diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-04-25 12:45:46 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-04-25 12:45:46 +0000 |
commit | e5330f77cf420d71cfd46c960387eb06edeccbf8 (patch) | |
tree | 375dbf2ce5be22a242de902811ba42d20288fa0f /lib | |
parent | 956ca7265c697107708468b7e1b2fd21f4185bae (diff) | |
download | external_llvm-e5330f77cf420d71cfd46c960387eb06edeccbf8.zip external_llvm-e5330f77cf420d71cfd46c960387eb06edeccbf8.tar.gz external_llvm-e5330f77cf420d71cfd46c960387eb06edeccbf8.tar.bz2 |
Use a pointer as the relocation iterator.
Since the relocation iterator walks only the relocations in one section, we
can just use a pointer and avoid fetching information about the section at
every reference.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@180262 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Object/MachOObjectFile.cpp | 53 |
1 files changed, 29 insertions, 24 deletions
diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp index 14bca2b..38198b1 100644 --- a/lib/Object/MachOObjectFile.cpp +++ b/lib/Object/MachOObjectFile.cpp @@ -758,31 +758,47 @@ MachOObjectFile::sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb, } relocation_iterator MachOObjectFile::getSectionRelBegin(DataRefImpl Sec) const { - DataRefImpl ret; - ret.d.b = Sec.d.a; - return relocation_iterator(RelocationRef(ret, this)); + uint32_t Offset; + if (is64Bit()) { + macho::Section64 Sect = getSection64(Sec); + Offset = Sect.RelocationTableOffset; + } else { + macho::Section Sect = getSection(Sec); + Offset = Sect.RelocationTableOffset; + } + + DataRefImpl Ret; + Ret.p = reinterpret_cast<uintptr_t>(getPtr(this, Offset)); + return relocation_iterator(RelocationRef(Ret, this)); } relocation_iterator MachOObjectFile::getSectionRelEnd(DataRefImpl Sec) const { - uint32_t LastReloc; + uint32_t Offset; + uint32_t Num; if (is64Bit()) { macho::Section64 Sect = getSection64(Sec); - LastReloc = Sect.NumRelocationTableEntries; + Offset = Sect.RelocationTableOffset; + Num = Sect.NumRelocationTableEntries; } else { macho::Section Sect = getSection(Sec); - LastReloc = Sect.NumRelocationTableEntries; + Offset = Sect.RelocationTableOffset; + Num = Sect.NumRelocationTableEntries; } + const macho::RelocationEntry *P = + reinterpret_cast<const macho::RelocationEntry*>(getPtr(this, Offset)); + DataRefImpl Ret; - Ret.d.a = LastReloc; - Ret.d.b = Sec.d.a; + Ret.p = reinterpret_cast<uintptr_t>(P + Num); return relocation_iterator(RelocationRef(Ret, this)); } - error_code MachOObjectFile::getRelocationNext(DataRefImpl Rel, - RelocationRef &Res) const { - ++Rel.d.a; +error_code MachOObjectFile::getRelocationNext(DataRefImpl Rel, + RelocationRef &Res) const { + const macho::RelocationEntry *P = + reinterpret_cast<const macho::RelocationEntry *>(Rel.p); + Rel.p = reinterpret_cast<uintptr_t>(P + 1); Res = RelocationRef(Rel, this); return object_error::success; } @@ -1378,19 +1394,8 @@ MachOObjectFile::getLinkeditDataLoadCommand(const MachOObjectFile::LoadCommandIn macho::RelocationEntry MachOObjectFile::getRelocation(DataRefImpl Rel) const { - uint32_t RelOffset; - DataRefImpl Sec; - Sec.d.a = Rel.d.b; - if (is64Bit()) { - macho::Section64 Sect = getSection64(Sec); - RelOffset = Sect.RelocationTableOffset; - } else { - macho::Section Sect = getSection(Sec); - RelOffset = Sect.RelocationTableOffset; - } - - uint64_t Offset = RelOffset + Rel.d.a * sizeof(macho::RelocationEntry); - return getStruct<macho::RelocationEntry>(this, getPtr(this, Offset)); + const char *P = reinterpret_cast<const char *>(Rel.p); + return getStruct<macho::RelocationEntry>(this, P); } macho::Header MachOObjectFile::getHeader() const { |