aboutsummaryrefslogtreecommitdiffstats
path: root/lib/MC
diff options
context:
space:
mode:
authorEric Christopher <echristo@apple.com>2010-06-22 23:51:47 +0000
committerEric Christopher <echristo@apple.com>2010-06-22 23:51:47 +0000
commit1008d3500002a64fab0a956ad681118d7af8143a (patch)
tree7e0bef4a40c2b95d8eb2d78e14f472286ef40685 /lib/MC
parente45da4f156217b6dcadd6e9b82b8cfa6d52f1d65 (diff)
downloadexternal_llvm-1008d3500002a64fab0a956ad681118d7af8143a.zip
external_llvm-1008d3500002a64fab0a956ad681118d7af8143a.tar.gz
external_llvm-1008d3500002a64fab0a956ad681118d7af8143a.tar.bz2
Get the addend correct for i386 pic.
Thanks Daniel! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106608 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC')
-rw-r--r--lib/MC/MachObjectWriter.cpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/lib/MC/MachObjectWriter.cpp b/lib/MC/MachObjectWriter.cpp
index 79d74b9..5a6066c 100644
--- a/lib/MC/MachObjectWriter.cpp
+++ b/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;
}