Changeset 317 in dev
- Timestamp:
- Sep 8, 2007, 8:43:18 PM (17 years ago)
- Location:
- trunk/abdev
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler64/CodeGenerator.cpp
r308 r317 1716 1716 pNativeCode->PutUserProcSchedule( pUserProc, false ); 1717 1717 } 1718 void 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 510 510 //仮想関数テーブルを初期化 511 511 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 } 524 532 } 525 533 } -
trunk/abdev/BasicCompiler64/Compile_Var.cpp
r316 r317 13 13 //変数 14 14 // TODO: xml未完成 15 int AllGlobalVarSize;16 int AllInitGlobalVarSize;17 18 15 int AllLocalVarSize; 19 16 -
trunk/abdev/BasicCompiler64/MakePeHdr.cpp
r315 r317 789 789 //グローバル変数情報を扱う構造体も初期バッファの有無による配置を行う 790 790 //(デバッグ情報で利用される) 791 extern int AllInitGlobalVarSize;792 791 BOOST_FOREACH( Variable *pVar, compiler.GetObjectModule().meta.GetGlobalVars() ){ 793 792 if(pVar->GetOffsetAddress()&0x80000000){ 794 793 pVar->SetOffsetAddress( 795 (pVar->GetOffsetAddress()&0x7FFFFFFF)+AllInitGlobalVarSize 794 (pVar->GetOffsetAddress()&0x7FFFFFFF) 795 + compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize() 796 796 ); 797 797 } … … 863 863 864 864 //リライタブルセクションのファイル上のサイズ(グローバル変数の初期情報のみを格納) 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 } 867 871 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 } 869 876 else FileSize_RWSection=FILE_ALIGNMENT; 870 877 } … … 927 934 928 935 //リライタブルセクションのメモリ上のサイズ 929 extern int AllGlobalVarSize;930 i=AllInitGlobalVarSize+AllGlobalVarSize;936 i = compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize() 937 + compiler.GetObjectModule().meta.GetGlobalVars().GetAllSize(); 931 938 if(i%MEM_ALIGNMENT) MemSize_RWSection=i+(MEM_ALIGNMENT-i%MEM_ALIGNMENT); 932 939 else MemSize_RWSection=i; … … 1312 1319 memset((char *)RWSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME); 1313 1320 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(); 1315 1323 RWSectionHeader.VirtualAddress= MemPos_RWSection; 1316 1324 RWSectionHeader.SizeOfRawData= FileSize_RWSection; -
trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h
r287 r317 364 364 void op_fld_ptr_esp(int type); 365 365 void op_zero_reg(int reg); 366 366 367 void op_call( const UserProc *pUserProc ); 367 368 void op_call( const DllProc *pDllProc ); 368 369 void op_ret(); 369 370 void op_addressof( int reg, const UserProc *pUserProc ); 371 void op_mov_RV_vtbl( int reg, const CClass *pClass ); 370 372 371 373 #else
Note:
See TracChangeset
for help on using the changeset viewer.