3359ae3b900ded9b074c49a2f1a554db70f9af79
[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
30 const DWARFDebugAbbrev *DWARFContext::getDebugAbbrev() {
31   if (Abbrev)
32     return Abbrev.get();
33
34   DataExtractor abbrData(getAbbrevSection(), isLittleEndian(), 0);
35
36   Abbrev.reset(new DWARFDebugAbbrev());
37   Abbrev->parse(abbrData);
38   return Abbrev.get();
39 }
40
41 const DWARFDebugAranges *DWARFContext::getDebugAranges() {
42   if (Aranges)
43     return Aranges.get();
44
45   DataExtractor arangesData(getARangeSection(), isLittleEndian(), 0);
46
47   Aranges.reset(new DWARFDebugAranges());
48   Aranges->extract(arangesData);
49   if (Aranges->isEmpty()) // No aranges in file, generate them from the DIEs.
50     Aranges->generate(this);
51   return Aranges.get();
52 }
53
54 void DWARFContext::parseCompileUnits() {
55   uint32_t offset = 0;
56   const DataExtractor &debug_info_data = DataExtractor(getInfoSection(),
57                                                        isLittleEndian(), 0);
58   while (debug_info_data.isValidOffset(offset)) {
59     CUs.push_back(DWARFCompileUnit(*this));
60     if (!CUs.back().extract(debug_info_data, &offset)) {
61       CUs.pop_back();
62       break;
63     }
64
65     offset = CUs.back().getNextCompileUnitOffset();
66   }
67 }