mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 19:31:58 +00:00
Store compile unit corresponding to each chain of inlined debug info entries. No functionality change.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@187792 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7398c774f6
commit
e664290ad6
@ -258,7 +258,7 @@ DWARFCompileUnit::buildAddressRangeTable(DWARFDebugAranges *debug_aranges,
|
||||
clearDIEs(true);
|
||||
}
|
||||
|
||||
DWARFDebugInfoEntryMinimal::InlinedChain
|
||||
DWARFDebugInfoEntryInlinedChain
|
||||
DWARFCompileUnit::getInlinedChainForAddress(uint64_t Address) {
|
||||
// First, find a subprogram that contains the given address (the root
|
||||
// of inlined chain).
|
||||
@ -273,6 +273,6 @@ DWARFCompileUnit::getInlinedChainForAddress(uint64_t Address) {
|
||||
}
|
||||
// Get inlined chain rooted at this subprogram DIE.
|
||||
if (!SubprogramDIE)
|
||||
return DWARFDebugInfoEntryMinimal::InlinedChain();
|
||||
return DWARFDebugInfoEntryInlinedChain();
|
||||
return SubprogramDIE->getInlinedChainForAddress(this, Address);
|
||||
}
|
||||
|
@ -112,9 +112,9 @@ public:
|
||||
bool clear_dies_if_already_not_parsed);
|
||||
|
||||
/// getInlinedChainForAddress - fetches inlined chain for a given address.
|
||||
/// Returns empty chain if there is no subprogram containing address.
|
||||
DWARFDebugInfoEntryMinimal::InlinedChain getInlinedChainForAddress(
|
||||
uint64_t Address);
|
||||
/// Returns empty chain if there is no subprogram containing address. The
|
||||
/// chain is valid as long as parsed compile unit DIEs are not cleared.
|
||||
DWARFDebugInfoEntryInlinedChain getInlinedChainForAddress(uint64_t Address);
|
||||
|
||||
private:
|
||||
/// extractDIEsToVector - Appends all parsed DIEs to a vector.
|
||||
|
@ -376,11 +376,11 @@ DILineInfo DWARFContext::getLineInfoForAddress(uint64_t Address,
|
||||
// The address may correspond to instruction in some inlined function,
|
||||
// so we have to build the chain of inlined functions and take the
|
||||
// name of the topmost function in it.
|
||||
const DWARFDebugInfoEntryMinimal::InlinedChain &InlinedChain =
|
||||
const DWARFDebugInfoEntryInlinedChain &InlinedChain =
|
||||
CU->getInlinedChainForAddress(Address);
|
||||
if (InlinedChain.size() > 0) {
|
||||
const DWARFDebugInfoEntryMinimal &TopFunctionDIE = InlinedChain[0];
|
||||
if (const char *Name = TopFunctionDIE.getSubroutineName(CU))
|
||||
if (InlinedChain.DIEs.size() > 0) {
|
||||
const DWARFDebugInfoEntryMinimal &TopFunctionDIE = InlinedChain.DIEs[0];
|
||||
if (const char *Name = TopFunctionDIE.getSubroutineName(InlinedChain.CU))
|
||||
FunctionName = Name;
|
||||
}
|
||||
}
|
||||
@ -409,11 +409,11 @@ DILineInfoTable DWARFContext::getLineInfoForAddressRange(uint64_t Address,
|
||||
// The address may correspond to instruction in some inlined function,
|
||||
// so we have to build the chain of inlined functions and take the
|
||||
// name of the topmost function in it.
|
||||
const DWARFDebugInfoEntryMinimal::InlinedChain &InlinedChain =
|
||||
const DWARFDebugInfoEntryInlinedChain &InlinedChain =
|
||||
CU->getInlinedChainForAddress(Address);
|
||||
if (InlinedChain.size() > 0) {
|
||||
const DWARFDebugInfoEntryMinimal &TopFunctionDIE = InlinedChain[0];
|
||||
if (const char *Name = TopFunctionDIE.getSubroutineName(CU))
|
||||
if (InlinedChain.DIEs.size() > 0) {
|
||||
const DWARFDebugInfoEntryMinimal &TopFunctionDIE = InlinedChain.DIEs[0];
|
||||
if (const char *Name = TopFunctionDIE.getSubroutineName(InlinedChain.CU))
|
||||
FunctionName = Name;
|
||||
}
|
||||
}
|
||||
@ -423,8 +423,8 @@ DILineInfoTable DWARFContext::getLineInfoForAddressRange(uint64_t Address,
|
||||
// If the Specifier says we don't need FileLineInfo, just
|
||||
// return the top-most function at the starting address.
|
||||
if (!Specifier.needs(DILineInfoSpecifier::FileLineInfo)) {
|
||||
Lines.push_back(std::make_pair(Address,
|
||||
DILineInfo(StringRef("<invalid>"),
|
||||
Lines.push_back(std::make_pair(Address,
|
||||
DILineInfo(StringRef("<invalid>"),
|
||||
FuncNameRef, 0, 0)));
|
||||
return Lines;
|
||||
}
|
||||
@ -446,7 +446,7 @@ DILineInfoTable DWARFContext::getLineInfoForAddressRange(uint64_t Address,
|
||||
std::string FileName = "<invalid>";
|
||||
getFileNameForCompileUnit(CU, LineTable, Row.File,
|
||||
NeedsAbsoluteFilePath, FileName);
|
||||
Lines.push_back(std::make_pair(Row.Address,
|
||||
Lines.push_back(std::make_pair(Row.Address,
|
||||
DILineInfo(StringRef(FileName),
|
||||
FuncNameRef, Row.Line, Row.Column)));
|
||||
}
|
||||
@ -460,23 +460,23 @@ DIInliningInfo DWARFContext::getInliningInfoForAddress(uint64_t Address,
|
||||
if (!CU)
|
||||
return DIInliningInfo();
|
||||
|
||||
const DWARFDebugInfoEntryMinimal::InlinedChain &InlinedChain =
|
||||
const DWARFDebugInfoEntryInlinedChain &InlinedChain =
|
||||
CU->getInlinedChainForAddress(Address);
|
||||
if (InlinedChain.size() == 0)
|
||||
if (InlinedChain.DIEs.size() == 0)
|
||||
return DIInliningInfo();
|
||||
|
||||
DIInliningInfo InliningInfo;
|
||||
uint32_t CallFile = 0, CallLine = 0, CallColumn = 0;
|
||||
const DWARFLineTable *LineTable = 0;
|
||||
for (uint32_t i = 0, n = InlinedChain.size(); i != n; i++) {
|
||||
const DWARFDebugInfoEntryMinimal &FunctionDIE = InlinedChain[i];
|
||||
for (uint32_t i = 0, n = InlinedChain.DIEs.size(); i != n; i++) {
|
||||
const DWARFDebugInfoEntryMinimal &FunctionDIE = InlinedChain.DIEs[i];
|
||||
std::string FileName = "<invalid>";
|
||||
std::string FunctionName = "<invalid>";
|
||||
uint32_t Line = 0;
|
||||
uint32_t Column = 0;
|
||||
// Get function name if necessary.
|
||||
if (Specifier.needs(DILineInfoSpecifier::FunctionName)) {
|
||||
if (const char *Name = FunctionDIE.getSubroutineName(CU))
|
||||
if (const char *Name = FunctionDIE.getSubroutineName(InlinedChain.CU))
|
||||
FunctionName = Name;
|
||||
}
|
||||
if (Specifier.needs(DILineInfoSpecifier::FileLineInfo)) {
|
||||
@ -500,7 +500,8 @@ DIInliningInfo DWARFContext::getInliningInfoForAddress(uint64_t Address,
|
||||
}
|
||||
// Get call file/line/column of a current DIE.
|
||||
if (i + 1 < n) {
|
||||
FunctionDIE.getCallerFrame(CU, CallFile, CallLine, CallColumn);
|
||||
FunctionDIE.getCallerFrame(InlinedChain.CU, CallFile, CallLine,
|
||||
CallColumn);
|
||||
}
|
||||
}
|
||||
DILineInfo Frame(StringRef(FileName), StringRef(FunctionName),
|
||||
|
@ -366,19 +366,18 @@ void DWARFDebugInfoEntryMinimal::getCallerFrame(const DWARFCompileUnit *CU,
|
||||
CallColumn = getAttributeValueAsUnsigned(CU, DW_AT_call_column, 0);
|
||||
}
|
||||
|
||||
DWARFDebugInfoEntryMinimal::InlinedChain
|
||||
DWARFDebugInfoEntryInlinedChain
|
||||
DWARFDebugInfoEntryMinimal::getInlinedChainForAddress(
|
||||
const DWARFCompileUnit *CU,
|
||||
const uint64_t Address)
|
||||
const {
|
||||
DWARFDebugInfoEntryMinimal::InlinedChain InlinedChain;
|
||||
const DWARFCompileUnit *CU, const uint64_t Address) const {
|
||||
DWARFDebugInfoEntryInlinedChain InlinedChain;
|
||||
InlinedChain.CU = CU;
|
||||
if (isNULL())
|
||||
return InlinedChain;
|
||||
for (const DWARFDebugInfoEntryMinimal *DIE = this; DIE; ) {
|
||||
// Append current DIE to inlined chain only if it has correct tag
|
||||
// (e.g. it is not a lexical block).
|
||||
if (DIE->isSubroutineDIE()) {
|
||||
InlinedChain.push_back(*DIE);
|
||||
InlinedChain.DIEs.push_back(*DIE);
|
||||
}
|
||||
// Try to get child which also contains provided address.
|
||||
const DWARFDebugInfoEntryMinimal *Child = DIE->getFirstChild();
|
||||
@ -392,6 +391,6 @@ DWARFDebugInfoEntryMinimal::getInlinedChainForAddress(
|
||||
DIE = Child;
|
||||
}
|
||||
// Reverse the obtained chain to make the root of inlined chain last.
|
||||
std::reverse(InlinedChain.begin(), InlinedChain.end());
|
||||
std::reverse(InlinedChain.DIEs.begin(), InlinedChain.DIEs.end());
|
||||
return InlinedChain;
|
||||
}
|
||||
|
@ -20,7 +20,7 @@ class DWARFDebugAranges;
|
||||
class DWARFCompileUnit;
|
||||
class DWARFContext;
|
||||
class DWARFFormValue;
|
||||
class DWARFInlinedSubroutineChain;
|
||||
struct DWARFDebugInfoEntryInlinedChain;
|
||||
|
||||
/// DWARFDebugInfoEntryMinimal - A DIE with only the minimum required data.
|
||||
class DWARFDebugInfoEntryMinimal {
|
||||
@ -162,18 +162,23 @@ public:
|
||||
void getCallerFrame(const DWARFCompileUnit *CU, uint32_t &CallFile,
|
||||
uint32_t &CallLine, uint32_t &CallColumn) const;
|
||||
|
||||
/// InlinedChain - represents a chain of inlined_subroutine
|
||||
/// DIEs, (possibly ending with subprogram DIE), all of which are contained
|
||||
/// in some concrete inlined instance tree. Address range for each DIE
|
||||
/// (except the last DIE) in this chain is contained in address
|
||||
/// range for next DIE in the chain.
|
||||
typedef SmallVector<DWARFDebugInfoEntryMinimal, 4> InlinedChain;
|
||||
|
||||
/// Get inlined chain for a given address, rooted at the current DIE.
|
||||
/// Returns empty chain if address is not contained in address range
|
||||
/// of current DIE.
|
||||
InlinedChain getInlinedChainForAddress(const DWARFCompileUnit *CU,
|
||||
const uint64_t Address) const;
|
||||
DWARFDebugInfoEntryInlinedChain
|
||||
getInlinedChainForAddress(const DWARFCompileUnit *CU,
|
||||
const uint64_t Address) const;
|
||||
};
|
||||
|
||||
/// DWARFDebugInfoEntryInlinedChain - represents a chain of inlined_subroutine
|
||||
/// DIEs, (possibly ending with subprogram DIE), all of which are contained
|
||||
/// in some concrete inlined instance tree. Address range for each DIE
|
||||
/// (except the last DIE) in this chain is contained in address
|
||||
/// range for next DIE in the chain.
|
||||
struct DWARFDebugInfoEntryInlinedChain {
|
||||
DWARFDebugInfoEntryInlinedChain() : CU(0) {}
|
||||
SmallVector<DWARFDebugInfoEntryMinimal, 4> DIEs;
|
||||
const DWARFCompileUnit *CU;
|
||||
};
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user