Changeset 308 in dev for trunk/abdev/BasicCompiler64/MakePeHdr.cpp
- Timestamp:
- Aug 29, 2007, 9:05:22 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler64/MakePeHdr.cpp
r268 r308 2 2 3 3 #include <jenga/include/common/Environment.h> 4 #include <jenga/include/common/Path.h> 5 #include <jenga/include/common/Directory.h> 4 6 5 7 #include <jenga/include/smoothie/Smoothie.h> … … 29 31 *pSub_System_InitStaticLocalVariables, 30 32 *pSub_System_Call_Destructor_of_GlobalObject, 33 *pSub_System_End, 31 34 *pSub_System_GetSp, 32 35 *pSub_pow, … … 88 91 89 92 90 void DebugVariable(void){91 char temporary[255];92 sprintf(temporary,"_DebugSys_dwThreadID[255]%c%cDWord",1,ESC_AS);93 OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);94 sprintf(temporary,"_DebugSys_ProcNum[255]%c%cDWord",1,ESC_AS);95 OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);96 sprintf(temporary,"_DebugSys_lplpObp[255]%c%c*ULONG_PTR",1,ESC_AS);97 OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);98 sprintf(temporary,"_DebugSys_lplpSpBase[255]%c%c*ULONG_PTR",1,ESC_AS);99 OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);100 }101 102 93 void Compile(void){ 103 94 extern HWND hMainDlg; … … 158 149 // 名前空間情報を取得 159 150 NamespaceSupporter::CollectNamespaces( 160 compiler. source.GetBuffer(),151 compiler.GetObjectModule().GetCurrentSource().GetBuffer(), 161 152 compiler.GetObjectModule().meta.GetNamespaces() 162 153 ); … … 165 156 // CollectProcedures関数の中で参照されるオブジェクト名を事前に取得する。 166 157 // ※オブジェクトの内容までは取得しない 167 compiler.GetObjectModule().meta.GetClasses().CollectClassesForNameOnly( compiler. source);158 compiler.GetObjectModule().meta.GetClasses().CollectClassesForNameOnly( compiler.GetObjectModule().GetCurrentSource() ); 168 159 169 160 //TypeDef情報を初期化 170 compiler.GetObjectModule().meta.GetTypeDefs(). Init();161 compiler.GetObjectModule().meta.GetTypeDefs().CollectTypeDefs(); 171 162 172 163 //定数情報を取得 … … 176 167 compiler.pCompilingClass = NULL; 177 168 CollectProcedures( 178 compiler. source,169 compiler.GetObjectModule().GetCurrentSource(), 179 170 compiler.GetObjectModule().meta.GetUserProcs(), 180 171 compiler.GetObjectModule().meta.GetDllProcs() … … 262 253 } 263 254 255 if(pSub_System_End=GetSubHash("_System_End",1)){ 256 pSub_System_End->Using(); 257 } 258 264 259 if(pSub_System_GetSp=GetSubHash("_System_GetSp",1)){ 265 260 pSub_System_GetSp->Using(); … … 298 293 } 299 294 300 301 302 //データテーブルスケジュール303 pobj_DataTableSchedule=new CSchedule();304 pobj_DataTableSchedule->SetFlag(SCHEDULE_FLAG_RELOC);305 306 //インポートテーブルスケジュール307 //※x64はRPI(実行中アドレス)からのオフセットになるため、再配置が不要308 pobj_ImportAddrSchedule=new CImportAddrSchedule();309 310 //プロシージャポインタスケジュール311 pobj_SubAddrSchedule=new CSubAddrSchedule();312 313 //グローバル変数アドレススケジュール314 pobj_GlobalVarSchedule=new CSchedule();315 pobj_GlobalVarSchedule->SetFlag(SCHEDULE_FLAG_RELOC);316 317 //グローバル変数の初期バッファ318 extern BYTE *initGlobalBuf;319 initGlobalBuf=(BYTE *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);320 321 295 //リロケーション情報 322 296 pobj_Reloc=new CReloc(); 323 297 324 obp_AllocSize=8192*2;325 OpBuffer=(char *)calloc(obp_AllocSize,1);326 obp=0;327 328 298 //レジスタのブロッキングを管理するためのオブジェクトを生成 329 299 pobj_BlockReg=new CBlockReg; 330 300 331 301 //レキシカルスコープ情報を初期化 332 compiler.codeGenerator.lexicalScopes.Init( obp);302 compiler.codeGenerator.lexicalScopes.Init(0); 333 303 334 304 … … 373 343 compiler.codeGenerator.ClearContinueArea(); 374 344 375 //スタックフレーム管理用クラスを初期化 376 extern CStackFrame *pobj_sf; 377 pobj_sf=new CStackFrame(); 345 //スタックフレーム管理用クラスを選択 346 pobj_sf = &compiler.GetObjectModule().globalStackFrame; 378 347 379 348 // コード生成対象を選択 … … 386 355 //breakpoint; 387 356 388 //sub rsp,スタックフレームサイズ 389 const PertialSchedule *pStackFramePertialSchedule = compiler.codeGenerator.op_sub_rsp( 0, true ); 390 391 if(bDebugCompile){ 392 //デバッグ用の変数を定義 393 DebugVariable(); 394 } 395 396 //GC用の変数を定義 397 InitGCVariables(); 398 399 //_System_StartupProgramの呼び出し 400 compiler.codeGenerator.op_call(pSub_System_StartupProgram); 357 if( compiler.IsCore() ) 358 { 359 //sub rsp,スタックフレームサイズ 360 const PertialSchedule *pStackFramePertialSchedule = compiler.codeGenerator.op_sub_rsp( 0, true ); 361 362 if(bDebugCompile){ 363 //デバッグ用の変数を定義 364 DebugVariable(); 365 } 366 367 //GC用の変数を定義 368 InitGCVariables(); 369 370 //_System_StartupProgramの呼び出し 371 compiler.codeGenerator.op_call(pSub_System_StartupProgram); 372 } 401 373 402 374 //クラスに属する静的メンバを定義 … … 419 391 420 392 421 /////////////////////////////////////// 422 // グローバル文字列変数の解放処理 423 /////////////////////////////////////// 424 425 //call _System_Call_Destructor_of_GlobalObject 426 extern const UserProc *pSub_System_Call_Destructor_of_GlobalObject; 427 compiler.codeGenerator.op_call(pSub_System_Call_Destructor_of_GlobalObject); 428 429 430 //add rsp,スタックフレームサイズ 431 int stackFrameSize = pobj_sf->GetFrameSize(0); 432 compiler.codeGenerator.op_add_RV( REG_RSP, stackFrameSize ); 433 434 //xor rax,rax(raxを0に初期化する) 435 compiler.codeGenerator.op_zero_reg(REG_RAX); 436 437 //ret 438 compiler.codeGenerator.op_ret(); 393 if( !compiler.IsStaticLibrary() ) 394 { 395 /////////////////////////////////////// 396 // グローバル文字列変数の解放処理 397 /////////////////////////////////////// 398 399 //call _System_End 400 extern const UserProc *pSub_System_End; 401 compiler.codeGenerator.op_call(pSub_System_End); 402 403 404 //add rsp,スタックフレームサイズ 405 int stackFrameSize = pobj_sf->GetFrameSize(0); 406 compiler.codeGenerator.op_add_RV( REG_RSP, stackFrameSize ); 407 408 //xor rax,rax(raxを0に初期化する) 409 compiler.codeGenerator.op_zero_reg(REG_RAX); 410 411 //ret 412 compiler.codeGenerator.op_ret(); 413 414 //スタックフレームスケジュール(subコマンドに渡す値) 415 compiler.codeGenerator.opfix( pStackFramePertialSchedule, stackFrameSize ); 416 417 //スタックフレームスケジュールを実行 418 pobj_sf->RunningSchedule( stackFrameSize ); 419 pobj_sf=0; 420 } 439 421 440 422 //グローバル実行領域のコードサイズ 441 423 extern int GlobalOpBufferSize; 442 GlobalOpBufferSize=obp; 443 444 //スタックフレームスケジュール(subコマンドに渡す値) 445 compiler.codeGenerator.opfix( pStackFramePertialSchedule, stackFrameSize ); 446 447 //スタックフレームスケジュールを実行 448 pobj_sf->RunningSchedule( stackFrameSize ); 449 delete pobj_sf; 450 pobj_sf=0; 424 GlobalOpBufferSize = compiler.linker.GetNativeCode().GetSize(); 451 425 452 426 //With情報のメモリを解放 … … 504 478 trace( "コード生成が終了しました。" ); 505 479 506 vector<ObjectModule *> masterObjectModules; 507 masterObjectModules.push_back( &compiler.GetObjectModule() ); 508 compiler.linker.Link( masterObjectModules ); 480 481 if( compiler.IsStaticLibrary() ) 482 { 483 // 静的リンクライブラリ 484 485 // 格納先ディレクトリを作る 486 Jenga::Common::Path path( OutputFileName ); 487 Jenga::Common::Directory dir( path.GetDriveName() + path.GetDirName(), true ); 488 489 // 書き込む 490 if( !compiler.GetObjectModule().Write( OutputFileName ) ) 491 { 492 MessageBox(0,"XML書き込みに失敗","test",0); 493 } 494 return; 495 } 496 497 extern BOOL bError; 498 if( !bError ) 499 { 500 CompileMessage( "リンク中..." ); 501 } 502 503 504 compiler.linker.Link( compiler.GetObjectModule() ); 505 506 extern SourceLines oldSourceLines; 507 oldSourceLines = compiler.linker.GetNativeCode().GetSourceLines(); 508 509 510 ///////////////////////////////////////////////////////////////// 511 // vtblの構築 512 ///////////////////////////////////////////////////////////////// 513 514 compiler.GetObjectModule().meta.GetClasses().GenerateVTables(); 515 509 516 510 517 … … 525 532 526 533 if( !pDllProc->IsUsing() ){ 527 pDllProc=pDllProc->pNextData;528 534 continue; 529 535 } … … 619 625 620 626 if( pUserProc->GetName() == "DllMain" ){ 621 DllMain_EntryPoint =pUserProc->_beginOpAddressOld;627 DllMain_EntryPoint = pUserProc->GetBeginOpAddress(); 622 628 } 623 629 624 630 lpdwExportAddressTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportAddressTable,(ExportNum+1)*sizeof(DWORD)); 625 lpdwExportAddressTable[ExportNum] =pUserProc->_beginOpAddressOld;631 lpdwExportAddressTable[ExportNum] = pUserProc->GetBeginOpAddress(); 626 632 627 633 lpdwExportNamePointerTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportNamePointerTable,(ExportNum+1)*sizeof(DWORD)); … … 703 709 704 710 if( !pDllProc->IsUsing() ){ 705 pDllProc=pDllProc->pNextData;706 711 continue; 707 712 } … … 742 747 743 748 if( !pDllProc->IsUsing() ){ 744 pDllProc=pDllProc->pNextData;745 749 continue; 746 750 } … … 780 784 781 785 if( !pDllProc->IsUsing() ){ 782 pDllProc=pDllProc->pNextData;783 786 continue; 784 787 } … … 855 858 856 859 //コードセッションのファイル上のサイズ 857 if(obp%FILE_ALIGNMENT) FileSize_CodeSection=obp+(FILE_ALIGNMENT-obp%FILE_ALIGNMENT); 858 else FileSize_CodeSection=obp; 860 if(compiler.linker.GetNativeCode().GetSize()%FILE_ALIGNMENT) 861 { 862 FileSize_CodeSection = 863 compiler.linker.GetNativeCode().GetSize() 864 + (FILE_ALIGNMENT-compiler.linker.GetNativeCode().GetSize()%FILE_ALIGNMENT); 865 } 866 else 867 { 868 FileSize_CodeSection = compiler.linker.GetNativeCode().GetSize(); 869 } 859 870 if(FileSize_CodeSection) bUse_CodeSection=1; 860 871 else bUse_CodeSection=0; … … 1052 1063 1053 1064 if( !pDllProc->IsUsing() ){ 1054 pDllProc=pDllProc->pNextData;1055 1065 continue; 1056 1066 } … … 1070 1080 1071 1081 1072 //////////////////////////////1073 // データテーブルスケジュール1074 for(i=0;i<pobj_DataTableSchedule->num;i++){1075 *((long *)(OpBuffer+pobj_DataTableSchedule->pObpValues[i]))+=ImageBase+MemPos_DataSection;1076 }1077 delete pobj_DataTableSchedule;1078 1079 1080 //////////////////////////////////1081 // インポートテーブルスケジュール(インポート アドレス テーブルを指し示させる)1082 // ※x86はRVAからのオフセット。x64はRPI(実行中アドレス)からのオフセット1083 for(i=0;i<pobj_ImportAddrSchedule->num;i++){1084 const DllProc *pDllProc = pobj_ImportAddrSchedule->ppdi[i];1085 *((long *)(OpBuffer+pobj_ImportAddrSchedule->pObpValues[i]))=1086 MemPos_ImportSection+1087 pDllProc->GetLookupAddress()1088 -(MemPos_CodeSection+pobj_ImportAddrSchedule->pObpValues[i]+sizeof(long));1089 }1090 delete pobj_ImportAddrSchedule;1091 1092 1093 ////////////////////////////////////1094 // プロシージャポインタスケジュール1095 for(i=0;i<pobj_SubAddrSchedule->num;i++){1096 if(pobj_SubAddrSchedule->ppsi[i]->_beginOpAddressOld==01097 &&pobj_SubAddrSchedule->ppsi[i]->_endOpAddressOld==0){1098 SetError(300,NULL,-1);1099 }1100 1101 if(pobj_SubAddrSchedule->pbCall[i]){1102 *((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))=1103 pobj_SubAddrSchedule->ppsi[i]->_beginOpAddressOld-(pobj_SubAddrSchedule->pObpValues[i]+sizeof(long));1104 }1105 else{1106 *((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))=1107 pobj_SubAddrSchedule->ppsi[i]->_beginOpAddressOld+ImageBase+MemPos_CodeSection;1108 }1109 }1110 delete pobj_SubAddrSchedule;1111 1112 1113 1082 if( compiler.IsDll() ){ 1114 1083 //DLLの場合はリロケーション情報を生成 1115 1084 pobj_Reloc->ResetRelocBuffer(); 1116 1085 } 1117 1118 1119 1120 //////////////////////////////////////1121 // グローバル変数アドレススケジュール1122 //////////////////////////////////////1123 1124 /*1125 GlobalArea1 - 初期バッファあり1126 GlobalArea2 - 初期バッファなし1127 */1128 for(i=0;i<pobj_GlobalVarSchedule->num;i++){1129 if(*((long *)(OpBuffer+pobj_GlobalVarSchedule->pObpValues[i])) & 0x80000000){1130 //初期バッファなし1131 *((long *)(OpBuffer+pobj_GlobalVarSchedule->pObpValues[i]))=1132 AllInitGlobalVarSize+1133 (*((long *)(OpBuffer+pobj_GlobalVarSchedule->pObpValues[i])) & 0x7FFFFFFF)+1134 ImageBase+MemPos_RWSection;1135 }1136 else{1137 //初期バッファあり1138 *((long *)(OpBuffer+pobj_GlobalVarSchedule->pObpValues[i]))+=1139 ImageBase+MemPos_RWSection;1140 }1141 }1142 delete pobj_GlobalVarSchedule;1143 1144 1086 1145 1087 … … 1149 1091 compiler.linker.ResolveUserProcSchedules( MemPos_CodeSection ); 1150 1092 compiler.linker.ResolveGlobalVarSchedules( MemPos_RWSection ); 1151 1152 if( obp == compiler.linker.GetNativeCode().GetSize() ) 1153 { 1154 memcpy( OpBuffer, compiler.linker.GetNativeCode().GetCodeBuffer(), compiler.linker.GetNativeCode().GetSize() ); 1155 } 1156 else 1157 { 1158 SetError(); 1159 } 1093 compiler.linker.ResolveVtblSchedule( MemPos_DataSection ); 1160 1094 1161 1095 … … 1349 1283 memset((char *)CodeSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME); 1350 1284 lstrcpy((char *)CodeSectionHeader.Name,".text"); 1351 CodeSectionHeader.Misc.VirtualSize= obp;1285 CodeSectionHeader.Misc.VirtualSize= MemSize_CodeSection; 1352 1286 CodeSectionHeader.VirtualAddress= MemPos_CodeSection; //開始アドレス 1353 1287 CodeSectionHeader.SizeOfRawData= FileSize_CodeSection; … … 1546 1480 1547 1481 //コード 1548 WriteFile(hFile,OpBuffer,obp,(DWORD *)&i2,NULL); 1482 WriteFile( 1483 hFile, 1484 compiler.linker.GetNativeCode().GetBuffer(), 1485 compiler.linker.GetNativeCode().GetSize(), 1486 (DWORD *)&i2, 1487 NULL 1488 ); 1549 1489 i+=i2; 1550 1490 … … 1629 1569 if(bUse_RWSection){ 1630 1570 //リライタブル データ テーブル(グローバル変数の初期バッファ) 1631 initGlobalBuf=(BYTE *)HeapReAlloc(hHeap, 1632 HEAP_ZERO_MEMORY, 1633 initGlobalBuf, 1634 FileSize_RWSection); 1635 WriteFile(hFile,initGlobalBuf,FileSize_RWSection,(DWORD *)&i2,NULL); 1636 i+=i2; 1571 char *temp = (char *)calloc( FileSize_RWSection, 1 ); 1572 memcpy( 1573 temp, 1574 compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetBuffer(), 1575 compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize() 1576 ); 1577 1578 WriteFile(hFile,temp,FileSize_RWSection,(DWORD *)&i2,NULL); 1579 i+=i2; 1580 1581 free( temp ); 1637 1582 } 1638 1583 … … 1709 1654 HeapDefaultFree(pHintTable); 1710 1655 1711 //グローバル変数の初期バッファを解放1712 HeapDefaultFree(initGlobalBuf);1713 1714 //コードバッファを解放1715 free(OpBuffer);1716 OpBuffer=0;1717 1718 1656 //リソースセクションバッファを解放 1719 1657 HeapDefaultFree(RSrcSectionBuffer);
Note:
See TracChangeset
for help on using the changeset viewer.