Changeset 308 in dev for trunk/abdev/BasicCompiler32


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

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

Location:
trunk/abdev/BasicCompiler32
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/Compile_Calc_PushVar.cpp

    r290 r308  
    5959    }
    6060}
    61 void SetReg_WholeVariable( Type &type, RELATIVE_VAR *pRelativeVar,int reg, bool is64Head)
     61void SetReg_WholeVariable( const Type &type, RELATIVE_VAR *pRelativeVar,int reg, bool is64Head)
    6262{
    6363    int varSize;
  • trunk/abdev/BasicCompiler32/Compile_ProcOp.cpp

    r299 r308  
    226226            Compile_AddGlobalRootsForGc();
    227227    }
     228    else if( userProc.GetName() == compiler.globalAreaProcName ){
     229        ////////////////////////////////////////
     230        // グローバル領域をコンパイル
     231        ////////////////////////////////////////
     232
     233        const UserProc *pBackUserProc = &UserProc::CompilingUserProc();
     234        UserProc::CompileStartForGlobalArea();
     235
     236        int BackCp = cp;
     237        cp=-1;
     238
     239        //クラスに属する静的メンバを定義
     240        compiler.GetObjectModule().meta.GetClasses().InitStaticMember();
     241
     242        //グローバル実行領域をコンパイル開始
     243        CompileBuffer(0,0);
     244
     245        //Goto未知ラベルスケジュールが存在したらエラーにする
     246        BOOST_FOREACH( const GotoLabelSchedule *pGotoLabelSchedule, compiler.codeGenerator.gotoLabelSchedules )
     247        {
     248            if(pGotoLabelSchedule->GetName().size()>0){
     249                SetError(6,pGotoLabelSchedule->GetName(),pGotoLabelSchedule->GetSourceCodePos());
     250            }
     251            else{
     252                char temporary[255];
     253                sprintf(temporary,"%d",pGotoLabelSchedule->GetLineNum());
     254                SetError(6,temporary,pGotoLabelSchedule->GetSourceCodePos());
     255            }
     256        }
     257
     258        UserProc::CompileStartForUserProc( pBackUserProc );
     259        cp=BackCp;
     260    }
    228261    else{
    229262        SetError();
     
    422455    //Continueアドレスを初期化
    423456    compiler.codeGenerator.ClearContinueArea();
     457
     458    //レキシカルスコープ情報を初期化
     459    compiler.codeGenerator.lexicalScopes.Init( compiler.codeGenerator.GetNativeCodeSize() );
    424460
    425461    const PertialSchedule *pEspOffsetPertialSchedule = NULL;
     
    768804}
    769805void CompileLocal(){
    770     if( compiler.IsDll() ){
     806    if( compiler.IsDll() )
     807    {
    771808        //DLLの場合はグローバル変数を初期化するための関数を一番初めにコンパイルする
    772809        const UserProc *pUserProc=GetSubHash("_System_InitDllGlobalVariables");
     
    775812        }
    776813        else SetError(300,NULL,cp);
     814    }
     815    else
     816    {
     817        // グローバル領域を一番初めにコンパイルする
     818        extern const UserProc *pSub_System_GlobalArea;
     819        CompileBufferInProcedure( *pSub_System_GlobalArea );
    777820    }
    778821
  • trunk/abdev/BasicCompiler32/MakePeHdr.cpp

    r294 r308  
    77#include <jenga/include/smoothie/Smoothie.h>
    88
    9 #include <LexicalScope.h>
    109#include <Class.h>
    1110#include <Compiler.h>
    12 #include <NamespaceSupporter.h>
    1311
    1412#include <../Enum.h>
     
    1816#include "Opcode.h"
    1917
    20 extern int GlobalOpBufferSize;
    21 
    2218
    2319////////////////////////////
     
    2824const UserProc
    2925    *pSub_System_StartupProgram,
     26    *pSub_System_GlobalArea,
    3027    *pSub_DebugSys_StartProc,
    3128    *pSub_DebugSys_EndProc,
     
    106103
    107104
    108 void DebugVariable(void){
    109     char temporary[255];
    110     if( compiler.GetObjectModule().meta.GetGlobalVars().Find( Symbol( "_DebugSys_dwThreadID" ) ) == NULL )
    111     {
    112         // 未定義の場合は定義する
    113         sprintf(temporary,"_DebugSys_dwThreadID[255]%c%cDWord",1,ESC_AS);
    114         OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
    115         sprintf(temporary,"_DebugSys_ProcNum[255]%c%cDWord",1,ESC_AS);
    116         OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
    117         sprintf(temporary,"_DebugSys_lplpObp[255]%c%c*ULONG_PTR",1,ESC_AS);
    118         OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
    119         sprintf(temporary,"_DebugSys_lplpSpBase[255]%c%c*ULONG_PTR",1,ESC_AS);
    120         OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
    121     }
    122 }
    123 
    124105void Compile(void){
    125106    extern HWND hMainDlg;
     
    220201        pSub_System_StartupProgram->Using();
    221202
     203    if(pSub_System_GlobalArea=GetSubHash(compiler.globalAreaProcName.c_str(),1))
     204    {
     205        pSub_System_GlobalArea->Using();
     206        pSub_System_GlobalArea->ThisIsAutoGenerationProc();
     207    }
     208
    222209    if(pSub_DebugSys_StartProc=GetSubHash("_DebugSys_StartProc",1))
    223210        pSub_DebugSys_StartProc->Using();
     
    392379            if(bDebugCompile)
    393380            {
    394                 //デバッグ用の変数を定義
     381                // デバッグ用の変数を定義
    395382                DebugVariable();
    396383            }
    397384
    398             //GC用の変数を定義
     385            // GC用の変数を定義
    399386            InitGCVariables();
    400387
    401             //_System_StartupProgramの呼び出し
     388            // _System_StartupProgram の呼び出し
    402389            compiler.codeGenerator.op_call(pSub_System_StartupProgram);
    403390        }
    404391
    405         //クラスに属する静的メンバを定義
    406         compiler.GetObjectModule().meta.GetClasses().InitStaticMember();
    407 
    408         //グローバル実行領域をコンパイル開始
    409         CompileBuffer(0,0);
    410 
    411         //Goto未知ラベルスケジュールが存在したらエラーにする
    412         BOOST_FOREACH( const GotoLabelSchedule *pGotoLabelSchedule, compiler.codeGenerator.gotoLabelSchedules )
    413         {
    414             if(pGotoLabelSchedule->GetName().size()>0){
    415                 SetError(6,pGotoLabelSchedule->GetName(),pGotoLabelSchedule->GetSourceCodePos());
    416             }
    417             else{
    418                 sprintf(temporary,"%d",pGotoLabelSchedule->GetLineNum());
    419                 SetError(6,temporary,pGotoLabelSchedule->GetSourceCodePos());
    420             }
    421         }
    422 
     392        // _System_GlobalArea の呼び出し
     393        compiler.codeGenerator.op_call( pSub_System_GlobalArea );
    423394
    424395        if( !compiler.IsStaticLibrary() )
     
    444415
    445416        //グローバル実行領域のコードサイズ
     417        extern int GlobalOpBufferSize;
    446418        GlobalOpBufferSize = compiler.linker.GetNativeCode().GetSize();
    447419
  • trunk/abdev/BasicCompiler32/NumOpe_Logical.cpp

    r290 r308  
    450450
    451451        //cmp eax,0
    452         compiler.codeGenerator.op_cmp_value(Type(type[sp-1],-1).GetSize(),REG_EAX,0);
     452        compiler.codeGenerator.op_cmp_value(Type(type[sp-1]).GetSize(),REG_EAX,0);
    453453
    454454        //setne al
  • trunk/abdev/BasicCompiler32/Opcode.h

    r301 r308  
    147147//Compile_Calc_PushVar.cpp
    148148void SetReg_RealVariable(int type,RELATIVE_VAR *pRelativeVar);
    149 void SetReg_WholeVariable( Type &type, RELATIVE_VAR *pRelativeVar,int reg, bool is64Head = false);
     149void SetReg_WholeVariable( const Type &type, RELATIVE_VAR *pRelativeVar,int reg, bool is64Head = false);
    150150void PushLongVariable(RELATIVE_VAR *pRelativeVar);
    151151
Note: See TracChangeset for help on using the changeset viewer.