diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2011-09-15 20:43:18 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2011-09-15 20:43:18 +0000 |
commit | c26ed9b47ff77ca6244feda9e3837b49624605db (patch) | |
tree | 85ca519ec4b793cfdfe44275827433ce178d4f36 /lib/DebugInfo/DWARFContext.cpp | |
parent | aba8015cc375ac7de757d92e55d1aad986de6202 (diff) | |
download | external_llvm-c26ed9b47ff77ca6244feda9e3837b49624605db.zip external_llvm-c26ed9b47ff77ca6244feda9e3837b49624605db.tar.gz external_llvm-c26ed9b47ff77ca6244feda9e3837b49624605db.tar.bz2 |
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.cpp | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/lib/DebugInfo/DWARFContext.cpp b/lib/DebugInfo/DWARFContext.cpp index 184a8b5..36c6d98 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() { |