Changeset 75 in dev for BasicCompiler64/MakePeHdr.cpp


Ignore:
Timestamp:
Mar 20, 2007, 4:36:16 AM (17 years ago)
Author:
dai_9181
Message:

TYPEINFO→Typeへのリファクタリングを実施。64bitはほぼ完了。32bitが全般的に未完成。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler64/MakePeHdr.cpp

    r73 r75  
    66// 特殊関数の構造体ポインタ
    77////////////////////////////
    8 SubInfo
     8UserProc
    99    *pSub_System_StartupProgram,
    1010    *pSub_DebugSys_StartProc,
     
    136136
    137137    //関数ポインタ情報を初期化
    138     extern PROCPTRINFO *pProcPtrInfo;
     138    extern ProcPointer **ppProcPointer;
    139139    extern int ProcPtrInfoNum;
    140     pProcPtrInfo=(PROCPTRINFO *)HeapAlloc(hHeap,0,1);
     140    ppProcPointer=(ProcPointer **)HeapAlloc(hHeap,0,1);
    141141    ProcPtrInfoNum=0;
    142142
     
    170170
    171171    if(pSub_System_StartupProgram=GetSubHash("_System_StartupProgram",1))
    172         pSub_System_StartupProgram->bUse=1;
     172        pSub_System_StartupProgram->Using();
    173173
    174174    if(pSub_DebugSys_StartProc=GetSubHash("_DebugSys_StartProc",1))
    175         pSub_DebugSys_StartProc->bUse=1;
     175        pSub_DebugSys_StartProc->Using();
    176176
    177177    if(pSub_DebugSys_EndProc=GetSubHash("_DebugSys_EndProc",1))
    178         pSub_DebugSys_EndProc->bUse=1;
     178        pSub_DebugSys_EndProc->Using();
    179179
    180180    if(pSub_DebugSys_SaveContext=GetSubHash("_DebugSys_SaveContext",1))
    181         pSub_DebugSys_SaveContext->bUse=1;
     181        pSub_DebugSys_SaveContext->Using();
    182182
    183183    if(pSub_System_GetEip=GetSubHash("_System_GetEip",1)){
    184         pSub_System_GetEip->bUse=1;
    185         pSub_System_GetEip->bSystem=1;
     184        pSub_System_GetEip->Using();
     185        pSub_System_GetEip->ThisIsSystemProc();
    186186    }
    187187
    188188    if(pSub_System_InitDllGlobalVariables=GetSubHash("_System_InitDllGlobalVariables",1)){
    189         pSub_System_InitDllGlobalVariables->bUse=1;
    190         pSub_System_InitDllGlobalVariables->bSystem=1;
     189        pSub_System_InitDllGlobalVariables->Using();
     190        pSub_System_InitDllGlobalVariables->ThisIsSystemProc();
    191191    }
    192192
    193193    if(pSub_System_InitStaticLocalVariables=GetSubHash("_System_InitStaticLocalVariables",1)){
    194         pSub_System_InitStaticLocalVariables->bUse=1;
    195         pSub_System_InitStaticLocalVariables->bSystem=1;
     194        pSub_System_InitStaticLocalVariables->Using();
     195        pSub_System_InitStaticLocalVariables->ThisIsSystemProc();
    196196    }
    197197
    198198    if(pSub_System_Call_Destructor_of_GlobalObject=GetSubHash("_System_Call_Destructor_of_GlobalObject",1)){
    199         pSub_System_Call_Destructor_of_GlobalObject->bUse=1;
    200         pSub_System_Call_Destructor_of_GlobalObject->bSystem=1;
     199        pSub_System_Call_Destructor_of_GlobalObject->Using();
     200        pSub_System_Call_Destructor_of_GlobalObject->ThisIsSystemProc();
    201201    }
    202202
    203203    if(pSub_System_GetSp=GetSubHash("_System_GetSp",1)){
    204         pSub_System_GetSp->bUse=1;
    205         pSub_System_GetSp->bSystem=1;
     204        pSub_System_GetSp->Using();
     205        pSub_System_GetSp->ThisIsSystemProc();
    206206    }
    207207
    208208    if(pSub_pow=GetSubHash("pow",1))
    209         pSub_pow->bUse=1;
     209        pSub_pow->Using();
    210210
    211211    if(pSub_calloc=GetSubHash("calloc",1))
    212         pSub_calloc->bUse=1;
     212        pSub_calloc->Using();
    213213
    214214    if(pSub_realloc=GetSubHash("realloc",1))
    215         pSub_realloc->bUse=1;
     215        pSub_realloc->Using();
    216216
    217217    if(pSub_free=GetSubHash("free",1))
    218         pSub_free->bUse=1;
     218        pSub_free->Using();
    219219
    220220    if( pSub_System_GC_malloc_ForObject = GetSubHash( "_System_GC_malloc_ForObject",1 ) )
    221         pSub_System_GC_malloc_ForObject->bUse = 1;
     221        pSub_System_GC_malloc_ForObject->Using();
    222222
    223223    if( pSub_System_GC_malloc_ForObjectPtr = GetSubHash( "_System_GC_malloc_ForObjectPtr",1 ) )
    224         pSub_System_GC_malloc_ForObjectPtr->bUse = 1;
     224        pSub_System_GC_malloc_ForObjectPtr->Using();
    225225
    226226    if( pSub_System_GC_free_for_SweepingDelete = GetSubHash( "_System_GC_free_for_SweepingDelete",1 ) )
    227         pSub_System_GC_free_for_SweepingDelete->bUse = 1;
     227        pSub_System_GC_free_for_SweepingDelete->Using();
    228228
    229229
     
    271271
    272272    cp=-1;
    273     extern BOOL bCompilingGlobal;
    274     bCompilingGlobal=1;
     273    UserProc::CompileStartForGlobalArea();
    275274
    276275    if(!bDll){
     
    352351
    353352        //call _System_Call_Destructor_of_GlobalObject
    354         extern SubInfo *pSub_System_Call_Destructor_of_GlobalObject;
     353        extern UserProc *pSub_System_Call_Destructor_of_GlobalObject;
    355354        op_call(pSub_System_Call_Destructor_of_GlobalObject);
    356355
     
    405404    /////////////////////
    406405
    407     bCompilingGlobal=0;
    408 
    409406    //プロシージャをコンパイル開始
    410407    cp=0;
     
    429426    ////////////////////////////////
    430427    for(i=0;i<MAX_HASH;i++){
    431         extern DECLAREINFO **ppDeclareHash;
    432         DECLAREINFO *pdi;
    433         pdi=ppDeclareHash[i];
    434         while(pdi){
    435             if(pdi->bUse==0){
    436                 pdi=pdi->pNextData;
     428        extern DllProc **ppDeclareHash;
     429        const DllProc *pDllProc = ppDeclareHash[i];
     430        while(pDllProc){
     431            if( !pDllProc->IsUsing() ){
     432                pDllProc=pDllProc->pNextData;
    437433                continue;
    438434            }
     
    440436            //エラーチェック
    441437            HINSTANCE hLib;
    442             hLib=LoadLibrary(pdi->file);
     438            hLib=LoadLibrary( pDllProc->GetDllFileName().c_str() );
    443439            if(!hLib){
    444440                extern char OutputFileName[MAX_PATH];
     
    446442                _splitpath(OutputFileName,temp2,temp3,NULL,NULL);
    447443                lstrcat(temp2,temp3);
    448                 lstrcpy(temp3,pdi->file);
     444                lstrcpy(temp3,pDllProc->GetDllFileName().c_str());
    449445                GetFullPath(temp3,temp2);
    450446                hLib=LoadLibrary(temp3);
    451447
    452448                if(!hLib){
    453                     SetError(-106,pdi->file,pdi->pos);
     449                    SetError(-106,pDllProc->GetDllFileName().c_str(),pDllProc->GetCodePos());
    454450                }
    455451            }
    456452
    457453            if(hLib){
    458                 if(!GetProcAddress(hLib,pdi->alias)){
     454                if(!GetProcAddress(hLib,pDllProc->GetAlias().c_str())){
    459455                    FreeLibrary(hLib);
    460                     SetError(-107,pdi->alias,pdi->pos);
     456                    SetError(-107,pDllProc->GetAlias(),pDllProc->GetCodePos());
    461457                }
    462458                FreeLibrary(hLib);
    463459            }
    464460
    465             pdi=pdi->pNextData;
     461            pDllProc=pDllProc->pNextData;
    466462        }
    467463    }
     
    500496        ExportNamesLength=lstrlen(lpExportNames)+1;
    501497
    502         extern SubInfo **ppSubHash;
    503         SubInfo *psi,*psi2;
     498        extern UserProc **ppSubHash;
     499        UserProc *pUserProc,*psi2;
    504500        while(1){
    505501            //辞書順にサーチ
    506502            temporary[0]=0;
    507503            for(i=0,psi2=0;i<MAX_HASH;i++){
    508                 psi=ppSubHash[i];
    509                 while(psi){
    510                     if(psi->bExport){
     504                pUserProc=ppSubHash[i];
     505                while(pUserProc){
     506                    if(pUserProc->IsExport()){
    511507                        if(temporary[0]=='\0'){
    512                             lstrcpy(temporary,psi->name);
    513                             psi2=psi;
     508                            lstrcpy(temporary,pUserProc->GetName().c_str());
     509                            psi2=pUserProc;
    514510                        }
    515511                        else{
    516512                            i3=lstrlen(temporary);
    517                             i4=lstrlen(psi->name);
     513                            i4=(int)pUserProc->GetName().size();
    518514                            if(i3<i4) i3=i4;
    519                             if(memcmp(temporary,psi->name,i3)>0){
    520                                 lstrcpy(temporary,psi->name);
    521                                 psi2=psi;
     515                            if(memcmp(temporary,pUserProc->GetName().c_str(),i3)>0){
     516                                lstrcpy(temporary,pUserProc->GetName().c_str());
     517                                psi2=pUserProc;
    522518                            }
    523519                        }
    524520                    }
    525                     psi=psi->pNextData;
     521                    pUserProc=pUserProc->pNextData;
    526522                }
    527523            }
    528524            if(psi2==0) break;
    529             psi=psi2;
    530 
    531             psi->bExport=0;
    532 
    533             if(lstrcmpi(psi->name,"DllMain")==0)
    534                 DllMain_EntryPoint=psi->CompileAddress;
     525            pUserProc=psi2;
     526
     527            pUserProc->ExportOff();
     528
     529            if( pUserProc->GetName() == "DllMain" ){
     530                DllMain_EntryPoint=pUserProc->beginOpAddress;
     531            }
    535532
    536533            lpdwExportAddressTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportAddressTable,(ExportNum+1)*sizeof(DWORD));
    537             lpdwExportAddressTable[ExportNum]=psi->CompileAddress;
     534            lpdwExportAddressTable[ExportNum]=pUserProc->beginOpAddress;
    538535
    539536            lpdwExportNamePointerTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportNamePointerTable,(ExportNum+1)*sizeof(DWORD));
     
    543540            lpwExportOrdinalTable[ExportNum]=ExportNum;
    544541
    545             lstrcpy(lpExportNames+ExportNamesLength,psi->name);
     542            lstrcpy(lpExportNames+ExportNamesLength,pUserProc->GetName().c_str());
    546543            ExportNamesLength+=lstrlen(lpExportNames+ExportNamesLength)+1;
    547544
     
    576573    //インポートDLL情報
    577574    /////////////////////
    578     extern DECLAREINFO **ppDeclareHash;
    579     DECLAREINFO *pdi;
     575    extern DllProc **ppDeclareHash;
     576    DllProc *pDllProc;
    580577    char **ppDllNames;
    581578    int ImportDllNum;
     
    613610    ImportDllNum=0;
    614611    for(i=0;i<MAX_HASH;i++){
    615         pdi=ppDeclareHash[i];
    616         while(pdi){
    617             if(pdi->dwType==DECLARE_STATIC||
    618                 pdi->bUse==0){
    619                 pdi=pdi->pNextData;
     612        const DllProc *pDllProc=ppDeclareHash[i];
     613        while(pDllProc){
     614            if( !pDllProc->IsUsing() ){
     615                pDllProc=pDllProc->pNextData;
    620616                continue;
    621617            }
    622618
    623             if(lstrlen(pdi->file)>16){
     619            if( pDllProc->GetDllFileName().size() > 16 ){
    624620                SetError(7,NULL,cp);
    625621                break;
    626622            }
    627623            for(i2=0;i2<ImportDllNum;i2++){
    628                 if(lstrcmp(ppDllNames[i2],pdi->file)==0) break;
     624                if( pDllProc->GetDllFileName() == ppDllNames[i2] ){
     625                    break;
     626                }
    629627            }
    630628            if(i2==ImportDllNum){
    631629                ppDllNames=(char **)HeapReAlloc(hHeap,0,ppDllNames,(ImportDllNum+1)*sizeof(char **));
    632630                ppDllNames[ImportDllNum]=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,16);
    633                 lstrcpy(ppDllNames[ImportDllNum],pdi->file);
     631                lstrcpy(ppDllNames[ImportDllNum],pDllProc->GetDllFileName().c_str());
    634632                ImportDllNum++;
    635633            }
    636634
    637             pdi=pdi->pNextData;
     635            pDllProc=pDllProc->pNextData;
    638636        }
    639637    }
     
    651649        pImportDescriptor[i].Name=i*0x10;   //※すぐ下で再計算
    652650        for(i2=0;i2<MAX_HASH;i2++){
    653             pdi=ppDeclareHash[i2];
    654             while(pdi){
    655                 if(pdi->dwType==DECLARE_STATIC||
    656                     pdi->bUse==0){
    657                     pdi=pdi->pNextData;
     651            pDllProc=ppDeclareHash[i2];
     652            while(pDllProc){
     653                if( !pDllProc->IsUsing() ){
     654                    pDllProc=pDllProc->pNextData;
    658655                    continue;
    659656                }
    660657
    661                 if(lstrcmp(ppDllNames[i],pdi->file)==0){
     658                if( pDllProc->GetDllFileName() == ppDllNames[i] ){
    662659                    //ルックアップデータのサイズを追加
    663660                    LookupSize+=sizeof(_int64);
    664661                }
    665662
    666                 pdi=pdi->pNextData;
     663                pDllProc=pDllProc->pNextData;
    667664            }
    668665        }
     
    691688    for(i=0,i5=0;i<ImportDllNum;i++){
    692689        for(i2=0;i2<MAX_HASH;i2++){
    693             pdi=ppDeclareHash[i2];
    694             while(pdi){
    695                 if(pdi->dwType==DECLARE_STATIC||
    696                     pdi->bUse==0){
    697                     pdi=pdi->pNextData;
     690            pDllProc=ppDeclareHash[i2];
     691            while(pDllProc){
     692                if( !pDllProc->IsUsing() ){
     693                    pDllProc=pDllProc->pNextData;
    698694                    continue;
    699695                }
    700696
    701                 if(lstrcmp(ppDllNames[i],pdi->file)==0){
     697                if( pDllProc->GetDllFileName() == ppDllNames[i] ){
    702698                    //ルックアップの位置をセット(後にインポート アドレス テーブルにセットしなおされる)
    703                     pdi->LookupAddress=i5*sizeof(_int64);
     699                    pDllProc->SetLookupAddress( i5*sizeof(_int64) );
    704700
    705701                    //ルックアップ テーブルの値をセット
     
    714710                    pHintTable[HintSize++]=0;
    715711                    pHintTable[HintSize++]=0;
    716                     lstrcpy(pHintTable+HintSize,pdi->alias);
    717                     i4=lstrlen(pdi->alias);
     712                    lstrcpy(pHintTable+HintSize,pDllProc->GetAlias().c_str());
     713                    i4=(int)pDllProc->GetAlias().size();
    718714                    HintSize+=i4+1;
    719715                    if(i4%2==0) pHintTable[HintSize++]=0;
     
    725721                }
    726722
    727                 pdi=pdi->pNextData;
     723                pDllProc=pDllProc->pNextData;
    728724            }
    729725        }
     
    742738    //グローバル変数情報を扱う構造体も初期バッファの有無による配置を行う
    743739    //(デバッグ情報で利用される)
    744     extern int MaxGlobalVarNum;
    745     extern VARIABLE *GlobalVar;
    746740    extern int AllInitGlobalVarSize;
    747     for(i=0;i<MaxGlobalVarNum;i++){
    748         if(GlobalVar[i].offset&0x80000000){
    749             GlobalVar[i].offset=(GlobalVar[i].offset&0x7FFFFFFF)+AllInitGlobalVarSize;
     741    foreach( Variable *pVar, globalVars ){
     742        if(pVar->offset&0x80000000){
     743            pVar->offset=(pVar->offset&0x7FFFFFFF)+AllInitGlobalVarSize;
    750744        }
    751745    }
     
    997991
    998992        for(i2=0;i2<MAX_HASH;i2++){
    999             pdi=ppDeclareHash[i2];
    1000             while(pdi){
    1001                 if(pdi->bUse==0){
    1002                     pdi=pdi->pNextData;
     993            const DllProc *pDllProc=ppDeclareHash[i2];
     994            while(pDllProc){
     995                if( !pDllProc->IsUsing() ){
     996                    pDllProc=pDllProc->pNextData;
    1003997                    continue;
    1004998                }
    1005999
    1006                 if(lstrcmp(ppDllNames[i],pdi->file)==0){
     1000                if( pDllProc->GetDllFileName() == ppDllNames[i] ){
    10071001                    //ルックアップ テーブル
    10081002                    pLookupTable[i5++]+=MemPos_ImportSection;
    10091003                }
    10101004
    1011                 pdi=pdi->pNextData;
     1005                pDllProc=pDllProc->pNextData;
    10121006            }
    10131007        }
     
    10331027    // ※x86はRVAからのオフセット。x64はRPI(実行中アドレス)からのオフセット
    10341028    for(i=0;i<pobj_ImportAddrSchedule->num;i++){
    1035         DECLAREINFO *pdi;
    1036         pdi=pobj_ImportAddrSchedule->ppdi[i];
     1029        DllProc *pDllProc;
     1030        pDllProc=pobj_ImportAddrSchedule->ppdi[i];
    10371031        *((long *)(OpBuffer+pobj_ImportAddrSchedule->pObpValues[i]))=
    10381032            MemPos_ImportSection+
    1039             pdi->LookupAddress
     1033            pDllProc->GetLookupAddress()
    10401034            -(MemPos_CodeSection+pobj_ImportAddrSchedule->pObpValues[i]+sizeof(long));
    10411035    }
     
    10461040    // プロシージャポインタスケジュール
    10471041    for(i=0;i<pobj_SubAddrSchedule->num;i++){
    1048         if(pobj_SubAddrSchedule->ppsi[i]->CompileAddress==0
    1049             &&pobj_SubAddrSchedule->ppsi[i]->EndOpAddr==0){
     1042        if(pobj_SubAddrSchedule->ppsi[i]->beginOpAddress==0
     1043            &&pobj_SubAddrSchedule->ppsi[i]->endOpAddress==0){
    10501044            SetError(300,NULL,-1);
    10511045        }
     
    10531047        if(pobj_SubAddrSchedule->pbCall[i]){
    10541048            *((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))=
    1055                 pobj_SubAddrSchedule->ppsi[i]->CompileAddress-(pobj_SubAddrSchedule->pObpValues[i]+sizeof(long));
     1049                pobj_SubAddrSchedule->ppsi[i]->beginOpAddress-(pobj_SubAddrSchedule->pObpValues[i]+sizeof(long));
    10561050        }
    10571051        else{
    10581052            *((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))=
    1059                 pobj_SubAddrSchedule->ppsi[i]->CompileAddress+ImageBase+MemPos_CodeSection;
     1053                pobj_SubAddrSchedule->ppsi[i]->beginOpAddress+ImageBase+MemPos_CodeSection;
    10601054        }
    10611055    }
     
    10981092    //グローバル変数情報を扱う構造体も初期バッファの有無による配置を行う
    10991093    //(デバッグ情報で利用される)
    1100     extern int MaxGlobalVarNum;
    1101     extern VARIABLE *GlobalVar;
    1102     for(i=0;i<MaxGlobalVarNum;i++){
    1103         if(GlobalVar[i].offset&0x80000000){
    1104             GlobalVar[i].offset=(GlobalVar[i].offset&0x7FFFFFFF)+AllInitGlobalVarSize;
     1094    foreach( Variable *pVar, globalVars ){
     1095        if(pVar->offset&0x80000000){
     1096            pVar->offset=(pVar->offset&0x7FFFFFFF)+AllInitGlobalVarSize;
    11051097        }
    11061098    }
Note: See TracChangeset for help on using the changeset viewer.