Get the addend correct for i386 pic.
authorEric Christopher <echristo@apple.com>
Tue, 22 Jun 2010 23:51:47 +0000 (23:51 +0000)
committerEric Christopher <echristo@apple.com>
Tue, 22 Jun 2010 23:51:47 +0000 (23:51 +0000)
Thanks Daniel!

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

lib/MC/MachObjectWriter.cpp

index 79d74b92241f00041812815256612ed43809e353..5a6066c6ee4dbae4ab30af848b51d38c34a44238 100644 (file)
@@ -747,7 +747,6 @@ public:
            !Is64Bit &&
            "Should only be called with a 32-bit TLVP relocation!");
 
-    // If this is a subtraction then we're pcrel.
     unsigned Log2Size = getFixupKindLog2Size(Fixup.getKind());
     uint32_t Value = Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
     unsigned IsPCRel = 0;
@@ -761,7 +760,14 @@ public:
     // between the picbase and the next address.  For 32-bit static the addend
     // is zero.
     if (Target.getSymB()) {
+      // If this is a subtraction then we're pcrel.
+      uint32_t FixupAddress =
+      Layout.getFragmentAddress(Fragment) + Fixup.getOffset();
+      MCSymbolData *SD_B = &Asm.getSymbolData(Target.getSymB()->getSymbol());
       IsPCRel = 1;
+      FixedValue = (FixupAddress - Layout.getSymbolAddress(SD_B) +
+                    Target.getConstant());
+      FixedValue += 1 << Log2Size;
     } else {
       FixedValue = 0;
     }