LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DWARFDebugAbbrev.cpp
Go to the documentation of this file.
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"
13 using namespace llvm;
14 
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 
36  for (unsigned i = 0, e = Decls.size(); i != e; ++i)
37  Decls[i].dump(OS);
38 }
39 
42  const {
43  if (IdxOffset == UINT32_MAX) {
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 
59  AbbrevCollMap(),
60  PrevAbbrOffsetPos(AbbrevCollMap.end()) {}
61 
62 
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 
79  if (AbbrevCollMap.empty()) {
80  OS << "< EMPTY >\n";
81  return;
82  }
83 
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 
92 DWARFDebugAbbrev::getAbbreviationDeclarationSet(uint64_t cu_abbr_offset) const {
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 }
const_iterator end(StringRef path)
Get end iterator over path.
Definition: Path.cpp:181
bool extract(DataExtractor Data, uint32_t *OffsetPtr)
DWARFAbbreviationDeclarationCollMap::const_iterator DWARFAbbreviationDeclarationCollMapConstIter
void parse(DataExtractor data)
bool isValidOffset(uint32_t offset) const
format_object1< T > format(const char *Fmt, const T &Val)
Definition: Format.h:180
const DWARFAbbreviationDeclarationSet * getAbbreviationDeclarationSet(uint64_t cu_abbr_offset) const
DWARFAbbreviationDeclarationColl::const_iterator DWARFAbbreviationDeclarationCollConstIter
const DWARFAbbreviationDeclaration * getAbbreviationDeclaration(uint32_t abbrCode) const
void dump(raw_ostream &OS) const
void dump(raw_ostream &OS) const
bool extract(DataExtractor data, uint32_t *offset_ptr)