Use pointers to iterate over symbols.

While here, don't report a dummy symbol for relocations that don't have symbols.
We used to says such relocations were for the first defined symbol, but now we
return end_symbols(). The llvm-readobj output change agrees with otool.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@180214 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp
index 4e6e0bd..51cd5b9 100644
--- a/lib/Object/MachOObjectFile.cpp
+++ b/lib/Object/MachOObjectFile.cpp
@@ -216,23 +216,9 @@
   return O->getData().substr(Offset, 1).data();
 }
 
-static const char *getSymbolTableEntryPtr(const MachOObjectFile *O,
-                                          DataRefImpl DRI) {
-  macho::SymtabLoadCommand S = O->getSymtabLoadCommand();
-
-  unsigned Index = DRI.d.b;
-
-  unsigned SymbolTableEntrySize = O->is64Bit() ?
-    sizeof(macho::Symbol64TableEntry) :
-    sizeof(macho::SymbolTableEntry);
-
-  uint64_t Offset = S.SymbolTableOffset + Index * SymbolTableEntrySize;
-  return getPtr(O, Offset);
-}
-
 static SymbolTableEntryBase
 getSymbolTableEntryBase(const MachOObjectFile *O, DataRefImpl DRI) {
-  const char *P = getSymbolTableEntryPtr(O, DRI);
+  const char *P = reinterpret_cast<const char *>(DRI.p);
   return getStruct<SymbolTableEntryBase>(O, P);
 }
 
@@ -420,7 +406,10 @@
 
 error_code MachOObjectFile::getSymbolNext(DataRefImpl Symb,
                                           SymbolRef &Res) const {
-  Symb.d.b++;
+  unsigned SymbolTableEntrySize = is64Bit() ?
+    sizeof(macho::Symbol64TableEntry) :
+    sizeof(macho::SymbolTableEntry);
+  Symb.p += SymbolTableEntrySize;
   Res = SymbolRef(Symb, this);
   return object_error::success;
 }
@@ -494,15 +483,15 @@
   }
   // Unfortunately symbols are unsorted so we need to touch all
   // symbols from load command
-  macho::SymtabLoadCommand Symtab = getSymtabLoadCommand();
-  DRI.d.b = 0;
-  while (DRI.d.b <= Symtab.NumSymbolTableEntries) {
+  error_code ec;
+  for (symbol_iterator I = begin_symbols(), E = end_symbols(); I != E;
+       I.increment(ec)) {
+    DataRefImpl DRI = I->getRawDataRefImpl();
     Entry = getSymbolTableEntryBase(this, DRI);
     getSymbolAddress(DRI, Value);
     if (Entry.SectionIndex == SectionIndex && Value > BeginOffset)
       if (!EndOffset || Value < EndOffset)
         EndOffset = Value;
-    DRI.d.b++;
   }
   if (!EndOffset) {
     uint64_t Size;
@@ -829,11 +818,18 @@
   macho::RelocationEntry RE = getRelocation(Rel);
   uint32_t SymbolIdx = getPlainRelocationSymbolNum(RE);
   bool isExtern = getPlainRelocationExternal(RE);
-
-  DataRefImpl Sym;
-  if (isExtern) {
-    Sym.d.b = SymbolIdx;
+  if (!isExtern) {
+    Res = *end_symbols();
+    return object_error::success;
   }
+
+  macho::SymtabLoadCommand S = getSymtabLoadCommand();
+  unsigned SymbolTableEntrySize = is64Bit() ?
+    sizeof(macho::Symbol64TableEntry) :
+    sizeof(macho::SymbolTableEntry);
+  uint64_t Offset = S.SymbolTableOffset + SymbolIdx * SymbolTableEntrySize;
+  DataRefImpl Sym;
+  Sym.p = reinterpret_cast<uintptr_t>(getPtr(this, Offset));
   Res = SymbolRef(Sym, this);
   return object_error::success;
 }
@@ -1160,17 +1156,27 @@
 }
 
 symbol_iterator MachOObjectFile::begin_symbols() const {
-  // DRI.d.a = segment number; DRI.d.b = symbol index.
   DataRefImpl DRI;
+  if (!SymtabLoadCmd)
+    return symbol_iterator(SymbolRef(DRI, this));
+
+  macho::SymtabLoadCommand Symtab = getSymtabLoadCommand();
+  DRI.p = reinterpret_cast<uintptr_t>(getPtr(this, Symtab.SymbolTableOffset));
   return symbol_iterator(SymbolRef(DRI, this));
 }
 
 symbol_iterator MachOObjectFile::end_symbols() const {
   DataRefImpl DRI;
-  if (SymtabLoadCmd) {
-    macho::SymtabLoadCommand Symtab = getSymtabLoadCommand();
-    DRI.d.b = Symtab.NumSymbolTableEntries;
-  }
+  if (!SymtabLoadCmd)
+    return symbol_iterator(SymbolRef(DRI, this));
+
+  macho::SymtabLoadCommand Symtab = getSymtabLoadCommand();
+  unsigned SymbolTableEntrySize = is64Bit() ?
+    sizeof(macho::Symbol64TableEntry) :
+    sizeof(macho::SymbolTableEntry);
+  unsigned Offset = Symtab.SymbolTableOffset +
+    Symtab.NumSymbolTableEntries * SymbolTableEntrySize;
+  DRI.p = reinterpret_cast<uintptr_t>(getPtr(this, Offset));
   return symbol_iterator(SymbolRef(DRI, this));
 }
 
@@ -1369,13 +1375,13 @@
 
 macho::SymbolTableEntry
 MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI) const {
-  const char *P = getSymbolTableEntryPtr(this, DRI);
+  const char *P = reinterpret_cast<const char *>(DRI.p);
   return getStruct<macho::SymbolTableEntry>(this, P);
 }
 
 macho::Symbol64TableEntry
 MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI) const {
-  const char *P = getSymbolTableEntryPtr(this, DRI);
+  const char *P = reinterpret_cast<const char *>(DRI.p);
   return getStruct<macho::Symbol64TableEntry>(this, P);
 }