[llvm-commits] [lld] r158375 - in /lld/trunk/lib/ReaderWriter/MachO: ReferenceKinds.cpp ReferenceKinds.h StubAtoms_x86.hpp StubAtoms_x86_64.hpp

Nick Kledzik kledzik at apple.com
Tue Jun 12 16:01:30 PDT 2012


Author: kledzik
Date: Tue Jun 12 18:01:30 2012
New Revision: 158375

URL: http://llvm.org/viewvc/llvm-project?rev=158375&view=rev
Log:
flesh out mach-o Reference Kinds

Modified:
    lld/trunk/lib/ReaderWriter/MachO/ReferenceKinds.cpp
    lld/trunk/lib/ReaderWriter/MachO/ReferenceKinds.h
    lld/trunk/lib/ReaderWriter/MachO/StubAtoms_x86.hpp
    lld/trunk/lib/ReaderWriter/MachO/StubAtoms_x86_64.hpp

Modified: lld/trunk/lib/ReaderWriter/MachO/ReferenceKinds.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ReferenceKinds.cpp?rev=158375&r1=158374&r2=158375&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/ReferenceKinds.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/ReferenceKinds.cpp Tue Jun 12 18:01:30 2012
@@ -53,25 +53,39 @@
 
 Reference::Kind KindHandler_x86_64::stringToKind(StringRef str) {
   if ( str.equals("none") )
-    return KindHandler_x86_64::none;
-  else if ( str.equals("call32") )
-    return KindHandler_x86_64::call32;
+    return none;
+  else if ( str.equals("branch32") )
+    return branch32;
   else if ( str.equals("ripRel32") )
-    return KindHandler_x86_64::ripRel32;
-  else if ( str.equals("gotLoad32") )
-    return KindHandler_x86_64::gotLoad32;
-  else if ( str.equals("gotUse32") )
-    return KindHandler_x86_64::gotUse32;
+    return ripRel32;
+  else if ( str.equals("ripRel32_1") )
+    return ripRel32_1;
+  else if ( str.equals("ripRel32_2") )
+    return ripRel32_2;
+  else if ( str.equals("ripRel32_4") )
+    return ripRel32_4;
+  else if ( str.equals("gotLoadRipRel32") )
+    return gotLoadRipRel32;
+  else if ( str.equals("gotLoadRipRel32NowLea") )
+    return gotLoadRipRel32NowLea;
+  else if ( str.equals("gotUseRipRel32") )
+    return gotUseRipRel32;
+  else if ( str.equals("tlvLoadRipRel32") )
+    return tlvLoadRipRel32;
+  else if ( str.equals("tlvLoadRipRel32NowLea") )
+    return tlvLoadRipRel32NowLea;
   else if ( str.equals("pointer64") )
-    return KindHandler_x86_64::pointer64;
-  else if ( str.equals("lea32WasGot") )
-    return KindHandler_x86_64::lea32WasGot;
+    return pointer64;
+  else if ( str.equals("pointerRel32") )
+    return pointerRel32;
   else if ( str.equals("lazyTarget") )
-    return KindHandler_x86_64::lazyTarget;
-  else if ( str.equals("lazyImm") )
-    return KindHandler_x86_64::lazyImm;
-  else if ( str.equals("gotTarget") )
-    return KindHandler_x86_64::gotTarget;
+    return lazyTarget;
+  else if ( str.equals("lazyImmediate") )
+    return lazyImmediate;
+  else if ( str.equals("subordinateFDE") )
+    return subordinateFDE;
+  else if ( str.equals("subordinateLSDA") )
+    return subordinateLSDA;
   
   assert(0 && "invalid x86_64 Reference kind");
   return 0;
@@ -81,68 +95,100 @@
   switch ( (Kinds)kind ) {
     case none:
       return StringRef("none");
-    case call32: 
-      return StringRef("call32");
+    case branch32: 
+      return StringRef("branch32");
     case ripRel32:
       return StringRef("ripRel32");
-    case gotLoad32:
-      return StringRef("gotLoad32");
-    case gotUse32:
-      return StringRef("gotUse32");
+    case ripRel32_1:
+      return StringRef("ripRel32_1");
+    case ripRel32_2:
+      return StringRef("ripRel32_2");
+    case ripRel32_4:
+      return StringRef("ripRel32_4");
+    case gotLoadRipRel32:
+      return StringRef("gotLoadRipRel32");
+    case gotLoadRipRel32NowLea:
+      return StringRef("gotLoadRipRel32NowLea");
+    case gotUseRipRel32:
+      return StringRef("gotUseRipRel32");
+    case tlvLoadRipRel32:
+      return StringRef("tlvLoadRipRel32");
+    case tlvLoadRipRel32NowLea:
+      return StringRef("tlvLoadRipRel32NowLea");
     case pointer64:
       return StringRef("pointer64");
-    case lea32WasGot:
-      return StringRef("lea32WasGot");
+    case pointerRel32:
+      return StringRef("pointerRel32");
     case lazyTarget:
       return StringRef("lazyTarget");
-    case lazyImm:
-      return StringRef("lazyImm");
-    case gotTarget:
-      return StringRef("gotTarget");
+    case lazyImmediate:
+      return StringRef("lazyImmediate");
+    case subordinateFDE:
+      return StringRef("subordinateFDE");
+    case subordinateLSDA:
+      return StringRef("subordinateLSDA");
   }
   assert(0 && "invalid x86_64 Reference kind");
   return StringRef();
 }
 
 bool KindHandler_x86_64::isCallSite(Kind kind) {
-  return (kind == call32);
+  return (kind == branch32);
 }
 
 bool KindHandler_x86_64::isPointer(Kind kind) {
   return (kind == pointer64);
 }
-
  
 bool KindHandler_x86_64::isLazyImmediate(Kind kind) {
-  return (kind == lazyImm);
+  return (kind == lazyImmediate);
 }
-
  
 bool KindHandler_x86_64::isLazyTarget(Kind kind) {
   return (kind == lazyTarget);
 }
 
  
-void KindHandler_x86_64::applyFixup(Kind kind, uint64_t addend, uint8_t *location, 
-                  uint64_t fixupAddress, uint64_t targetAddress) {
+void KindHandler_x86_64::applyFixup(Kind kind, uint64_t addend,  
+                                    uint8_t *location, uint64_t fixupAddress, 
+                                    uint64_t targetAddress) {
   int32_t *loc32 = reinterpret_cast<int32_t*>(location);
   uint64_t* loc64 = reinterpret_cast<uint64_t*>(location);
   switch ( (Kinds)kind ) {
-    case call32: 
+    case branch32: 
     case ripRel32:
-    case gotLoad32:
-    case gotUse32:
+    case gotLoadRipRel32:
+    case gotUseRipRel32:
+    case tlvLoadRipRel32:
       *loc32 = (targetAddress - (fixupAddress+4)) + addend;
       break;
     case pointer64:
       *loc64 = targetAddress + addend;
       break;
-    case lea32WasGot:
+    case ripRel32_1:
+      *loc32 = (targetAddress - (fixupAddress+5)) + addend;
+      break;
+    case ripRel32_2:
+      *loc32 = (targetAddress - (fixupAddress+6)) + addend;
+      break;
+    case ripRel32_4:
+      *loc32 = (targetAddress - (fixupAddress+8)) + addend;
+      break;
+    case pointerRel32: 
+      *loc32 = (targetAddress - fixupAddress) + addend;
+      break;
+    case gotLoadRipRel32NowLea:
+    case tlvLoadRipRel32NowLea:
+      // Change MOVQ to LEA
+      assert(location[-2] == 0x8B);
+      location[-2] = 0x8D;
+      *loc32 = (targetAddress - (fixupAddress+4)) + addend;
       break;
     case none:
     case lazyTarget:
-    case lazyImm:
-    case gotTarget:
+    case lazyImmediate:
+    case subordinateFDE:
+    case subordinateLSDA:
       // do nothing
       break;
   }
@@ -158,17 +204,19 @@
 
 Reference::Kind KindHandler_x86::stringToKind(StringRef str) {
   if ( str.equals("none") )
-    return KindHandler_x86::none;
-  else if ( str.equals("call32") )
-    return KindHandler_x86::call32;
+    return none;
+  else if ( str.equals("branch32") )
+    return branch32;
   else if ( str.equals("abs32") )
-    return KindHandler_x86::abs32;
+    return abs32;
+  else if ( str.equals("funcRel32") )
+    return funcRel32;
   else if ( str.equals("pointer32") )
-    return KindHandler_x86::pointer32;
+    return pointer32;
   else if ( str.equals("lazyTarget") )
-    return KindHandler_x86::lazyTarget;
-  else if ( str.equals("lazyImm") )
-    return KindHandler_x86::lazyImm;
+    return lazyTarget;
+  else if ( str.equals("lazyImmediate") )
+    return lazyImmediate;
   
   assert(0 && "invalid x86 Reference kind");
   return 0;
@@ -178,23 +226,29 @@
   switch ( (Kinds)kind ) {
     case none:
       return StringRef("none");
-    case call32: 
-      return StringRef("call32");
+    case branch32: 
+      return StringRef("branch32");
     case abs32:
       return StringRef("abs32");
+    case funcRel32:
+      return StringRef("funcRel32");
     case pointer32:
       return StringRef("pointer32");
     case lazyTarget:
       return StringRef("lazyTarget");
-    case lazyImm:
-      return StringRef("lazyImm");
+    case lazyImmediate:
+      return StringRef("lazyImmediate");
+    case subordinateFDE:
+      return StringRef("subordinateFDE");
+    case subordinateLSDA:
+      return StringRef("subordinateLSDA");
   }
   assert(0 && "invalid x86 Reference kind");
   return StringRef();
 }
 
 bool KindHandler_x86::isCallSite(Kind kind) {
-  return (kind == call32);
+  return (kind == branch32);
 }
 
 bool KindHandler_x86::isPointer(Kind kind) {
@@ -203,7 +257,7 @@
 
  
 bool KindHandler_x86::isLazyImmediate(Kind kind) {
-  return (kind == lazyImm);
+  return (kind == lazyImmediate);
 }
 
  
@@ -216,16 +270,21 @@
                   uint64_t fixupAddress, uint64_t targetAddress) {
   int32_t *loc32 = reinterpret_cast<int32_t*>(location);
   switch ( (Kinds)kind ) {
-    case call32: 
+    case branch32: 
       *loc32 = (targetAddress - (fixupAddress+4)) + addend;
       break;
     case pointer32:
     case abs32:
       *loc32 = targetAddress + addend;
       break;
+    case funcRel32:
+      *loc32 = targetAddress + addend;
+      break;
     case none:
     case lazyTarget:
-    case lazyImm:
+    case lazyImmediate:
+    case subordinateFDE:
+    case subordinateLSDA:
       // do nothing
       break;
   }
@@ -241,15 +300,29 @@
 
 Reference::Kind KindHandler_arm::stringToKind(StringRef str) {
   if ( str.equals("none") )
-    return KindHandler_arm::none;
-  else if ( str.equals("br22") )
-    return KindHandler_arm::br22;
+    return none;
+  else if ( str.equals("thumbBranch22") )
+    return thumbBranch22;
+  else if ( str.equals("armBranch24") )
+    return armBranch24;
+  else if ( str.equals("thumbAbsLow16") )
+    return thumbAbsLow16;
+  else if ( str.equals("thumbAbsHigh16") )
+    return thumbAbsHigh16;
+  else if ( str.equals("thumbPcRelLow16") )
+    return thumbPcRelLow16;
+  else if ( str.equals("thumbPcRelHigh16") )
+    return thumbPcRelHigh16;
+  else if ( str.equals("abs32") )
+    return abs32;
   else if ( str.equals("pointer32") )
-    return KindHandler_arm::pointer32;
+    return pointer32;
   else if ( str.equals("lazyTarget") )
-    return KindHandler_arm::lazyTarget;
-  else if ( str.equals("lazyImm") )
-    return KindHandler_arm::lazyImm;
+    return lazyTarget;
+  else if ( str.equals("lazyImmediate") )
+    return lazyImmediate;
+  else if ( str.equals("subordinateLSDA") )
+    return subordinateLSDA;
 
   assert(0 && "invalid ARM Reference kind");
   return 0;
@@ -259,21 +332,35 @@
   switch ( (Kinds)kind ) {
     case none:
       return StringRef("none");
-    case br22: 
-      return StringRef("br22");
+    case thumbBranch22: 
+      return StringRef("thumbBranch22");
+    case armBranch24: 
+      return StringRef("armBranch24");
+    case thumbAbsLow16:
+      return StringRef("thumbAbsLow16");
+    case thumbAbsHigh16:
+      return StringRef("thumbAbsHigh16");
+    case thumbPcRelLow16:
+      return StringRef("thumbPcRelLow16");
+    case thumbPcRelHigh16:
+      return StringRef("thumbPcRelHigh16");
+    case abs32:
+      return StringRef("abs32");
     case pointer32:
       return StringRef("pointer32");
     case lazyTarget:
       return StringRef("lazyTarget");
-    case lazyImm:
-      return StringRef("lazyImm");
+    case lazyImmediate:
+      return StringRef("lazyImmediate");
+    case subordinateLSDA:
+      return StringRef("subordinateLSDA");
   }
   assert(0 && "invalid ARM Reference kind");
   return StringRef();
 }
 
 bool KindHandler_arm::isCallSite(Kind kind) {
-  return (kind == br22);
+  return (kind == thumbBranch22) || (kind == armBranch24);
 }
 
 bool KindHandler_arm::isPointer(Kind kind) {
@@ -282,7 +369,7 @@
 
  
 bool KindHandler_arm::isLazyImmediate(Kind kind) {
-  return (kind == lazyImm);
+  return (kind == lazyImmediate);
 }
 
  
@@ -295,7 +382,25 @@
                   uint64_t fixupAddress, uint64_t targetAddress) {
   //int32_t *loc32 = reinterpret_cast<int32_t*>(location);
   switch ( (Kinds)kind ) {
-    case br22: 
+    case thumbBranch22: 
+      // FIXME
+      break;
+    case armBranch24: 
+      // FIXME
+      break;
+    case thumbAbsLow16: 
+      // FIXME
+      break;
+    case thumbAbsHigh16: 
+      // FIXME
+      break;
+    case thumbPcRelLow16: 
+      // FIXME
+      break;
+    case thumbPcRelHigh16: 
+      // FIXME
+      break;
+    case abs32: 
       // FIXME
       break;
     case pointer32: 
@@ -303,7 +408,8 @@
       break;
     case none:
     case lazyTarget:
-    case lazyImm:
+    case lazyImmediate:
+    case subordinateLSDA:
       // do nothing
       break;
   }

Modified: lld/trunk/lib/ReaderWriter/MachO/ReferenceKinds.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ReferenceKinds.h?rev=158375&r1=158374&r2=158375&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/ReferenceKinds.h (original)
+++ lld/trunk/lib/ReaderWriter/MachO/ReferenceKinds.h Tue Jun 12 18:01:30 2012
@@ -48,16 +48,23 @@
 class KindHandler_x86_64 : public KindHandler {
 public:
   enum Kinds {
-    none        = 0,
-    call32      = 1,
-    ripRel32    = 2,
-    gotLoad32   = 3,
-    gotUse32    = 4,
-    lea32WasGot = 5,
-    lazyTarget  = 6,
-    lazyImm     = 7,
-    gotTarget   = 8,
-    pointer64   = 9
+    none,
+    branch32,        // CALL or JMP 32-bit pc-rel
+    ripRel32,        // RIP-rel access pc-rel to fix up location
+    ripRel32_1,      // RIP-rel access pc-rel to fix up location + 1
+    ripRel32_2,      // RIP-rel access pc-rel to fix up location + 2
+    ripRel32_4,      // RIP-rel access pc-rel to fix up location + 4
+    gotLoadRipRel32, // RIP-rel load of GOT slot (can be optimized)
+    gotLoadRipRel32NowLea, // RIP-rel movq load of GOT slot optimized to LEA
+    gotUseRipRel32,  // RIP-rel non-load of GOT slot (not a movq load of GOT)
+    tlvLoadRipRel32, // RIP-rel load of thread local pointer (can be optimized)
+    tlvLoadRipRel32NowLea, // RIP-rel movq load of TLV pointer optimized to LEA
+    pointer64,       // 64-bit data pointer
+    pointerRel32,    // 32-bit pc-rel offset
+    lazyTarget,      // Used in lazy pointers to reference ultimate target
+    lazyImmediate,   // Location in stub where lazy info offset to be stored
+    subordinateFDE,  // Reference to unwind info for this function
+    subordinateLSDA  // Reference to excecption info for this function
   };
 
   virtual ~KindHandler_x86_64();
@@ -76,12 +83,15 @@
 class KindHandler_x86 : public KindHandler {
 public:
   enum Kinds {
-    none        = 0,
-    call32      = 1,
-    abs32       = 2,
-    pointer32   = 3,
-    lazyTarget  = 4,
-    lazyImm     = 5
+    none,
+    branch32,        // CALL or JMP 32-bit pc-rel
+    abs32,           // 32-bit absolute address embedded in instruction
+    funcRel32,       // 32-bit offset to target from start of function
+    pointer32,       // 32-bit data pointer
+    lazyTarget,      // Used in lazy pointers to reference ultimate target
+    lazyImmediate,   // Location in stub where lazy info offset to be stored
+    subordinateFDE,  // Reference to unwind info for this function
+    subordinateLSDA  // Reference to excecption info for this function
   };
 
   virtual ~KindHandler_x86();
@@ -99,12 +109,18 @@
 class KindHandler_arm : public KindHandler {
 public:
   enum Kinds {
-    none        = 0,
-    br22        = 1,
-    pointer32   = 2,
-    lazyTarget  = 3,
-    lazyImm     = 4
-    // FIXME
+    none,
+    thumbBranch22,   // thumb b or bl with 22/24-bits of displacement
+    armBranch24,     // arm b or bl with 24-bits of displacement
+    thumbAbsLow16,   // thumb movw of absolute address
+    thumbAbsHigh16,  // thumb movt of absolute address
+    thumbPcRelLow16, // thumb movw of (target - pc)
+    thumbPcRelHigh16,// thumb movt of (target - pc)
+    abs32,           // 32-bit absolute address embedded in instructions
+    pointer32,       // 32-bit data pointer
+    lazyTarget,      // Used in lazy pointers to reference ultimate target
+    lazyImmediate,   // Location in stub where lazy info offset to be stored
+    subordinateLSDA  // Reference to excecption info for this function
   };
 
   virtual ~KindHandler_arm();

Modified: lld/trunk/lib/ReaderWriter/MachO/StubAtoms_x86.hpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/StubAtoms_x86.hpp?rev=158375&r1=158374&r2=158375&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/StubAtoms_x86.hpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/StubAtoms_x86.hpp Tue Jun 12 18:01:30 2012
@@ -100,8 +100,8 @@
 public:
   X86StubHelperAtom(const File &file, const Atom &helperCommon) 
   : SimpleDefinedAtom(file) {
-    this->addReference(KindHandler_x86::lazyImm, 1, nullptr, 0);
-    this->addReference(KindHandler_x86::call32, 6, &helperCommon, 0);
+    this->addReference(KindHandler_x86::lazyImmediate, 1, nullptr, 0);
+    this->addReference(KindHandler_x86::branch32, 6, &helperCommon, 0);
   }
   
   virtual ContentType contentType() const  {

Modified: lld/trunk/lib/ReaderWriter/MachO/StubAtoms_x86_64.hpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/StubAtoms_x86_64.hpp?rev=158375&r1=158374&r2=158375&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/StubAtoms_x86_64.hpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/StubAtoms_x86_64.hpp Tue Jun 12 18:01:30 2012
@@ -101,7 +101,7 @@
 public:
   X86_64StubHelperAtom(const File &file, const Atom &helperCommon) 
   : SimpleDefinedAtom(file) {
-    this->addReference(KindHandler_x86_64::lazyImm, 1, nullptr, 0);
+    this->addReference(KindHandler_x86_64::lazyImmediate, 1, nullptr, 0);
     this->addReference(KindHandler_x86_64::ripRel32, 6, &helperCommon, 0);
   }
   





More information about the llvm-commits mailing list