1226584Sdim//===-- DWARFAbbreviationDeclaration.cpp ----------------------------------===//
2226584Sdim//
3226584Sdim//                     The LLVM Compiler Infrastructure
4226584Sdim//
5226584Sdim// This file is distributed under the University of Illinois Open Source
6226584Sdim// License. See LICENSE.TXT for details.
7226584Sdim//
8226584Sdim//===----------------------------------------------------------------------===//
9226584Sdim
10226584Sdim#include "DWARFAbbreviationDeclaration.h"
11226584Sdim#include "llvm/Support/Dwarf.h"
12226584Sdim#include "llvm/Support/Format.h"
13226584Sdim#include "llvm/Support/raw_ostream.h"
14226584Sdimusing namespace llvm;
15226584Sdimusing namespace dwarf;
16226584Sdim
17226584Sdimbool
18226584SdimDWARFAbbreviationDeclaration::extract(DataExtractor data, uint32_t* offset_ptr){
19226584Sdim  return extract(data, offset_ptr, data.getULEB128(offset_ptr));
20226584Sdim}
21226584Sdim
22226584Sdimbool
23226584SdimDWARFAbbreviationDeclaration::extract(DataExtractor data, uint32_t* offset_ptr,
24226584Sdim                                      uint32_t code) {
25226584Sdim  Code = code;
26249423Sdim  Attribute.clear();
27226584Sdim  if (Code) {
28226584Sdim    Tag = data.getULEB128(offset_ptr);
29226584Sdim    HasChildren = data.getU8(offset_ptr);
30226584Sdim
31226584Sdim    while (data.isValidOffset(*offset_ptr)) {
32226584Sdim      uint16_t attr = data.getULEB128(offset_ptr);
33226584Sdim      uint16_t form = data.getULEB128(offset_ptr);
34226584Sdim
35226584Sdim      if (attr && form)
36249423Sdim        Attribute.push_back(DWARFAttribute(attr, form));
37226584Sdim      else
38226584Sdim        break;
39226584Sdim    }
40226584Sdim
41226584Sdim    return Tag != 0;
42226584Sdim  } else {
43226584Sdim    Tag = 0;
44226584Sdim    HasChildren = false;
45226584Sdim  }
46226584Sdim
47226584Sdim  return false;
48226584Sdim}
49226584Sdim
50226584Sdimvoid DWARFAbbreviationDeclaration::dump(raw_ostream &OS) const {
51226584Sdim  const char *tagString = TagString(getTag());
52226584Sdim  OS << '[' << getCode() << "] ";
53226584Sdim  if (tagString)
54226584Sdim    OS << tagString;
55226584Sdim  else
56226584Sdim    OS << format("DW_TAG_Unknown_%x", getTag());
57226584Sdim  OS << "\tDW_CHILDREN_" << (hasChildren() ? "yes" : "no") << '\n';
58249423Sdim  for (unsigned i = 0, e = Attribute.size(); i != e; ++i) {
59226584Sdim    OS << '\t';
60249423Sdim    const char *attrString = AttributeString(Attribute[i].getAttribute());
61226584Sdim    if (attrString)
62226584Sdim      OS << attrString;
63226584Sdim    else
64249423Sdim      OS << format("DW_AT_Unknown_%x", Attribute[i].getAttribute());
65226584Sdim    OS << '\t';
66249423Sdim    const char *formString = FormEncodingString(Attribute[i].getForm());
67226584Sdim    if (formString)
68226584Sdim      OS << formString;
69226584Sdim    else
70249423Sdim      OS << format("DW_FORM_Unknown_%x", Attribute[i].getForm());
71226584Sdim    OS << '\n';
72226584Sdim  }
73226584Sdim  OS << '\n';
74226584Sdim}
75226584Sdim
76226584Sdimuint32_t
77226584SdimDWARFAbbreviationDeclaration::findAttributeIndex(uint16_t attr) const {
78249423Sdim  for (uint32_t i = 0, e = Attribute.size(); i != e; ++i) {
79249423Sdim    if (Attribute[i].getAttribute() == attr)
80226584Sdim      return i;
81226584Sdim  }
82226584Sdim  return -1U;
83226584Sdim}
84