Changeset 253 in dev for trunk/abdev/BasicCompiler_Common


Ignore:
Timestamp:
Jul 30, 2007, 4:12:54 PM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev/BasicCompiler_Common
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/Compile.cpp

    r250 r253  
    8888    extern LINEINFO *pLineInfo;
    8989    if(MaxLineInfoNum){
     90        extern int obp;
    9091        if(pLineInfo[MaxLineInfoNum-1].TopObp==obp){
    9192            pLineInfo[MaxLineInfoNum-1].TopCp=cp;
     
    9596    pLineInfo=(LINEINFO *)HeapReAlloc(hHeap,0,pLineInfo,(MaxLineInfoNum+1)*sizeof(LINEINFO));
    9697    pLineInfo[MaxLineInfoNum].TopCp=cp;
     98    extern int obp;
    9799    pLineInfo[MaxLineInfoNum].TopObp=obp;
    98100
     
    123125        pLabelNames[MaxLabelNum].pName=(char *)HeapAlloc(hHeap,0,lstrlen(Command+1)+1);
    124126        lstrcpy(pLabelNames[MaxLabelNum].pName,Command+1);
     127        extern int obp;
    125128        pLabelNames[MaxLabelNum].address=obp;
    126129        MaxLabelNum++;
    127130
    128131        //書き込みスケジュール
    129         std::vector<GotoLabelSchedule>::iterator it = compiler.codeGenerator.gotoLabelSchedules.begin();
     132        GotoLabelSchedules::iterator it = compiler.codeGenerator.gotoLabelSchedules.begin();
    130133        while( it != compiler.codeGenerator.gotoLabelSchedules.end() )
    131134        {
    132             if( it->GetName() == Command+1 )
     135            if( (*it)->GetName() == Command+1 )
    133136            {
    134                 *((long *)( OpBuffer + it->GetNativeCodePos() ))=obp-(it->GetNativeCodePos()+sizeof(long));
     137                compiler.codeGenerator.opfix_JmpPertialSchedule( (*it) );
    135138               
    136139                //詰める
     
    335338            extern BOOL bDebugCompile;
    336339            //int 3
    337             if(bDebugCompile) OpBuffer[obp++]=(char)0xCC;
     340            if(bDebugCompile)
     341            {
     342                breakpoint;
     343            }
    338344#if defined(_DEBUG)
    339             else OpBuffer[obp++]=(char)0xCC;
     345            else
     346            {
     347                breakpoint;
     348            }
    340349#endif
    341350            break;
     
    532541                pLabelNames[MaxLabelNum].pName=0;
    533542                pLabelNames[MaxLabelNum].line=i3;
     543                extern int obp;
    534544                pLabelNames[MaxLabelNum].address=obp;
    535545                MaxLabelNum++;
    536546
    537547                //書き込みスケジュール
    538                 std::vector<GotoLabelSchedule>::iterator it = compiler.codeGenerator.gotoLabelSchedules.begin();
     548                GotoLabelSchedules::iterator it = compiler.codeGenerator.gotoLabelSchedules.begin();
    539549                while( it != compiler.codeGenerator.gotoLabelSchedules.end() )
    540550                {
    541                     if( it->GetName().size() == 0 && it->GetLineNum() == i3 )
     551                    if( (*it)->GetName().size() == 0 && (*it)->GetLineNum() == i3 )
    542552                    {
    543                         *((long *)( OpBuffer + it->GetNativeCodePos() ))=obp-(it->GetNativeCodePos()+sizeof(long));
    544                        
     553                        compiler.codeGenerator.opfix_JmpPertialSchedule( (*it) );
     554
    545555                        //詰める
    546556                        it = compiler.codeGenerator.gotoLabelSchedules.erase( it );
  • trunk/abdev/BasicCompiler_Common/PESchedule.cpp

    r242 r253  
    154154void CSchedule::add(){
    155155    pObpValues=(int *)HeapReAlloc(hHeap,0,pObpValues,(num+1)*sizeof(int));
     156    extern int obp;
    156157    pObpValues[num]=obp;
    157158    num++;
     
    227228    if(!bCall){
    228229        //リロケーション情報を追加する
     230        extern int obp;
    229231        pobj_Reloc->AddSchedule_CodeSection(obp);
    230232    }
  • trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h

    r252 r253  
    1212void ReallocNativeCodeBuffer();
    1313
    14 //Goto未知ラベル
    15 class GotoLabelSchedule
    16 {
    17     std::string name;
    18     int line;
    19     int nativeCodePos;
    20     int sourceCodePos;
    21 public:
    22     GotoLabelSchedule( const std::string &name, int nativeCodePos, int sourceCodePos )
    23         : name( name )
    24         , line( -1 )
    25         , nativeCodePos( nativeCodePos )
    26         , sourceCodePos( sourceCodePos )
    27     {
    28     }
    29     GotoLabelSchedule( int line, int nativeCodePos, int sourceCodePos )
    30         : line( line )
    31         , nativeCodePos( nativeCodePos )
    32         , sourceCodePos( sourceCodePos )
    33     {
    34     }
    35     const std::string &GetName() const
    36     {
    37         return name;
    38     }
    39     int GetLineNum() const
    40     {
    41         return line;
    42     }
    43     int GetNativeCodePos() const
    44     {
    45         return nativeCodePos;
    46     }
    47     int GetSourceCodePos() const
    48     {
    49         return sourceCodePos;
    50     }
    51 };
    52 
    5314// コード生成時の部分的なスケジューリング
    5415class PertialSchedule
     
    8546typedef std::vector<const PertialSchedule *> PertialSchedules;
    8647
     48//Goto未知ラベル
     49class GotoLabelSchedule : public PertialSchedule
     50{
     51    std::string name;
     52    int line;
     53    int sourceCodePos;
     54public:
     55    GotoLabelSchedule( const std::string &name, int nativeCodePos, int sourceCodePos )
     56        : PertialSchedule( nativeCodePos, sizeof(long) )
     57        , name( name )
     58        , line( -1 )
     59        , sourceCodePos( sourceCodePos )
     60    {
     61    }
     62    GotoLabelSchedule( int line, int nativeCodePos, int sourceCodePos )
     63        : PertialSchedule( nativeCodePos, sizeof(long) )
     64        , line( line )
     65        , sourceCodePos( sourceCodePos )
     66    {
     67    }
     68    const std::string &GetName() const
     69    {
     70        return name;
     71    }
     72    int GetLineNum() const
     73    {
     74        return line;
     75    }
     76    int GetSourceCodePos() const
     77    {
     78        return sourceCodePos;
     79    }
     80};
     81typedef std::vector<const GotoLabelSchedule *> GotoLabelSchedules;
     82
    8783class LexicalScope
    8884{
     
    186182public:
    187183
     184    // ローカル変数用スケジュールの管理
     185    PertialSchedules localVarPertialSchedules;
     186
    188187    // Exit Subスケジュールの管理
    189188    std::vector<long> exitSubCodePositions;
     
    191190
    192191    // Gotoスケジュールの管理
    193     std::vector<GotoLabelSchedule> gotoLabelSchedules;
     192    GotoLabelSchedules gotoLabelSchedules;
    194193
    195194    // レキシカルスコープの管理
     
    256255
    257256    void opfix( const PertialSchedule *pPertialSchedule, long newValue );
     257    void opfix_offset( const PertialSchedule *pPertialSchedule, long offset );
    258258    void opfix_JmpPertialSchedule( const PertialSchedule *pPertialSchedule );
    259259
     
    279279    void op_jmp_continue();
    280280    void op_jmp_exitsub();
    281     void op_jmp_goto_schedule( const GotoLabelSchedule &gotoLabelSchedule );
     281    void op_jmp_goto_schedule( const std::string &name, int lineNum, int sourceCodePos );
    282282
    283283
     
    370370    const PertialSchedule *__op_format(char op_prefix,char opcode1,char opcode2,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
    371371public:
    372     void op_mov_MV          ( int op_size, int base_reg, long offset, Schedule::Type offsetScheduleType, long value, Schedule::Type valueScheduleType = Schedule::None );
    373     void op_mov_RV          (int reg,long offset, Schedule::Type scheduleType = Schedule::None );
    374     void op_mov_RR          (int reg1,int reg2);
    375     void op_mov_RM          (int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None );
    376     void op_mov_RM_ex       (int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None );
    377     void op_mov_MR          (int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None );
    378     void op_mov_MR_ex       (int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None );
    379     void op_movsx_R32R16    (int reg32,int reg16 = REG_NON);
    380     void op_movsx_R32R8     (int reg32,int reg8 = REG_NON);
    381     void op_movsx_R16R8     (int reg16,int reg8 = REG_NON);
    382     void op_lea_RM          ( int reg, int base_reg, long offset, char mod, Schedule::Type scheduleType = Schedule::None );
    383     void op_inc             (int reg);
    384     void op_dec             (int reg);
    385     void op_add_RV8         (int reg,char cValue);
    386     void op_add_RV          ( int reg, long offset, Schedule::Type scheduleType = Schedule::None );
    387     void op_add_RR          ( int reg1, int reg2 );
    388     void op_add_RM          (int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None );
     372    const PertialSchedule *op_mov_MV        ( int op_size, int base_reg, long offset, Schedule::Type offsetScheduleType, bool isPertialSchedule, long value, Schedule::Type valueScheduleType = Schedule::None );
     373    void op_mov_RV                          ( int reg,long offset, Schedule::Type scheduleType = Schedule::None );
     374    void op_mov_RR                          ( int reg1,int reg2);
     375    const PertialSchedule *op_mov_RM        ( int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     376    const PertialSchedule *op_mov_RM_ex     ( int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     377    const PertialSchedule *op_mov_MR        ( int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     378    const PertialSchedule *op_mov_MR_ex     ( int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     379    void op_movsx_R32R16                    ( int reg32,int reg16 = REG_NON);
     380    void op_movsx_R32R8                     ( int reg32,int reg8 = REG_NON);
     381    void op_movsx_R16R8                     ( int reg16,int reg8 = REG_NON);
     382    const PertialSchedule *op_lea_RM        ( int reg, int base_reg, long offset, char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     383    void op_inc                             (int reg);
     384    void op_dec                             (int reg);
     385    void op_add_RV8                         (int reg,char cValue);
     386    const PertialSchedule *op_add_RV        ( int reg, long offset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     387    void op_add_RR                          ( int reg1, int reg2 );
     388    const PertialSchedule *op_add_RM        (int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
    389389    void op_adc_RV8         (int reg,char cValue);
    390390    void op_adc_RR          ( int reg1, int reg2 );
     
    413413    void op_pop(int reg = REG_NON);
    414414    void op_add_esp(long num);
    415     void op_sub_esp(long num);
     415    const PertialSchedule *op_sub_esp( long num, bool isPertialSchedule = false );
    416416    void op_cmp_RR( int reg1, int reg2 );
    417417    void op_cmp_value(int op_size,int reg,char byte_data);
     
    421421    void op_fld_ptr_esp(int type);
    422422    void op_fld_basereg         (int type,int base_reg);
    423     void op_fld_base_offset     (int type,int base_reg,long offset, Schedule::Type scheduleType = Schedule::None );
    424     void op_fld_base_offset_ex  (int type,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None);
     423    const PertialSchedule *op_fld_base_offset       (int type,int base_reg,long offset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     424    const PertialSchedule *op_fld_base_offset_ex    (int type,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
    425425    void op_fstp_basereg        (int type,int base_reg);
    426     void op_fstp_base_offset    (int type,int base_reg,long offset, Schedule::Type scheduleType = Schedule::None);
    427     void op_fstp_base_offset_ex (int type,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None);
     426    const PertialSchedule *op_fstp_base_offset      (int type,int base_reg,long offset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
     427    const PertialSchedule *op_fstp_base_offset_ex   (int type,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
    428428    void op_fistp_ptr_esp       ( int typeSize );
    429429    void op_fstp_push           ( Type &type );
     
    452452        pNativeCode->Put( nativeCode );
    453453    }
     454    void PutOld( char c )
     455    {
     456        pNativeCode->Put( c );
     457    }
    454458    void PutOld( char c1, char c2 )
    455459    {
  • trunk/abdev/BasicCompiler_Common/include/NativeCode.h

    r252 r253  
    77#include <BoostSerializationSupport.h>
    88
    9 void AddLocalVarAddrSchedule();
    109void ObpPlus( int step = 1 );
    1110
     
    1918        None = 10000,
    2019        GlobalVar,      // グローバル変数スケジュール
    21         LocalVar,       // ローカル変数スケジュール
    2220        DataTable,      // データテーブル スケジュール
    2321        Relocation,     // リロケーション情報スケジュール
     
    172170    }
    173171
     172    long GetLong( int codePos ) const
     173    {
     174        return *(long *)(this->codeBuffer+codePos);
     175    }
     176    long _GetLong_ObpOld( int _obpOld ) const
     177    {
     178        extern char *OpBuffer;
     179        return *(long *)(OpBuffer+_obpOld);
     180    }
     181
    174182    void Overwrite( int codePos, char c )
    175183    {
     
    236244            pobj_GlobalVarSchedule->add();
    237245            break;
    238         case Schedule::LocalVar:
    239             AddLocalVarAddrSchedule();
    240             break;
    241246        case Schedule::DataTable:
    242247            extern CSchedule *pobj_DataTableSchedule;
  • trunk/abdev/BasicCompiler_Common/src/CommonCodeGenerator.cpp

    r251 r253  
    6565
    6666            isSuccessful = true;
     67            break;
     68        }
     69        else
     70        {
     71            it++;
     72        }
     73    }
     74
     75    if( isSuccessful == false )
     76    {
     77        SetError();
     78    }
     79}
     80
     81void CodeGenerator::opfix_offset( const PertialSchedule *pPertialSchedule, long offset )
     82{
     83    bool isSuccessful = false;
     84
     85    PertialSchedules::iterator it = pertialSchedules.begin();
     86    while( it != pertialSchedules.end() )
     87    {
     88        if( (*it) == pPertialSchedule )
     89        {
     90            if( pPertialSchedule->GetTypeSize() == sizeof(long) )
     91            {
     92                pNativeCode->Overwrite(
     93                    pPertialSchedule->GetCodePos(),
     94                    pNativeCode->GetLong(pPertialSchedule->GetCodePos()) + offset
     95                );
     96
     97                // TODO: 未完成(用が無くなったら消す)
     98                pNativeCode->OverwriteOld(
     99                    pPertialSchedule->GetObpOld(),
     100                    pNativeCode->_GetLong_ObpOld(pPertialSchedule->GetObpOld()) + offset
     101                );
     102            }
     103            else
     104            {
     105                SetError();
     106            }
     107
     108            it = pertialSchedules.erase( it );
     109            delete pPertialSchedule;
     110
     111            isSuccessful = true;
     112            break;
    67113        }
    68114        else
     
    280326    pNativeCode->Put( (long)0 );
    281327}
    282 void CodeGenerator::op_jmp_goto_schedule( const GotoLabelSchedule &gotoLabelSchedule )
     328void CodeGenerator::op_jmp_goto_schedule( const std::string &name, int lineNum, int sourceCodePos )
    283329{
    284330    // オペコード
    285331    pNativeCode->Put( (char)0xE9 );
    286332
    287     gotoLabelSchedules.push_back( gotoLabelSchedule );
     333    const GotoLabelSchedule *pGotoLabelSchedule = NULL;
     334    if( name.size() == 0 )
     335    {
     336        pGotoLabelSchedule = new GotoLabelSchedule( name, pNativeCode->GetSize(), sourceCodePos );
     337    }
     338    else
     339    {
     340        pGotoLabelSchedule = new GotoLabelSchedule( name, pNativeCode->GetSize(), sourceCodePos );
     341    }
     342    gotoLabelSchedules.push_back( pGotoLabelSchedule );
     343
     344    pertialSchedules.push_back( pGotoLabelSchedule );
    288345
    289346    pNativeCode->Put( (long)0 );
  • trunk/abdev/BasicCompiler_Common/src/LexicalScope.cpp

    r248 r253  
    136136
    137137            //mov ecx,dword ptr[ebp+offset]
    138             compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_EBP,-pVar->GetOffsetAddress(),MOD_BASE_DISP32, Schedule::LocalVar );
     138            compiler.codeGenerator.localVarPertialSchedules.push_back(
     139                compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_EBP,-pVar->GetOffsetAddress(),MOD_BASE_DISP32, Schedule::None, true )
     140            );
    139141
    140142            //push ecx
Note: See TracChangeset for help on using the changeset viewer.