summaryrefslogtreecommitdiff
path: root/lib/DebugInfo/DWARFContext.cpp
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2011-09-15 20:43:18 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2011-09-15 20:43:18 +0000
commitc26ed9b47ff77ca6244feda9e3837b49624605db (patch)
tree85ca519ec4b793cfdfe44275827433ce178d4f36 /lib/DebugInfo/DWARFContext.cpp
parentaba8015cc375ac7de757d92e55d1aad986de6202 (diff)
downloadllvm-c26ed9b47ff77ca6244feda9e3837b49624605db.tar.gz
llvm-c26ed9b47ff77ca6244feda9e3837b49624605db.tar.bz2
llvm-c26ed9b47ff77ca6244feda9e3837b49624605db.tar.xz
DWARF: Remove accessors that parse the whole line table section in one go, this can't possibly work.
The address size is specified by the compile unit associated with a line table, there is no global address size. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@139835 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/DebugInfo/DWARFContext.cpp')
-rw-r--r--lib/DebugInfo/DWARFContext.cpp28
1 files changed, 19 insertions, 9 deletions
diff --git a/lib/DebugInfo/DWARFContext.cpp b/lib/DebugInfo/DWARFContext.cpp
index 184a8b595c..36c6d98ac6 100644
--- a/lib/DebugInfo/DWARFContext.cpp
+++ b/lib/DebugInfo/DWARFContext.cpp
@@ -77,15 +77,25 @@ const DWARFDebugAranges *DWARFContext::getDebugAranges() {
return Aranges.get();
}
-const DWARFDebugLine *DWARFContext::getDebugLine() {
- if (Line)
- return Line.get();
-
- DataExtractor lineData(getLineSection(), isLittleEndian(), 0);
-
- Line.reset(new DWARFDebugLine());
- Line->parse(lineData);
- return Line.get();
+const DWARFDebugLine::LineTable *
+DWARFContext::getLineTableForCompileUnit(DWARFCompileUnit *cu) {
+ if (!Line)
+ Line.reset(new DWARFDebugLine());
+
+ unsigned stmtOffset =
+ cu->getCompileUnitDIE()->getAttributeValueAsUnsigned(cu, DW_AT_stmt_list,
+ -1U);
+ if (stmtOffset == -1U)
+ return 0; // No line table for this compile unit.
+
+ // See if the line table is cached.
+ if (const DWARFDebugLine::LineTable *lt = Line->getLineTable(stmtOffset))
+ return lt;
+
+ // We have to parse it first.
+ DataExtractor lineData(getLineSection(), isLittleEndian(),
+ cu->getAddressByteSize());
+ return Line->getOrParseLineTable(lineData, stmtOffset);
}
void DWARFContext::parseCompileUnits() {