mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-30 17:33:24 +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);
|
clearDIEs(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
DWARFDebugInfoEntryMinimal::InlinedChain
|
DWARFDebugInfoEntryInlinedChain
|
||||||
DWARFCompileUnit::getInlinedChainForAddress(uint64_t Address) {
|
DWARFCompileUnit::getInlinedChainForAddress(uint64_t Address) {
|
||||||
// First, find a subprogram that contains the given address (the root
|
// First, find a subprogram that contains the given address (the root
|
||||||
// of inlined chain).
|
// of inlined chain).
|
||||||
@ -273,6 +273,6 @@ DWARFCompileUnit::getInlinedChainForAddress(uint64_t Address) {
|
|||||||
}
|
}
|
||||||
// Get inlined chain rooted at this subprogram DIE.
|
// Get inlined chain rooted at this subprogram DIE.
|
||||||
if (!SubprogramDIE)
|
if (!SubprogramDIE)
|
||||||
return DWARFDebugInfoEntryMinimal::InlinedChain();
|
return DWARFDebugInfoEntryInlinedChain();
|
||||||
return SubprogramDIE->getInlinedChainForAddress(this, Address);
|
return SubprogramDIE->getInlinedChainForAddress(this, Address);
|
||||||
}
|
}
|
||||||
|
@ -112,9 +112,9 @@ public:
|
|||||||
bool clear_dies_if_already_not_parsed);
|
bool clear_dies_if_already_not_parsed);
|
||||||
|
|
||||||
/// getInlinedChainForAddress - fetches inlined chain for a given address.
|
/// getInlinedChainForAddress - fetches inlined chain for a given address.
|
||||||
/// Returns empty chain if there is no subprogram containing address.
|
/// Returns empty chain if there is no subprogram containing address. The
|
||||||
DWARFDebugInfoEntryMinimal::InlinedChain getInlinedChainForAddress(
|
/// chain is valid as long as parsed compile unit DIEs are not cleared.
|
||||||
uint64_t Address);
|
DWARFDebugInfoEntryInlinedChain getInlinedChainForAddress(uint64_t Address);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// extractDIEsToVector - Appends all parsed DIEs to a vector.
|
/// 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,
|
// The address may correspond to instruction in some inlined function,
|
||||||
// so we have to build the chain of inlined functions and take the
|
// so we have to build the chain of inlined functions and take the
|
||||||
// name of the topmost function in it.
|
// name of the topmost function in it.
|
||||||
const DWARFDebugInfoEntryMinimal::InlinedChain &InlinedChain =
|
const DWARFDebugInfoEntryInlinedChain &InlinedChain =
|
||||||
CU->getInlinedChainForAddress(Address);
|
CU->getInlinedChainForAddress(Address);
|
||||||
if (InlinedChain.size() > 0) {
|
if (InlinedChain.DIEs.size() > 0) {
|
||||||
const DWARFDebugInfoEntryMinimal &TopFunctionDIE = InlinedChain[0];
|
const DWARFDebugInfoEntryMinimal &TopFunctionDIE = InlinedChain.DIEs[0];
|
||||||
if (const char *Name = TopFunctionDIE.getSubroutineName(CU))
|
if (const char *Name = TopFunctionDIE.getSubroutineName(InlinedChain.CU))
|
||||||
FunctionName = Name;
|
FunctionName = Name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -409,11 +409,11 @@ DILineInfoTable DWARFContext::getLineInfoForAddressRange(uint64_t Address,
|
|||||||
// The address may correspond to instruction in some inlined function,
|
// The address may correspond to instruction in some inlined function,
|
||||||
// so we have to build the chain of inlined functions and take the
|
// so we have to build the chain of inlined functions and take the
|
||||||
// name of the topmost function in it.
|
// name of the topmost function in it.
|
||||||
const DWARFDebugInfoEntryMinimal::InlinedChain &InlinedChain =
|
const DWARFDebugInfoEntryInlinedChain &InlinedChain =
|
||||||
CU->getInlinedChainForAddress(Address);
|
CU->getInlinedChainForAddress(Address);
|
||||||
if (InlinedChain.size() > 0) {
|
if (InlinedChain.DIEs.size() > 0) {
|
||||||
const DWARFDebugInfoEntryMinimal &TopFunctionDIE = InlinedChain[0];
|
const DWARFDebugInfoEntryMinimal &TopFunctionDIE = InlinedChain.DIEs[0];
|
||||||
if (const char *Name = TopFunctionDIE.getSubroutineName(CU))
|
if (const char *Name = TopFunctionDIE.getSubroutineName(InlinedChain.CU))
|
||||||
FunctionName = Name;
|
FunctionName = Name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -423,8 +423,8 @@ DILineInfoTable DWARFContext::getLineInfoForAddressRange(uint64_t Address,
|
|||||||
// If the Specifier says we don't need FileLineInfo, just
|
// If the Specifier says we don't need FileLineInfo, just
|
||||||
// return the top-most function at the starting address.
|
// return the top-most function at the starting address.
|
||||||
if (!Specifier.needs(DILineInfoSpecifier::FileLineInfo)) {
|
if (!Specifier.needs(DILineInfoSpecifier::FileLineInfo)) {
|
||||||
Lines.push_back(std::make_pair(Address,
|
Lines.push_back(std::make_pair(Address,
|
||||||
DILineInfo(StringRef("<invalid>"),
|
DILineInfo(StringRef("<invalid>"),
|
||||||
FuncNameRef, 0, 0)));
|
FuncNameRef, 0, 0)));
|
||||||
return Lines;
|
return Lines;
|
||||||
}
|
}
|
||||||
@ -446,7 +446,7 @@ DILineInfoTable DWARFContext::getLineInfoForAddressRange(uint64_t Address,
|
|||||||
std::string FileName = "<invalid>";
|
std::string FileName = "<invalid>";
|
||||||
getFileNameForCompileUnit(CU, LineTable, Row.File,
|
getFileNameForCompileUnit(CU, LineTable, Row.File,
|
||||||
NeedsAbsoluteFilePath, FileName);
|
NeedsAbsoluteFilePath, FileName);
|
||||||
Lines.push_back(std::make_pair(Row.Address,
|
Lines.push_back(std::make_pair(Row.Address,
|
||||||
DILineInfo(StringRef(FileName),
|
DILineInfo(StringRef(FileName),
|
||||||
FuncNameRef, Row.Line, Row.Column)));
|
FuncNameRef, Row.Line, Row.Column)));
|
||||||
}
|
}
|
||||||
@ -460,23 +460,23 @@ DIInliningInfo DWARFContext::getInliningInfoForAddress(uint64_t Address,
|
|||||||
if (!CU)
|
if (!CU)
|
||||||
return DIInliningInfo();
|
return DIInliningInfo();
|
||||||
|
|
||||||
const DWARFDebugInfoEntryMinimal::InlinedChain &InlinedChain =
|
const DWARFDebugInfoEntryInlinedChain &InlinedChain =
|
||||||
CU->getInlinedChainForAddress(Address);
|
CU->getInlinedChainForAddress(Address);
|
||||||
if (InlinedChain.size() == 0)
|
if (InlinedChain.DIEs.size() == 0)
|
||||||
return DIInliningInfo();
|
return DIInliningInfo();
|
||||||
|
|
||||||
DIInliningInfo InliningInfo;
|
DIInliningInfo InliningInfo;
|
||||||
uint32_t CallFile = 0, CallLine = 0, CallColumn = 0;
|
uint32_t CallFile = 0, CallLine = 0, CallColumn = 0;
|
||||||
const DWARFLineTable *LineTable = 0;
|
const DWARFLineTable *LineTable = 0;
|
||||||
for (uint32_t i = 0, n = InlinedChain.size(); i != n; i++) {
|
for (uint32_t i = 0, n = InlinedChain.DIEs.size(); i != n; i++) {
|
||||||
const DWARFDebugInfoEntryMinimal &FunctionDIE = InlinedChain[i];
|
const DWARFDebugInfoEntryMinimal &FunctionDIE = InlinedChain.DIEs[i];
|
||||||
std::string FileName = "<invalid>";
|
std::string FileName = "<invalid>";
|
||||||
std::string FunctionName = "<invalid>";
|
std::string FunctionName = "<invalid>";
|
||||||
uint32_t Line = 0;
|
uint32_t Line = 0;
|
||||||
uint32_t Column = 0;
|
uint32_t Column = 0;
|
||||||
// Get function name if necessary.
|
// Get function name if necessary.
|
||||||
if (Specifier.needs(DILineInfoSpecifier::FunctionName)) {
|
if (Specifier.needs(DILineInfoSpecifier::FunctionName)) {
|
||||||
if (const char *Name = FunctionDIE.getSubroutineName(CU))
|
if (const char *Name = FunctionDIE.getSubroutineName(InlinedChain.CU))
|
||||||
FunctionName = Name;
|
FunctionName = Name;
|
||||||
}
|
}
|
||||||
if (Specifier.needs(DILineInfoSpecifier::FileLineInfo)) {
|
if (Specifier.needs(DILineInfoSpecifier::FileLineInfo)) {
|
||||||
@ -500,7 +500,8 @@ DIInliningInfo DWARFContext::getInliningInfoForAddress(uint64_t Address,
|
|||||||
}
|
}
|
||||||
// Get call file/line/column of a current DIE.
|
// Get call file/line/column of a current DIE.
|
||||||
if (i + 1 < n) {
|
if (i + 1 < n) {
|
||||||
FunctionDIE.getCallerFrame(CU, CallFile, CallLine, CallColumn);
|
FunctionDIE.getCallerFrame(InlinedChain.CU, CallFile, CallLine,
|
||||||
|
CallColumn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DILineInfo Frame(StringRef(FileName), StringRef(FunctionName),
|
DILineInfo Frame(StringRef(FileName), StringRef(FunctionName),
|
||||||
|
@ -366,19 +366,18 @@ void DWARFDebugInfoEntryMinimal::getCallerFrame(const DWARFCompileUnit *CU,
|
|||||||
CallColumn = getAttributeValueAsUnsigned(CU, DW_AT_call_column, 0);
|
CallColumn = getAttributeValueAsUnsigned(CU, DW_AT_call_column, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
DWARFDebugInfoEntryMinimal::InlinedChain
|
DWARFDebugInfoEntryInlinedChain
|
||||||
DWARFDebugInfoEntryMinimal::getInlinedChainForAddress(
|
DWARFDebugInfoEntryMinimal::getInlinedChainForAddress(
|
||||||
const DWARFCompileUnit *CU,
|
const DWARFCompileUnit *CU, const uint64_t Address) const {
|
||||||
const uint64_t Address)
|
DWARFDebugInfoEntryInlinedChain InlinedChain;
|
||||||
const {
|
InlinedChain.CU = CU;
|
||||||
DWARFDebugInfoEntryMinimal::InlinedChain InlinedChain;
|
|
||||||
if (isNULL())
|
if (isNULL())
|
||||||
return InlinedChain;
|
return InlinedChain;
|
||||||
for (const DWARFDebugInfoEntryMinimal *DIE = this; DIE; ) {
|
for (const DWARFDebugInfoEntryMinimal *DIE = this; DIE; ) {
|
||||||
// Append current DIE to inlined chain only if it has correct tag
|
// Append current DIE to inlined chain only if it has correct tag
|
||||||
// (e.g. it is not a lexical block).
|
// (e.g. it is not a lexical block).
|
||||||
if (DIE->isSubroutineDIE()) {
|
if (DIE->isSubroutineDIE()) {
|
||||||
InlinedChain.push_back(*DIE);
|
InlinedChain.DIEs.push_back(*DIE);
|
||||||
}
|
}
|
||||||
// Try to get child which also contains provided address.
|
// Try to get child which also contains provided address.
|
||||||
const DWARFDebugInfoEntryMinimal *Child = DIE->getFirstChild();
|
const DWARFDebugInfoEntryMinimal *Child = DIE->getFirstChild();
|
||||||
@ -392,6 +391,6 @@ DWARFDebugInfoEntryMinimal::getInlinedChainForAddress(
|
|||||||
DIE = Child;
|
DIE = Child;
|
||||||
}
|
}
|
||||||
// Reverse the obtained chain to make the root of inlined chain last.
|
// 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;
|
return InlinedChain;
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@ class DWARFDebugAranges;
|
|||||||
class DWARFCompileUnit;
|
class DWARFCompileUnit;
|
||||||
class DWARFContext;
|
class DWARFContext;
|
||||||
class DWARFFormValue;
|
class DWARFFormValue;
|
||||||
class DWARFInlinedSubroutineChain;
|
struct DWARFDebugInfoEntryInlinedChain;
|
||||||
|
|
||||||
/// DWARFDebugInfoEntryMinimal - A DIE with only the minimum required data.
|
/// DWARFDebugInfoEntryMinimal - A DIE with only the minimum required data.
|
||||||
class DWARFDebugInfoEntryMinimal {
|
class DWARFDebugInfoEntryMinimal {
|
||||||
@ -162,18 +162,23 @@ public:
|
|||||||
void getCallerFrame(const DWARFCompileUnit *CU, uint32_t &CallFile,
|
void getCallerFrame(const DWARFCompileUnit *CU, uint32_t &CallFile,
|
||||||
uint32_t &CallLine, uint32_t &CallColumn) const;
|
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.
|
/// Get inlined chain for a given address, rooted at the current DIE.
|
||||||
/// Returns empty chain if address is not contained in address range
|
/// Returns empty chain if address is not contained in address range
|
||||||
/// of current DIE.
|
/// of current DIE.
|
||||||
InlinedChain getInlinedChainForAddress(const DWARFCompileUnit *CU,
|
DWARFDebugInfoEntryInlinedChain
|
||||||
const uint64_t Address) const;
|
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