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:
Alexey Samsonov 2013-08-06 10:49:15 +00:00
parent 7398c774f6
commit e664290ad6
5 changed files with 44 additions and 39 deletions

View File

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

View File

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

View File

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

View File

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

View File

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