Changeset 309 in dev


Ignore:
Timestamp:
Aug 29, 2007, 9:19:17 AM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev/BasicCompiler64
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler64/BasicCompiler.vcproj

    r308 r309  
    412412                    </File>
    413413                </Filter>
    414                 <Filter
    415                     Name="Low Level Classes"
    416                     >
    417                     <File
    418                         RelativePath="..\BasicCompiler_Common\include\StackFrame.h"
    419                         >
    420                     </File>
    421                 </Filter>
    422414            </Filter>
    423415        </Filter>
  • trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp

    r308 r309  
    146146
    147147            Compile_AddGlobalRootsForGc();
     148    }
     149    else if( userProc.GetName() == compiler.globalAreaProcName ){
     150        ////////////////////////////////////////
     151        // グローバル領域をコンパイル
     152        ////////////////////////////////////////
     153
     154        const UserProc *pBackUserProc = &UserProc::CompilingUserProc();
     155        UserProc::CompileStartForGlobalArea();
     156
     157        int BackCp = cp;
     158        cp=-1;
     159
     160        //クラスに属する静的メンバを定義
     161        compiler.GetObjectModule().meta.GetClasses().InitStaticMember();
     162
     163        //グローバル実行領域をコンパイル開始
     164        CompileBuffer(0,0);
     165
     166        //Goto未知ラベルスケジュールが存在したらエラーにする
     167        BOOST_FOREACH( const GotoLabelSchedule *pGotoLabelSchedule, compiler.codeGenerator.gotoLabelSchedules )
     168        {
     169            if(pGotoLabelSchedule->GetName().size()>0){
     170                SetError(6,pGotoLabelSchedule->GetName(),pGotoLabelSchedule->GetSourceCodePos());
     171            }
     172            else{
     173                char temporary[255];
     174                sprintf(temporary,"%d",pGotoLabelSchedule->GetLineNum());
     175                SetError(6,temporary,pGotoLabelSchedule->GetSourceCodePos());
     176            }
     177        }
     178
     179        UserProc::CompileStartForUserProc( pBackUserProc );
     180        cp=BackCp;
    148181    }
    149182    else{
     
    691724        else SetError(300,NULL,cp);
    692725    }
     726    else
     727    {
     728        // グローバル領域を一番初めにコンパイルする
     729        extern const UserProc *pSub_System_GlobalArea;
     730        CompileBufferInProcedure( *pSub_System_GlobalArea );
     731    }
    693732
    694733    //_System_TypeBase_InitializeUserTypesは一番最後にコンパイル
  • trunk/abdev/BasicCompiler64/MakePeHdr.cpp

    r308 r309  
    2424const UserProc
    2525    *pSub_System_StartupProgram,
     26    *pSub_System_GlobalArea,
    2627    *pSub_DebugSys_StartProc,
    2728    *pSub_DebugSys_EndProc,
     
    224225        pSub_System_StartupProgram->Using();
    225226
     227    if(pSub_System_GlobalArea=GetSubHash(compiler.globalAreaProcName.c_str(),1))
     228    {
     229        pSub_System_GlobalArea->Using();
     230        pSub_System_GlobalArea->ThisIsAutoGenerationProc();
     231    }
     232
    226233    if(pSub_DebugSys_StartProc=GetSubHash("_DebugSys_StartProc",1))
    227234        pSub_DebugSys_StartProc->Using();
     
    344351
    345352        //スタックフレーム管理用クラスを選択
    346         pobj_sf = &compiler.GetObjectModule().globalStackFrame;
     353        pobj_sf=new StackFrame();
    347354
    348355        // コード生成対象を選択
     
    358365        {
    359366            //sub rsp,スタックフレームサイズ
    360             const PertialSchedule *pStackFramePertialSchedule = compiler.codeGenerator.op_sub_rsp( 0, true );
     367            compiler.codeGenerator.op_sub_RV( sizeof(_int64), REG_RSP, 0x100 );
    361368
    362369            if(bDebugCompile){
     
    372379        }
    373380
    374         //クラスに属する静的メンバを定義
    375         compiler.GetObjectModule().meta.GetClasses().InitStaticMember();
    376 
    377         //グローバル実行領域をコンパイル開始
    378         CompileBuffer(0,0);
    379 
    380         //Goto未知ラベルスケジュールが存在したらエラーにする
    381         BOOST_FOREACH( const GotoLabelSchedule *pGotoLabelSchedule, compiler.codeGenerator.gotoLabelSchedules )
    382         {
    383             if(pGotoLabelSchedule->GetName().size()>0){
    384                 SetError(6,pGotoLabelSchedule->GetName(),pGotoLabelSchedule->GetSourceCodePos());
    385             }
    386             else{
    387                 sprintf(temporary,"%d",pGotoLabelSchedule->GetLineNum());
    388                 SetError(6,temporary,pGotoLabelSchedule->GetSourceCodePos());
    389             }
    390         }
     381        // _System_GlobalArea の呼び出し
     382        compiler.codeGenerator.op_call( pSub_System_GlobalArea );
    391383
    392384
     
    403395
    404396            //add rsp,スタックフレームサイズ
    405             int stackFrameSize = pobj_sf->GetFrameSize(0);
    406             compiler.codeGenerator.op_add_RV( REG_RSP, stackFrameSize );
     397            compiler.codeGenerator.op_add_RV( REG_RSP, 0x100 );
    407398
    408399            //xor rax,rax(raxを0に初期化する)
     
    411402            //ret
    412403            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         }
     404        }
     405
     406        //スタックフレームスケジュールを実行
     407        pobj_sf->RunningSchedule( 0x100 );
     408        delete pobj_sf;
     409        pobj_sf=0;
    421410
    422411        //グローバル実行領域のコードサイズ
  • trunk/abdev/BasicCompiler64/Opcode.h

    r308 r309  
    4343
    4444
     45class StackFrame
     46{
     47    ///////////////////////////
     48    // スタックフレーム管理
     49    ///////////////////////////
     50
     51    PertialSchedules pertialSchedules;
     52
     53    int lowest_sp;          //スタックポインタの最下位位置
     54    int now_sp;             //スタックポインタ
     55    int max_parm_size;      //パラメータの最大サイズ
     56
     57public:
     58    //コンストラクタ
     59    StackFrame();
     60
     61    //デストラクタ
     62    ~StackFrame();
     63
     64    int GetFrameSize( int localParamSize );
     65    int GetNowSp();
     66    void mov_sp( int reg );
     67    int push(int reg);
     68    void push(int xmm_reg,int varSize);
     69    void ref_offset_data( int reg, int sp_offset );
     70    void ref(int reg);
     71    void ref(int xmm_reg,int varSize);
     72    void pop(int reg = REG_NON);
     73    void pop(int xmm_reg,int varSize);
     74    void parameter_allocate(int size);
     75    void RunningSchedule( int stackFrameSize );
     76
     77    void error_check(void);
     78};
    4579extern StackFrame *pobj_sf;
    4680
Note: See TracChangeset for help on using the changeset viewer.