Skip to content

Commit

Permalink
[DWARF] - Refactoring: localize handling of relocations in a single p…
Browse files Browse the repository at this point in the history
…lace.

This is splitted from D32228,
currently DWARF parsers code has few places that applied relocations values manually.
These places has similar duplicated code. Patch introduces separate method that can be
used to obtain relocated value. That helps to reduce code and simplifies things.

Differential revision: https://reviews.llvm.org/D32284

llvm-svn: 300956
  • Loading branch information
George Rimar committed Apr 21, 2017
1 parent 1f043e1 commit f8a9642
Show file tree
Hide file tree
Showing 6 changed files with 32 additions and 41 deletions.
5 changes: 5 additions & 0 deletions llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h
Expand Up @@ -50,6 +50,11 @@ class raw_ostream;
// entire size of the debug info sections.
typedef DenseMap<uint64_t, std::pair<uint8_t, int64_t>> RelocAddrMap;

/// Reads a value from data extractor and applies a relocation to the result if
/// one exists for the given offset.
uint64_t getRelocatedValue(const DataExtractor &Data, uint32_t Size,
uint32_t *Off, const RelocAddrMap *Relocs);

/// DWARFContext
/// This data structure is the top level entity that deals with dwarf debug
/// information parsing. The actual data is supplied through pure virtual
Expand Down
7 changes: 3 additions & 4 deletions llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp
Expand Up @@ -9,6 +9,7 @@

#include "llvm/ADT/SmallVector.h"
#include "llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h"
#include "llvm/DebugInfo/DWARF/DWARFContext.h"
#include "llvm/DebugInfo/DWARF/DWARFFormValue.h"
#include "llvm/DebugInfo/DWARF/DWARFRelocMap.h"
#include "llvm/Support/Dwarf.h"
Expand Down Expand Up @@ -112,10 +113,8 @@ LLVM_DUMP_METHOD void DWARFAcceleratorTable::dump(raw_ostream &OS) const {
continue;
}
while (AccelSection.isValidOffsetForDataOfSize(DataOffset, 4)) {
unsigned StringOffset = AccelSection.getU32(&DataOffset);
RelocAddrMap::const_iterator Reloc = Relocs.find(DataOffset-4);
if (Reloc != Relocs.end())
StringOffset += Reloc->second.second;
unsigned StringOffset =
getRelocatedValue(AccelSection, 4, &DataOffset, &Relocs);
if (!StringOffset)
break;
OS << format(" Name: %08x \"%s\"\n", StringOffset,
Expand Down
10 changes: 10 additions & 0 deletions llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
Expand Up @@ -56,6 +56,16 @@ typedef DWARFDebugLine::LineTable DWARFLineTable;
typedef DILineInfoSpecifier::FileLineInfoKind FileLineInfoKind;
typedef DILineInfoSpecifier::FunctionNameKind FunctionNameKind;

uint64_t llvm::getRelocatedValue(const DataExtractor &Data, uint32_t Size,
uint32_t *Off, const RelocAddrMap *Relocs) {
if (!Relocs)
return Data.getUnsigned(Off, Size);
RelocAddrMap::const_iterator AI = Relocs->find(*Off);
if (AI == Relocs->end())
return Data.getUnsigned(Off, Size);
return Data.getUnsigned(Off, Size) + AI->second.second;
}

static void dumpAccelSection(raw_ostream &OS, StringRef Name,
const DWARFSection& Section, StringRef StringSection,
bool LittleEndian) {
Expand Down
14 changes: 4 additions & 10 deletions llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
Expand Up @@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//

#include "llvm/ADT/SmallString.h"
#include "llvm/DebugInfo/DWARF/DWARFContext.h"
#include "llvm/DebugInfo/DWARF/DWARFDebugLine.h"
#include "llvm/DebugInfo/DWARF/DWARFRelocMap.h"
#include "llvm/Support/Dwarf.h"
Expand Down Expand Up @@ -302,16 +303,9 @@ bool DWARFDebugLine::LineTable::parse(DataExtractor debug_line_data,
// relocatable address. All of the other statement program opcodes
// that affect the address register add a delta to it. This instruction
// stores a relocatable value into it instead.
{
// If this address is in our relocation map, apply the relocation.
RelocAddrMap::const_iterator AI = RMap->find(*offset_ptr);
if (AI != RMap->end()) {
const std::pair<uint8_t, int64_t> &R = AI->second;
State.Row.Address =
debug_line_data.getAddress(offset_ptr) + R.second;
} else
State.Row.Address = debug_line_data.getAddress(offset_ptr);
}
State.Row.Address =
getRelocatedValue(debug_line_data, debug_line_data.getAddressSize(),
offset_ptr, RMap);
break;

case DW_LNE_define_file:
Expand Down
15 changes: 4 additions & 11 deletions llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp
Expand Up @@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//

#include "llvm/ADT/StringRef.h"
#include "llvm/DebugInfo/DWARF/DWARFContext.h"
#include "llvm/DebugInfo/DWARF/DWARFDebugLoc.h"
#include "llvm/DebugInfo/DWARF/DWARFRelocMap.h"
#include "llvm/Support/Dwarf.h"
Expand Down Expand Up @@ -48,18 +49,10 @@ void DWARFDebugLoc::parse(DataExtractor data, unsigned AddressSize) {
// 2.6.2 Location Lists
// A location list entry consists of:
while (true) {
// A beginning and ending address offsets.
Entry E;
RelocAddrMap::const_iterator AI = RelocMap.find(Offset);
// 1. A beginning address offset. ...
E.Begin = data.getUnsigned(&Offset, AddressSize);
if (AI != RelocMap.end())
E.Begin += AI->second.second;

AI = RelocMap.find(Offset);
// 2. An ending address offset. ...
E.End = data.getUnsigned(&Offset, AddressSize);
if (AI != RelocMap.end())
E.End += AI->second.second;
E.Begin = getRelocatedValue(data, AddressSize, &Offset, &RelocMap);
E.End = getRelocatedValue(data, AddressSize, &Offset, &RelocMap);

// The end of any given location list is marked by an end of list entry,
// which consists of a 0 for the beginning address offset and a 0 for the
Expand Down
22 changes: 6 additions & 16 deletions llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp
Expand Up @@ -334,11 +334,8 @@ bool DWARFFormValue::extractValue(const DataExtractor &data,
(Form == DW_FORM_addr)
? U->getAddressByteSize()
: U->getRefAddrByteSize();
RelocAddrMap::const_iterator AI = U->getRelocMap()->find(*offset_ptr);
if (AI != U->getRelocMap()->end()) {
Value.uval = data.getUnsigned(offset_ptr, AddrSize) + AI->second.second;
} else
Value.uval = data.getUnsigned(offset_ptr, AddrSize);
Value.uval =
getRelocatedValue(data, AddrSize, offset_ptr, U->getRelocMap());
break;
}
case DW_FORM_exprloc:
Expand Down Expand Up @@ -376,12 +373,8 @@ bool DWARFFormValue::extractValue(const DataExtractor &data,
case DW_FORM_ref_sup4:
case DW_FORM_strx4:
case DW_FORM_addrx4: {
Value.uval = data.getU32(offset_ptr);
if (!U)
break;
RelocAddrMap::const_iterator AI = U->getRelocMap()->find(*offset_ptr-4);
if (AI != U->getRelocMap()->end())
Value.uval += AI->second.second;
const RelocAddrMap* RelocMap = U ? U->getRelocMap() : nullptr;
Value.uval = getRelocatedValue(data, 4, offset_ptr, RelocMap);
break;
}
case DW_FORM_data8:
Expand Down Expand Up @@ -411,11 +404,8 @@ bool DWARFFormValue::extractValue(const DataExtractor &data,
case DW_FORM_strp_sup: {
if (!U)
return false;
RelocAddrMap::const_iterator AI = U->getRelocMap()->find(*offset_ptr);
uint8_t Size = U->getDwarfOffsetByteSize();
Value.uval = data.getUnsigned(offset_ptr, Size);
if (AI != U->getRelocMap()->end())
Value.uval += AI->second.second;
Value.uval = getRelocatedValue(data, U->getDwarfOffsetByteSize(),
offset_ptr, U->getRelocMap());
break;
}
case DW_FORM_flag_present:
Expand Down

0 comments on commit f8a9642

Please sign in to comment.