aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2010-03-13 02:38:00 +0000
committerDaniel Dunbar <daniel@zuster.org>2010-03-13 02:38:00 +0000
commitda3e9f760ce2328f6dfe69663c2b17da02ece2db (patch)
tree3da1536ebe72c69d6f21f7d57082073e7bbd863f
parent5e6a7a248b980dd2a98a3613c72b75ba9d01d162 (diff)
MC/Mach-O: PCrel relocations weren't using the right base address, they are
relative to the fragment address, not its offset. This was masked by the text section normally being at address 0. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98420 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/MC/MCAssembler.cpp2
-rw-r--r--test/MC/MachO/reloc-pcrel-offset.s14
2 files changed, 15 insertions, 1 deletions
diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp
index 88be99cffd..29ac8684bd 100644
--- a/lib/MC/MCAssembler.cpp
+++ b/lib/MC/MCAssembler.cpp
@@ -1024,7 +1024,7 @@ bool MCAssembler::EvaluateFixup(const MCAsmLayout &Layout, MCAsmFixup &Fixup,
}
if (IsPCRel)
- Value -= DF->getOffset() + Fixup.Offset;
+ Value -= DF->getAddress() + Fixup.Offset;
return IsResolved;
}
diff --git a/test/MC/MachO/reloc-pcrel-offset.s b/test/MC/MachO/reloc-pcrel-offset.s
new file mode 100644
index 0000000000..46dc3a9c57
--- /dev/null
+++ b/test/MC/MachO/reloc-pcrel-offset.s
@@ -0,0 +1,14 @@
+// RUN: llvm-mc -n -triple i386-apple-darwin9 %s -filetype=obj -o - | macho-dump --dump-section-data | FileCheck %s
+
+// CHECK: # Relocation 0
+// CHECK: (('word-0', 0x1),
+// CHECK: ('word-1', 0x5000002)),
+// CHECK-NEXT: ])
+// CHECK: ('_section_data', '\xe8\xfb\xff\xff\xff')
+
+ .data
+ .long 0
+
+ .text
+_a:
+ call _a