const DWARFAbbreviationDeclarationSet* DWARFDebugAbbrev::getAbbreviationDeclarationSet(uint64_t CUAbbrOffset) const { const auto End = AbbrDeclSets.end(); if (PrevAbbrOffsetPos != End && PrevAbbrOffsetPos->first == CUAbbrOffset) { return &(PrevAbbrOffsetPos->second); } const auto Pos = AbbrDeclSets.find(CUAbbrOffset); if (Pos != End) { PrevAbbrOffsetPos = Pos; return &(Pos->second); } if (Data && CUAbbrOffset < Data->getData().size()) { uint32_t Offset = CUAbbrOffset; DWARFAbbreviationDeclarationSet AbbrDecls; if (!AbbrDecls.extract(*Data, &Offset)) return nullptr; PrevAbbrOffsetPos = AbbrDeclSets.insert(std::make_pair(CUAbbrOffset, std::move(AbbrDecls))) .first; return &PrevAbbrOffsetPos->second; } return nullptr; }
void DWARFDebugAbbrev::extract(DataExtractor Data) { clear(); uint32_t Offset = 0; DWARFAbbreviationDeclarationSet AbbrDecls; while (Data.isValidOffset(Offset)) { uint32_t CUAbbrOffset = Offset; if (!AbbrDecls.extract(Data, &Offset)) break; AbbrDeclSets[CUAbbrOffset] = std::move(AbbrDecls); } }
//---------------------------------------------------------------------- // DWARFDebugAbbrev::Parse() //---------------------------------------------------------------------- void DWARFDebugAbbrev::Parse(const DWARFDataExtractor &data) { lldb::offset_t offset = 0; while (data.ValidOffset(offset)) { uint32_t initial_cu_offset = offset; DWARFAbbreviationDeclarationSet abbrevDeclSet; if (abbrevDeclSet.Extract(data, &offset)) m_abbrevCollMap[initial_cu_offset] = abbrevDeclSet; else break; } m_prev_abbr_offset_pos = m_abbrevCollMap.end(); }
void DWARFDebugAbbrev::parse() const { if (!Data) return; uint32_t Offset = 0; DWARFAbbreviationDeclarationSet AbbrDecls; auto I = AbbrDeclSets.begin(); while (Data->isValidOffset(Offset)) { while (I != AbbrDeclSets.end() && I->first < Offset) ++I; uint32_t CUAbbrOffset = Offset; if (!AbbrDecls.extract(*Data, &Offset)) break; AbbrDeclSets.insert(I, std::make_pair(CUAbbrOffset, std::move(AbbrDecls))); } Data = None; }