mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 11:38:21 +02:00
Fixed Win32 eval
This commit is contained in:
parent
5b25039ff4
commit
2bb2a5926a
6 changed files with 48 additions and 40 deletions
|
@ -2635,6 +2635,7 @@ void COFF::ParseCompileUnit_Symbols(DbgCompileUnit* compileUnit, uint8* sectionD
|
||||||
// }
|
// }
|
||||||
|
|
||||||
curSubprogram->mFrameBaseLen = frameProc->cbFrame + frameProc->cbSaveRegs;
|
curSubprogram->mFrameBaseLen = frameProc->cbFrame + frameProc->cbSaveRegs;
|
||||||
|
curSubprogram->mParamBaseReg = (DbgSubprogram::LocalBaseRegKind)(uint8)frameProc->flags.encodedParamBasePointer;
|
||||||
curSubprogram->mLocalBaseReg = (DbgSubprogram::LocalBaseRegKind)(uint8)frameProc->flags.encodedLocalBasePointer;
|
curSubprogram->mLocalBaseReg = (DbgSubprogram::LocalBaseRegKind)(uint8)frameProc->flags.encodedLocalBasePointer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6003,10 +6004,10 @@ void COFF::FinishHotSwap()
|
||||||
mTypeMap.Clear();
|
mTypeMap.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
addr_target COFF::EvaluateLocation(DbgSubprogram* dwSubprogram, const uint8* locData, int locDataLen, WdStackFrame* stackFrame, DbgAddrType* outAddrType, bool allowReg)
|
addr_target COFF::EvaluateLocation(DbgSubprogram* dwSubprogram, const uint8* locData, int locDataLen, WdStackFrame* stackFrame, DbgAddrType* outAddrType, DbgEvalLocFlags flags)
|
||||||
{
|
{
|
||||||
if (mDbgFlavor == DbgFlavor_GNU)
|
if (mDbgFlavor == DbgFlavor_GNU)
|
||||||
return DbgModule::EvaluateLocation(dwSubprogram, locData, locDataLen, stackFrame, outAddrType, allowReg);
|
return DbgModule::EvaluateLocation(dwSubprogram, locData, locDataLen, stackFrame, outAddrType, flags);
|
||||||
|
|
||||||
addr_target pc = 0;
|
addr_target pc = 0;
|
||||||
if (stackFrame != NULL)
|
if (stackFrame != NULL)
|
||||||
|
@ -6104,30 +6105,20 @@ addr_target COFF::EvaluateLocation(DbgSubprogram* dwSubprogram, const uint8* loc
|
||||||
{
|
{
|
||||||
DEFRANGESYMFRAMEPOINTERREL& defRangeFPRel = *(DEFRANGESYMFRAMEPOINTERREL*)dataStart;
|
DEFRANGESYMFRAMEPOINTERREL& defRangeFPRel = *(DEFRANGESYMFRAMEPOINTERREL*)dataStart;
|
||||||
|
|
||||||
|
DbgSubprogram::LocalBaseRegKind baseReg = ((flags & DbgEvalLocFlag_IsParam) != 0) ? dwSubprogram->mParamBaseReg : dwSubprogram->mLocalBaseReg;
|
||||||
|
|
||||||
*outAddrType = DbgAddrType_Target;
|
*outAddrType = DbgAddrType_Target;
|
||||||
#ifdef BF_DBG_64
|
#ifdef BF_DBG_64
|
||||||
if (dwSubprogram->mLocalBaseReg == DbgSubprogram::LocalBaseRegKind_RSP)
|
if (baseReg == DbgSubprogram::LocalBaseRegKind_RSP)
|
||||||
result = stackFrame->mRegisters.mIntRegsArray[X64Reg_RSP] + defRangeFPRel.offFramePointer;
|
result = stackFrame->mRegisters.mIntRegsArray[X64Reg_RSP] + defRangeFPRel.offFramePointer;
|
||||||
else if (dwSubprogram->mLocalBaseReg == DbgSubprogram::LocalBaseRegKind_R13)
|
else if (baseReg == DbgSubprogram::LocalBaseRegKind_R13)
|
||||||
result = stackFrame->mRegisters.mIntRegsArray[X64Reg_R13] + defRangeFPRel.offFramePointer;
|
result = stackFrame->mRegisters.mIntRegsArray[X64Reg_R13] + defRangeFPRel.offFramePointer;
|
||||||
else
|
else
|
||||||
result = stackFrame->mRegisters.mIntRegsArray[X64Reg_RBP] + defRangeFPRel.offFramePointer;
|
result = stackFrame->mRegisters.mIntRegsArray[X64Reg_RBP] + defRangeFPRel.offFramePointer;
|
||||||
#else
|
#else
|
||||||
if (dwSubprogram->mLocalBaseReg == DbgSubprogram::LocalBaseRegKind_VFRAME)
|
if (baseReg == DbgSubprogram::LocalBaseRegKind_VFRAME)
|
||||||
{
|
|
||||||
if (defRangeFPRel.offFramePointer > 0)
|
|
||||||
{
|
|
||||||
// Note that a positive offFramePointer always refers to params, and param fp reg is always EBP-relative.
|
|
||||||
// If this is not true in some cases then we need to actually pass in knowledge of whether is loc data is
|
|
||||||
// from a param or not, and we have to store the param fp reg just like the local fp reg (mLocalBaseReg)
|
|
||||||
result = stackFrame->mRegisters.mIntRegsArray[X86Reg_EBP] + defRangeFPRel.offFramePointer;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
result = stackFrame->mRegisters.mIntRegsArray[X86Reg_ESP] + dwSubprogram->mFrameBaseLen + defRangeFPRel.offFramePointer;
|
result = stackFrame->mRegisters.mIntRegsArray[X86Reg_ESP] + dwSubprogram->mFrameBaseLen + defRangeFPRel.offFramePointer;
|
||||||
//result = stackFrame->mRegisters.mIntRegsArray[X86Reg_EBP] + defRangeFPRel.offFramePointer;
|
else if (baseReg == DbgSubprogram::LocalBaseRegKind_EBX)
|
||||||
//result = ((stackFrame->mRegisters.mIntRegsArray[X86Reg_ESP] + dwSubprogram->mFrameBaseLen) & ~7) + defRangeFPRel.offFramePointer;
|
|
||||||
}
|
|
||||||
else if (dwSubprogram->mLocalBaseReg == DbgSubprogram::LocalBaseRegKind_EBX)
|
|
||||||
result = stackFrame->mRegisters.mIntRegsArray[X86Reg_EBX] + defRangeFPRel.offFramePointer;
|
result = stackFrame->mRegisters.mIntRegsArray[X86Reg_EBX] + defRangeFPRel.offFramePointer;
|
||||||
else
|
else
|
||||||
result = stackFrame->mRegisters.mIntRegsArray[X86Reg_EBP] + defRangeFPRel.offFramePointer;
|
result = stackFrame->mRegisters.mIntRegsArray[X86Reg_EBP] + defRangeFPRel.offFramePointer;
|
||||||
|
|
|
@ -312,7 +312,7 @@ public:
|
||||||
virtual void PopulateStaticVariableMap() override;
|
virtual void PopulateStaticVariableMap() override;
|
||||||
virtual void ProcessDebugInfo() override;
|
virtual void ProcessDebugInfo() override;
|
||||||
virtual void FinishHotSwap() override;
|
virtual void FinishHotSwap() override;
|
||||||
virtual addr_target EvaluateLocation(DbgSubprogram* dwSubprogram, const uint8* locData, int locDataLen, WdStackFrame* stackFrame, DbgAddrType* outAddrType, bool allowReg) override;
|
virtual addr_target EvaluateLocation(DbgSubprogram* dwSubprogram, const uint8* locData, int locDataLen, WdStackFrame* stackFrame, DbgAddrType* outAddrType, DbgEvalLocFlags flags = DbgEvalLocFlag_None) override;
|
||||||
virtual bool CanGetOldSource() override;
|
virtual bool CanGetOldSource() override;
|
||||||
virtual String GetOldSourceCommand(const StringImpl& path) override;
|
virtual String GetOldSourceCommand(const StringImpl& path) override;
|
||||||
virtual bool HasPendingDebugInfo() override;
|
virtual bool HasPendingDebugInfo() override;
|
||||||
|
|
|
@ -6145,6 +6145,12 @@ void BfModule::Visit(BfForEachStatement* forEachStmt)
|
||||||
BfMethodMatcher methodMatcher(forEachStmt->mVariableName, this, "get__", argValues.mResolvedArgs, NULL);
|
BfMethodMatcher methodMatcher(forEachStmt->mVariableName, this, "get__", argValues.mResolvedArgs, NULL);
|
||||||
methodMatcher.mMethodType = BfMethodType_PropertyGetter;
|
methodMatcher.mMethodType = BfMethodType_PropertyGetter;
|
||||||
methodMatcher.CheckType(target.mType->ToTypeInstance(), target, false);
|
methodMatcher.CheckType(target.mType->ToTypeInstance(), target, false);
|
||||||
|
if (methodMatcher.mBestMethodDef == NULL)
|
||||||
|
{
|
||||||
|
Fail("Failed to find indexer method in array", forEachStmt);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
methodMatcher.mCheckedKind = boundsCheck ? BfCheckedKind_Checked : BfCheckedKind_Unchecked;
|
methodMatcher.mCheckedKind = boundsCheck ? BfCheckedKind_Checked : BfCheckedKind_Unchecked;
|
||||||
BfTypedValue arrayItem = exprEvaluator.CreateCall(&methodMatcher, target);
|
BfTypedValue arrayItem = exprEvaluator.CreateCall(&methodMatcher, target);
|
||||||
|
|
||||||
|
@ -6160,6 +6166,7 @@ void BfModule::Visit(BfForEachStatement* forEachStmt)
|
||||||
mBfIRBuilder->CreateStore(arrayItem.mValue, varInst);
|
mBfIRBuilder->CreateStore(arrayItem.mValue, varInst);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!itr)
|
if (!itr)
|
||||||
|
|
|
@ -6425,8 +6425,10 @@ void DbgModule::FinishHotSwap()
|
||||||
mSymbolNameMap.Clear();
|
mSymbolNameMap.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
addr_target DbgModule::ExecuteOps(DbgSubprogram* dwSubprogram, const uint8* locData, int locDataLen, WdStackFrame* stackFrame, CPURegisters* registers, DbgAddrType* outAddrType, bool allowReg, addr_target* pushValue)
|
addr_target DbgModule::ExecuteOps(DbgSubprogram* dwSubprogram, const uint8* locData, int locDataLen, WdStackFrame* stackFrame, CPURegisters* registers, DbgAddrType* outAddrType, DbgEvalLocFlags flags, addr_target* pushValue)
|
||||||
{
|
{
|
||||||
|
bool allowReg = (flags & DbgEvalLocFlag_IsParam) == 0;
|
||||||
|
|
||||||
const uint8* locDataEnd = locData + locDataLen;
|
const uint8* locDataEnd = locData + locDataLen;
|
||||||
int regNum = -1;
|
int regNum = -1;
|
||||||
|
|
||||||
|
@ -6507,7 +6509,7 @@ addr_target DbgModule::ExecuteOps(DbgSubprogram* dwSubprogram, const uint8* locD
|
||||||
}
|
}
|
||||||
|
|
||||||
BF_ASSERT(nonInlinedSubProgram->mFrameBaseData != NULL);
|
BF_ASSERT(nonInlinedSubProgram->mFrameBaseData != NULL);
|
||||||
uint64 loc = EvaluateLocation(nonInlinedSubProgram, nonInlinedSubProgram->mFrameBaseData, nonInlinedSubProgram->mFrameBaseLen, stackFrame, outAddrType, false);
|
uint64 loc = EvaluateLocation(nonInlinedSubProgram, nonInlinedSubProgram->mFrameBaseData, nonInlinedSubProgram->mFrameBaseLen, stackFrame, outAddrType, DbgEvalLocFlag_DisallowReg);
|
||||||
int64 offset = DecodeSLEB128(locData);
|
int64 offset = DecodeSLEB128(locData);
|
||||||
loc += offset;
|
loc += offset;
|
||||||
//loc = BfDebuggerReadMemory(loc);
|
//loc = BfDebuggerReadMemory(loc);
|
||||||
|
@ -6631,7 +6633,7 @@ addr_target DbgModule::ExecuteOps(DbgSubprogram* dwSubprogram, const uint8* locD
|
||||||
return stackFrameData[--stackIdx];
|
return stackFrameData[--stackIdx];
|
||||||
}
|
}
|
||||||
|
|
||||||
addr_target DbgModule::EvaluateLocation(DbgSubprogram* dwSubprogram, const uint8* locData, int locDataLen, WdStackFrame* stackFrame, DbgAddrType* outAddrType, bool allowReg)
|
addr_target DbgModule::EvaluateLocation(DbgSubprogram* dwSubprogram, const uint8* locData, int locDataLen, WdStackFrame* stackFrame, DbgAddrType* outAddrType, DbgEvalLocFlags flags)
|
||||||
{
|
{
|
||||||
BP_ZONE("DebugTarget::EvaluateLocation");
|
BP_ZONE("DebugTarget::EvaluateLocation");
|
||||||
|
|
||||||
|
@ -6725,7 +6727,7 @@ addr_target DbgModule::EvaluateLocation(DbgSubprogram* dwSubprogram, const uint8
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ExecuteOps(dwSubprogram, locData, locDataLen, stackFrame, registers, outAddrType, allowReg);
|
return ExecuteOps(dwSubprogram, locData, locDataLen, stackFrame, registers, outAddrType, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DbgModule::ProcessHotSwapVariables()
|
void DbgModule::ProcessHotSwapVariables()
|
||||||
|
|
|
@ -384,6 +384,7 @@ public:
|
||||||
int mDeferredInternalsSize;
|
int mDeferredInternalsSize;
|
||||||
int mVTableLoc;
|
int mVTableLoc;
|
||||||
int mStepFilterVersion;
|
int mStepFilterVersion;
|
||||||
|
LocalBaseRegKind mParamBaseReg;
|
||||||
LocalBaseRegKind mLocalBaseReg;
|
LocalBaseRegKind mLocalBaseReg;
|
||||||
bool mHasQualifiedName;
|
bool mHasQualifiedName;
|
||||||
bool mIsStepFiltered;
|
bool mIsStepFiltered;
|
||||||
|
@ -1086,6 +1087,13 @@ enum DbgModuleLoadState
|
||||||
DbgModuleLoadState_Loaded
|
DbgModuleLoadState_Loaded
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum DbgEvalLocFlags
|
||||||
|
{
|
||||||
|
DbgEvalLocFlag_None = 0,
|
||||||
|
DbgEvalLocFlag_DisallowReg = 1,
|
||||||
|
DbgEvalLocFlag_IsParam = 2
|
||||||
|
};
|
||||||
|
|
||||||
struct DbgSizedArrayEntry
|
struct DbgSizedArrayEntry
|
||||||
{
|
{
|
||||||
DbgType* mElementType;
|
DbgType* mElementType;
|
||||||
|
@ -1286,8 +1294,8 @@ public:
|
||||||
|
|
||||||
int64 GetImageSize();
|
int64 GetImageSize();
|
||||||
virtual void FinishHotSwap();
|
virtual void FinishHotSwap();
|
||||||
addr_target ExecuteOps(DbgSubprogram* dwSubprogram, const uint8* locData, int locDataLen, WdStackFrame* stackFrame, CPURegisters* registers, DbgAddrType* outAddrType, bool allowReg, addr_target* pushValue = NULL);
|
addr_target ExecuteOps(DbgSubprogram* dwSubprogram, const uint8* locData, int locDataLen, WdStackFrame* stackFrame, CPURegisters* registers, DbgAddrType* outAddrType, DbgEvalLocFlags flags, addr_target* pushValue = NULL);
|
||||||
virtual addr_target EvaluateLocation(DbgSubprogram* dwSubprogram, const uint8* locData, int locDataLen, WdStackFrame* stackFrame, DbgAddrType* outAddrType, bool allowReg = true);
|
virtual addr_target EvaluateLocation(DbgSubprogram* dwSubprogram, const uint8* locData, int locDataLen, WdStackFrame* stackFrame, DbgAddrType* outAddrType, DbgEvalLocFlags flags = DbgEvalLocFlag_None);
|
||||||
|
|
||||||
//const uint8* CopyOrigImageData(addr_target address, int length);
|
//const uint8* CopyOrigImageData(addr_target address, int length);
|
||||||
|
|
||||||
|
|
|
@ -1699,7 +1699,7 @@ bool DebugTarget::RollBackStackFrame_DwFrameDescriptor(CPURegisters* registers,
|
||||||
{
|
{
|
||||||
int blockLen = (int)DecodeULEB128(data);
|
int blockLen = (int)DecodeULEB128(data);
|
||||||
DbgAddrType addrType;
|
DbgAddrType addrType;
|
||||||
state->mCFA = dwFrameDescriptor->mCommonFrameDescriptor->mDbgModule->ExecuteOps(NULL, data, blockLen , NULL, registers, &addrType, true, &state->mCFA);
|
state->mCFA = dwFrameDescriptor->mCommonFrameDescriptor->mDbgModule->ExecuteOps(NULL, data, blockLen , NULL, registers, &addrType, DbgEvalLocFlag_None, &state->mCFA);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DW_CFA_expression:
|
case DW_CFA_expression:
|
||||||
|
@ -1766,7 +1766,7 @@ bool DebugTarget::RollBackStackFrame_DwFrameDescriptor(CPURegisters* registers,
|
||||||
case DW_CFA_expression:
|
case DW_CFA_expression:
|
||||||
{
|
{
|
||||||
DbgAddrType addrType;
|
DbgAddrType addrType;
|
||||||
registers->mIntRegsArray[registerNum] = dwFrameDescriptor->mCommonFrameDescriptor->mDbgModule->ExecuteOps(NULL, registerRuleData->mParamData, registerRuleData->mParamOffset, NULL, registers, &addrType, true, &state->mCFA);
|
registers->mIntRegsArray[registerNum] = dwFrameDescriptor->mCommonFrameDescriptor->mDbgModule->ExecuteOps(NULL, registerRuleData->mParamData, registerRuleData->mParamOffset, NULL, registers, &addrType, DbgEvalLocFlag_None, &state->mCFA);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -2372,7 +2372,7 @@ bool DebugTarget::GetValueByNameInBlock_Helper(DbgSubprogram* dwSubprogram, DbgB
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
*outAddr = variable->mCompileUnit->mDbgModule->EvaluateLocation(dwSubprogram, variable->mLocationData, variable->mLocationLen, stackFrame, outAddrType);
|
*outAddr = variable->mCompileUnit->mDbgModule->EvaluateLocation(dwSubprogram, variable->mLocationData, variable->mLocationLen, stackFrame, outAddrType, variable->mIsParam ? DbgEvalLocFlag_IsParam : DbgEvalLocFlag_None);
|
||||||
|
|
||||||
_FixParam(variable);
|
_FixParam(variable);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue