Changeset 20 in dev for BasicCompiler64
- Timestamp:
- Dec 28, 2006, 5:24:48 AM (18 years ago)
- Location:
- BasicCompiler64
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler64/CParameter.cpp
r11 r20 329 329 } 330 330 } 331 332 void CParameter::NewTempParameters( char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){ 333 /////////////////////////////////////////////////////// 334 // 一時オブジェクトをあらかじめスタックに積んでおく 335 /////////////////////////////////////////////////////// 336 337 useTempObject = false; 338 339 BOOL bEllipse; 340 if(pi_num){ 341 if(ppi[pi_num-1].type==DEF_ELLIPSE) bEllipse=1; 342 else bEllipse=0; 343 } 344 else bEllipse=0; 345 346 for(int i2=ParmsNum-1;i2>=0;i2--){ 347 useTempParameters[i2] = false; 348 349 if(bEllipse&&i2<=pi_num-2) bEllipse=0; 350 351 if(i2==0&&ppi[i2].name){ 352 if(lstrcmp(ppi[i2].name,"_System_LocalThis")==0){ 353 //オブジェクトメンバの第一パラメータのThisポインタ 354 continue; 355 } 356 } 357 if((i2==0||i2==1)&&ppi[i2].name){ 358 if(lstrcmp(ppi[i2].name,FuncName)==0){ 359 //オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト 360 continue; 361 } 362 } 363 364 TYPEINFO DummyTypeInfo; 365 BOOL bByVal; 366 if(bEllipse){ 367 DummyTypeInfo.type=NumOpe_GetType(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex); 368 bByVal=1; 369 } 370 else{ 371 DummyTypeInfo.type=ppi[i2].type; 372 DummyTypeInfo.u.lpIndex=ppi[i2].u.index; 373 bByVal=ppi[i2].bByVal; 374 } 375 376 377 if( !bByVal ){ 378 //ポインタ参照 379 if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){ 380 //ポインタ指定 381 continue; 382 } 383 384 LONG_PTR lpVarIndex; 385 if( GetVarType( Parms[i2], &lpVarIndex, FALSE ) == -1 ){ 386 //変数ではないとき 387 int reg = REG_RAX; 388 int type = NumOpe( ®, Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex ); 389 390 //スタックフレームへコピー 391 StackOffsetOfTempObject[i2] = pobj_sf->push(reg); 392 393 useTempParameters[i2] = true; 394 useTempObject = true; 395 396 types[i2].type = type; 397 types[i2].u.lpIndex = lpVarIndex; 398 } 399 } 400 } 401 } 402 void CParameter::DeleteTempParameters(){ 403 /////////////////////////////////////////////////////// 404 // 一時オブジェクトを破棄 405 /////////////////////////////////////////////////////// 406 if( !useTempObject ) return; 407 408 for(int i2=ParmsNum-1;i2>=0;i2--){ 409 if( useTempParameters[i2] ){ 410 //スタックフレームから取得 411 pobj_sf->ref(REG_RCX); 412 413 //デストラクタを呼び出す 414 415 //call destructor 416 int i5 = types[i2].u.pobj_Class->DestructorMemberSubIndex; 417 op_call( types[i2].u.pobj_Class->ppobj_Method[i5]->psi ); 418 419 //メモリを解放する 420 421 pobj_sf->pop(REG_RCX); 422 423 //call free 424 extern SUBINFO *pSub_free; 425 op_call(pSub_free); 426 } 427 } 428 } 429 331 430 void CParameter::SetObjectParameter(int reg,CClass *pobj_Class,LPSTR Parameter){ 332 431 ////////////////////////////////////////////////////// … … 427 526 op_mov_RR(reg,REG_R11); 428 527 } 528 429 529 void CParameter::SetParameter(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){ 430 530 /////////////////////////////////////////////////////////// … … 616 716 int VarType; 617 717 LONG_PTR lpVarIndex; 618 if(!GetVarOffsetReadOnly( 718 if(GetVarOffset( 719 false, 720 false, 619 721 Parms[i2], 620 722 &VarType, 621 723 &RelativeVar, 622 &lpVarIndex)) continue; 623 624 if(DummyTypeInfo.type!=DEF_ANY){ 625 //型チェックを行う 626 if(DummyTypeInfo.type==VarType){ 627 if(DummyTypeInfo.type==DEF_OBJECT){ 628 if(DummyTypeInfo.u.lpIndex!=lpVarIndex){ 724 &lpVarIndex)){ 725 726 if(DummyTypeInfo.type!=DEF_ANY){ 727 //型チェックを行う 728 if(DummyTypeInfo.type==VarType){ 729 if(DummyTypeInfo.type==DEF_OBJECT){ 730 if(DummyTypeInfo.u.lpIndex!=lpVarIndex){ 731 SetError(11,Parms[i2],cp); 732 } 733 } 734 } 735 else if((VarType&FLAG_PTR)&&((VarType^FLAG_PTR)==DummyTypeInfo.type)){ 736 //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき 737 } 738 else{ 629 739 SetError(11,Parms[i2],cp); 630 740 } 631 741 } 632 } 633 else if((VarType&FLAG_PTR)&&((VarType^FLAG_PTR)==DummyTypeInfo.type)){ 634 //仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき 635 } 636 else{ 637 SetError(11,Parms[i2],cp); 638 } 639 } 640 641 //変数アドレスをレジスタにセット 642 SetVarPtrToReg(reg,&RelativeVar); 742 743 //変数アドレスをレジスタにセット 744 SetVarPtrToReg(reg,&RelativeVar); 745 746 } 747 else{ 748 //一時オブジェクトをコピー 749 750 //mov reg, qword ptr[rsp+offset] 751 pobj_sf->ref_offset_data( reg, StackOffsetOfTempObject[i2] ); 752 753 //VarType = NumOpe( ®, Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex ); 754 } 643 755 } 644 756 } -
BasicCompiler64/Compile_CallProc.cpp
r19 r20 180 180 pobj_parameter->BackupParameter(pi->ParmNum); 181 181 182 //一時オブジェクトを生成 183 pobj_parameter->NewTempParameters( variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum ); 184 182 185 //レジスタ、スタックフレームにセット 183 186 pobj_parameter->SetParameter(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum); … … 200 203 //レジスタのブロッキングを解除 ※パラメータセット時にロックされたレジスタ 201 204 pobj_BlockReg->clear(); 205 206 //一時オブジェクトを破棄 207 pobj_parameter->DeleteTempParameters(); 202 208 203 209 //スタックフレームに存在する既存のパラメータを復元 … … 355 361 pobj_parameter->BackupParameter(psi->RealParmNum); 356 362 363 //一時オブジェクトを生成 364 pobj_parameter->NewTempParameters( psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum ); 365 357 366 //レジスタ、スタックフレームにセット 358 367 pobj_parameter->SetParameter(psi->name,psi->pRealParmInfo,psi->RealParmNum,psi->RealSecondParmNum); … … 490 499 pobj_BlockReg->clear(); 491 500 501 //一時オブジェクトを破棄 502 pobj_parameter->DeleteTempParameters(); 503 492 504 //スタックフレームに存在する既存のパラメータを復元 493 505 pobj_parameter->RestoreParameter(psi->RealParmNum); -
BasicCompiler64/Compile_Var.cpp
r19 r20 781 781 } 782 782 783 784 /////////////////////////////////////// 785 // 単発式([]で囲まれていない) 786 /////////////////////////////////////// 787 788 if( type == DEF_OBJECT){ 789 //オブジェクトの場合はありえない 790 SetError(300,NULL,cp); 791 return 0; 792 } 793 783 794 if(SubScripts[0]!=-1){ 784 795 SetError(41,0,cp); -
BasicCompiler64/Opcode.h
r19 r20 120 120 void SetLocalParmSize(int size); 121 121 int GetFrameSize(); 122 voidpush(int reg);122 int push(int reg); 123 123 void push(int xmm_reg,int var_size); 124 void ref_offset_data( int reg, int sp_offset ); 124 125 void ref(int reg); 125 126 void ref(int xmm_reg,int var_size); … … 339 340 TYPEINFO ReturnTypeInfo; 340 341 342 //一時オブジェクト管理用 343 bool useTempObject; 344 bool useTempParameters[255]; 345 int StackOffsetOfTempObject[255]; 346 341 347 public: 342 348 CParameter(char *buffer); … … 354 360 void MacroParameterSupport(PARAMETER_INFO *ppi); 355 361 void SetObjectParameter(int reg,CClass *pobj_Class,LPSTR Parameter); 362 363 //一時オブジェクトパラメータの生成と破棄 364 void NewTempParameters( char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ); 365 void DeleteTempParameters(); 366 356 367 void SetParameter(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum); 368 357 369 void BackupParameter(int pi_num); 358 370 void RestoreParameter(int pi_num); -
BasicCompiler64/stack_frame.cpp
r3 r20 39 39 return -(answer_sp-0x08); 40 40 } 41 voidCStackFrame::push(int reg){41 int CStackFrame::push(int reg){ 42 42 now_sp-=sizeof(_int64); 43 43 if(lowest_sp>now_sp) lowest_sp=now_sp; 44 44 45 if(reg==REG_NON) return ;45 if(reg==REG_NON) return now_sp; 46 46 47 47 //mov qword ptr[rsp+offset],reg … … 52 52 add(); 53 53 obp+=sizeof(long); 54 55 return now_sp; 54 56 } 55 57 void CStackFrame::push(int xmm_reg,int var_size){ … … 77 79 obp+=sizeof(long); 78 80 } 79 void CStackFrame::ref (int reg){81 void CStackFrame::ref_offset_data( int reg, int sp_offset ){ 80 82 //mov reg,qword ptr[rsp+offset] ※スタックフレームを利用 81 op_mov_RM(sizeof(_int64),reg,REG_RSP, now_sp,MOD_BASE_DISP32);83 op_mov_RM(sizeof(_int64),reg,REG_RSP,sp_offset,MOD_BASE_DISP32); 82 84 83 85 //スケジュールをセット … … 85 87 add(); 86 88 obp+=sizeof(long); 89 } 90 void CStackFrame::ref(int reg){ 91 ref_offset_data( reg, now_sp ); 87 92 } 88 93 void CStackFrame::ref(int xmm_reg,int var_size){
Note:
See TracChangeset
for help on using the changeset viewer.