Don't use InMemoryStruct<macho::SymtabLoadCommand>.

This also required not using the RegisterStringTable API, which is also a
good thing.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178947 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp
index 4d91864..e2b0468 100644
--- a/lib/Object/MachOObjectFile.cpp
+++ b/lib/Object/MachOObjectFile.cpp
@@ -30,8 +30,7 @@
 MachOObjectFile::MachOObjectFile(MemoryBuffer *Object, MachOObject *MOO,
                                  error_code &ec)
     : ObjectFile(Binary::ID_MachO, Object, ec),
-      MachOObj(MOO),
-      RegisteredStringTable(std::numeric_limits<uint32_t>::max()) {
+      MachOObj(MOO) {
   DataRefImpl DRI;
   moveToNextSection(DRI);
   uint32_t LoadCommandCount = MachOObj->getHeader().NumLoadCommands;
@@ -62,13 +61,20 @@
 
 /*===-- Symbols -----------------------------------------------------------===*/
 
+const MachOFormat::SymtabLoadCommand *
+MachOObjectFile::getSymtabLoadCommand(LoadCommandInfo LCI) const {
+  StringRef Data = MachOObj->getData(LCI.Offset,
+                                     sizeof(MachOFormat::SymtabLoadCommand));
+  return reinterpret_cast<const MachOFormat::SymtabLoadCommand*>(Data.data());
+}
+
 void MachOObjectFile::moveToNextSymbol(DataRefImpl &DRI) const {
   uint32_t LoadCommandCount = MachOObj->getHeader().NumLoadCommands;
   while (DRI.d.a < LoadCommandCount) {
     LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
     if (LCI.Command.Type == macho::LCT_Symtab) {
-      InMemoryStruct<macho::SymtabLoadCommand> SymtabLoadCmd;
-      MachOObj->ReadSymtabLoadCommand(LCI, SymtabLoadCmd);
+      const MachOFormat::SymtabLoadCommand *SymtabLoadCmd =
+        getSymtabLoadCommand(LCI);
       if (DRI.d.b < SymtabLoadCmd->NumSymbolTableEntries)
         return;
     }
@@ -80,15 +86,16 @@
 
 const MachOFormat::SymbolTableEntry *
 MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI) const {
-  InMemoryStruct<macho::SymtabLoadCommand> SymtabLoadCmd;
   LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
-  MachOObj->ReadSymtabLoadCommand(LCI, SymtabLoadCmd);
+  const MachOFormat::SymtabLoadCommand *SymtabLoadCmd =
+    getSymtabLoadCommand(LCI);
 
-  if (RegisteredStringTable != DRI.d.a) {
-    MachOObj->RegisterStringTable(*SymtabLoadCmd);
-    RegisteredStringTable = DRI.d.a;
-  }
+  return getSymbolTableEntry(DRI, SymtabLoadCmd);
+}
 
+const MachOFormat::SymbolTableEntry *
+MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI,
+                    const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const {
   uint64_t SymbolTableOffset = SymtabLoadCmd->SymbolTableOffset;
   unsigned Index = DRI.d.b;
   uint64_t Offset = (SymbolTableOffset +
@@ -100,15 +107,16 @@
 
 const MachOFormat::Symbol64TableEntry*
 MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI) const {
-  InMemoryStruct<macho::SymtabLoadCommand> SymtabLoadCmd;
   LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
-  MachOObj->ReadSymtabLoadCommand(LCI, SymtabLoadCmd);
+  const MachOFormat::SymtabLoadCommand *SymtabLoadCmd =
+    getSymtabLoadCommand(LCI);
 
-  if (RegisteredStringTable != DRI.d.a) {
-    MachOObj->RegisterStringTable(*SymtabLoadCmd);
-    RegisteredStringTable = DRI.d.a;
-  }
+  return getSymbol64TableEntry(DRI, SymtabLoadCmd);
+}
 
+const MachOFormat::Symbol64TableEntry*
+MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI,
+                    const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const {
   uint64_t SymbolTableOffset = SymtabLoadCmd->SymbolTableOffset;
   unsigned Index = DRI.d.b;
   uint64_t Offset = (SymbolTableOffset +
@@ -128,13 +136,28 @@
 
 error_code MachOObjectFile::getSymbolName(DataRefImpl DRI,
                                           StringRef &Result) const {
+  LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
+  const MachOFormat::SymtabLoadCommand *SymtabLoadCmd =
+    getSymtabLoadCommand(LCI);
+
+  StringRef StringTable =
+    MachOObj->getData(SymtabLoadCmd->StringTableOffset,
+                      SymtabLoadCmd->StringTableSize);
+
+  uint32_t StringIndex;
   if (MachOObj->is64Bit()) {
-    const MachOFormat::Symbol64TableEntry *Entry = getSymbol64TableEntry(DRI);
-    Result = MachOObj->getStringAtIndex(Entry->StringIndex);
+    const MachOFormat::Symbol64TableEntry *Entry =
+      getSymbol64TableEntry(DRI, SymtabLoadCmd);
+    StringIndex = Entry->StringIndex;
   } else {
-    const MachOFormat::SymbolTableEntry *Entry = getSymbolTableEntry(DRI);
-    Result = MachOObj->getStringAtIndex(Entry->StringIndex);
+    const MachOFormat::SymbolTableEntry *Entry =
+      getSymbolTableEntry(DRI, SymtabLoadCmd);
+    StringIndex = Entry->StringIndex;
   }
+
+  const char *Start = &StringTable.data()[StringIndex];
+  Result = StringRef(Start);
+
   return object_error::success;
 }