llvm-project/llvm/lib/DebugInfo/DWARF/DWARFUnitIndex.cpp

70 lines
2.0 KiB
C++
Raw Normal View History

//===-- DWARFUnitIndex.cpp ------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "llvm/DebugInfo/DWARF/DWARFUnitIndex.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/ErrorHandling.h"
namespace llvm {
bool DWARFUnitIndex::Header::parse(DataExtractor IndexData,
uint32_t *OffsetPtr) {
if (!IndexData.isValidOffsetForDataOfSize(*OffsetPtr, 16))
return false;
Version = IndexData.getU32(OffsetPtr);
NumColumns = IndexData.getU32(OffsetPtr);
NumUnits = IndexData.getU32(OffsetPtr);
NumBuckets = IndexData.getU32(OffsetPtr);
return Version <= 2;
}
void DWARFUnitIndex::Header::dump(raw_ostream &OS) const {
OS << "Index header:\n" << format(" version: %u\n", Version)
<< format(" columns: %u\n", NumColumns)
<< format(" units: %u\n", NumUnits)
<< format(" buckets: %u\n", NumBuckets);
}
bool DWARFUnitIndex::parse(DataExtractor IndexData) {
uint32_t Offset = 0;
if (!Header.parse(IndexData, &Offset))
return false;
if (!IndexData.isValidOffsetForDataOfSize(
Offset, Header.NumBuckets * (8 + 4) +
(2 * Header.NumUnits + 1) * 4 * Header.NumColumns))
return false;
return true;
}
StringRef DWARFUnitIndex::getColumnHeader(DwarfSection DS) {
#define CASE(DS) \
case DW_SECT_##DS: \
return #DS;
switch (DS) {
CASE(INFO);
CASE(TYPES);
CASE(ABBREV);
CASE(LINE);
CASE(LOC);
CASE(STR_OFFSETS);
CASE(MACINFO);
CASE(MACRO);
}
llvm_unreachable("unknown DwarfSection");
}
void DWARFUnitIndex::dump(raw_ostream &OS) const {
Header.dump(OS);
}
}