blob: fd5f5e95fc14d03861d5c3d1d507f0cf2da60c87 [file] [log] [blame]
Benjamin Kramer72c0d7f2011-09-13 19:42:23 +00001//===-- 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"
13using namespace llvm;
14
15bool 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
Benjamin Kramer72c0d7f2011-09-13 19:42:23 +000035void DWARFAbbreviationDeclarationSet::dump(raw_ostream &OS) const {
Stephen Hines36b56882014-04-23 16:57:46 -070036 for (const auto &Decl : Decls)
37 Decl.dump(OS);
Benjamin Kramer72c0d7f2011-09-13 19:42:23 +000038}
39
Benjamin Kramer72c0d7f2011-09-13 19:42:23 +000040const DWARFAbbreviationDeclaration*
41DWARFAbbreviationDeclarationSet::getAbbreviationDeclaration(uint32_t abbrCode)
42 const {
43 if (IdxOffset == UINT32_MAX) {
Stephen Hines36b56882014-04-23 16:57:46 -070044 for (const auto &Decl : Decls) {
45 if (Decl.getCode() == abbrCode)
46 return &Decl;
Benjamin Kramer72c0d7f2011-09-13 19:42:23 +000047 }
48 } else {
49 uint32_t idx = abbrCode - IdxOffset;
50 if (idx < Decls.size())
51 return &Decls[idx];
52 }
53 return NULL;
54}
55
56DWARFDebugAbbrev::DWARFDebugAbbrev() :
Benjamin Kramer4aa3fea2011-09-13 21:47:32 +000057 AbbrevCollMap(),
58 PrevAbbrOffsetPos(AbbrevCollMap.end()) {}
Benjamin Kramer72c0d7f2011-09-13 19:42:23 +000059
60
61void DWARFDebugAbbrev::parse(DataExtractor data) {
62 uint32_t offset = 0;
63
64 while (data.isValidOffset(offset)) {
65 uint32_t initial_cu_offset = offset;
66 DWARFAbbreviationDeclarationSet abbrevDeclSet;
67
68 if (abbrevDeclSet.extract(data, &offset))
Benjamin Kramer4aa3fea2011-09-13 21:47:32 +000069 AbbrevCollMap[initial_cu_offset] = abbrevDeclSet;
Benjamin Kramer72c0d7f2011-09-13 19:42:23 +000070 else
71 break;
72 }
Benjamin Kramer4aa3fea2011-09-13 21:47:32 +000073 PrevAbbrOffsetPos = AbbrevCollMap.end();
Benjamin Kramer72c0d7f2011-09-13 19:42:23 +000074}
75
76void DWARFDebugAbbrev::dump(raw_ostream &OS) const {
Benjamin Kramer4aa3fea2011-09-13 21:47:32 +000077 if (AbbrevCollMap.empty()) {
Benjamin Kramer72c0d7f2011-09-13 19:42:23 +000078 OS << "< EMPTY >\n";
79 return;
80 }
81
Stephen Hines36b56882014-04-23 16:57:46 -070082 for (const auto &I : AbbrevCollMap) {
83 OS << format("Abbrev table for offset: 0x%8.8" PRIx64 "\n", I.first);
84 I.second.dump(OS);
Benjamin Kramer72c0d7f2011-09-13 19:42:23 +000085 }
86}
87
88const DWARFAbbreviationDeclarationSet*
89DWARFDebugAbbrev::getAbbreviationDeclarationSet(uint64_t cu_abbr_offset) const {
Benjamin Kramer4aa3fea2011-09-13 21:47:32 +000090 DWARFAbbreviationDeclarationCollMapConstIter end = AbbrevCollMap.end();
Benjamin Kramer72c0d7f2011-09-13 19:42:23 +000091 DWARFAbbreviationDeclarationCollMapConstIter pos;
Benjamin Kramer4aa3fea2011-09-13 21:47:32 +000092 if (PrevAbbrOffsetPos != end &&
93 PrevAbbrOffsetPos->first == cu_abbr_offset) {
94 return &(PrevAbbrOffsetPos->second);
Benjamin Kramer72c0d7f2011-09-13 19:42:23 +000095 } else {
Benjamin Kramer4aa3fea2011-09-13 21:47:32 +000096 pos = AbbrevCollMap.find(cu_abbr_offset);
97 PrevAbbrOffsetPos = pos;
Benjamin Kramer72c0d7f2011-09-13 19:42:23 +000098 }
99
Benjamin Kramer4aa3fea2011-09-13 21:47:32 +0000100 if (pos != AbbrevCollMap.end())
Benjamin Kramer72c0d7f2011-09-13 19:42:23 +0000101 return &(pos->second);
102 return NULL;
103}