Add 179294 back, but don't use bit fields so that it works on big endian hosts.

Original message:

Print more information about relocations.

With this patch llvm-readobj now prints if a relocation is pcrel, its length,
if it is extern and if it is scattered.

It also refactors the code a bit to use bit fields instead of shifts and
masks all over the place.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179345 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp
index c846206..627e748 100644
--- a/lib/Object/MachOObjectFile.cpp
+++ b/lib/Object/MachOObjectFile.cpp
@@ -80,6 +80,46 @@
   return ObjectFile::getData().substr(Offset, Size);
 }
 
+const MachOObjectFileBase::RelocationEntry *
+MachOObjectFileBase::getRelocation(DataRefImpl Rel) const {
+  if (const MachOObjectFile32Le *O = dyn_cast<MachOObjectFile32Le>(this))
+    return O->getRelocation(Rel);
+  const MachOObjectFile64Le *O = dyn_cast<MachOObjectFile64Le>(this);
+  return O->getRelocation(Rel);
+}
+
+bool MachOObjectFileBase::isScattered(const RelocationEntry *RE) const {
+  unsigned Arch = getArch();
+  return (Arch != Triple::x86_64) && (RE->Address & macho::RF_Scattered);
+}
+
+bool MachOObjectFileBase::isPCRel(const RelocationEntry *RE) const {
+  if (isScattered(RE)) {
+    const ScatteredRelocationEntry *SRE =
+      reinterpret_cast<const ScatteredRelocationEntry *>(RE);
+    return SRE->getPCRel();
+  }
+  return RE->getPCRel();
+}
+
+unsigned MachOObjectFileBase::getLength(const RelocationEntry *RE) const {
+  if (isScattered(RE)) {
+    const ScatteredRelocationEntry *SRE =
+      reinterpret_cast<const ScatteredRelocationEntry *>(RE);
+    return SRE->getLength();
+  }
+  return RE->getLength();
+}
+
+unsigned MachOObjectFileBase::getType(const RelocationEntry *RE) const {
+  if (isScattered(RE)) {
+    const ScatteredRelocationEntry *SRE =
+      reinterpret_cast<const ScatteredRelocationEntry *>(RE);
+    return SRE->getType();
+  }
+  return RE->getType();
+}
+
 ObjectFile *ObjectFile::createMachOObjectFile(MemoryBuffer *Buffer) {
   StringRef Magic = Buffer->getBuffer().slice(0, 4);
   error_code ec;
@@ -435,16 +475,12 @@
 void
 MachOObjectFileBase::printRelocationTargetName(const RelocationEntry *RE,
                                                raw_string_ostream &fmt) const {
-  unsigned Arch = getArch();
-  bool isScattered = (Arch != Triple::x86_64) &&
-                     (RE->Word0 & macho::RF_Scattered);
-
   // Target of a scattered relocation is an address.  In the interest of
   // generating pretty output, scan through the symbol table looking for a
   // symbol that aligns with that address.  If we find one, print it.
   // Otherwise, we just print the hex address of the target.
-  if (isScattered) {
-    uint32_t Val = RE->Word1;
+  if (isScattered(RE)) {
+    uint32_t Val = RE->SymbolNum;
 
     error_code ec;
     for (symbol_iterator SI = begin_symbols(), SE = end_symbols(); SI != SE;
@@ -486,8 +522,8 @@
   }
 
   StringRef S;
-  bool isExtern = (RE->Word1 >> 27) & 1;
-  uint32_t Val = RE->Word1 & 0xFFFFFF;
+  bool isExtern = RE->getExternal();
+  uint32_t Val = RE->Address;
 
   if (isExtern) {
     symbol_iterator SI = begin_symbols();