DWARF: Add basic support for line tables.
[oota-llvm.git] / lib / DebugInfo / DWARFContext.cpp
1 //===-- DWARFContext.cpp --------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "DWARFContext.h"
11 #include "llvm/Support/raw_ostream.h"
12 using namespace llvm;
13
14 void DWARFContext::dump(raw_ostream &OS) {
15   OS << ".debug_abbrev contents:\n";
16   getDebugAbbrev()->dump(OS);
17
18   OS << "\n.debug_info contents:\n";
19   for (unsigned i = 0, e = getNumCompileUnits(); i != e; ++i)
20     getCompileUnitAtIndex(i)->dump(OS);
21
22   OS << "\n.debug_aranges contents:\n";
23   DataExtractor arangesData(getARangeSection(), isLittleEndian(), 0);
24   uint32_t offset = 0;
25   DWARFDebugArangeSet set;
26   while (set.extract(arangesData, &offset))
27     set.dump(OS);
28
29   OS << "\n.debug_lines contents:\n";
30   DataExtractor lineData(getLineSection(), isLittleEndian(), 8);
31   DWARFDebugLine::dump(lineData, OS);
32 }
33
34 const DWARFDebugAbbrev *DWARFContext::getDebugAbbrev() {
35   if (Abbrev)
36     return Abbrev.get();
37
38   DataExtractor abbrData(getAbbrevSection(), isLittleEndian(), 0);
39
40   Abbrev.reset(new DWARFDebugAbbrev());
41   Abbrev->parse(abbrData);
42   return Abbrev.get();
43 }
44
45 const DWARFDebugAranges *DWARFContext::getDebugAranges() {
46   if (Aranges)
47     return Aranges.get();
48
49   DataExtractor arangesData(getARangeSection(), isLittleEndian(), 0);
50
51   Aranges.reset(new DWARFDebugAranges());
52   Aranges->extract(arangesData);
53   if (Aranges->isEmpty()) // No aranges in file, generate them from the DIEs.
54     Aranges->generate(this);
55   return Aranges.get();
56 }
57
58 const DWARFDebugLine *DWARFContext::getDebugLine() {
59   if (Line)
60     return Line.get();
61
62   DataExtractor lineData(getLineSection(), isLittleEndian(), 0);
63
64   Line.reset(new DWARFDebugLine());
65   Line->parse(lineData);
66   return Line.get();
67 }
68
69 void DWARFContext::parseCompileUnits() {
70   uint32_t offset = 0;
71   const DataExtractor &debug_info_data = DataExtractor(getInfoSection(),
72                                                        isLittleEndian(), 0);
73   while (debug_info_data.isValidOffset(offset)) {
74     CUs.push_back(DWARFCompileUnit(*this));
75     if (!CUs.back().extract(debug_info_data, &offset)) {
76       CUs.pop_back();
77       break;
78     }
79
80     offset = CUs.back().getNextCompileUnitOffset();
81   }
82 }