Changeset 262 in dev


Ignore:
Timestamp:
Aug 4, 2007, 4:36:34 AM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev
Files:
8 edited

Legend:

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

    r255 r262  
    16951695
    16961696void CodeGenerator::op_call( const UserProc *pUserProc ){
    1697     pUserProc->Using();
    1698 
    1699     pNativeCode->Put(  (char)0xE8 );
    1700     pobj_SubAddrSchedule->add( pUserProc, 1 );
    1701     pNativeCode->Put( (long)0 );
     1697    pNativeCode->Put( (char)0xE8 );
     1698    pNativeCode->PutUserProcSchedule( pUserProc, true );
    17021699}
    17031700void CodeGenerator::op_call( const DllProc *pDllProc ){
    1704     pDllProc->Using();
    1705 
    1706     pNativeCode->Put(  (char)0xFF );
    1707     pNativeCode->Put(  (char)0x15 );
    1708     pobj_ImportAddrSchedule->add(pDllProc);
    1709     pNativeCode->Put( (long)0 );
     1701    pNativeCode->Put( (char)0xFF );
     1702    pNativeCode->Put( (char)0x15 );
     1703    pNativeCode->PutDllProcSchedule( pDllProc );
    17101704}
    17111705void CodeGenerator::op_ret(){
    17121706    pNativeCode->Put( (char)0xC3 );
    17131707}
     1708void CodeGenerator::op_addressof( int reg, const UserProc *pUserProc )
     1709{
     1710    //mov reg,userProcAddress
     1711
     1712    //オペコード、レジスタ
     1713    pNativeCode->Put( (char)(0xB8|REGISTER_OPERAND(reg)) );
     1714
     1715    //DISP32
     1716    pNativeCode->PutUserProcSchedule( pUserProc, false );
     1717}
  • trunk/abdev/BasicCompiler64/Compile_Func.cpp

    r257 r262  
    159159
    160160        //mov rax,ProcAddr
    161         compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RAX,0);
    162         obp-=sizeof(long);
    163         pobj_SubAddrSchedule->add(pUserProc,0);
    164         obp+=sizeof(long);
     161        compiler.codeGenerator.op_addressof( REG_RAX, pUserProc );
    165162    }
    166163
  • trunk/abdev/BasicCompiler64/Compile_Object.cpp

    r255 r262  
    1616    //をセットしておかなければならない
    1717
    18     int jnz_back;
    19 
    2018
    2119    //jnzの番地
    22     jnz_back=obp;
     20    /*extern int obp;
     21    int jnz_back = obp;*/
    2322
    2423    if(bSomeObjects){
    2524        SetError();
    2625        //mov qword ptr[rsp+offset],rbx     ※スタックフレームを利用
    27         pobj_sf->push(REG_RBX);
     26        //pobj_sf->push(REG_RBX);
    2827
    2928        // ※ここでプッシュされた値はコンストラクタのthisポインタとなる
    3029        //mov qword ptr[rsp+offset],rax     ※スタックフレームを利用
    31         pobj_sf->push(REG_RAX);
     30        //pobj_sf->push(REG_RAX);
    3231    }
    3332
     
    7372
    7473    if(bSomeObjects){
     74        /*
    7575        //mov rax,qword ptr[rsp+offset]     ※スタックフレームを利用
    7676        pobj_sf->pop(REG_RAX);
     
    8787        //jnz ↑
    8888        compiler.codeGenerator.op_jne( jnz_back-obp, sizeof(long), false, true );
     89        */
    8990    }
    9091}
     
    180181
    181182    //mov rcx,DestructorProcAddr(デストラクタの関数ポインタ)
    182     compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RCX,0);
    183     obp-=sizeof(long);
    184     pobj_SubAddrSchedule->add(&method->GetUserProc(),0);
    185     method->GetUserProc().Using();
    186     obp+=sizeof(long);
     183    compiler.codeGenerator.op_addressof( REG_RCX, &method->GetUserProc() );
    187184
    188185    //mov qword ptr[rax],rcx
  • trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp

    r259 r262  
    237237
    238238    //ラベル用のメモリを確保
    239     extern LABEL *pLabelNames;
    240     extern int MaxLabelNum;
    241     pLabelNames=(LABEL *)HeapAlloc(hHeap,0,1);
    242     MaxLabelNum=0;
     239    compiler.codeGenerator.gotoLabels.clear();
    243240
    244241    //Gotoラベルスケジュール
     
    565562    }
    566563
    567     //ラベル用のメモリを解放
    568     for(i3=0;i3<MaxLabelNum;i3++){
    569         if(pLabelNames[i3].pName) HeapDefaultFree(pLabelNames[i3].pName);
    570     }
    571     HeapDefaultFree(pLabelNames);
    572 
    573564    //With情報のメモリを解放
    574565    for(i3=0;i3<WithInfo.num;i3++){
  • trunk/abdev/BasicCompiler64/Compile_Statement.cpp

    r257 r262  
    236236
    237237int GetLabelAddress(char *LabelName,int LineNum){
    238     extern int MaxLabelNum;
    239     extern LABEL *pLabelNames;
    240     int i;
    241 
    242238    if(LabelName){
    243         for(i=0;i<MaxLabelNum;i++){
    244             if(pLabelNames[i].pName){
    245                 if(lstrcmp(LabelName,pLabelNames[i].pName)==0) return pLabelNames[i].address;
     239        BOOST_FOREACH( const GotoLabel &label, compiler.codeGenerator.gotoLabels )
     240        {
     241            if( label.name.size() > 0 )
     242            {
     243                if( label.name == LabelName )
     244                {
     245                    return label.address;
     246                }
    246247            }
    247248        }
    248249    }
    249250    else{
    250         for(i=0;i<MaxLabelNum;i++){
    251             if(pLabelNames[i].pName==0){
    252                 if(LineNum==pLabelNames[i].line) return pLabelNames[i].address;
     251        BOOST_FOREACH( const GotoLabel &label, compiler.codeGenerator.gotoLabels )
     252        {
     253            if( label.name.size() == 0 )
     254            {
     255                if( label.line == LineNum )
     256                {
     257                    return label.address;
     258                }
    253259            }
    254260        }
  • trunk/abdev/BasicCompiler64/MakePeHdr.cpp

    r259 r262  
    361361        }
    362362
    363         //ラベル用のメモリを確保
    364         extern LABEL *pLabelNames;
    365         extern int MaxLabelNum;
    366         pLabelNames=(LABEL *)HeapAlloc(hHeap,0,1);
    367         MaxLabelNum=0;
     363        //ラベル管理オブジェクトを初期化
     364        compiler.codeGenerator.gotoLabels.clear();
    368365
    369366        //Gotoラベルスケジュール
     
    411408        //グローバル実行領域をコンパイル開始
    412409        CompileBuffer(0,0);
    413 
    414         //ラベル用のメモリを解放
    415         for(i=0;i<MaxLabelNum;i++){
    416             if(pLabelNames[i].pName) HeapDefaultFree(pLabelNames[i].pName);
    417         }
    418         HeapDefaultFree(pLabelNames);
    419410
    420411        //Goto未知ラベルスケジュールが存在したらエラーにする
  • trunk/abdev/BasicCompiler64/Opcode.h

    r255 r262  
    2020
    2121#define breakpoint compiler.codeGenerator.PutOld( (char)0xCC );
    22 
    23 
    24 //ラベルアドレス
    25 struct LABEL{
    26     char *pName;
    27     int line;
    28     DWORD address;
    29 };
    3022
    3123
  • trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h

    r261 r262  
    382382    void op_call( const DllProc *pDllProc );
    383383    void op_ret();
     384    void op_addressof( int reg, const UserProc *pUserProc );
    384385
    385386#else
Note: See TracChangeset for help on using the changeset viewer.