Changeset 317 in dev


Ignore:
Timestamp:
Sep 8, 2007, 8:43:18 PM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev
Files:
5 edited

Legend:

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

    r308 r317  
    17161716    pNativeCode->PutUserProcSchedule( pUserProc, false );
    17171717}
     1718void CodeGenerator::op_mov_RV_vtbl( int reg, const CClass *pClass )
     1719{
     1720    // mov reg,vtblAddress
     1721
     1722    //オペコード、レジスタ
     1723    pNativeCode->Put( (char)(0xB8|REGISTER_OPERAND(reg)) );
     1724
     1725    //DISP32
     1726    pNativeCode->PutVtblSchedule( pClass );
     1727}
  • trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp

    r316 r317  
    510510            //仮想関数テーブルを初期化
    511511            if( compiler.pCompilingClass->IsExistVirtualFunctions()
    512                 && !compiler.pCompilingClass->IsAbstract() ){
    513                     //関数テーブルに値をセット
    514                     int offset = (int)compiler.pCompilingClass->GetVtblGlobalOffset();
    515 
    516                     //mov rax,offset
    517                     compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RAX,offset, Schedule::DataTable );
    518 
    519                     //Thisポインタをrcxにコピー
    520                     SetThisPtrToReg(REG_RCX);
    521 
    522                     //mov qword ptr[rcx],rax
    523                     compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RAX,REG_RCX,0,MOD_BASE);
     512                && !compiler.pCompilingClass->IsAbstract() )
     513            {
     514                // mov rax,vtblAddress
     515                compiler.codeGenerator.op_mov_RV_vtbl( REG_RAX, compiler.pCompilingClass );
     516
     517                //Thisポインタをrcxにコピー
     518                SetThisPtrToReg(REG_RCX);
     519
     520                //mov qword ptr[rcx],rax
     521                compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RAX,REG_RCX,0,MOD_BASE);
     522
     523
     524                // 仮想関数になるメソッドに使用チェックをつける
     525                BOOST_FOREACH( const CMethod *pMethod, compiler.pCompilingClass->GetMethods() )
     526                {
     527                    if( pMethod->IsVirtual() )
     528                    {
     529                        pMethod->GetUserProc().Using();
     530                    }
     531                }
    524532            }
    525533        }
  • trunk/abdev/BasicCompiler64/Compile_Var.cpp

    r316 r317  
    1313//変数
    1414// TODO: xml未完成
    15 int AllGlobalVarSize;
    16 int AllInitGlobalVarSize;
    17 
    1815int AllLocalVarSize;
    1916
  • trunk/abdev/BasicCompiler64/MakePeHdr.cpp

    r315 r317  
    789789    //グローバル変数情報を扱う構造体も初期バッファの有無による配置を行う
    790790    //(デバッグ情報で利用される)
    791     extern int AllInitGlobalVarSize;
    792791    BOOST_FOREACH( Variable *pVar, compiler.GetObjectModule().meta.GetGlobalVars() ){
    793792        if(pVar->GetOffsetAddress()&0x80000000){
    794793            pVar->SetOffsetAddress(
    795                 (pVar->GetOffsetAddress()&0x7FFFFFFF)+AllInitGlobalVarSize
     794                (pVar->GetOffsetAddress()&0x7FFFFFFF)
     795                + compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize()
    796796            );
    797797        }
     
    863863
    864864    //リライタブルセクションのファイル上のサイズ(グローバル変数の初期情報のみを格納)
    865     extern int AllInitGlobalVarSize;
    866     if(AllInitGlobalVarSize%FILE_ALIGNMENT) FileSize_RWSection=AllInitGlobalVarSize+(FILE_ALIGNMENT-AllInitGlobalVarSize%FILE_ALIGNMENT);
     865    if( compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize() % FILE_ALIGNMENT )
     866    {
     867        FileSize_RWSection =
     868            compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize()
     869            + (FILE_ALIGNMENT-compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize()%FILE_ALIGNMENT);
     870    }
    867871    else{
    868         if(AllInitGlobalVarSize) FileSize_RWSection=AllInitGlobalVarSize;
     872        if( compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize() )
     873        {
     874            FileSize_RWSection = compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize();
     875        }
    869876        else FileSize_RWSection=FILE_ALIGNMENT;
    870877    }
     
    927934
    928935    //リライタブルセクションのメモリ上のサイズ
    929     extern int AllGlobalVarSize;
    930     i=AllInitGlobalVarSize+AllGlobalVarSize;
     936    i = compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize()
     937        + compiler.GetObjectModule().meta.GetGlobalVars().GetAllSize();
    931938    if(i%MEM_ALIGNMENT) MemSize_RWSection=i+(MEM_ALIGNMENT-i%MEM_ALIGNMENT);
    932939    else MemSize_RWSection=i;
     
    13121319    memset((char *)RWSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
    13131320    lstrcpy((char *)RWSectionHeader.Name,".data");
    1314     RWSectionHeader.Misc.VirtualSize=           AllInitGlobalVarSize+AllGlobalVarSize;
     1321    RWSectionHeader.Misc.VirtualSize=           compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize()
     1322                                                + compiler.GetObjectModule().meta.GetGlobalVars().GetAllSize();
    13151323    RWSectionHeader.VirtualAddress=             MemPos_RWSection;
    13161324    RWSectionHeader.SizeOfRawData=              FileSize_RWSection;
  • trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h

    r287 r317  
    364364    void op_fld_ptr_esp(int type);
    365365    void op_zero_reg(int reg);
     366
    366367    void op_call( const UserProc *pUserProc );
    367368    void op_call( const DllProc *pDllProc );
    368369    void op_ret();
    369370    void op_addressof( int reg, const UserProc *pUserProc );
     371    void op_mov_RV_vtbl( int reg, const CClass *pClass );
    370372
    371373#else
Note: See TracChangeset for help on using the changeset viewer.