summaryrefslogtreecommitdiff
path: root/lib/MC
diff options
context:
space:
mode:
authorAhmed Bougacha <ahmed.bougacha@gmail.com>2013-05-30 18:18:36 +0000
committerAhmed Bougacha <ahmed.bougacha@gmail.com>2013-05-30 18:18:36 +0000
commitb54d29735af9ddabce268c817ccc2ab3eb54d719 (patch)
tree68438b743f0a13e3ce1ef8c96028f90ff9cb84e1 /lib/MC
parent964722ca40f48c65605e459e3a732bb8783b92f6 (diff)
downloadllvm-b54d29735af9ddabce268c817ccc2ab3eb54d719.tar.gz
llvm-b54d29735af9ddabce268c817ccc2ab3eb54d719.tar.bz2
llvm-b54d29735af9ddabce268c817ccc2ab3eb54d719.tar.xz
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@182949 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC')
-rw-r--r--lib/MC/MCObjectSymbolizer.cpp56
1 files changed, 46 insertions, 10 deletions
diff --git a/lib/MC/MCObjectSymbolizer.cpp b/lib/MC/MCObjectSymbolizer.cpp
index 1803498991..923c9a0d5f 100644
--- a/lib/MC/MCObjectSymbolizer.cpp
+++ b/lib/MC/MCObjectSymbolizer.cpp
@@ -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);
+}