Ignore:
Timestamp:
Aug 29, 2007, 9:05:22 AM (17 years ago)
Author:
dai_9181
Message:

静的リンクライブラリにより、複数のグローバル領域が存在することになったのでそれぞれを関数ベースに分けた

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler64/MakePeHdr.cpp

    r268 r308  
    22
    33#include <jenga/include/common/Environment.h>
     4#include <jenga/include/common/Path.h>
     5#include <jenga/include/common/Directory.h>
    46
    57#include <jenga/include/smoothie/Smoothie.h>
     
    2931    *pSub_System_InitStaticLocalVariables,
    3032    *pSub_System_Call_Destructor_of_GlobalObject,
     33    *pSub_System_End,
    3134    *pSub_System_GetSp,
    3235    *pSub_pow,
     
    8891
    8992
    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 
    10293void Compile(void){
    10394    extern HWND hMainDlg;
     
    158149    // 名前空間情報を取得
    159150    NamespaceSupporter::CollectNamespaces(
    160         compiler.source.GetBuffer(),
     151        compiler.GetObjectModule().GetCurrentSource().GetBuffer(),
    161152        compiler.GetObjectModule().meta.GetNamespaces()
    162153    );
     
    165156    //   CollectProcedures関数の中で参照されるオブジェクト名を事前に取得する。
    166157    //     ※オブジェクトの内容までは取得しない
    167     compiler.GetObjectModule().meta.GetClasses().CollectClassesForNameOnly( compiler.source );
     158    compiler.GetObjectModule().meta.GetClasses().CollectClassesForNameOnly( compiler.GetObjectModule().GetCurrentSource() );
    168159
    169160    //TypeDef情報を初期化
    170     compiler.GetObjectModule().meta.GetTypeDefs().Init();
     161    compiler.GetObjectModule().meta.GetTypeDefs().CollectTypeDefs();
    171162
    172163    //定数情報を取得
     
    176167    compiler.pCompilingClass = NULL;
    177168    CollectProcedures(
    178         compiler.source,
     169        compiler.GetObjectModule().GetCurrentSource(),
    179170        compiler.GetObjectModule().meta.GetUserProcs(),
    180171        compiler.GetObjectModule().meta.GetDllProcs()
     
    262253    }
    263254
     255    if(pSub_System_End=GetSubHash("_System_End",1)){
     256        pSub_System_End->Using();
     257    }
     258
    264259    if(pSub_System_GetSp=GetSubHash("_System_GetSp",1)){
    265260        pSub_System_GetSp->Using();
     
    298293    }
    299294
    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 
    321295    //リロケーション情報
    322296    pobj_Reloc=new CReloc();
    323297
    324     obp_AllocSize=8192*2;
    325     OpBuffer=(char *)calloc(obp_AllocSize,1);
    326     obp=0;
    327 
    328298    //レジスタのブロッキングを管理するためのオブジェクトを生成
    329299    pobj_BlockReg=new CBlockReg;
    330300
    331301    //レキシカルスコープ情報を初期化
    332     compiler.codeGenerator.lexicalScopes.Init(obp);
     302    compiler.codeGenerator.lexicalScopes.Init(0);
    333303
    334304
     
    373343        compiler.codeGenerator.ClearContinueArea();
    374344
    375         //スタックフレーム管理用クラスを初期化
    376         extern CStackFrame *pobj_sf;
    377         pobj_sf=new CStackFrame();
     345        //スタックフレーム管理用クラスを選択
     346        pobj_sf = &compiler.GetObjectModule().globalStackFrame;
    378347
    379348        // コード生成対象を選択
     
    386355        //breakpoint;
    387356
    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        }
    401373
    402374        //クラスに属する静的メンバを定義
     
    419391
    420392
    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        }
    439421
    440422        //グローバル実行領域のコードサイズ
    441423        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();
    451425
    452426        //With情報のメモリを解放
     
    504478    trace( "コード生成が終了しました。" );
    505479
    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
    509516
    510517
     
    525532
    526533        if( !pDllProc->IsUsing() ){
    527             pDllProc=pDllProc->pNextData;
    528534            continue;
    529535        }
     
    619625
    620626            if( pUserProc->GetName() == "DllMain" ){
    621                 DllMain_EntryPoint=pUserProc->_beginOpAddressOld;
     627                DllMain_EntryPoint = pUserProc->GetBeginOpAddress();
    622628            }
    623629
    624630            lpdwExportAddressTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportAddressTable,(ExportNum+1)*sizeof(DWORD));
    625             lpdwExportAddressTable[ExportNum]=pUserProc->_beginOpAddressOld;
     631            lpdwExportAddressTable[ExportNum] = pUserProc->GetBeginOpAddress();
    626632
    627633            lpdwExportNamePointerTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportNamePointerTable,(ExportNum+1)*sizeof(DWORD));
     
    703709
    704710        if( !pDllProc->IsUsing() ){
    705             pDllProc=pDllProc->pNextData;
    706711            continue;
    707712        }
     
    742747
    743748            if( !pDllProc->IsUsing() ){
    744                 pDllProc=pDllProc->pNextData;
    745749                continue;
    746750            }
     
    780784
    781785            if( !pDllProc->IsUsing() ){
    782                 pDllProc=pDllProc->pNextData;
    783786                continue;
    784787            }
     
    855858
    856859    //コードセッションのファイル上のサイズ
    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    }
    859870    if(FileSize_CodeSection) bUse_CodeSection=1;
    860871    else bUse_CodeSection=0;
     
    10521063
    10531064            if( !pDllProc->IsUsing() ){
    1054                 pDllProc=pDllProc->pNextData;
    10551065                continue;
    10561066            }
     
    10701080
    10711081
    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==0
    1097             &&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 
    11131082    if( compiler.IsDll() ){
    11141083        //DLLの場合はリロケーション情報を生成
    11151084        pobj_Reloc->ResetRelocBuffer();
    11161085    }
    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 
    11441086
    11451087
     
    11491091    compiler.linker.ResolveUserProcSchedules( MemPos_CodeSection );
    11501092    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 );
    11601094
    11611095
     
    13491283    memset((char *)CodeSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
    13501284    lstrcpy((char *)CodeSectionHeader.Name,".text");
    1351     CodeSectionHeader.Misc.VirtualSize=         obp;
     1285    CodeSectionHeader.Misc.VirtualSize=         MemSize_CodeSection;
    13521286    CodeSectionHeader.VirtualAddress=           MemPos_CodeSection; //開始アドレス
    13531287    CodeSectionHeader.SizeOfRawData=            FileSize_CodeSection;
     
    15461480
    15471481    //コード
    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    );
    15491489    i+=i2;
    15501490
     
    16291569    if(bUse_RWSection){
    16301570        //リライタブル データ テーブル(グローバル変数の初期バッファ)
    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 );
    16371582    }
    16381583
     
    17091654    HeapDefaultFree(pHintTable);
    17101655
    1711     //グローバル変数の初期バッファを解放
    1712     HeapDefaultFree(initGlobalBuf);
    1713 
    1714     //コードバッファを解放
    1715     free(OpBuffer);
    1716     OpBuffer=0;
    1717 
    17181656    //リソースセクションバッファを解放
    17191657    HeapDefaultFree(RSrcSectionBuffer);
Note: See TracChangeset for help on using the changeset viewer.