Changeset 263 in dev for trunk/abdev/BasicCompiler64
- Timestamp:
- Aug 5, 2007, 3:47:49 AM (17 years ago)
- Location:
- trunk/abdev/BasicCompiler64
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler64/Compile_Object.cpp
r262 r263 60 60 if( subs.size() == 1 ){ 61 61 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() ); 63 63 64 64 Opcode_CallProc(temporary, … … 258 258 259 259 //jnzの番地 260 int jnz_back; 261 jnz_back=obp; 260 //int jnz_back=obp; 262 261 263 262 //mov qword ptr[rsp+offset],rcx ※スタックフレームを利用 … … 280 279 281 280 //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 ); 283 282 284 283 -
trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp
r262 r263 140 140 && userProc.HasParentClass() 141 141 && userProc.GetParentClass().GetName() == "_System_TypeBase" ){ 142 143 142 compiler.objectModule.meta.GetClasses().Compile_System_InitializeUserTypes(); 144 143 } … … 670 669 671 670 672 pUserProc-> SetEndOpAddress( obp );671 pUserProc->_endOpAddressOld = obp; 673 672 674 673 -
trunk/abdev/BasicCompiler64/Compile_Statement.cpp
r262 r263 272 272 { 273 273 //jmp ...(schedule) 274 extern int obp;275 274 compiler.codeGenerator.op_jmp_goto_schedule( (const std::string)(Parameter + 1), 0, cp ); 276 275 } … … 289 288 { 290 289 //jmp ...(schedule) 291 extern int obp;292 290 compiler.codeGenerator.op_jmp_goto_schedule( "", LineNum, cp ); 293 291 } -
trunk/abdev/BasicCompiler64/MakePeHdr.cpp
r262 r263 222 222 223 223 //コードと行番号の関係 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(); 228 226 229 227 … … 387 385 388 386 //未完成 389 // OpBuffer[obp++]=(char)0xCC;387 //breakpoint; 390 388 391 389 //sub rsp,スタックフレームサイズ … … 503 501 ////////////////////////////////////////////////////////// 504 502 503 504 505 trace( "コード生成が終了しました。" ); 506 507 vector<ObjectModule *> masterObjectModules; 508 masterObjectModules.push_back( &compiler.objectModule ); 509 compiler.linker.Link( masterObjectModules ); 505 510 506 511 … … 836 841 837 842 //機械語コードとBasicコードの関係を整理 838 extern LINEINFO *pLineInfo; 839 extern int MaxLineInfoNum; 843 extern SourceLines oldSourceLines; 840 844 int MinObp,MaxObp; 841 LINEINFO *pTempLineInfo; 842 pTempLineInfo=(LINEINFO *)HeapAlloc(hHeap,0,MaxLineInfoNum*sizeof(LINEINFO)); 843 i2=0; 845 SourceLines tempSourceLines; 844 846 MaxObp=0; 845 847 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(); 849 851 i4=i3; 850 852 } 851 853 } 852 854 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; 862 859 863 860 //デバッグセクションを生成 … … 1165 1162 1166 1163 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 1167 1181 //////////////////////////////// 1168 1182 // リソースアドレススケジュール -
trunk/abdev/BasicCompiler64/Opcode.h
r262 r263 45 45 46 46 47 class CStackFrame:public CSchedule{ 47 class CStackFrame 48 { 48 49 /////////////////////////// 49 50 // スタックフレーム管理 50 51 /////////////////////////// 52 53 PertialSchedules pertialSchedules; 51 54 52 55 int lowest_sp; //スタックポインタの最下位位置 -
trunk/abdev/BasicCompiler64/stack_frame.cpp
r232 r263 39 39 40 40 //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 ); 47 44 } 48 45 int CStackFrame::push(int reg){ … … 53 50 54 51 //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 ); 61 55 62 56 return now_sp; … … 68 62 if(varSize==sizeof(double)){ 69 63 //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 ); 71 67 } 72 68 if(varSize==sizeof(float)){ 73 69 //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 ); 75 73 } 76 77 //スケジュールをセット78 obp-=sizeof(long);79 add();80 obp+=sizeof(long);81 74 } 82 75 void CStackFrame::ref_offset_data( int reg, int sp_offset ){ 83 76 //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 ); 90 80 } 91 81 void CStackFrame::ref(int reg){ … … 95 85 if(varSize==sizeof(double)){ 96 86 //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 ); 98 90 } 99 91 if(varSize==sizeof(float)){ 100 92 //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 ); 102 96 } 103 104 //スケジュールをセット105 obp-=sizeof(long);106 add();107 obp+=sizeof(long);108 97 } 109 98 void CStackFrame::pop(int reg){ … … 121 110 } 122 111 void 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 ); 125 115 } 126 116 }
Note:
See TracChangeset
for help on using the changeset viewer.