Changeset 266 in dev for trunk/abdev/BasicCompiler64/MakePeHdr.cpp
- Timestamp:
- Aug 7, 2007, 4:14:06 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler64/MakePeHdr.cpp
r263 r266 105 105 extern HANDLE hHeap; 106 106 extern BOOL bDebugCompile; 107 extern BOOL bDll;108 107 extern DWORD ImageBase; 109 108 extern int obp_AllocSize; … … 123 122 124 123 //エクスポート セクションを利用するかどうか 125 if( bDll) bUse_ExportSection=1;124 if( compiler.IsDll() ) bUse_ExportSection=1; 126 125 else bUse_ExportSection=0; 127 126 … … 129 128 ////////////////// 130 129 // データテーブル 131 compiler. objectModule.dataTable.Clear();130 compiler.GetObjectModule().dataTable.Clear(); 132 131 if(bDebugCompile){ 133 compiler. objectModule.dataTable.Add( (long)0x00000002 );132 compiler.GetObjectModule().dataTable.Add( (long)0x00000002 ); 134 133 } 135 134 … … 155 154 156 155 //関数ポインタ情報を初期化 157 compiler. objectModule.meta.GetProcPointers().clear();156 compiler.GetObjectModule().meta.GetProcPointers().clear(); 158 157 159 158 // 名前空間情報を取得 160 159 NamespaceSupporter::CollectNamespaces( 161 Smoothie::Lexical::source.GetBuffer(),162 compiler. objectModule.meta.GetNamespaces()160 compiler.GetObjectModule().source.GetBuffer(), 161 compiler.GetObjectModule().meta.GetNamespaces() 163 162 ); 164 163 … … 166 165 // CollectProcedures関数の中で参照されるオブジェクト名を事前に取得する。 167 166 // ※オブジェクトの内容までは取得しない 168 compiler. objectModule.meta.GetClasses().CollectClassesForNameOnly( Smoothie::Lexical::source );167 compiler.GetObjectModule().meta.GetClasses().CollectClassesForNameOnly( compiler.GetObjectModule().source ); 169 168 170 169 //TypeDef情報を初期化 171 compiler. objectModule.meta.GetTypeDefs().Init();170 compiler.GetObjectModule().meta.GetTypeDefs().Init(); 172 171 173 172 //定数情報を取得 … … 177 176 compiler.pCompilingClass = NULL; 178 177 CollectProcedures( 179 Smoothie::Lexical::source,180 compiler. objectModule.meta.GetUserProcs(),181 compiler. objectModule.meta.GetDllProcs()178 compiler.GetObjectModule().source, 179 compiler.GetObjectModule().meta.GetUserProcs(), 180 compiler.GetObjectModule().meta.GetDllProcs() 182 181 ); 183 182 184 183 // クラス情報を取得(※注 - CollectProceduresの後に呼び出す) 185 compiler. objectModule.meta.GetClasses().GetAllClassInfo();184 compiler.GetObjectModule().meta.GetClasses().GetAllClassInfo(); 186 185 187 186 // サブルーチン(ユーザー定義、DLL関数)のイテレータの準備 188 compiler. objectModule.meta.GetUserProcs().Iterator_Init();189 compiler. objectModule.meta.GetDllProcs().Iterator_Init();187 compiler.GetObjectModule().meta.GetUserProcs().Iterator_Init(); 188 compiler.GetObjectModule().meta.GetDllProcs().Iterator_Init(); 190 189 191 190 /* 192 if( !compiler. objectModule.meta.WriteXml( Jenga::Common::Environment::GetAppDir() + "\\meta_test.xml" ) )191 if( !compiler.GetObjectModule().meta.WriteXml( Jenga::Common::Environment::GetAppDir() + "\\meta_test.xml" ) ) 193 192 { 194 193 MessageBox(0,"XML書き込みに失敗","test",0); … … 200 199 } 201 200 202 if( !compiler. objectModule.meta.WriteBinaly( Jenga::Common::Environment::GetAppDir() + "\\meta_test.dat" ) )201 if( !compiler.GetObjectModule().meta.WriteBinaly( Jenga::Common::Environment::GetAppDir() + "\\meta_test.dat" ) ) 203 202 { 204 203 MessageBox(0,"バイナリ書き込みに失敗","test",0); … … 209 208 MessageBox(0,"バイナリ読み込みに失敗","test",0); 210 209 } 211 if( !compiler. objectModule.meta.WriteText( Jenga::Common::Environment::GetAppDir() + "\\meta_test.dat" ) )210 if( !compiler.GetObjectModule().meta.WriteText( Jenga::Common::Environment::GetAppDir() + "\\meta_test.dat" ) ) 212 211 { 213 212 MessageBox(0,"バイナリ書き込みに失敗","test",0); … … 218 217 MessageBox(0,"バイナリ読み込みに失敗","test",0); 219 218 } 220 compiler. objectModule.meta = (*pTempMeta);*/219 compiler.GetObjectModule().meta = (*pTempMeta);*/ 221 220 222 221 … … 353 352 UserProc::CompileStartForGlobalArea(); 354 353 355 if( !bDll){354 if( !compiler.IsDll() ){ 356 355 // 名前空間が初期化されているかをチェック 357 356 if( compiler.GetNamespaceSupporter().GetLivingNamespaceScopes().size() ){ … … 379 378 380 379 // コード生成対象を選択 381 compiler.codeGenerator.Select( compiler. objectModule.globalNativeCode );380 compiler.codeGenerator.Select( compiler.GetObjectModule().globalNativeCode ); 382 381 383 382 trace_for_sourcecodestep( "★★★ グローバル領域のコンパイルを開始" ); … … 402 401 403 402 //クラスに属する静的メンバを定義 404 compiler. objectModule.meta.GetClasses().InitStaticMember();403 compiler.GetObjectModule().meta.GetClasses().InitStaticMember(); 405 404 406 405 //グローバル実行領域をコンパイル開始 … … 506 505 507 506 vector<ObjectModule *> masterObjectModules; 508 masterObjectModules.push_back( &compiler. objectModule);507 masterObjectModules.push_back( &compiler.GetObjectModule() ); 509 508 compiler.linker.Link( masterObjectModules ); 510 509 … … 520 519 // 使用するDLL関数のチェック 521 520 //////////////////////////////// 522 compiler. objectModule.meta.GetDllProcs().Iterator_Reset();523 while( compiler. objectModule.meta.GetDllProcs().Iterator_HasNext() )521 compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset(); 522 while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() ) 524 523 { 525 const DllProc *pDllProc = compiler. objectModule.meta.GetDllProcs().Iterator_GetNext();524 const DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext(); 526 525 527 526 if( !pDllProc->IsUsing() ){ … … 594 593 //辞書順にサーチ 595 594 temporary[0]=0; 596 compiler. objectModule.meta.GetUserProcs().Iterator_Reset();597 while( compiler. objectModule.meta.GetUserProcs().Iterator_HasNext() )595 compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset(); 596 while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() ) 598 597 { 599 pUserProc = compiler. objectModule.meta.GetUserProcs().Iterator_GetNext();598 pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext(); 600 599 if(pUserProc->IsExport()){ 601 600 if(temporary[0]=='\0'){ … … 698 697 int ImportDllNum=0; 699 698 700 compiler. objectModule.meta.GetDllProcs().Iterator_Reset();701 while( compiler. objectModule.meta.GetDllProcs().Iterator_HasNext() )699 compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset(); 700 while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() ) 702 701 { 703 const DllProc *pDllProc = compiler. objectModule.meta.GetDllProcs().Iterator_GetNext();702 const DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext(); 704 703 705 704 if( !pDllProc->IsUsing() ){ … … 737 736 pImportDescriptor[i].Name=i*0x10; //※すぐ下で再計算 738 737 739 compiler. objectModule.meta.GetDllProcs().Iterator_Reset();740 while( compiler. objectModule.meta.GetDllProcs().Iterator_HasNext() )738 compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset(); 739 while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() ) 741 740 { 742 const DllProc *pDllProc = compiler. objectModule.meta.GetDllProcs().Iterator_GetNext();741 const DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext(); 743 742 744 743 if( !pDllProc->IsUsing() ){ … … 775 774 pHintTable=(char *)HeapAlloc(hHeap,0,HintAllocSize); 776 775 for(i=0,i5=0;i<ImportDllNum;i++){ 777 compiler. objectModule.meta.GetDllProcs().Iterator_Reset();778 while( compiler. objectModule.meta.GetDllProcs().Iterator_HasNext() )776 compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset(); 777 while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() ) 779 778 { 780 DllProc *pDllProc = compiler. objectModule.meta.GetDllProcs().Iterator_GetNext();779 DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext(); 781 780 782 781 if( !pDllProc->IsUsing() ){ … … 815 814 816 815 817 if( bDll){816 if( compiler.IsDll() ){ 818 817 //DLLの場合はリロケーション情報を仮生成 819 818 //※正式な生成は各セクションのメモリ上のサイズが決定してから再度行う。 … … 826 825 //(デバッグ情報で利用される) 827 826 extern int AllInitGlobalVarSize; 828 BOOST_FOREACH( Variable *pVar, compiler. objectModule.meta.GetGlobalVars() ){827 BOOST_FOREACH( Variable *pVar, compiler.GetObjectModule().meta.GetGlobalVars() ){ 829 828 if(pVar->GetOffsetAddress()&0x80000000){ 830 829 pVar->SetOffsetAddress( … … 839 838 // デバッグセクションを生成 840 839 //////////////////////////////////// 841 842 //機械語コードとBasicコードの関係を整理843 extern SourceLines oldSourceLines;844 int MinObp,MaxObp;845 SourceLines tempSourceLines;846 MaxObp=0;847 while(1){848 for(i3=0,MinObp=0x0FFFFFFF;i3<oldSourceLines.size();i3++){849 if(oldSourceLines[i3].GetNativeCodePos()<MinObp&&MaxObp<oldSourceLines[i3].GetNativeCodePos()){850 MinObp=oldSourceLines[i3].GetNativeCodePos();851 i4=i3;852 }853 }854 if(MinObp==0x0FFFFFFF) break;855 tempSourceLines.push_back( oldSourceLines[i4] );856 MaxObp=tempSourceLines.back().GetNativeCodePos();857 }858 oldSourceLines = tempSourceLines;859 840 860 841 //デバッグセクションを生成 … … 903 884 904 885 //データセクションのファイル上のサイズ 905 if(compiler. objectModule.dataTable.GetSize()%FILE_ALIGNMENT) FileSize_DataSection=compiler.objectModule.dataTable.GetSize()+(FILE_ALIGNMENT-compiler.objectModule.dataTable.GetSize()%FILE_ALIGNMENT);906 else FileSize_DataSection=compiler. objectModule.dataTable.GetSize();886 if(compiler.GetObjectModule().dataTable.GetSize()%FILE_ALIGNMENT) FileSize_DataSection=compiler.GetObjectModule().dataTable.GetSize()+(FILE_ALIGNMENT-compiler.GetObjectModule().dataTable.GetSize()%FILE_ALIGNMENT); 887 else FileSize_DataSection=compiler.GetObjectModule().dataTable.GetSize(); 907 888 if(FileSize_DataSection) bUse_DataSection=1; 908 889 else bUse_DataSection=0; … … 1065 1046 LookupSize; //ルックアップテーブル 1066 1047 1067 compiler. objectModule.meta.GetDllProcs().Iterator_Reset();1068 while( compiler. objectModule.meta.GetDllProcs().Iterator_HasNext() )1048 compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset(); 1049 while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() ) 1069 1050 { 1070 const DllProc *pDllProc = compiler. objectModule.meta.GetDllProcs().Iterator_GetNext();1051 const DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext(); 1071 1052 1072 1053 if( !pDllProc->IsUsing() ){ … … 1086 1067 //////////////////////////////////////// 1087 1068 //仮想関数データテーブルスケジュール 1088 compiler. objectModule.meta.GetClasses().ActionVtblSchedule(ImageBase,MemPos_CodeSection);1069 compiler.GetObjectModule().meta.GetClasses().ActionVtblSchedule(ImageBase,MemPos_CodeSection); 1089 1070 1090 1071 … … 1130 1111 1131 1112 1132 if( bDll){1113 if( compiler.IsDll() ){ 1133 1114 //DLLの場合はリロケーション情報を生成 1134 1115 pobj_Reloc->ResetRelocBuffer(); … … 1269 1250 ImagePeHdr.FileHeader.NumberOfSymbols= 0x00000000; 1270 1251 ImagePeHdr.FileHeader.SizeOfOptionalHeader= IMAGE_SIZEOF_NT_OPTIONAL64_HEADER; 1271 if( bDll){1252 if( compiler.IsDll() ){ 1272 1253 ImagePeHdr.FileHeader.Characteristics= IMAGE_FILE_EXECUTABLE_IMAGE| 1273 1254 IMAGE_FILE_DLL| … … 1286 1267 ImagePeHdr.OptionalHeader.SizeOfInitializedData=FileSize_DataSection; //データサイズ(.dataのセッションサイズ) 1287 1268 ImagePeHdr.OptionalHeader.SizeOfUninitializedData=0; //未初期化データのサイズ(なし) 1288 if( bDll){1269 if( compiler.IsDll() ){ 1289 1270 if(DllMain_EntryPoint==-1) 1290 1271 ImagePeHdr.OptionalHeader.AddressOfEntryPoint=0; … … 1636 1617 if(bUse_DataSection){ 1637 1618 //データ テーブル 1638 WriteFile(hFile,compiler. objectModule.dataTable.GetPtr(),compiler.objectModule.dataTable.GetSize(),(DWORD *)&i2,NULL);1619 WriteFile(hFile,compiler.GetObjectModule().dataTable.GetPtr(),compiler.GetObjectModule().dataTable.GetSize(),(DWORD *)&i2,NULL); 1639 1620 i+=i2; 1640 1621 } … … 1748 1729 1749 1730 //クラスに関するメモリを解放 1750 compiler. objectModule.meta.GetClasses().Clear();1731 compiler.GetObjectModule().meta.GetClasses().Clear(); 1751 1732 }
Note:
See TracChangeset
for help on using the changeset viewer.