source: dev/trunk/ab5.0/abdev/BasicCompiler_Common/Diagnose.cpp@ 523

Last change on this file since 523 was 523, checked in by dai_9181, 16 years ago

ヘッダファイルを整理中

File size: 4.4 KB
RevLine 
[206]1#include "stdafx.h"
2
[193]3#include <Compiler.h>
[167]4#include <Program.h>
5
[91]6#include "../BasicCompiler_Common/common.h"
7
8#ifdef _AMD64_
[485]9#include "../compiler_x64/opcode.h"
[91]10#else
[484]11#include "../compiler_x86/opcode.h"
[91]12#endif
13
14
15void Diagnose(){
16 char temporary[8192];
17
[92]18 {
19 ///////////////////////////////////////////////////////////////////
20 // グローバル / ローカル コード領域のサイズを調べる
21 ///////////////////////////////////////////////////////////////////
[91]22
[92]23 extern int GlobalOpBufferSize;
24 sprintf(temporary, "%d", GlobalOpBufferSize/1024 );
[523]25 trace_for_size( (std::string)"グローバル領域のコードサイズ: " + temporary + "KB" );
[276]26 //sprintf(temporary, "%d", (obp-GlobalOpBufferSize)/1024 );
[523]27 //trace_for_size( (std::string)"ローカル領域のコードサイズ: " + temporary + "KB" );
[276]28 //sprintf(temporary, "%d", obp/1024 );
[523]29 //trace_for_size( (std::string)"コードサイズ総量: " + temporary + "KB" );
[92]30 }
31
[91]32 {
[92]33 ///////////////////////////////////////////////////////////////////
[91]34 // グローバル関数、クラスメソッドのサイズを調べる
[92]35 ///////////////////////////////////////////////////////////////////
36
[91]37 int codeSizeOfGlobalProc = 0;
38 int codeSizeOfClassMethod = 0;
[265]39 compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
40 while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
[206]41 {
[265]42 UserProc *pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
[206]43 if( pUserProc->IsCompiled() ){
44 if( pUserProc->HasParentClass() ){
45 codeSizeOfClassMethod += pUserProc->GetCodeSize();
[91]46 }
[206]47 else{
48 codeSizeOfGlobalProc += pUserProc->GetCodeSize();
49 }
[91]50 }
51 }
52
53 sprintf(temporary, "%d", codeSizeOfGlobalProc/1024 );
[523]54 trace_for_size( (std::string)"グローバル関数のコードサイズ総量: " + temporary + "KB" );
[91]55 sprintf(temporary, "%d", codeSizeOfClassMethod/1024 );
[523]56 trace_for_size( (std::string)"クラスメソッドのコードサイズ総量: " + temporary + "KB" );
[92]57 }
[91]58
[92]59 {
60 ///////////////////////////////////////////////////////////////////
61 // Enumに必要なのコードサイズを調べる
62 ///////////////////////////////////////////////////////////////////
63 int codeSizeOfEnum = 0;
64
65 // イテレータをリセット
[265]66 compiler.GetObjectModule().meta.GetClasses().Iterator_Reset();
[92]67
[265]68 while( compiler.GetObjectModule().meta.GetClasses().Iterator_HasNext() ){
[92]69 int codeSizeOfClass = 0;
70
[265]71 CClass &objClass = *compiler.GetObjectModule().meta.GetClasses().Iterator_GetNext();
[92]72
73 if( !objClass.IsEnum() ){
74 // 列挙型以外は無視
75 continue;
76 }
77
78 // 動的メソッド
[342]79 BOOST_FOREACH( const CMethod *pMethod, objClass.GetDynamicMethods() ){
[206]80 if( pMethod->GetUserProc().IsCompiled() ){
81 codeSizeOfClass += pMethod->GetUserProc().GetCodeSize();
[92]82 }
83 }
84
85 // 静的メソッド
[182]86 BOOST_FOREACH( const CMethod *pMethod, objClass.GetStaticMethods() ){
[206]87 codeSizeOfClass += pMethod->GetUserProc().GetCodeSize();
[92]88 }
89
90 codeSizeOfEnum += codeSizeOfClass;
91 }
92
93 sprintf(temporary, "%d", codeSizeOfEnum/1024 );
[523]94 trace_for_size( (std::string)"Enumのコードサイズ総量: " + temporary + "KB" );
[91]95 }
96
[167]97 trace_for_size( "\n\n" );
[92]98
[91]99 {
[92]100 ///////////////////////////////////////////////////////////////////
[91]101 // クラスのサイズを調べる
[92]102 ///////////////////////////////////////////////////////////////////
[91]103
104 // イテレータをリセット
[265]105 compiler.GetObjectModule().meta.GetClasses().Iterator_Reset();
[91]106
[265]107 while( compiler.GetObjectModule().meta.GetClasses().Iterator_HasNext() ){
[91]108 int codeSizeOfClass = 0;
109
[265]110 CClass &objClass = *compiler.GetObjectModule().meta.GetClasses().Iterator_GetNext();
[91]111
112 // 動的メソッド
[342]113 BOOST_FOREACH( const CMethod *pMethod, objClass.GetDynamicMethods() ){
[206]114 if( pMethod->GetUserProc().IsCompiled() ){
115 codeSizeOfClass += pMethod->GetUserProc().GetCodeSize();
[91]116 }
117 }
118
119 // 静的メソッド
[182]120 BOOST_FOREACH( const CMethod *pMethod, objClass.GetStaticMethods() ){
[206]121 codeSizeOfClass += pMethod->GetUserProc().GetCodeSize();
[91]122 }
123
124 if( codeSizeOfClass ){
125 temporary[0]=0;
126 lstrcat( temporary, "------------------------------------------------------------------\n" );
[131]127 sprintf( temporary + lstrlen(temporary), "【 %s クラスのコード情報】\n", objClass.GetName().c_str() );
[91]128 sprintf( temporary + lstrlen(temporary), "class code size: %d bytes\n", codeSizeOfClass );
129 lstrcat( temporary, "------------------------------------------------------------------\n" );
130 lstrcat( temporary, "\n" );
[167]131 trace_for_size( temporary );
[91]132 }
133 }
134 }
135}
Note: See TracBrowser for help on using the repository browser.