source: dev/trunk/abdev/BasicCompiler_Common/Diagnose.cpp@ 167

Last change on this file since 167 was 167, checked in by dai_9181, 17 years ago

BasicSysDirをGetAppDirに置き換えた

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