DWARFAbbreviationDeclaration.cpp revision 226584
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; 26226584Sdim Attributes.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) 36226584Sdim Attributes.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'; 58226584Sdim for (unsigned i = 0, e = Attributes.size(); i != e; ++i) { 59226584Sdim OS << '\t'; 60226584Sdim const char *attrString = AttributeString(Attributes[i].getAttribute()); 61226584Sdim if (attrString) 62226584Sdim OS << attrString; 63226584Sdim else 64226584Sdim OS << format("DW_AT_Unknown_%x", Attributes[i].getAttribute()); 65226584Sdim OS << '\t'; 66226584Sdim const char *formString = FormEncodingString(Attributes[i].getForm()); 67226584Sdim if (formString) 68226584Sdim OS << formString; 69226584Sdim else 70226584Sdim OS << format("DW_FORM_Unknown_%x", Attributes[i].getForm()); 71226584Sdim OS << '\n'; 72226584Sdim } 73226584Sdim OS << '\n'; 74226584Sdim} 75226584Sdim 76226584Sdimuint32_t 77226584SdimDWARFAbbreviationDeclaration::findAttributeIndex(uint16_t attr) const { 78226584Sdim for (uint32_t i = 0, e = Attributes.size(); i != e; ++i) { 79226584Sdim if (Attributes[i].getAttribute() == attr) 80226584Sdim return i; 81226584Sdim } 82226584Sdim return -1U; 83226584Sdim} 84