Implement a very basic PIC case.
authorRafael Espindola <rafael.espindola@gmail.com>
Sun, 3 Oct 2010 00:46:57 +0000 (00:46 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Sun, 3 Oct 2010 00:46:57 +0000 (00:46 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115454 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/ELFObjectWriter.cpp
test/MC/ELF/pic-diff.s [new file with mode: 0644]

index 1890da72e0ecbb743df7a614fbb4d9c1682ed4eb..614e3967130f06719a639bda5c656e1a76825a84 100644 (file)
@@ -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 (file)
index 0000000..1557547
--- /dev/null
@@ -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