source: dev/branches/egtra/ab5.0/abdev/BasicCompiler_Common/Diagnose.cpp@ 803

Last change on this file since 803 was 803, checked in by イグトランス (egtra), 13 years ago

Hashmapの実装にunorderedを用いるよう変更

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