1
0
Fork 0
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:
Brian Fiete 2019-12-01 10:17:09 -08:00
parent 5b25039ff4
commit 2bb2a5926a
6 changed files with 48 additions and 40 deletions

View file

@ -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)
{ result = stackFrame->mRegisters.mIntRegsArray[X86Reg_ESP] + dwSubprogram->mFrameBaseLen + defRangeFPRel.offFramePointer;
if (defRangeFPRel.offFramePointer > 0) else if (baseReg == DbgSubprogram::LocalBaseRegKind_EBX)
{
// 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_EBP] + defRangeFPRel.offFramePointer;
//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;

View file

@ -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;

View file

@ -6145,19 +6145,26 @@ 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);
methodMatcher.mCheckedKind = boundsCheck ? BfCheckedKind_Checked : BfCheckedKind_Unchecked; if (methodMatcher.mBestMethodDef == NULL)
BfTypedValue arrayItem = exprEvaluator.CreateCall(&methodMatcher, target);
if ((varInst) && (arrayItem))
{ {
if (isRefExpression) Fail("Failed to find indexer method in array", forEachStmt);
arrayItem = BfTypedValue(arrayItem.mValue, CreateRefType(arrayItem.mType)); }
else if (!arrayItem.mType->IsComposite()) else
{
methodMatcher.mCheckedKind = boundsCheck ? BfCheckedKind_Checked : BfCheckedKind_Unchecked;
BfTypedValue arrayItem = exprEvaluator.CreateCall(&methodMatcher, target);
if ((varInst) && (arrayItem))
{
if (isRefExpression)
arrayItem = BfTypedValue(arrayItem.mValue, CreateRefType(arrayItem.mType));
else if (!arrayItem.mType->IsComposite())
arrayItem = LoadValue(arrayItem);
arrayItem = Cast(forEachStmt->mCollectionExpression, arrayItem, varType, BfCastFlags_Explicit);
arrayItem = LoadValue(arrayItem); arrayItem = LoadValue(arrayItem);
arrayItem = Cast(forEachStmt->mCollectionExpression, arrayItem, varType, BfCastFlags_Explicit); if (arrayItem)
arrayItem = LoadValue(arrayItem); mBfIRBuilder->CreateStore(arrayItem.mValue, varInst);
if (arrayItem) }
mBfIRBuilder->CreateStore(arrayItem.mValue, varInst);
} }
} }
else else

View file

@ -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()

View file

@ -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);

View file

@ -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);