From: Rafael Espindola Date: Mon, 20 Jul 2015 14:15:38 +0000 (+0000) Subject: Simplify the search for which segment has a virtual address. NFC. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=96a1f00376e05ea16dd6671685affb92fc8dde94;p=oota-llvm.git Simplify the search for which segment has a virtual address. NFC. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242672 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Object/ELF.h b/include/llvm/Object/ELF.h index 160b12d607e..fc6fe6e49b9 100644 --- a/include/llvm/Object/ELF.h +++ b/include/llvm/Object/ELF.h @@ -16,7 +16,6 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" -#include "llvm/ADT/IntervalMap.h" #include "llvm/ADT/PointerIntPair.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringSwitch.h" @@ -726,17 +725,12 @@ ELFFile::ELFFile(StringRef Object, std::error_code &EC) } template -void ELFFile::scanDynamicTable() { - // Build load-address to file-offset map. - typedef IntervalMap< - uintX_t, uintptr_t, - IntervalMapImpl::NodeSizer::LeafSize, - IntervalMapHalfOpenInfo> LoadMapT; - typename LoadMapT::Allocator Alloc; - // Allocate the IntervalMap on the heap to work around MSVC bug where the - // stack doesn't get realigned despite LoadMap having alignment 8 (PR24113). - std::unique_ptr LoadMap(new LoadMapT(Alloc)); +static bool compareAddr(uint64_t VAddr, const Elf_Phdr_Impl *Phdr) { + return VAddr < Phdr->p_vaddr; +} +template void ELFFile::scanDynamicTable() { + SmallVector LoadSegments; for (const Elf_Phdr &Phdr : program_headers()) { if (Phdr.p_type == ELF::PT_DYNAMIC) { DynamicRegion.Addr = base() + Phdr.p_offset; @@ -746,14 +740,16 @@ void ELFFile::scanDynamicTable() { } if (Phdr.p_type != ELF::PT_LOAD || Phdr.p_filesz == 0) continue; - LoadMap->insert(Phdr.p_vaddr, Phdr.p_vaddr + Phdr.p_filesz, Phdr.p_offset); + LoadSegments.push_back(&Phdr); } auto toMappedAddr = [&](uint64_t VAddr) -> const uint8_t * { - auto I = LoadMap->find(VAddr); - if (I == LoadMap->end()) + const Elf_Phdr **I = std::upper_bound( + LoadSegments.begin(), LoadSegments.end(), VAddr, compareAddr); + if (I == LoadSegments.begin()) return nullptr; - return this->base() + I.value() + (VAddr - I.start()); + --I; + return this->base() + (*I)->p_offset + (VAddr - (*I)->p_vaddr); }; for (Elf_Dyn_Iter DynI = dynamic_table_begin(), DynE = dynamic_table_end();