Add a SymbolTableEntryBase.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 9 Apr 2013 00:22:58 +0000 (00:22 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 9 Apr 2013 00:22:58 +0000 (00:22 +0000)
Use it when we don't need to know if we have a 32 or 64 bit SymbolTableEntry.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179074 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Object/MachO.h
lib/Object/MachOObjectFile.cpp

index 07c8fc5ca2bb89aa0f23ca4168660cd180eeb96d..8c2e268dae5d6d9be5d8af04c3eb668a1e97307c 100644 (file)
@@ -71,6 +71,13 @@ namespace MachOFormat {
     support::ulittle32_t Word1;
   };
 
+  struct SymbolTableEntryBase {
+    support::ulittle32_t StringIndex;
+    uint8_t Type;
+    uint8_t SectionIndex;
+    support::ulittle16_t Flags;
+  };
+
   template<bool is64Bits>
   struct SymbolTableEntry;
 
@@ -263,12 +270,11 @@ private:
 
   void moveToNextSection(DataRefImpl &DRI) const;
 
-  const MachOFormat::SymbolTableEntry<false> *
-  getSymbolTableEntry(DataRefImpl DRI,
-                     const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const;
+  const MachOFormat::SymbolTableEntryBase *
+    getSymbolTableEntryBase(DataRefImpl DRI) const;
 
-  const MachOFormat::SymbolTableEntry<true> *
-  getSymbol64TableEntry(DataRefImpl DRI,
+  const MachOFormat::SymbolTableEntryBase *
+    getSymbolTableEntryBase(DataRefImpl DRI,
                      const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const;
 
   void moveToNextSymbol(DataRefImpl &DRI) const;
index 3931c53ac836fbff6a67ffe291e9f4c99d8be864..ae30105a93c3b8fcefb3719673b228bb5b8c5658 100644 (file)
@@ -116,47 +116,40 @@ void MachOObjectFile::moveToNextSymbol(DataRefImpl &DRI) const {
   }
 }
 
-const MachOFormat::SymbolTableEntry<false> *
-MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI) const {
+const MachOFormat::SymbolTableEntryBase *
+MachOObjectFile::getSymbolTableEntryBase(DataRefImpl DRI) const {
   const MachOFormat::LoadCommand *Command = getLoadCommandInfo(DRI.d.a);
   const MachOFormat::SymtabLoadCommand *SymtabLoadCmd =
     reinterpret_cast<const MachOFormat::SymtabLoadCommand*>(Command);
-
-  return getSymbolTableEntry(DRI, SymtabLoadCmd);
+  return getSymbolTableEntryBase(DRI, SymtabLoadCmd);
 }
 
 const MachOFormat::SymbolTableEntry<false> *
-MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI,
+MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI) const {
+  const MachOFormat::SymbolTableEntryBase *Base = getSymbolTableEntryBase(DRI);
+  return reinterpret_cast<const MachOFormat::SymbolTableEntry<false>*>(Base);
+}
+
+const MachOFormat::SymbolTableEntryBase *
+MachOObjectFile::getSymbolTableEntryBase(DataRefImpl DRI,
                     const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const {
   uint64_t SymbolTableOffset = SymtabLoadCmd->SymbolTableOffset;
   unsigned Index = DRI.d.b;
-  uint64_t Offset = (SymbolTableOffset +
-                     Index * sizeof(MachOFormat::SymbolTableEntry<false>));
-  StringRef Data =
-    getData(Offset, sizeof(MachOFormat::SymbolTableEntry<false>));
-  return
-    reinterpret_cast<const MachOFormat::SymbolTableEntry<false>*>(Data.data());
-}
 
-const MachOFormat::SymbolTableEntry<true>*
-MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI) const {
-  const MachOFormat::LoadCommand *Command = getLoadCommandInfo(DRI.d.a);
-  const MachOFormat::SymtabLoadCommand *SymtabLoadCmd =
-    reinterpret_cast<const MachOFormat::SymtabLoadCommand*>(Command);
+  unsigned SymbolTableEntrySize = is64Bit() ?
+    sizeof(MachOFormat::SymbolTableEntry<true>) :
+    sizeof(MachOFormat::SymbolTableEntry<false>);
 
-  return getSymbol64TableEntry(DRI, SymtabLoadCmd);
+  uint64_t Offset = SymbolTableOffset + Index * SymbolTableEntrySize;
+  StringRef Data = getData(Offset, SymbolTableEntrySize);
+  return
+    reinterpret_cast<const MachOFormat::SymbolTableEntryBase*>(Data.data());
 }
 
 const MachOFormat::SymbolTableEntry<true>*
-MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI,
-                    const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const {
-  uint64_t SymbolTableOffset = SymtabLoadCmd->SymbolTableOffset;
-  unsigned Index = DRI.d.b;
-  uint64_t Offset = (SymbolTableOffset +
-                     Index * sizeof(MachOFormat::SymbolTableEntry<true>));
-  StringRef Data = getData(Offset, sizeof(MachOFormat::SymbolTableEntry<true>));
-  return
-    reinterpret_cast<const MachOFormat::SymbolTableEntry<true>*>(Data.data());
+MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI) const {
+  const MachOFormat::SymbolTableEntryBase *Base = getSymbolTableEntryBase(DRI);
+  return reinterpret_cast<const MachOFormat::SymbolTableEntry<true>*>(Base);
 }
 
 error_code MachOObjectFile::getSymbolNext(DataRefImpl DRI,
@@ -176,16 +169,9 @@ error_code MachOObjectFile::getSymbolName(DataRefImpl DRI,
   StringRef StringTable = getData(SymtabLoadCmd->StringTableOffset,
                                   SymtabLoadCmd->StringTableSize);
 
-  uint32_t StringIndex;
-  if (is64Bit()) {
-    const MachOFormat::SymbolTableEntry<true> *Entry =
-      getSymbol64TableEntry(DRI, SymtabLoadCmd);
-    StringIndex = Entry->StringIndex;
-  } else {
-    const MachOFormat::SymbolTableEntry<false> *Entry =
-      getSymbolTableEntry(DRI, SymtabLoadCmd);
-    StringIndex = Entry->StringIndex;
-  }
+  const MachOFormat::SymbolTableEntryBase *Entry =
+    getSymbolTableEntryBase(DRI, SymtabLoadCmd);
+  uint32_t StringIndex = Entry->StringIndex;
 
   const char *Start = &StringTable.data()[StringIndex];
   Result = StringRef(Start);
@@ -403,16 +389,10 @@ error_code MachOObjectFile::getSymbolSection(DataRefImpl Symb,
 
 error_code MachOObjectFile::getSymbolType(DataRefImpl Symb,
                                           SymbolRef::Type &Res) const {
-  uint8_t n_type;
-  if (is64Bit()) {
-    const MachOFormat::SymbolTableEntry<true> *Entry =
-      getSymbol64TableEntry(Symb);
-    n_type = Entry->Type;
-  } else {
-    const MachOFormat::SymbolTableEntry<false> *Entry =
-      getSymbolTableEntry(Symb);
-    n_type = Entry->Type;
-  }
+  const MachOFormat::SymbolTableEntryBase *Entry =
+    getSymbolTableEntryBase(Symb);
+  uint8_t n_type = Entry->Type;
+
   Res = SymbolRef::ST_Other;
 
   // If this is a STAB debugging symbol, we can do nothing more.