aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2010-10-03 00:46:57 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2010-10-03 00:46:57 +0000
commit9d8b7555cde8b9722dd6f8dc77c627bae0718c67 (patch)
tree23ff50f123272db9a40efb7f0f9fb298572a4fe3
parent11bfe3e5bf5a7c37a9f665ba5e825e00a8837f2c (diff)
Implement a very basic PIC case.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115454 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/MC/ELFObjectWriter.cpp7
-rw-r--r--test/MC/ELF/pic-diff.s25
2 files changed, 32 insertions, 0 deletions
diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp
index 1890da72e0..614e396713 100644
--- a/lib/MC/ELFObjectWriter.cpp
+++ b/lib/MC/ELFObjectWriter.cpp
@@ -535,6 +535,13 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm,
MCSymbolData &SD = Asm.getSymbolData(*Symbol);
MCFragment *F = SD.getFragment();
+ if (const MCSymbolRefExpr *RefB = Target.getSymB()) {
+ const MCSymbol &SymbolB = RefB->getSymbol();
+ MCSymbolData &SDB = Asm.getSymbolData(SymbolB);
+ IsPCRel = true;
+ Value += Fixup.getOffset() - Layout.getSymbolAddress(&SDB);
+ }
+
// Check that this case has already been fully resolved before we get
// here.
if (Symbol->isDefined() && !SD.isExternal() &&
diff --git a/test/MC/ELF/pic-diff.s b/test/MC/ELF/pic-diff.s
new file mode 100644
index 0000000000..155754717a
--- /dev/null
+++ b/test/MC/ELF/pic-diff.s
@@ -0,0 +1,25 @@
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump | FileCheck %s
+
+// CHECK: # Symbol 5
+// CHECK-NEXT: (('st_name', 5) # 'baz'
+// CHECK-NEXT: ('st_bind', 1)
+// CHECK-NEXT: ('st_type', 0)
+// CHECK-NEXT: ('st_other', 0)
+// CHECK-NEXT: ('st_shndx', 0)
+// CHECK-NEXT: ('st_value', 0)
+// CHECK-NEXT: ('st_size', 0)
+// CHECK-NEXT: ),
+
+// CHECK: ('_relocations', [
+// CHECK-NEXT: # Relocation 0
+// CHECK-NEXT: (('r_offset', 12)
+// CHECK-NEXT: ('r_sym', 5)
+// CHECK-NEXT: ('r_type', 2)
+// CHECK-NEXT: ('r_addend', 8)
+// CHECK-NEXT: ),
+// CHECK-NEXT: ])
+
+.zero 4
+foo:
+.zero 8
+.long baz - foo