]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/lib/DebugInfo/DWARFDebugAbbrev.cpp
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / lib / DebugInfo / DWARFDebugAbbrev.cpp
1 //===-- DWARFDebugAbbrev.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 "DWARFDebugAbbrev.h"
11 #include "llvm/Support/Format.h"
12 #include "llvm/Support/raw_ostream.h"
13 using namespace llvm;
14
15 bool DWARFAbbreviationDeclarationSet::extract(DataExtractor data,
16                                               uint32_t* offset_ptr) {
17   const uint32_t beginOffset = *offset_ptr;
18   Offset = beginOffset;
19   clear();
20   DWARFAbbreviationDeclaration abbrevDeclaration;
21   uint32_t prevAbbrAode = 0;
22   while (abbrevDeclaration.extract(data, offset_ptr)) {
23     Decls.push_back(abbrevDeclaration);
24     if (IdxOffset == 0) {
25       IdxOffset = abbrevDeclaration.getCode();
26     } else {
27       if (prevAbbrAode + 1 != abbrevDeclaration.getCode())
28         IdxOffset = UINT32_MAX;// Out of order indexes, we can't do O(1) lookups
29     }
30     prevAbbrAode = abbrevDeclaration.getCode();
31   }
32   return beginOffset != *offset_ptr;
33 }
34
35 void DWARFAbbreviationDeclarationSet::dump(raw_ostream &OS) const {
36   for (unsigned i = 0, e = Decls.size(); i != e; ++i)
37     Decls[i].dump(OS);
38 }
39
40 const DWARFAbbreviationDeclaration*
41 DWARFAbbreviationDeclarationSet::getAbbreviationDeclaration(uint32_t abbrCode)
42   const {
43   if (IdxOffset == UINT32_MAX) {
44     DWARFAbbreviationDeclarationCollConstIter pos;
45     DWARFAbbreviationDeclarationCollConstIter end = Decls.end();
46     for (pos = Decls.begin(); pos != end; ++pos) {
47       if (pos->getCode() == abbrCode)
48         return &(*pos);
49     }
50   } else {
51     uint32_t idx = abbrCode - IdxOffset;
52     if (idx < Decls.size())
53       return &Decls[idx];
54   }
55   return NULL;
56 }
57
58 DWARFDebugAbbrev::DWARFDebugAbbrev() :
59   AbbrevCollMap(),
60   PrevAbbrOffsetPos(AbbrevCollMap.end()) {}
61
62
63 void DWARFDebugAbbrev::parse(DataExtractor data) {
64   uint32_t offset = 0;
65
66   while (data.isValidOffset(offset)) {
67     uint32_t initial_cu_offset = offset;
68     DWARFAbbreviationDeclarationSet abbrevDeclSet;
69
70     if (abbrevDeclSet.extract(data, &offset))
71       AbbrevCollMap[initial_cu_offset] = abbrevDeclSet;
72     else
73       break;
74   }
75   PrevAbbrOffsetPos = AbbrevCollMap.end();
76 }
77
78 void DWARFDebugAbbrev::dump(raw_ostream &OS) const {
79   if (AbbrevCollMap.empty()) {
80     OS << "< EMPTY >\n";
81     return;
82   }
83
84   DWARFAbbreviationDeclarationCollMapConstIter pos;
85   for (pos = AbbrevCollMap.begin(); pos != AbbrevCollMap.end(); ++pos) {
86     OS << format("Abbrev table for offset: 0x%8.8" PRIx64 "\n", pos->first);
87     pos->second.dump(OS);
88   }
89 }
90
91 const DWARFAbbreviationDeclarationSet*
92 DWARFDebugAbbrev::getAbbreviationDeclarationSet(uint64_t cu_abbr_offset) const {
93   DWARFAbbreviationDeclarationCollMapConstIter end = AbbrevCollMap.end();
94   DWARFAbbreviationDeclarationCollMapConstIter pos;
95   if (PrevAbbrOffsetPos != end &&
96       PrevAbbrOffsetPos->first == cu_abbr_offset) {
97     return &(PrevAbbrOffsetPos->second);
98   } else {
99     pos = AbbrevCollMap.find(cu_abbr_offset);
100     PrevAbbrOffsetPos = pos;
101   }
102
103   if (pos != AbbrevCollMap.end())
104     return &(pos->second);
105   return NULL;
106 }