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
This commit is contained in:
Rafael Espindola 2013-04-25 12:45:46 +00:00
parent 956ca7265c
commit e5330f77cf

View File

@ -758,31 +758,47 @@ MachOObjectFile::sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb,
} }
relocation_iterator MachOObjectFile::getSectionRelBegin(DataRefImpl Sec) const { relocation_iterator MachOObjectFile::getSectionRelBegin(DataRefImpl Sec) const {
DataRefImpl ret; uint32_t Offset;
ret.d.b = Sec.d.a; if (is64Bit()) {
return relocation_iterator(RelocationRef(ret, this)); 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 relocation_iterator
MachOObjectFile::getSectionRelEnd(DataRefImpl Sec) const { MachOObjectFile::getSectionRelEnd(DataRefImpl Sec) const {
uint32_t LastReloc; uint32_t Offset;
uint32_t Num;
if (is64Bit()) { if (is64Bit()) {
macho::Section64 Sect = getSection64(Sec); macho::Section64 Sect = getSection64(Sec);
LastReloc = Sect.NumRelocationTableEntries; Offset = Sect.RelocationTableOffset;
Num = Sect.NumRelocationTableEntries;
} else { } else {
macho::Section Sect = getSection(Sec); 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; DataRefImpl Ret;
Ret.d.a = LastReloc; Ret.p = reinterpret_cast<uintptr_t>(P + Num);
Ret.d.b = Sec.d.a;
return relocation_iterator(RelocationRef(Ret, this)); return relocation_iterator(RelocationRef(Ret, this));
} }
error_code MachOObjectFile::getRelocationNext(DataRefImpl Rel, error_code MachOObjectFile::getRelocationNext(DataRefImpl Rel,
RelocationRef &Res) const { RelocationRef &Res) const {
++Rel.d.a; const macho::RelocationEntry *P =
reinterpret_cast<const macho::RelocationEntry *>(Rel.p);
Rel.p = reinterpret_cast<uintptr_t>(P + 1);
Res = RelocationRef(Rel, this); Res = RelocationRef(Rel, this);
return object_error::success; return object_error::success;
} }
@ -1378,19 +1394,8 @@ MachOObjectFile::getLinkeditDataLoadCommand(const MachOObjectFile::LoadCommandIn
macho::RelocationEntry macho::RelocationEntry
MachOObjectFile::getRelocation(DataRefImpl Rel) const { MachOObjectFile::getRelocation(DataRefImpl Rel) const {
uint32_t RelOffset; const char *P = reinterpret_cast<const char *>(Rel.p);
DataRefImpl Sec; return getStruct<macho::RelocationEntry>(this, P);
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));
} }
macho::Header MachOObjectFile::getHeader() const { macho::Header MachOObjectFile::getHeader() const {