[llvm] r182949 - MCObjectSymbolizer: Switch from IntervalMap to sorted vector, following r182625.
Bill Wendling
wendling at apple.com
Thu May 30 16:31:25 PDT 2013
On May 30, 2013, at 11:18 AM, Ahmed Bougacha <ahmed.bougacha at gmail.com> wrote:
> Author: ab
> Date: Thu May 30 13:18:36 2013
> New Revision: 182949
>
> URL: http://llvm.org/viewvc/llvm-project?rev=182949&view=rev
> Log:
> 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.
>
> Modified:
> llvm/trunk/include/llvm/MC/MCObjectSymbolizer.h
> llvm/trunk/lib/MC/MCObjectSymbolizer.cpp
>
> Modified: llvm/trunk/lib/MC/MCObjectSymbolizer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectSymbolizer.cpp?rev=182949&r1=182948&r2=182949&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCObjectSymbolizer.cpp (original)
> +++ llvm/trunk/lib/MC/MCObjectSymbolizer.cpp Thu May 30 13:18:36 2013
> @@ -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";
Did you mean to keep this "errs()" statement here?
-bw
> + 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(M
> 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::createObjectSymboliz
> }
> 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);
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list