DWARF parser: Use ArrayRef to represent form sizes and simplify DWARFDIE::extractFast() interface. No functionality change.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193560 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Alexey Samsonov
2013-10-28 23:41:49 +00:00
parent 1765daa21c
commit 6faff4886a
6 changed files with 16 additions and 21 deletions

View File

@ -10,6 +10,7 @@
#ifndef LLVM_DEBUGINFO_DWARFFORMVALUE_H #ifndef LLVM_DEBUGINFO_DWARFFORMVALUE_H
#define LLVM_DEBUGINFO_DWARFFORMVALUE_H #define LLVM_DEBUGINFO_DWARFFORMVALUE_H
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/Optional.h" #include "llvm/ADT/Optional.h"
#include "llvm/Support/DataExtractor.h" #include "llvm/Support/DataExtractor.h"
@ -75,7 +76,8 @@ public:
static bool skipValue(uint16_t form, DataExtractor debug_info_data, static bool skipValue(uint16_t form, DataExtractor debug_info_data,
uint32_t *offset_ptr, const DWARFUnit *u); uint32_t *offset_ptr, const DWARFUnit *u);
static const uint8_t *getFixedFormSizes(uint8_t AddrSize, uint16_t Version); static ArrayRef<uint8_t> getFixedFormSizes(uint8_t AddrSize,
uint16_t Version);
}; };
} }

View File

@ -93,7 +93,6 @@ void DWARFDebugInfoEntryMinimal::dumpAttribute(raw_ostream &OS,
} }
bool DWARFDebugInfoEntryMinimal::extractFast(const DWARFUnit *U, bool DWARFDebugInfoEntryMinimal::extractFast(const DWARFUnit *U,
const uint8_t *FixedFormSizes,
uint32_t *OffsetPtr) { uint32_t *OffsetPtr) {
Offset = *OffsetPtr; Offset = *OffsetPtr;
DataExtractor DebugInfoData = U->getDebugInfoExtractor(); DataExtractor DebugInfoData = U->getDebugInfoExtractor();
@ -105,21 +104,19 @@ bool DWARFDebugInfoEntryMinimal::extractFast(const DWARFUnit *U,
} }
AbbrevDecl = U->getAbbreviations()->getAbbreviationDeclaration(AbbrCode); AbbrevDecl = U->getAbbreviations()->getAbbreviationDeclaration(AbbrCode);
assert(AbbrevDecl); assert(AbbrevDecl);
assert(FixedFormSizes); // For best performance this should be specified! ArrayRef<uint8_t> FixedFormSizes = DWARFFormValue::getFixedFormSizes(
U->getAddressByteSize(), U->getVersion());
assert(FixedFormSizes.size() > 0);
// Skip all data in the .debug_info for the attributes // Skip all data in the .debug_info for the attributes
for (uint32_t i = 0, n = AbbrevDecl->getNumAttributes(); i < n; ++i) { for (uint32_t i = 0, n = AbbrevDecl->getNumAttributes(); i < n; ++i) {
uint16_t Form = AbbrevDecl->getFormByIndex(i); uint16_t Form = AbbrevDecl->getFormByIndex(i);
// FIXME: Currently we're checking if this is less than the last
// entry in the fixed_form_sizes table, but this should be changed
// to use dynamic dispatch.
uint8_t FixedFormSize = uint8_t FixedFormSize =
(Form < DW_FORM_ref_sig8) ? FixedFormSizes[Form] : 0; (Form < FixedFormSizes.size()) ? FixedFormSizes[Form] : 0;
if (FixedFormSize) if (FixedFormSize)
*OffsetPtr += FixedFormSize; *OffsetPtr += FixedFormSize;
else if (!DWARFFormValue::skipValue(Form, DebugInfoData, OffsetPtr, else if (!DWARFFormValue::skipValue(Form, DebugInfoData, OffsetPtr, U)) {
U)) {
// Restore the original offset. // Restore the original offset.
*OffsetPtr = Offset; *OffsetPtr = Offset;
return false; return false;

View File

@ -45,11 +45,10 @@ public:
void dumpAttribute(raw_ostream &OS, const DWARFUnit *u, uint32_t *offset_ptr, void dumpAttribute(raw_ostream &OS, const DWARFUnit *u, uint32_t *offset_ptr,
uint16_t attr, uint16_t form, unsigned indent = 0) const; uint16_t attr, uint16_t form, unsigned indent = 0) const;
/// Extracts a debug info entry, which is a child of a given compile unit, /// Extracts a debug info entry, which is a child of a given unit,
/// starting at a given offset. If DIE can't be extracted, returns false and /// starting at a given offset. If DIE can't be extracted, returns false and
/// doesn't change OffsetPtr. /// doesn't change OffsetPtr.
bool extractFast(const DWARFUnit *U, const uint8_t *FixedFormSizes, bool extractFast(const DWARFUnit *U, uint32_t *OffsetPtr);
uint32_t *OffsetPtr);
/// Extract a debug info entry for a given compile unit from the /// Extract a debug info entry for a given compile unit from the
/// .debug_info and .debug_abbrev data starting at the given offset. /// .debug_info and .debug_abbrev data starting at the given offset.

View File

@ -62,8 +62,8 @@ static uint8_t getRefAddrSize(uint8_t AddrSize, uint16_t Version) {
return (Version == 2) ? AddrSize : 4; return (Version == 2) ? AddrSize : 4;
} }
const uint8_t * ArrayRef<uint8_t> DWARFFormValue::getFixedFormSizes(uint8_t AddrSize,
DWARFFormValue::getFixedFormSizes(uint8_t AddrSize, uint16_t Version) { uint16_t Version) {
uint8_t RefAddrSize = getRefAddrSize(AddrSize, Version); uint8_t RefAddrSize = getRefAddrSize(AddrSize, Version);
if (AddrSize == 4 && RefAddrSize == 4) if (AddrSize == 4 && RefAddrSize == 4)
return FixedFormSizes<4, 4>::sizes; return FixedFormSizes<4, 4>::sizes;
@ -73,7 +73,7 @@ DWARFFormValue::getFixedFormSizes(uint8_t AddrSize, uint16_t Version) {
return FixedFormSizes<8, 4>::sizes; return FixedFormSizes<8, 4>::sizes;
if (AddrSize == 8 && RefAddrSize == 8) if (AddrSize == 8 && RefAddrSize == 8)
return FixedFormSizes<8, 8>::sizes; return FixedFormSizes<8, 8>::sizes;
return 0; return None;
} }
static const DWARFFormValue::FormClass DWARF4FormClasses[] = { static const DWARFFormValue::FormClass DWARF4FormClasses[] = {

View File

@ -194,12 +194,9 @@ void DWARFUnit::extractDIEsToVector(
uint32_t NextCUOffset = getNextUnitOffset(); uint32_t NextCUOffset = getNextUnitOffset();
DWARFDebugInfoEntryMinimal DIE; DWARFDebugInfoEntryMinimal DIE;
uint32_t Depth = 0; uint32_t Depth = 0;
const uint8_t *FixedFormSizes =
DWARFFormValue::getFixedFormSizes(getAddressByteSize(), getVersion());
bool IsCUDie = true; bool IsCUDie = true;
while (Offset < NextCUOffset && while (Offset < NextCUOffset && DIE.extractFast(this, &Offset)) {
DIE.extractFast(this, FixedFormSizes, &Offset)) {
if (IsCUDie) { if (IsCUDie) {
if (AppendCUDie) if (AppendCUDie)
Dies.push_back(DIE); Dies.push_back(DIE);

View File

@ -18,14 +18,14 @@ namespace {
TEST(DWARFFormValue, FixedFormSizes) { TEST(DWARFFormValue, FixedFormSizes) {
// Size of DW_FORM_addr and DW_FORM_ref_addr are equal in DWARF2, // Size of DW_FORM_addr and DW_FORM_ref_addr are equal in DWARF2,
// DW_FORM_ref_addr is always 4 bytes in DWARF32 starting from DWARF3. // DW_FORM_ref_addr is always 4 bytes in DWARF32 starting from DWARF3.
const uint8_t *sizes = DWARFFormValue::getFixedFormSizes(4, 2); ArrayRef<uint8_t> sizes = DWARFFormValue::getFixedFormSizes(4, 2);
EXPECT_EQ(sizes[DW_FORM_addr], sizes[DW_FORM_ref_addr]); EXPECT_EQ(sizes[DW_FORM_addr], sizes[DW_FORM_ref_addr]);
sizes = DWARFFormValue::getFixedFormSizes(8, 2); sizes = DWARFFormValue::getFixedFormSizes(8, 2);
EXPECT_EQ(sizes[DW_FORM_addr], sizes[DW_FORM_ref_addr]); EXPECT_EQ(sizes[DW_FORM_addr], sizes[DW_FORM_ref_addr]);
sizes = DWARFFormValue::getFixedFormSizes(8, 3); sizes = DWARFFormValue::getFixedFormSizes(8, 3);
EXPECT_EQ(4, sizes[DW_FORM_ref_addr]); EXPECT_EQ(4, sizes[DW_FORM_ref_addr]);
// Check that we don't have fixed form sizes for weird address sizes. // Check that we don't have fixed form sizes for weird address sizes.
EXPECT_EQ(0, DWARFFormValue::getFixedFormSizes(16, 2)); EXPECT_EQ(0U, DWARFFormValue::getFixedFormSizes(16, 2).size());
} }
bool isFormClass(uint16_t Form, DWARFFormValue::FormClass FC) { bool isFormClass(uint16_t Form, DWARFFormValue::FormClass FC) {