aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Samsonov <samsonov@google.com>2013-08-06 10:49:15 +0000
committerAlexey Samsonov <samsonov@google.com>2013-08-06 10:49:15 +0000
commite664290ad6d988e0ae40f2461084f6adbababa47 (patch)
tree61ac2dc9fbd57bbfea16f43d2aa8afc7453db741
parent7398c774f636f881166a73ff32275354b505d852 (diff)
downloadexternal_llvm-e664290ad6d988e0ae40f2461084f6adbababa47.zip
external_llvm-e664290ad6d988e0ae40f2461084f6adbababa47.tar.gz
external_llvm-e664290ad6d988e0ae40f2461084f6adbababa47.tar.bz2
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
-rw-r--r--lib/DebugInfo/DWARFCompileUnit.cpp4
-rw-r--r--lib/DebugInfo/DWARFCompileUnit.h6
-rw-r--r--lib/DebugInfo/DWARFContext.cpp35
-rw-r--r--lib/DebugInfo/DWARFDebugInfoEntry.cpp13
-rw-r--r--lib/DebugInfo/DWARFDebugInfoEntry.h25
5 files changed, 44 insertions, 39 deletions
diff --git a/lib/DebugInfo/DWARFCompileUnit.cpp b/lib/DebugInfo/DWARFCompileUnit.cpp
index ef3ddf9..93b1622 100644
--- a/lib/DebugInfo/DWARFCompileUnit.cpp
+++ b/lib/DebugInfo/DWARFCompileUnit.cpp
@@ -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);
}
diff --git a/lib/DebugInfo/DWARFCompileUnit.h b/lib/DebugInfo/DWARFCompileUnit.h
index 071be90..dc2214b 100644
--- a/lib/DebugInfo/DWARFCompileUnit.h
+++ b/lib/DebugInfo/DWARFCompileUnit.h
@@ -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.
diff --git a/lib/DebugInfo/DWARFContext.cpp b/lib/DebugInfo/DWARFContext.cpp
index 6ecd0a7..51ad645 100644
--- a/lib/DebugInfo/DWARFContext.cpp
+++ b/lib/DebugInfo/DWARFContext.cpp
@@ -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),
diff --git a/lib/DebugInfo/DWARFDebugInfoEntry.cpp b/lib/DebugInfo/DWARFDebugInfoEntry.cpp
index 10be7b4..0c7b7e3 100644
--- a/lib/DebugInfo/DWARFDebugInfoEntry.cpp
+++ b/lib/DebugInfo/DWARFDebugInfoEntry.cpp
@@ -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;
}
diff --git a/lib/DebugInfo/DWARFDebugInfoEntry.h b/lib/DebugInfo/DWARFDebugInfoEntry.h
index 9003591..a69911f 100644
--- a/lib/DebugInfo/DWARFDebugInfoEntry.h
+++ b/lib/DebugInfo/DWARFDebugInfoEntry.h
@@ -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;
};
}