forked from OSchip/llvm-project
MCObjectSymbolizer: Switch from IntervalMap to sorted vector, following r182625.
This removes the need for the missing SectionRef operator< workaround, and fixes an IntervalMap assert about alignment on MSVC. llvm-svn: 182949
This commit is contained in:
parent
278d9de314
commit
75633ba1e7
|
@ -15,10 +15,10 @@
|
|||
#ifndef LLVM_MC_MCOBJECTSYMBOLIZER_H
|
||||
#define LLVM_MC_MCOBJECTSYMBOLIZER_H
|
||||
|
||||
#include "llvm/ADT/IntervalMap.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/MC/MCSymbolizer.h"
|
||||
#include "llvm/Object/ObjectFile.h"
|
||||
#include <vector>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
|
@ -33,12 +33,8 @@ protected:
|
|||
const object::ObjectFile *Obj;
|
||||
|
||||
typedef DenseMap<uint64_t, object::RelocationRef> AddrToRelocMap;
|
||||
// FIXME: Working around a missing SectionRef operator!= by storing
|
||||
// DataRefImpl.p instead of SectionRef. Feel free to improve!
|
||||
typedef IntervalMap<uint64_t, uintptr_t> AddrToSectionMap;
|
||||
|
||||
AddrToSectionMap::Allocator AddrToSectionAllocator;
|
||||
AddrToSectionMap AddrToSection;
|
||||
typedef std::vector<object::SectionRef> SortedSectionList;
|
||||
SortedSectionList SortedSections;
|
||||
|
||||
// Map a load address to the first relocation that applies there. As far as I
|
||||
// know, if there are several relocations at the exact same address, they are
|
||||
|
@ -48,6 +44,11 @@ protected:
|
|||
// relocation (referencing the subtrahend symbol).
|
||||
AddrToRelocMap AddrToReloc;
|
||||
|
||||
// Helpers around SortedSections.
|
||||
SortedSectionList::const_iterator findSectionContaining(uint64_t Addr) const;
|
||||
void insertSection(object::SectionRef Section);
|
||||
|
||||
|
||||
MCObjectSymbolizer(MCContext &Ctx, OwningPtr<MCRelocationInfo> &RelInfo,
|
||||
const object::ObjectFile *Obj);
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include "llvm/Object/MachO.h"
|
||||
#include "llvm/Object/ELF.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include <algorithm>
|
||||
|
||||
using namespace llvm;
|
||||
using namespace object;
|
||||
|
@ -40,15 +41,16 @@ public:
|
|||
return;
|
||||
}
|
||||
uint64_t Addr = Value;
|
||||
AddrToSectionMap::const_iterator SI = AddrToSection.find(Addr);
|
||||
if (SI.valid()) {
|
||||
DataRefImpl DRI; DRI.p = *SI;
|
||||
SectionRef S(DRI, Obj);
|
||||
SortedSectionList::const_iterator SI = findSectionContaining(Addr);
|
||||
errs() << " looking for sec " << Addr << "\n";
|
||||
if (SI != SortedSections.end()) {
|
||||
const SectionRef &S = *SI;
|
||||
StringRef Name; S.getName(Name);
|
||||
uint64_t SAddr; S.getAddress(SAddr);
|
||||
if (Name == "__cstring") {
|
||||
StringRef Contents;
|
||||
S.getContents(Contents);
|
||||
Contents = Contents.substr(Addr - SI.start());
|
||||
Contents = Contents.substr(Addr - SAddr);
|
||||
cStream << " ## literal pool for: "
|
||||
<< Contents.substr(0, Contents.find_first_of(0));
|
||||
}
|
||||
|
@ -62,9 +64,7 @@ public:
|
|||
MCObjectSymbolizer::MCObjectSymbolizer(MCContext &Ctx,
|
||||
OwningPtr<MCRelocationInfo> &RelInfo,
|
||||
const ObjectFile *Obj)
|
||||
: MCSymbolizer(Ctx, RelInfo), Obj(Obj),
|
||||
AddrToSectionAllocator(), AddrToSection(AddrToSectionAllocator),
|
||||
AddrToReloc() {
|
||||
: MCSymbolizer(Ctx, RelInfo), Obj(Obj), SortedSections(), AddrToReloc() {
|
||||
error_code ec;
|
||||
for (section_iterator SI = Obj->begin_sections(),
|
||||
SE = Obj->end_sections();
|
||||
|
@ -81,8 +81,7 @@ MCObjectSymbolizer::MCObjectSymbolizer(MCContext &Ctx,
|
|||
bool RequiredForExec; RelSecI->isRequiredForExecution(RequiredForExec);
|
||||
if (RequiredForExec == false || Size == 0)
|
||||
continue;
|
||||
AddrToSection.insert(StartAddr, StartAddr + Size - 1,
|
||||
SI->getRawDataRefImpl().p);
|
||||
insertSection(*SI);
|
||||
for (relocation_iterator RI = SI->begin_relocations(),
|
||||
RE = SI->end_relocations();
|
||||
RI != RE;
|
||||
|
@ -177,3 +176,40 @@ MCObjectSymbolizer::createObjectSymbolizer(MCContext &Ctx,
|
|||
}
|
||||
return new MCObjectSymbolizer(Ctx, RelInfo, Obj);
|
||||
}
|
||||
|
||||
// SortedSections implementation.
|
||||
|
||||
static bool SectionStartsBefore(const SectionRef &S, uint64_t Addr) {
|
||||
uint64_t SAddr; S.getAddress(SAddr);
|
||||
return SAddr < Addr;
|
||||
}
|
||||
|
||||
MCObjectSymbolizer::SortedSectionList::const_iterator
|
||||
MCObjectSymbolizer::findSectionContaining(uint64_t Addr) const {
|
||||
SortedSectionList::const_iterator
|
||||
EndIt = SortedSections.end(),
|
||||
It = std::lower_bound(SortedSections.begin(), EndIt,
|
||||
Addr, SectionStartsBefore);
|
||||
if (It == EndIt)
|
||||
return It;
|
||||
uint64_t SAddr; It->getAddress(SAddr);
|
||||
uint64_t SSize; It->getSize(SSize);
|
||||
if (Addr >= SAddr + SSize)
|
||||
return EndIt;
|
||||
return It;
|
||||
}
|
||||
|
||||
void MCObjectSymbolizer::insertSection(SectionRef Sec) {
|
||||
uint64_t SAddr; Sec.getAddress(SAddr);
|
||||
uint64_t SSize; Sec.getSize(SSize);
|
||||
SortedSectionList::iterator It = std::lower_bound(SortedSections.begin(),
|
||||
SortedSections.end(),
|
||||
SAddr,
|
||||
SectionStartsBefore);
|
||||
if (It != SortedSections.end()) {
|
||||
uint64_t FoundSAddr; It->getAddress(FoundSAddr);
|
||||
if (FoundSAddr < SAddr + SSize)
|
||||
llvm_unreachable("Inserting overlapping sections");
|
||||
}
|
||||
SortedSections.insert(It, Sec);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue