diff options
author | Eric Christopher <echristo@apple.com> | 2010-06-22 23:51:47 +0000 |
---|---|---|
committer | Eric Christopher <echristo@apple.com> | 2010-06-22 23:51:47 +0000 |
commit | 7f85520644b5614c96edaea3b4d2cc7d3cc4fca5 (patch) | |
tree | 1fa935d8cc2a8de8353d51a18264119d1bdd4bd1 /llvm/lib/MC/MachObjectWriter.cpp | |
parent | 689999da1f171b63141b9a45cd930c689d7d6007 (diff) | |
download | bcm5719-llvm-7f85520644b5614c96edaea3b4d2cc7d3cc4fca5.tar.gz bcm5719-llvm-7f85520644b5614c96edaea3b4d2cc7d3cc4fca5.zip |
Get the addend correct for i386 pic.
Thanks Daniel!
llvm-svn: 106608
Diffstat (limited to 'llvm/lib/MC/MachObjectWriter.cpp')
-rw-r--r-- | llvm/lib/MC/MachObjectWriter.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/llvm/lib/MC/MachObjectWriter.cpp b/llvm/lib/MC/MachObjectWriter.cpp index 79d74b92241..5a6066c6ee4 100644 --- a/llvm/lib/MC/MachObjectWriter.cpp +++ b/llvm/lib/MC/MachObjectWriter.cpp @@ -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; } |