Home | History | Annotate | Download | only in DebugInfo
      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 
     15 bool 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 
     35 void 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*
     41 DWARFAbbreviationDeclarationSet::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 
     58 DWARFDebugAbbrev::DWARFDebugAbbrev() :
     59   AbbrevCollMap(),
     60   PrevAbbrOffsetPos(AbbrevCollMap.end()) {}
     61 
     62 
     63 void 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 
     78 void 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.8x\n", pos->first);
     87     pos->second.dump(OS);
     88   }
     89 }
     90 
     91 const DWARFAbbreviationDeclarationSet*
     92 DWARFDebugAbbrev::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