[lld] r293054 - [ELF] - Implemented support for R_386_PC8/R_386_8 relocations.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 25 05:36:49 PST 2017


Author: grimar
Date: Wed Jan 25 07:36:49 2017
New Revision: 293054

URL: http://llvm.org/viewvc/llvm-project?rev=293054&view=rev
Log:
[ELF] - Implemented support for R_386_PC8/R_386_8 relocations.

These relocations are used in linux kernel.

Differential revision: https://reviews.llvm.org/D28094

Added:
    lld/trunk/test/ELF/Inputs/i386-pc8.s
    lld/trunk/test/ELF/i386-pc8.s
Removed:
    lld/trunk/test/ELF/unknown-reloc.s
Modified:
    lld/trunk/ELF/Target.cpp

Modified: lld/trunk/ELF/Target.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.cpp?rev=293054&r1=293053&r2=293054&view=diff
==============================================================================
--- lld/trunk/ELF/Target.cpp (original)
+++ lld/trunk/ELF/Target.cpp Wed Jan 25 07:36:49 2017
@@ -358,6 +358,7 @@ X86TargetInfo::X86TargetInfo() {
 
 RelExpr X86TargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const {
   switch (Type) {
+  case R_386_8:
   case R_386_16:
   case R_386_32:
   case R_386_TLS_LDO_32:
@@ -368,6 +369,7 @@ RelExpr X86TargetInfo::getRelExpr(uint32
     return R_TLSLD;
   case R_386_PLT32:
     return R_PLT_PC;
+  case R_386_PC8:
   case R_386_PC16:
   case R_386_PC32:
     return R_PC;
@@ -488,6 +490,9 @@ uint64_t X86TargetInfo::getImplicitAdden
   switch (Type) {
   default:
     return 0;
+  case R_386_8:
+  case R_386_PC8:
+    return *Buf;
   case R_386_16:
   case R_386_PC16:
     return read16le(Buf);
@@ -507,8 +512,12 @@ void X86TargetInfo::relocateOne(uint8_t
                                 uint64_t Val) const {
   checkInt<32>(Loc, Val, Type);
 
-  // R_386_PC16 and R_386_16 are not part of the current i386 psABI. They are
-  // used by 16-bit x86 objects, like boot loaders.
+  // R_386_PC16/R_386_16/R_386_PC8/R_386_8 are not part of the current i386
+  // psABI. They are used by 16-bit x86 objects, like boot loaders.
+  if (Type == R_386_8 || Type == R_386_PC8) {
+    *Loc = (uint8_t)Val;
+    return;
+  }
   if (Type == R_386_16 || Type == R_386_PC16) {
     write16le(Loc, Val);
     return;

Added: lld/trunk/test/ELF/Inputs/i386-pc8.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/Inputs/i386-pc8.s?rev=293054&view=auto
==============================================================================
--- lld/trunk/test/ELF/Inputs/i386-pc8.s (added)
+++ lld/trunk/test/ELF/Inputs/i386-pc8.s Wed Jan 25 07:36:49 2017
@@ -0,0 +1,2 @@
+.global und
+und:

Added: lld/trunk/test/ELF/i386-pc8.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/i386-pc8.s?rev=293054&view=auto
==============================================================================
--- lld/trunk/test/ELF/i386-pc8.s (added)
+++ lld/trunk/test/ELF/i386-pc8.s Wed Jan 25 07:36:49 2017
@@ -0,0 +1,13 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=i386-pc-linux-gnu %s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple=i386-pc-linux-gnu %S/Inputs/i386-pc8.s -o %t2.o
+# RUN: ld.lld %t1.o %t2.o -o %t.out
+# RUN: llvm-objdump -s -section=.text %t.out | FileCheck %s
+
+# CHECK:      Contents of section .text:
+# CHECK-NEXT:  11000 15253748
+
+.byte und-.+0x11
+.byte und-.+0x22
+.byte und+0x33
+.byte und+0x44

Removed: lld/trunk/test/ELF/unknown-reloc.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/unknown-reloc.s?rev=293053&view=auto
==============================================================================
--- lld/trunk/test/ELF/unknown-reloc.s (original)
+++ lld/trunk/test/ELF/unknown-reloc.s (removed)
@@ -1,14 +0,0 @@
-# REQUIRES: x86
-# RUN: llvm-mc -filetype=obj -triple=i386-pc-linux-gnu %s -o %t1.o
-# RUN: llvm-mc -filetype=obj -triple=i386-pc-linux-gnu %S/Inputs/unknown-reloc.s -o %t2.o
-# RUN: not ld.lld %t1.o %t2.o -o %t.out 2>&1 | FileCheck %s
-
-# CHECK: do not know how to handle relocation 'R_386_PC8' (23)
-# CHECK: do not know how to handle relocation 'R_386_8' (22)
-
-.text
-.global foo
-foo:
-
-.byte und-foo
-.byte foo




More information about the llvm-commits mailing list