1*9880d681SAndroid Build Coastguard Worker //===-- DWARFAbbreviationDeclaration.cpp ----------------------------------===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/DWARF/DWARFAbbreviationDeclaration.h" 11*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Dwarf.h" 12*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Format.h" 13*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h" 14*9880d681SAndroid Build Coastguard Worker using namespace llvm; 15*9880d681SAndroid Build Coastguard Worker using namespace dwarf; 16*9880d681SAndroid Build Coastguard Worker clear()17*9880d681SAndroid Build Coastguard Workervoid DWARFAbbreviationDeclaration::clear() { 18*9880d681SAndroid Build Coastguard Worker Code = 0; 19*9880d681SAndroid Build Coastguard Worker Tag = 0; 20*9880d681SAndroid Build Coastguard Worker HasChildren = false; 21*9880d681SAndroid Build Coastguard Worker AttributeSpecs.clear(); 22*9880d681SAndroid Build Coastguard Worker } 23*9880d681SAndroid Build Coastguard Worker DWARFAbbreviationDeclaration()24*9880d681SAndroid Build Coastguard WorkerDWARFAbbreviationDeclaration::DWARFAbbreviationDeclaration() { 25*9880d681SAndroid Build Coastguard Worker clear(); 26*9880d681SAndroid Build Coastguard Worker } 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker bool extract(DataExtractor Data,uint32_t * OffsetPtr)29*9880d681SAndroid Build Coastguard WorkerDWARFAbbreviationDeclaration::extract(DataExtractor Data, uint32_t* OffsetPtr) { 30*9880d681SAndroid Build Coastguard Worker clear(); 31*9880d681SAndroid Build Coastguard Worker Code = Data.getULEB128(OffsetPtr); 32*9880d681SAndroid Build Coastguard Worker if (Code == 0) { 33*9880d681SAndroid Build Coastguard Worker return false; 34*9880d681SAndroid Build Coastguard Worker } 35*9880d681SAndroid Build Coastguard Worker Tag = Data.getULEB128(OffsetPtr); 36*9880d681SAndroid Build Coastguard Worker uint8_t ChildrenByte = Data.getU8(OffsetPtr); 37*9880d681SAndroid Build Coastguard Worker HasChildren = (ChildrenByte == DW_CHILDREN_yes); 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker while (true) { 40*9880d681SAndroid Build Coastguard Worker uint32_t CurOffset = *OffsetPtr; 41*9880d681SAndroid Build Coastguard Worker uint16_t Attr = Data.getULEB128(OffsetPtr); 42*9880d681SAndroid Build Coastguard Worker if (CurOffset == *OffsetPtr) { 43*9880d681SAndroid Build Coastguard Worker clear(); 44*9880d681SAndroid Build Coastguard Worker return false; 45*9880d681SAndroid Build Coastguard Worker } 46*9880d681SAndroid Build Coastguard Worker CurOffset = *OffsetPtr; 47*9880d681SAndroid Build Coastguard Worker uint16_t Form = Data.getULEB128(OffsetPtr); 48*9880d681SAndroid Build Coastguard Worker if (CurOffset == *OffsetPtr) { 49*9880d681SAndroid Build Coastguard Worker clear(); 50*9880d681SAndroid Build Coastguard Worker return false; 51*9880d681SAndroid Build Coastguard Worker } 52*9880d681SAndroid Build Coastguard Worker if (Attr == 0 && Form == 0) 53*9880d681SAndroid Build Coastguard Worker break; 54*9880d681SAndroid Build Coastguard Worker AttributeSpecs.push_back(AttributeSpec(Attr, Form)); 55*9880d681SAndroid Build Coastguard Worker } 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker if (Tag == 0) { 58*9880d681SAndroid Build Coastguard Worker clear(); 59*9880d681SAndroid Build Coastguard Worker return false; 60*9880d681SAndroid Build Coastguard Worker } 61*9880d681SAndroid Build Coastguard Worker return true; 62*9880d681SAndroid Build Coastguard Worker } 63*9880d681SAndroid Build Coastguard Worker dump(raw_ostream & OS) const64*9880d681SAndroid Build Coastguard Workervoid DWARFAbbreviationDeclaration::dump(raw_ostream &OS) const { 65*9880d681SAndroid Build Coastguard Worker const char *tagString = TagString(getTag()); 66*9880d681SAndroid Build Coastguard Worker OS << '[' << getCode() << "] "; 67*9880d681SAndroid Build Coastguard Worker if (tagString) 68*9880d681SAndroid Build Coastguard Worker OS << tagString; 69*9880d681SAndroid Build Coastguard Worker else 70*9880d681SAndroid Build Coastguard Worker OS << format("DW_TAG_Unknown_%x", getTag()); 71*9880d681SAndroid Build Coastguard Worker OS << "\tDW_CHILDREN_" << (hasChildren() ? "yes" : "no") << '\n'; 72*9880d681SAndroid Build Coastguard Worker for (const AttributeSpec &Spec : AttributeSpecs) { 73*9880d681SAndroid Build Coastguard Worker OS << '\t'; 74*9880d681SAndroid Build Coastguard Worker const char *attrString = AttributeString(Spec.Attr); 75*9880d681SAndroid Build Coastguard Worker if (attrString) 76*9880d681SAndroid Build Coastguard Worker OS << attrString; 77*9880d681SAndroid Build Coastguard Worker else 78*9880d681SAndroid Build Coastguard Worker OS << format("DW_AT_Unknown_%x", Spec.Attr); 79*9880d681SAndroid Build Coastguard Worker OS << '\t'; 80*9880d681SAndroid Build Coastguard Worker const char *formString = FormEncodingString(Spec.Form); 81*9880d681SAndroid Build Coastguard Worker if (formString) 82*9880d681SAndroid Build Coastguard Worker OS << formString; 83*9880d681SAndroid Build Coastguard Worker else 84*9880d681SAndroid Build Coastguard Worker OS << format("DW_FORM_Unknown_%x", Spec.Form); 85*9880d681SAndroid Build Coastguard Worker OS << '\n'; 86*9880d681SAndroid Build Coastguard Worker } 87*9880d681SAndroid Build Coastguard Worker OS << '\n'; 88*9880d681SAndroid Build Coastguard Worker } 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker uint32_t findAttributeIndex(uint16_t attr) const91*9880d681SAndroid Build Coastguard WorkerDWARFAbbreviationDeclaration::findAttributeIndex(uint16_t attr) const { 92*9880d681SAndroid Build Coastguard Worker for (uint32_t i = 0, e = AttributeSpecs.size(); i != e; ++i) { 93*9880d681SAndroid Build Coastguard Worker if (AttributeSpecs[i].Attr == attr) 94*9880d681SAndroid Build Coastguard Worker return i; 95*9880d681SAndroid Build Coastguard Worker } 96*9880d681SAndroid Build Coastguard Worker return -1U; 97*9880d681SAndroid Build Coastguard Worker } 98