[llvm] f04d92a - [X86] Produce R_X86_64_GOTPCRELX for test/binop instructions (MOV32rm/TEST32rm/...) when -Wa,-mrelax-relocations=yes is enabled

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Sat Oct 24 15:14:32 PDT 2020


Author: Fangrui Song
Date: 2020-10-24T15:14:17-07:00
New Revision: f04d92af94a8d763e91ae38fe35319e426dc466c

URL: https://github.com/llvm/llvm-project/commit/f04d92af94a8d763e91ae38fe35319e426dc466c
DIFF: https://github.com/llvm/llvm-project/commit/f04d92af94a8d763e91ae38fe35319e426dc466c.diff

LOG: [X86] Produce R_X86_64_GOTPCRELX for test/binop instructions (MOV32rm/TEST32rm/...) when -Wa,-mrelax-relocations=yes is enabled

We have been producing R_X86_64_REX_GOTPCRELX (MOV64rm/TEST64rm/...) and
R_X86_64_GOTPCRELX for CALL64m/JMP64m without the REX prefix since 2016 (to be
consistent with GNU as), but not for MOV32rm/TEST32rm/...

Added: 
    llvm/test/MC/X86/gotpcrelx.s

Modified: 
    llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
    llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp
    llvm/test/MC/ELF/got.s

Removed: 
    llvm/test/MC/ELF/got-relaxed.s


################################################################################
diff  --git a/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
index 813875d14d0e..fe8eba03edf4 100644
--- a/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
@@ -229,6 +229,7 @@ class ELFLinkGraphBuilder_x86_64 {
     case ELF::R_X86_64_64:
       return ELF_x86_64_Edges::ELFX86RelocationKind::Pointer64;
     case ELF::R_X86_64_GOTPCREL:
+    case ELF::R_X86_64_GOTPCRELX:
     case ELF::R_X86_64_REX_GOTPCRELX:
       return ELF_x86_64_Edges::ELFX86RelocationKind::PCRel32GOTLoad;
     }

diff  --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp
index 533145e57ca5..714f45c6e660 100644
--- a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp
+++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp
@@ -404,6 +404,17 @@ void X86MCCodeEmitter::emitMemModRMByte(const MCInst &MI, unsigned Op,
       switch (Opcode) {
       default:
         return X86::reloc_riprel_4byte;
+      case X86::ADC32rm:
+      case X86::ADD32rm:
+      case X86::AND32rm:
+      case X86::CMP32rm:
+      case X86::MOV32rm:
+      case X86::OR32rm:
+      case X86::SBB32rm:
+      case X86::SUB32rm:
+      case X86::TEST32mr:
+      case X86::XOR32rm:
+        return X86::reloc_riprel_4byte_relax;
       case X86::MOV64rm:
         assert(HasREX);
         return X86::reloc_riprel_4byte_movq_load;

diff  --git a/llvm/test/MC/ELF/got-relaxed.s b/llvm/test/MC/ELF/got-relaxed.s
deleted file mode 100644
index 2ac34a8c2137..000000000000
--- a/llvm/test/MC/ELF/got-relaxed.s
+++ /dev/null
@@ -1,21 +0,0 @@
-// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux %s -o - | llvm-readobj -r - | FileCheck %s
-// RUN: llvm-mc -filetype=obj -relax-relocations=false -triple x86_64-pc-linux %s -o - | llvm-readobj -r - | FileCheck --check-prefix=OLD %s
-
-// these should produce R_X86_64_GOTPCRELX
-
-        call *call at GOTPCREL(%rip)
-        jmp *jmp at GOTPCREL(%rip)
-
-// CHECK:      Relocations [
-// CHECK-NEXT:   Section ({{.*}}) .rela.text {
-// CHECK-NEXT:     R_X86_64_GOTPCRELX call
-// CHECK-NEXT:     R_X86_64_GOTPCRELX jmp
-// CHECK-NEXT:   }
-// CHECK-NEXT: ]
-
-// OLD:      Relocations [
-// OLD-NEXT:   Section ({{.*}}) .rela.text {
-// OLD-NEXT:     R_X86_64_GOTPCREL call
-// OLD-NEXT:     R_X86_64_GOTPCREL jmp
-// OLD-NEXT:   }
-// OLD-NEXT: ]

diff  --git a/llvm/test/MC/ELF/got.s b/llvm/test/MC/ELF/got.s
index 7d8e4d059b9b..ba1d6eb97981 100644
--- a/llvm/test/MC/ELF/got.s
+++ b/llvm/test/MC/ELF/got.s
@@ -9,7 +9,7 @@
 // CHECK:      Relocations [
 // CHECK:        Section ({{[^ ]+}}) .rela.text {
 // CHECK-NEXT:       0x{{[^ ]+}} R_X86_64_GOT32 foo 0x{{[^ ]+}}
-// CHECK-NEXT:       0x{{[^ ]+}} R_X86_64_GOTPCREL foo 0x{{[^ ]+}}
+// CHECK-NEXT:       0x{{[^ ]+}} R_X86_64_GOTPCRELX foo 0x{{[^ ]+}}
 // CHECK-NEXT:   }
 // CHECK-NEXT: ]
 

diff  --git a/llvm/test/MC/X86/gotpcrelx.s b/llvm/test/MC/X86/gotpcrelx.s
new file mode 100644
index 000000000000..4afc76235b0d
--- /dev/null
+++ b/llvm/test/MC/X86/gotpcrelx.s
@@ -0,0 +1,49 @@
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %s | llvm-readobj -r - | FileCheck %s
+# RUN: llvm-mc -filetype=obj -triple=x86_64 -relax-relocations=false %s | llvm-readobj -r - | FileCheck --check-prefix=NORELAX %s
+
+# CHECK:      Relocations [
+# CHECK-NEXT:   Section ({{.*}}) .rela.text {
+# CHECK-NEXT:     R_X86_64_GOTPCRELX mov
+# CHECK-NEXT:     R_X86_64_GOTPCRELX test
+# CHECK-NEXT:     R_X86_64_GOTPCRELX adc
+# CHECK-NEXT:     R_X86_64_GOTPCRELX add
+# CHECK-NEXT:     R_X86_64_GOTPCRELX and
+# CHECK-NEXT:     R_X86_64_GOTPCRELX cmp
+# CHECK-NEXT:     R_X86_64_GOTPCRELX or
+# CHECK-NEXT:     R_X86_64_GOTPCRELX sbb
+# CHECK-NEXT:     R_X86_64_GOTPCRELX sub
+# CHECK-NEXT:     R_X86_64_GOTPCRELX xor
+# CHECK-NEXT:     R_X86_64_GOTPCRELX call
+# CHECK-NEXT:     R_X86_64_GOTPCRELX jmp
+# CHECK-NEXT:   }
+# CHECK-NEXT: ]
+
+# NORELAX:      Relocations [
+# NORELAX-NEXT:   Section ({{.*}}) .rela.text {
+# NORELAX-NEXT:     R_X86_64_GOTPCREL mov
+# NORELAX-NEXT:     R_X86_64_GOTPCREL test
+# NORELAX-NEXT:     R_X86_64_GOTPCREL adc
+# NORELAX-NEXT:     R_X86_64_GOTPCREL add
+# NORELAX-NEXT:     R_X86_64_GOTPCREL and
+# NORELAX-NEXT:     R_X86_64_GOTPCREL cmp
+# NORELAX-NEXT:     R_X86_64_GOTPCREL or
+# NORELAX-NEXT:     R_X86_64_GOTPCREL sbb
+# NORELAX-NEXT:     R_X86_64_GOTPCREL sub
+# NORELAX-NEXT:     R_X86_64_GOTPCREL xor
+# NORELAX-NEXT:     R_X86_64_GOTPCREL call
+# NORELAX-NEXT:     R_X86_64_GOTPCREL jmp
+# NORELAX-NEXT:   }
+# NORELAX-NEXT: ]
+
+movl mov at GOTPCREL(%rip), %eax
+test %eax, test at GOTPCREL(%rip)
+adc adc at GOTPCREL(%rip), %eax
+add add at GOTPCREL(%rip), %eax
+and and at GOTPCREL(%rip), %eax
+cmp cmp at GOTPCREL(%rip), %eax
+or  or at GOTPCREL(%rip), %eax
+sbb sbb at GOTPCREL(%rip), %eax
+sub sub at GOTPCREL(%rip), %eax
+xor xor at GOTPCREL(%rip), %eax
+call *call at GOTPCREL(%rip)
+jmp *jmp at GOTPCREL(%rip)


        


More information about the llvm-commits mailing list