Home | History | Annotate | Download | only in DWARF
      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 "llvm/DebugInfo/DWARF/DWARFAbbreviationDeclaration.h"
     11 #include "llvm/Support/Dwarf.h"
     12 #include "llvm/Support/Format.h"
     13 #include "llvm/Support/raw_ostream.h"
     14 using namespace llvm;
     15 using namespace dwarf;
     16 
     17 void DWARFAbbreviationDeclaration::clear() {
     18   Code = 0;
     19   Tag = 0;
     20   HasChildren = false;
     21   AttributeSpecs.clear();
     22 }
     23 
     24 DWARFAbbreviationDeclaration::DWARFAbbreviationDeclaration() {
     25   clear();
     26 }
     27 
     28 bool
     29 DWARFAbbreviationDeclaration::extract(DataExtractor Data, uint32_t* OffsetPtr) {
     30   clear();
     31   Code = Data.getULEB128(OffsetPtr);
     32   if (Code == 0) {
     33     return false;
     34   }
     35   Tag = Data.getULEB128(OffsetPtr);
     36   uint8_t ChildrenByte = Data.getU8(OffsetPtr);
     37   HasChildren = (ChildrenByte == DW_CHILDREN_yes);
     38 
     39   while (true) {
     40     uint32_t CurOffset = *OffsetPtr;
     41     uint16_t Attr = Data.getULEB128(OffsetPtr);
     42     if (CurOffset == *OffsetPtr) {
     43       clear();
     44       return false;
     45     }
     46     CurOffset = *OffsetPtr;
     47     uint16_t Form = Data.getULEB128(OffsetPtr);
     48     if (CurOffset == *OffsetPtr) {
     49       clear();
     50       return false;
     51     }
     52     if (Attr == 0 && Form == 0)
     53       break;
     54     AttributeSpecs.push_back(AttributeSpec(Attr, Form));
     55   }
     56 
     57   if (Tag == 0) {
     58     clear();
     59     return false;
     60   }
     61   return true;
     62 }
     63 
     64 void DWARFAbbreviationDeclaration::dump(raw_ostream &OS) const {
     65   const char *tagString = TagString(getTag());
     66   OS << '[' << getCode() << "] ";
     67   if (tagString)
     68     OS << tagString;
     69   else
     70     OS << format("DW_TAG_Unknown_%x", getTag());
     71   OS << "\tDW_CHILDREN_" << (hasChildren() ? "yes" : "no") << '\n';
     72   for (const AttributeSpec &Spec : AttributeSpecs) {
     73     OS << '\t';
     74     const char *attrString = AttributeString(Spec.Attr);
     75     if (attrString)
     76       OS << attrString;
     77     else
     78       OS << format("DW_AT_Unknown_%x", Spec.Attr);
     79     OS << '\t';
     80     const char *formString = FormEncodingString(Spec.Form);
     81     if (formString)
     82       OS << formString;
     83     else
     84       OS << format("DW_FORM_Unknown_%x", Spec.Form);
     85     OS << '\n';
     86   }
     87   OS << '\n';
     88 }
     89 
     90 uint32_t
     91 DWARFAbbreviationDeclaration::findAttributeIndex(uint16_t attr) const {
     92   for (uint32_t i = 0, e = AttributeSpecs.size(); i != e; ++i) {
     93     if (AttributeSpecs[i].Attr == attr)
     94       return i;
     95   }
     96   return -1U;
     97 }
     98