Changeset 263 in dev for trunk/abdev/BasicCompiler64


Ignore:
Timestamp:
Aug 5, 2007, 3:47:49 AM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev/BasicCompiler64
Files:
6 edited

Legend:

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

    r262 r263  
    6060        if( subs.size() == 1 ){
    6161            char temporary[VN_SIZE];
    62             sprintf( temporary, "ActiveBasic.Core._System_TypeBase.Search(\"\",\"%s\"))", pobj_c->GetName().c_str() );
     62            sprintf( temporary, "_System_TypeBase_Search(\"\",\"%s\"))", pobj_c->GetName().c_str() );
    6363
    6464            Opcode_CallProc(temporary,
     
    258258
    259259    //jnzの番地
    260     int jnz_back;
    261     jnz_back=obp;
     260    //int jnz_back=obp;
    262261
    263262    //mov qword ptr[rsp+offset],rcx     ※スタックフレームを利用
     
    280279
    281280    //jnz ↑
    282     compiler.codeGenerator.op_jne( jnz_back-obp, sizeof(long), false, true );
     281    //compiler.codeGenerator.op_jne( jnz_back-obp, sizeof(long), false, true );
    283282
    284283
  • trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp

    r262 r263  
    140140        && userProc.HasParentClass()
    141141        && userProc.GetParentClass().GetName() == "_System_TypeBase" ){
    142 
    143142            compiler.objectModule.meta.GetClasses().Compile_System_InitializeUserTypes();
    144143    }
     
    670669
    671670
    672     pUserProc->SetEndOpAddress( obp );
     671    pUserProc->_endOpAddressOld = obp;
    673672
    674673
  • trunk/abdev/BasicCompiler64/Compile_Statement.cpp

    r262 r263  
    272272        {
    273273            //jmp ...(schedule)
    274             extern int obp;
    275274            compiler.codeGenerator.op_jmp_goto_schedule( (const std::string)(Parameter + 1), 0, cp );
    276275        }
     
    289288        {
    290289            //jmp ...(schedule)
    291             extern int obp;
    292290            compiler.codeGenerator.op_jmp_goto_schedule( "", LineNum, cp );
    293291        }
  • trunk/abdev/BasicCompiler64/MakePeHdr.cpp

    r262 r263  
    222222
    223223    //コードと行番号の関係
    224     extern LINEINFO *pLineInfo;
    225     extern int MaxLineInfoNum;
    226     pLineInfo=(LINEINFO *)HeapAlloc(hHeap,0,1);
    227     MaxLineInfoNum=0;
     224    extern SourceLines oldSourceLines;
     225    oldSourceLines.clear();
    228226
    229227
     
    387385
    388386        //未完成
    389         //OpBuffer[obp++]=(char)0xCC;
     387        //breakpoint;
    390388
    391389        //sub rsp,スタックフレームサイズ
     
    503501    //////////////////////////////////////////////////////////
    504502
     503
     504
     505    trace( "コード生成が終了しました。" );
     506
     507    vector<ObjectModule *> masterObjectModules;
     508    masterObjectModules.push_back( &compiler.objectModule );
     509    compiler.linker.Link( masterObjectModules );
    505510
    506511
     
    836841
    837842    //機械語コードとBasicコードの関係を整理
    838     extern LINEINFO *pLineInfo;
    839     extern int MaxLineInfoNum;
     843    extern SourceLines oldSourceLines;
    840844    int MinObp,MaxObp;
    841     LINEINFO *pTempLineInfo;
    842     pTempLineInfo=(LINEINFO *)HeapAlloc(hHeap,0,MaxLineInfoNum*sizeof(LINEINFO));
    843     i2=0;
     845    SourceLines tempSourceLines;
    844846    MaxObp=0;
    845847    while(1){
    846         for(i3=0,MinObp=0x0FFFFFFF;i3<MaxLineInfoNum;i3++){
    847             if(pLineInfo[i3].TopObp<MinObp&&MaxObp<pLineInfo[i3].TopObp){
    848                 MinObp=pLineInfo[i3].TopObp;
     848        for(i3=0,MinObp=0x0FFFFFFF;i3<oldSourceLines.size();i3++){
     849            if(oldSourceLines[i3].GetNativeCodePos()<MinObp&&MaxObp<oldSourceLines[i3].GetNativeCodePos()){
     850                MinObp=oldSourceLines[i3].GetNativeCodePos();
    849851                i4=i3;
    850852            }
    851853        }
    852854        if(MinObp==0x0FFFFFFF) break;
    853         pTempLineInfo[i2]=pLineInfo[i4];
    854         MaxObp=pTempLineInfo[i2].TopObp;
    855         i2++;
    856     }
    857     HeapDefaultFree(pLineInfo);
    858     pLineInfo=(LINEINFO *)HeapAlloc(hHeap,0,i2*sizeof(LINEINFO));
    859     memcpy(pLineInfo,pTempLineInfo,i2*sizeof(LINEINFO));
    860     MaxLineInfoNum=i2;
    861     HeapDefaultFree(pTempLineInfo);
     855        tempSourceLines.push_back( oldSourceLines[i4] );
     856        MaxObp=tempSourceLines.back().GetNativeCodePos();
     857    }
     858    oldSourceLines = tempSourceLines;
    862859
    863860    //デバッグセクションを生成
     
    11651162
    11661163
     1164
     1165    compiler.linker.SetImageBase( ImageBase );
     1166    compiler.linker.ResolveDataTableSchedules( MemPos_DataSection );
     1167    compiler.linker.ResolveDllProcSchedules( MemPos_CodeSection, MemPos_ImportSection, LookupSize, HintSize );
     1168    compiler.linker.ResolveUserProcSchedules( MemPos_CodeSection );
     1169    compiler.linker.ResolveGlobalVarSchedules( MemPos_RWSection );
     1170
     1171    if( obp == compiler.linker.GetNativeCode().GetSize() )
     1172    {
     1173        memcpy( OpBuffer, compiler.linker.GetNativeCode().GetCodeBuffer(), compiler.linker.GetNativeCode().GetSize() );
     1174    }
     1175    else
     1176    {
     1177        SetError();
     1178    }
     1179
     1180
    11671181    ////////////////////////////////
    11681182    // リソースアドレススケジュール
  • trunk/abdev/BasicCompiler64/Opcode.h

    r262 r263  
    4545
    4646
    47 class CStackFrame:public CSchedule{
     47class CStackFrame
     48{
    4849    ///////////////////////////
    4950    // スタックフレーム管理
    5051    ///////////////////////////
     52
     53    PertialSchedules pertialSchedules;
    5154
    5255    int lowest_sp;          //スタックポインタの最下位位置
  • trunk/abdev/BasicCompiler64/stack_frame.cpp

    r232 r263  
    3939
    4040    //add reg,now_sp
    41     compiler.codeGenerator.op_add_RV( reg, now_sp );
    42 
    43     //スケジュールをセット
    44     obp-=sizeof(long);
    45     add();
    46     obp+=sizeof(long);
     41    pertialSchedules.push_back(
     42        compiler.codeGenerator.op_add_RV( reg, now_sp, Schedule::None, true )
     43    );
    4744}
    4845int CStackFrame::push(int reg){
     
    5350
    5451    //mov qword ptr[rsp+offset],reg
    55     compiler.codeGenerator.op_mov_MR(sizeof(_int64),reg,REG_RSP,now_sp,MOD_BASE_DISP32);
    56 
    57     //スケジュールをセット
    58     obp-=sizeof(long);
    59     add();
    60     obp+=sizeof(long);
     52    pertialSchedules.push_back(
     53        compiler.codeGenerator.op_mov_MR(sizeof(_int64),reg,REG_RSP,now_sp,MOD_BASE_DISP32, Schedule::None, true)
     54    );
    6155
    6256    return now_sp;
     
    6862    if(varSize==sizeof(double)){
    6963        //movlpd qword ptr[rsp+offset],xmm_reg
    70         compiler.codeGenerator.op_movlpd_MR(xmm_reg,REG_RSP,now_sp,MOD_BASE_DISP32);
     64        pertialSchedules.push_back(
     65            compiler.codeGenerator.op_movlpd_MR(xmm_reg,REG_RSP,now_sp,MOD_BASE_DISP32, Schedule::None, true )
     66        );
    7167    }
    7268    if(varSize==sizeof(float)){
    7369        //movss dword ptr[rsp+offset],xmm_reg
    74         compiler.codeGenerator.op_movss_MR( xmm_reg, REG_RSP, now_sp, MOD_BASE_DISP32 );
     70        pertialSchedules.push_back(
     71            compiler.codeGenerator.op_movss_MR( xmm_reg, REG_RSP, now_sp, MOD_BASE_DISP32, Schedule::None, true )
     72        );
    7573    }
    76 
    77     //スケジュールをセット
    78     obp-=sizeof(long);
    79     add();
    80     obp+=sizeof(long);
    8174}
    8275void CStackFrame::ref_offset_data( int reg, int sp_offset ){
    8376    //mov reg,qword ptr[rsp+offset]     ※スタックフレームを利用
    84     compiler.codeGenerator.op_mov_RM(sizeof(_int64),reg,REG_RSP,sp_offset,MOD_BASE_DISP32);
    85 
    86     //スケジュールをセット
    87     obp-=sizeof(long);
    88     add();
    89     obp+=sizeof(long);
     77    pertialSchedules.push_back(
     78        compiler.codeGenerator.op_mov_RM(sizeof(_int64),reg,REG_RSP,sp_offset,MOD_BASE_DISP32, Schedule::None, true )
     79    );
    9080}
    9181void CStackFrame::ref(int reg){
     
    9585    if(varSize==sizeof(double)){
    9686        //movlpd xmm_reg,qword ptr[rsp+offset]
    97         compiler.codeGenerator.op_movlpd_RM(xmm_reg,REG_RSP,now_sp,MOD_BASE_DISP32);
     87        pertialSchedules.push_back(
     88            compiler.codeGenerator.op_movlpd_RM(xmm_reg,REG_RSP,now_sp,MOD_BASE_DISP32, Schedule::None, true )
     89        );
    9890    }
    9991    if(varSize==sizeof(float)){
    10092        //movss xmm_reg,dword ptr[rsp+offset]
    101         compiler.codeGenerator.op_movss_MR( xmm_reg, REG_RSP, now_sp, MOD_BASE_DISP32 );
     93        pertialSchedules.push_back(
     94            compiler.codeGenerator.op_movss_MR( xmm_reg, REG_RSP, now_sp, MOD_BASE_DISP32, Schedule::None, true )
     95        );
    10296    }
    103 
    104     //スケジュールをセット
    105     obp-=sizeof(long);
    106     add();
    107     obp+=sizeof(long);
    10897}
    10998void CStackFrame::pop(int reg){
     
    121110}
    122111void CStackFrame::RunningSchedule( int stackFrameSize ){
    123     for(int i=0;i<num;i++){
    124         *((long *)(OpBuffer+pObpValues[i])) += stackFrameSize;
     112    BOOST_FOREACH( const PertialSchedule *pPertialSchedule, pertialSchedules )
     113    {
     114        compiler.codeGenerator.opfix_offset( pPertialSchedule, stackFrameSize );
    125115    }
    126116}
Note: See TracChangeset for help on using the changeset viewer.