1 //===-- DWARFDebugAbbrev.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 "DWARFDebugAbbrev.h" 11 #include "llvm/Support/Format.h" 12 #include "llvm/Support/raw_ostream.h" 13 using namespace llvm; 14 extract(DataExtractor data,uint32_t * offset_ptr)15bool DWARFAbbreviationDeclarationSet::extract(DataExtractor data, 16 uint32_t* offset_ptr) { 17 const uint32_t beginOffset = *offset_ptr; 18 Offset = beginOffset; 19 clear(); 20 DWARFAbbreviationDeclaration abbrevDeclaration; 21 uint32_t prevAbbrAode = 0; 22 while (abbrevDeclaration.extract(data, offset_ptr)) { 23 Decls.push_back(abbrevDeclaration); 24 if (IdxOffset == 0) { 25 IdxOffset = abbrevDeclaration.getCode(); 26 } else { 27 if (prevAbbrAode + 1 != abbrevDeclaration.getCode()) 28 IdxOffset = UINT32_MAX;// Out of order indexes, we can't do O(1) lookups 29 } 30 prevAbbrAode = abbrevDeclaration.getCode(); 31 } 32 return beginOffset != *offset_ptr; 33 } 34 dump(raw_ostream & OS) const35void DWARFAbbreviationDeclarationSet::dump(raw_ostream &OS) const { 36 for (unsigned i = 0, e = Decls.size(); i != e; ++i) 37 Decls[i].dump(OS); 38 } 39 40 const DWARFAbbreviationDeclaration* getAbbreviationDeclaration(uint32_t abbrCode) const41DWARFAbbreviationDeclarationSet::getAbbreviationDeclaration(uint32_t abbrCode) 42 const { 43 if (IdxOffset == UINT32_MAX) { 44 DWARFAbbreviationDeclarationCollConstIter pos; 45 DWARFAbbreviationDeclarationCollConstIter end = Decls.end(); 46 for (pos = Decls.begin(); pos != end; ++pos) { 47 if (pos->getCode() == abbrCode) 48 return &(*pos); 49 } 50 } else { 51 uint32_t idx = abbrCode - IdxOffset; 52 if (idx < Decls.size()) 53 return &Decls[idx]; 54 } 55 return NULL; 56 } 57 DWARFDebugAbbrev()58DWARFDebugAbbrev::DWARFDebugAbbrev() : 59 AbbrevCollMap(), 60 PrevAbbrOffsetPos(AbbrevCollMap.end()) {} 61 62 parse(DataExtractor data)63void DWARFDebugAbbrev::parse(DataExtractor data) { 64 uint32_t offset = 0; 65 66 while (data.isValidOffset(offset)) { 67 uint32_t initial_cu_offset = offset; 68 DWARFAbbreviationDeclarationSet abbrevDeclSet; 69 70 if (abbrevDeclSet.extract(data, &offset)) 71 AbbrevCollMap[initial_cu_offset] = abbrevDeclSet; 72 else 73 break; 74 } 75 PrevAbbrOffsetPos = AbbrevCollMap.end(); 76 } 77 dump(raw_ostream & OS) const78void DWARFDebugAbbrev::dump(raw_ostream &OS) const { 79 if (AbbrevCollMap.empty()) { 80 OS << "< EMPTY >\n"; 81 return; 82 } 83 84 DWARFAbbreviationDeclarationCollMapConstIter pos; 85 for (pos = AbbrevCollMap.begin(); pos != AbbrevCollMap.end(); ++pos) { 86 OS << format("Abbrev table for offset: 0x%8.8" PRIx64 "\n", pos->first); 87 pos->second.dump(OS); 88 } 89 } 90 91 const DWARFAbbreviationDeclarationSet* getAbbreviationDeclarationSet(uint64_t cu_abbr_offset) const92DWARFDebugAbbrev::getAbbreviationDeclarationSet(uint64_t cu_abbr_offset) const { 93 DWARFAbbreviationDeclarationCollMapConstIter end = AbbrevCollMap.end(); 94 DWARFAbbreviationDeclarationCollMapConstIter pos; 95 if (PrevAbbrOffsetPos != end && 96 PrevAbbrOffsetPos->first == cu_abbr_offset) { 97 return &(PrevAbbrOffsetPos->second); 98 } else { 99 pos = AbbrevCollMap.find(cu_abbr_offset); 100 PrevAbbrOffsetPos = pos; 101 } 102 103 if (pos != AbbrevCollMap.end()) 104 return &(pos->second); 105 return NULL; 106 } 107