MCPcopy Create free account
hub / github.com/beefytech/Beef / EvaluateLocation

Method EvaluateLocation

IDEHelper/DbgModule.cpp:7023–7118  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

7021}
7022
7023intptr DbgModule::EvaluateLocation(DbgSubprogram* dwSubprogram, const uint8* locData, int locDataLen, WdStackFrame* stackFrame, DbgAddrType* outAddrType, DbgEvalLocFlags flags)
7024{
7025 BP_ZONE("DebugTarget::EvaluateLocation");
7026
7027 auto dbgModule = this;
7028
7029 if (locDataLen == DbgLocationLenKind_SegPlusOffset)
7030 {
7031 BF_ASSERT(dbgModule->mDbgFlavor == DbgFlavor_MS);
7032 if (dbgModule->mDbgFlavor == DbgFlavor_MS)
7033 {
7034 COFF* coff = (COFF*)dbgModule;
7035 struct SegOfsData
7036 {
7037 uint32 mOfs;
7038 uint16 mSeg;
7039 };
7040 SegOfsData* segOfsData = (SegOfsData*)locData;
7041
7042 *outAddrType = DbgAddrType_Target;
7043 return coff->GetSectionAddr(segOfsData->mSeg, segOfsData->mOfs);
7044 }
7045 else
7046 {
7047 *outAddrType = DbgAddrType_Target;
7048 return 0;
7049 }
7050 }
7051
7052 CPURegisters* registers = NULL;
7053 if (stackFrame != NULL)
7054 registers = &stackFrame->mRegisters;
7055
7056 if (locDataLen < 0)
7057 {
7058 if (registers == NULL)
7059 return 0;
7060 int64 ipAddr = stackFrame->GetSourcePC();
7061
7062 const uint8* checkLocData = locData;
7063 int64 startLoc = (int64)GET_FROM(checkLocData, addr_target);
7064 int64 endLoc = startLoc + GET_FROM(checkLocData, uint16);
7065
7066 BF_ASSERT(dwSubprogram != NULL);
7067 startLoc += dwSubprogram->mCompileUnit->mLowPC;
7068 endLoc += dwSubprogram->mCompileUnit->mLowPC;
7069
7070 if ((ipAddr >= startLoc) && (ipAddr < endLoc))
7071 {
7072 locDataLen = -locDataLen - sizeof(addr_target) - sizeof(uint16);
7073 locData = checkLocData;
7074 }
7075 else
7076 {
7077 *outAddrType = DbgAddrType_OptimizedOut;
7078 return 0;
7079 }
7080 }

Callers

nothing calls this directly

Calls 2

GetSectionAddrMethod · 0.80
GetSourcePCMethod · 0.80

Tested by

no test coverage detected