#include "stdafx.h" #include "../BasicCompiler_Common/common.h" #ifdef _AMD64_ #include "../compiler_x64/opcode.h" #else #include "../compiler_x86/opcode.h" #endif void Diagnose(){ char temporary[8192]; { /////////////////////////////////////////////////////////////////// // グローバル / ローカル コード領域のサイズを調べる /////////////////////////////////////////////////////////////////// extern int GlobalOpBufferSize; sprintf(temporary, "%d", GlobalOpBufferSize/1024 ); trace_for_size( (std::string)"グローバル領域のコードサイズ: " + temporary + "KB" ); //sprintf(temporary, "%d", (obp-GlobalOpBufferSize)/1024 ); //trace_for_size( (std::string)"ローカル領域のコードサイズ: " + temporary + "KB" ); //sprintf(temporary, "%d", obp/1024 ); //trace_for_size( (std::string)"コードサイズ総量: " + temporary + "KB" ); } { /////////////////////////////////////////////////////////////////// // グローバル関数、クラスメソッドのサイズを調べる /////////////////////////////////////////////////////////////////// int codeSizeOfGlobalProc = 0; int codeSizeOfClassMethod = 0; compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset(); while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() ) { UserProc *pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext(); if( pUserProc->IsCompiled() ){ if( pUserProc->HasParentClass() ){ codeSizeOfClassMethod += pUserProc->GetCodeSize(); } else{ codeSizeOfGlobalProc += pUserProc->GetCodeSize(); } } } sprintf(temporary, "%d", codeSizeOfGlobalProc/1024 ); trace_for_size( (std::string)"グローバル関数のコードサイズ総量: " + temporary + "KB" ); sprintf(temporary, "%d", codeSizeOfClassMethod/1024 ); trace_for_size( (std::string)"クラスメソッドのコードサイズ総量: " + temporary + "KB" ); } { /////////////////////////////////////////////////////////////////// // Enumに必要なのコードサイズを調べる /////////////////////////////////////////////////////////////////// int codeSizeOfEnum = 0; // イテレータをリセット compiler.GetObjectModule().meta.GetClasses().Iterator_Reset(); while( compiler.GetObjectModule().meta.GetClasses().Iterator_HasNext() ){ int codeSizeOfClass = 0; CClass &objClass = *compiler.GetObjectModule().meta.GetClasses().Iterator_GetNext(); if( !objClass.IsEnum() ){ // 列挙型以外は無視 continue; } // 動的メソッド BOOST_FOREACH( const CMethod *pMethod, objClass.GetDynamicMethods() ){ if( pMethod->GetUserProc().IsCompiled() ){ codeSizeOfClass += pMethod->GetUserProc().GetCodeSize(); } } // 静的メソッド BOOST_FOREACH( const CMethod *pMethod, objClass.GetStaticMethods() ){ codeSizeOfClass += pMethod->GetUserProc().GetCodeSize(); } codeSizeOfEnum += codeSizeOfClass; } sprintf(temporary, "%d", codeSizeOfEnum/1024 ); trace_for_size( (std::string)"Enumのコードサイズ総量: " + temporary + "KB" ); } trace_for_size( "\n\n" ); { /////////////////////////////////////////////////////////////////// // クラスのサイズを調べる /////////////////////////////////////////////////////////////////// // イテレータをリセット compiler.GetObjectModule().meta.GetClasses().Iterator_Reset(); while( compiler.GetObjectModule().meta.GetClasses().Iterator_HasNext() ){ int codeSizeOfClass = 0; CClass &objClass = *compiler.GetObjectModule().meta.GetClasses().Iterator_GetNext(); // 動的メソッド BOOST_FOREACH( const CMethod *pMethod, objClass.GetDynamicMethods() ){ if( pMethod->GetUserProc().IsCompiled() ){ codeSizeOfClass += pMethod->GetUserProc().GetCodeSize(); } } // 静的メソッド BOOST_FOREACH( const CMethod *pMethod, objClass.GetStaticMethods() ){ codeSizeOfClass += pMethod->GetUserProc().GetCodeSize(); } if( codeSizeOfClass ){ temporary[0]=0; lstrcat( temporary, "------------------------------------------------------------------\n" ); sprintf( temporary + lstrlen(temporary), "【 %s クラスのコード情報】\n", objClass.GetName().c_str() ); sprintf( temporary + lstrlen(temporary), "class code size: %d bytes\n", codeSizeOfClass ); lstrcat( temporary, "------------------------------------------------------------------\n" ); lstrcat( temporary, "\n" ); trace_for_size( temporary ); } } } }