[llvm] r180262 - Use a pointer as the relocation iterator.

Rafael Espindola rafael.espindola at gmail.com
Thu Apr 25 05:45:47 PDT 2013


Author: rafael
Date: Thu Apr 25 07:45:46 2013
New Revision: 180262

URL: http://llvm.org/viewvc/llvm-project?rev=180262&view=rev
Log:
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.

Modified:
    llvm/trunk/lib/Object/MachOObjectFile.cpp

Modified: llvm/trunk/lib/Object/MachOObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/MachOObjectFile.cpp?rev=180262&r1=180261&r2=180262&view=diff
==============================================================================
--- llvm/trunk/lib/Object/MachOObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/MachOObjectFile.cpp Thu Apr 25 07:45:46 2013
@@ -758,31 +758,47 @@ MachOObjectFile::sectionContainsSymbol(D
 }
 
 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::getLinkeditDataLoadComm
 
 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 {





More information about the llvm-commits mailing list