[RuntimeDyld] Add support for R_X86_64_PC8 relocation.
authorMaksim Panchenko <maks@fb.com>
Sun, 8 Nov 2015 19:34:17 +0000 (19:34 +0000)
committerMaksim Panchenko <maks@fb.com>
Sun, 8 Nov 2015 19:34:17 +0000 (19:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252423 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
test/ExecutionEngine/RuntimeDyld/X86/ELF_x64-64_PC8_relocations.s [new file with mode: 0644]

index de616232f21fd0f937604c5d8545633cc0e11fdc..99cec0edcd5a8b0586998ea35f44543ba8bb9e7c 100644 (file)
@@ -249,6 +249,14 @@ void RuntimeDyldELF::resolveX86_64Relocation(const SectionEntry &Section,
                  << format("%p\n", Section.Address + Offset));
     break;
   }
                  << format("%p\n", Section.Address + Offset));
     break;
   }
+  case ELF::R_X86_64_PC8: {
+    uint64_t FinalAddress = Section.LoadAddress + Offset;
+    int64_t RealOffset = Value + Addend - FinalAddress;
+    assert(isInt<8>(RealOffset));
+    int8_t TruncOffset = (RealOffset & 0xFF);
+    Section.Address[Offset] = TruncOffset;
+    break;
+  }
   case ELF::R_X86_64_PC32: {
     uint64_t FinalAddress = Section.LoadAddress + Offset;
     int64_t RealOffset = Value + Addend - FinalAddress;
   case ELF::R_X86_64_PC32: {
     uint64_t FinalAddress = Section.LoadAddress + Offset;
     int64_t RealOffset = Value + Addend - FinalAddress;
diff --git a/test/ExecutionEngine/RuntimeDyld/X86/ELF_x64-64_PC8_relocations.s b/test/ExecutionEngine/RuntimeDyld/X86/ELF_x64-64_PC8_relocations.s
new file mode 100644 (file)
index 0000000..7df9225
--- /dev/null
@@ -0,0 +1,26 @@
+# RUN: llvm-mc -triple=x86_64-pc-linux -relocation-model=pic -filetype=obj -o %T/test_ELF_x86-64_PC8.o %s
+# RUN: llvm-rtdyld -triple=x86_64-pc-linux -verify -map-section test_ELF_x86-64_PC8.o,.text.bar=0x10000 -map-section test_ELF_x86-64_PC8.o,.text.baz=0x10040 %T/test_ELF_x86-64_PC8.o
+# RUN: llvm-rtdyld -triple=x86_64-pc-linux -verify -map-section test_ELF_x86-64_PC8.o,.text.baz=0x10000 -map-section test_ELF_x86-64_PC8.o,.text.bar=0x10040 %T/test_ELF_x86-64_PC8.o
+
+# Test that R_X86_64_PC8 relocation works.
+
+  .section .text.bar,"ax"
+       .align  16, 0x90
+       .type   bar,@function
+bar:
+       retq
+.Ltmp1:
+       .size   bar, .Ltmp1-bar
+
+  .section .text.baz,"ax"
+       .align  16, 0x90
+       .type   baz,@function
+baz:
+  movq  %rdi, %rcx
+  jrcxz bar
+       retq
+.Ltmp2:
+       .size   baz, .Ltmp2-baz
+
+
+       .section        ".note.GNU-stack","",@progbits