Ignore:
Timestamp:
Jul 18, 2007, 4:23:29 AM (17 years ago)
Author:
dai_9181
Message:

[64bitコンパイラ] スタックフレームが128ビット境界ラインにならないバグを修正

File:
1 edited

Legend:

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

    r206 r220  
    6363
    6464        //add rsp,スタックフレームサイズ
    65         op_add_RV(REG_RSP,pobj_sf->GetFrameSize());
     65        op_add_RV(REG_RSP,pobj_sf->GetFrameSize(0));
    6666
    6767        //スタックフレームスケジュール(subコマンドに渡す値)
    68         *((long *)(OpBuffer+StackFrameSchedule))=pobj_sf->GetFrameSize();
     68        *((long *)(OpBuffer+StackFrameSchedule))=pobj_sf->GetFrameSize(0);
    6969
    7070        UserProc::CompileStartForUserProc( pBackUserProc );
     
    100100
    101101        //add rsp,スタックフレームサイズ
    102         op_add_RV(REG_RSP,pobj_sf->GetFrameSize());
     102        op_add_RV(REG_RSP,pobj_sf->GetFrameSize(0));
    103103
    104104        //スタックフレームスケジュール(subコマンドに渡す値)
    105         *((long *)(OpBuffer+StackFrameSchedule))=pobj_sf->GetFrameSize();
     105        *((long *)(OpBuffer+StackFrameSchedule))=pobj_sf->GetFrameSize(0);
    106106
    107107        //ret
     
    735735    }
    736736
     737    if( pUserProc->GetName() == "test" )
     738    {
     739        int test=0;
     740    }
     741
    737742    //ローカル変数領域のサイズをスタックフレームに通知
    738     int iLocalParmSize;
    739     iLocalParmSize=AllLocalVarSize-BaseLocalVar;
    740     pobj_sf->SetLocalParmSize(iLocalParmSize);
     743    int localParmSize = AllLocalVarSize - BaseLocalVar;
     744    int stackFrameSize = pobj_sf->GetFrameSize( AllLocalVarSize );
    741745
    742746    //ローカル変数アドレススケジュール
    743747    for(i3=0;i3<LocalVarAddrScheduleNum;i3++){
    744         *((long *)(OpBuffer+pLocalVarAddrSchedule[i3]))+=AllLocalVarSize+pobj_sf->GetFrameSize();
     748        *((long *)(OpBuffer+pLocalVarAddrSchedule[i3])) += AllLocalVarSize + stackFrameSize;
    745749    }
    746750    HeapDefaultFree(pLocalVarAddrSchedule);
     
    748752        //後にデバッグで利用する
    749753        pVar->SetOffsetAddress(
    750             AllLocalVarSize + pobj_sf->GetFrameSize() - pVar->GetOffsetAddress()
     754            AllLocalVarSize + stackFrameSize - pVar->GetOffsetAddress()
    751755        );
    752756    }
     
    761765    pobj_sf->pop(REG_RBX);
    762766
    763     int iStackFrameSize;
    764     iStackFrameSize=iLocalParmSize + pobj_sf->GetFrameSize();
     767    int stackFrameAndLocalParamSize = localParmSize + stackFrameSize;
    765768
    766769    //add rsp,スタックフレームサイズ
    767     op_add_rsp(iStackFrameSize);
     770    op_add_rsp(stackFrameAndLocalParamSize);
    768771
    769772    //ret
     
    773776    //デバッグ用
    774777    if(RspOffsetSchedule){
    775         *((long *)(OpBuffer+RspOffsetSchedule))=iStackFrameSize;
    776         *((long *)(OpBuffer+RspOffsetSchedule2))=iStackFrameSize+sizeof(_int64);
     778        *((long *)(OpBuffer+RspOffsetSchedule))=stackFrameAndLocalParamSize;
     779        *((long *)(OpBuffer+RspOffsetSchedule2))=stackFrameAndLocalParamSize+sizeof(_int64);
    777780    }
    778781
    779782
    780783    //スタックフレームスケジュール(subコマンド)
    781     *((long *)(OpBuffer+StackFrameSchedule))=iStackFrameSize;
     784    *((long *)(OpBuffer+StackFrameSchedule))=stackFrameAndLocalParamSize;
    782785
    783786    //スタックフレームスケジュールを実行
    784     pobj_sf->RunningSchedule();
     787    pobj_sf->RunningSchedule( stackFrameSize );
    785788    delete pobj_sf;
    786789    pobj_sf=0;
Note: See TracChangeset for help on using the changeset viewer.