1//===-- DWARFAbbreviationDeclaration.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 "DWARFAbbreviationDeclaration.h"
11#include "llvm/Support/Dwarf.h"
12#include "llvm/Support/Format.h"
13#include "llvm/Support/raw_ostream.h"
14using namespace llvm;
15using namespace dwarf;
16
17bool
18DWARFAbbreviationDeclaration::extract(DataExtractor data, uint32_t* offset_ptr){
19  return extract(data, offset_ptr, data.getULEB128(offset_ptr));
20}
21
22bool
23DWARFAbbreviationDeclaration::extract(DataExtractor data, uint32_t* offset_ptr,
24                                      uint32_t code) {
25  Code = code;
26  Attribute.clear();
27  if (Code) {
28    Tag = data.getULEB128(offset_ptr);
29    HasChildren = data.getU8(offset_ptr);
30
31    while (data.isValidOffset(*offset_ptr)) {
32      uint16_t attr = data.getULEB128(offset_ptr);
33      uint16_t form = data.getULEB128(offset_ptr);
34
35      if (attr && form)
36        Attribute.push_back(DWARFAttribute(attr, form));
37      else
38        break;
39    }
40
41    return Tag != 0;
42  } else {
43    Tag = 0;
44    HasChildren = false;
45  }
46
47  return false;
48}
49
50void DWARFAbbreviationDeclaration::dump(raw_ostream &OS) const {
51  const char *tagString = TagString(getTag());
52  OS << '[' << getCode() << "] ";
53  if (tagString)
54    OS << tagString;
55  else
56    OS << format("DW_TAG_Unknown_%x", getTag());
57  OS << "\tDW_CHILDREN_" << (hasChildren() ? "yes" : "no") << '\n';
58  for (unsigned i = 0, e = Attribute.size(); i != e; ++i) {
59    OS << '\t';
60    const char *attrString = AttributeString(Attribute[i].getAttribute());
61    if (attrString)
62      OS << attrString;
63    else
64      OS << format("DW_AT_Unknown_%x", Attribute[i].getAttribute());
65    OS << '\t';
66    const char *formString = FormEncodingString(Attribute[i].getForm());
67    if (formString)
68      OS << formString;
69    else
70      OS << format("DW_FORM_Unknown_%x", Attribute[i].getForm());
71    OS << '\n';
72  }
73  OS << '\n';
74}
75
76uint32_t
77DWARFAbbreviationDeclaration::findAttributeIndex(uint16_t attr) const {
78  for (uint32_t i = 0, e = Attribute.size(); i != e; ++i) {
79    if (Attribute[i].getAttribute() == attr)
80      return i;
81  }
82  return -1U;
83}
84