[lld] 026e0bf - [LLD][ELF] - Update and fix gnu-ifunc* tests.
Georgii Rymar via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 11 05:15:15 PDT 2020
Author: Georgii Rymar
Date: 2020-08-11T15:14:33+03:00
New Revision: 026e0bf984c617fa2ff4347e47deb069e23fde11
URL: https://github.com/llvm/llvm-project/commit/026e0bf984c617fa2ff4347e47deb069e23fde11
DIFF: https://github.com/llvm/llvm-project/commit/026e0bf984c617fa2ff4347e47deb069e23fde11.diff
LOG: [LLD][ELF] - Update and fix gnu-ifunc* tests.
It turns that gnu-ifunc-plt-i386.s and gnu-ifunc-plt.s tests are broken.
Initially they were implemented in D27581 and tested that `IRELATIVE` relocations
are placed after other relocations in `.rel.plt`.
Later, we started to place `IRELATIVE` relocations to `.rela.dyn` (D65651).
Also, at some point `.plt` was renamed to `.iplt` (D71520).
Now, `gnu-ifunc*` tests mentioned do not test what they intended to test initially:
they should test that `IRELATIVE` relocations are placed after other ones in
`.rela.dyn`. Also, comments needs to be updated accordingly after changes performed.
This patch updates them.
Differential revision: https://reviews.llvm.org/D85642
Added:
Modified:
lld/test/ELF/Inputs/shared2-x86-64.s
lld/test/ELF/gnu-ifunc-plt-i386.s
lld/test/ELF/gnu-ifunc-plt.s
Removed:
################################################################################
diff --git a/lld/test/ELF/Inputs/shared2-x86-64.s b/lld/test/ELF/Inputs/shared2-x86-64.s
index 925e6a427fac..ba84ed05cd7e 100644
--- a/lld/test/ELF/Inputs/shared2-x86-64.s
+++ b/lld/test/ELF/Inputs/shared2-x86-64.s
@@ -7,3 +7,8 @@ bar2:
.type zed2, @function
zed2:
ret
+
+.global bar3
+.type bar3, @function
+bar3:
+ ret
diff --git a/lld/test/ELF/gnu-ifunc-plt-i386.s b/lld/test/ELF/gnu-ifunc-plt-i386.s
index 90a21a212eb7..86fc35e9ffb2 100644
--- a/lld/test/ELF/gnu-ifunc-plt-i386.s
+++ b/lld/test/ELF/gnu-ifunc-plt-i386.s
@@ -3,74 +3,80 @@
// RUN: ld.lld %t1.o --shared --soname=t.so -o %t.so
// RUN: llvm-mc -filetype=obj -triple=i686-pc-linux %s -o %t.o
// RUN: ld.lld --hash-style=sysv %t.so %t.o -o %tout
-// RUN: llvm-objdump -d --no-show-raw-insn %tout | FileCheck %s --check-prefix=DISASM
+// RUN: llvm-objdump -d --no-show-raw-insn --print-imm-hex %tout | FileCheck %s --check-prefix=DISASM
// RUN: llvm-objdump -s %tout | FileCheck %s --check-prefix=GOTPLT
// RUN: llvm-readobj -r --dynamic-table %tout | FileCheck %s
/// Check that the PLTRELSZ tag does not include the IRELATIVE relocations
// CHECK: DynamicSection [
-// CHECK: 0x00000012 RELSZ 16 (bytes)
+// CHECK: 0x00000012 RELSZ 24 (bytes)
// CHECK: 0x00000002 PLTRELSZ 16 (bytes)
-// Check that the IRELATIVE relocations are after the JUMP_SLOT in the plt
+/// Check that the IRELATIVE relocations are placed to the .rel.dyn section after
+/// other regular relocations (e.g. GLOB_DAT).
// CHECK: Relocations [
// CHECK-NEXT: Section (4) .rel.dyn {
-// CHECK-NEXT: 0x4032AC R_386_IRELATIVE
-// CHECK-NEXT: 0x4032B0 R_386_IRELATIVE
+// CHECK-NEXT: 0x4022C8 R_386_GLOB_DAT bar3 0x0
+// CHECK-NEXT: 0x4032E0 R_386_IRELATIVE - 0x0
+// CHECK-NEXT: 0x4032E4 R_386_IRELATIVE - 0x0
// CHECK-NEXT: }
// CHECK-NEXT: Section (5) .rel.plt {
-// CHECK-NEXT: 0x4032A4 R_386_JUMP_SLOT bar2
-// CHECK-NEXT: 0x4032A8 R_386_JUMP_SLOT zed2
+// CHECK-NEXT: 0x4032D8 R_386_JUMP_SLOT bar2 0x0
+// CHECK-NEXT: 0x4032DC R_386_JUMP_SLOT zed2 0x0
// CHECK-NEXT: }
// Check that IRELATIVE .got.plt entries point to ifunc resolver and not
// back to the plt entry + 6.
// GOTPLT: Contents of section .got.plt:
-// GOTPLT: 403298 20224000 00000000 00000000 e6114000
-// GOTPLT-NEXT: 4032a8 f6114000 b4114000 b5114000
+// GOTPLT: 4032cc 50224000 00000000 00000000 16124000
+// GOTPLT-NEXT: 4032dc 26124000 dc114000 dd114000
+// ^ ^-- <bar> (0x4011dd)
+// -- <foo> (0x4011dcd)
-// Check that a PLT header is written and the ifunc entries appear last
+/// Check that we have 2 PLT sections: one regular .plt section and one
+/// .iplt section for ifunc entries.
// DISASM: Disassembly of section .text:
// DISASM-EMPTY:
// DISASM-NEXT: <foo>:
-// DISASM-NEXT: 4011b4: retl
+// DISASM-NEXT: 4011dc: retl
// DISASM: <bar>:
-// DISASM-NEXT: 4011b5: retl
+// DISASM-NEXT: 4011dd: retl
// DISASM: <_start>:
-// DISASM-NEXT: 4011b6: calll 0x401200 <zed2+0x401200>
-// DISASM-NEXT: calll 0x401210 <zed2+0x401210>
-// DISASM-NEXT: calll 0x4011e0 <bar2 at plt>
-// DISASM-NEXT: calll 0x4011f0 <zed2 at plt>
+// DISASM-NEXT: 4011de: calll 0x401230
+// DISASM-NEXT: calll 0x401240
+// DISASM-NEXT: calll 0x401210 <bar2 at plt>
+// DISASM-NEXT: calll 0x401220 <zed2 at plt>
+// DISASM-NEXT: movl -0x1004(%eax), %eax
// DISASM-EMPTY:
// DISASM-NEXT: Disassembly of section .plt:
// DISASM-EMPTY:
// DISASM-NEXT: <.plt>:
-// DISASM-NEXT: 4011d0: pushl 4207260
-// DISASM-NEXT: jmpl *4207264
+// DISASM-NEXT: 401200: pushl 0x4032d0
+// DISASM-NEXT: jmpl *0x4032d4
// DISASM-NEXT: nop
// DISASM-NEXT: nop
// DISASM-NEXT: nop
// DISASM-NEXT: nop
// DISASM-EMPTY:
// DISASM-NEXT: <bar2 at plt>:
-// DISASM-NEXT: 4011e0: jmpl *4207268
-// DISASM-NEXT: pushl $0
-// DISASM-NEXT: jmp 0x4011d0 <.plt>
+// DISASM-NEXT: 401210: jmpl *0x4032d8
+// DISASM-NEXT: pushl $0x0
+// DISASM-NEXT: jmp 0x401200 <.plt>
// DISASM-EMPTY:
// DISASM-NEXT: <zed2 at plt>:
-// DISASM-NEXT: 4011f0: jmpl *4207272
-// DISASM-NEXT: pushl $8
-// DISASM-NEXT: jmp 0x4011d0 <.plt>
+// DISASM-NEXT: 401220: jmpl *0x4032dc
+// DISASM-NEXT: pushl $0x8
+// DISASM-NEXT: jmp 0x401200 <.plt>
// DISASM-EMPTY:
// DISASM-NEXT: Disassembly of section .iplt:
// DISASM-EMPTY:
// DISASM-NEXT: <.iplt>:
-// DISASM-NEXT: jmpl *4207276
-// DISASM-NEXT: pushl $0
-// DISASM-NEXT: jmp 0x4011d0 <.plt>
-// DISASM-NEXT: jmpl *4207280
-// DISASM-NEXT: pushl $8
-// DISASM-NEXT: jmp 0x4011d0 <.plt>
+// DISASM-NEXT: jmpl *0x4032e0
+// DISASM-NEXT: pushl $0x0
+// DISASM-NEXT: jmp 0x401200 <.plt>
+// DISASM-NEXT: jmpl *0x4032e4
+// DISASM-NEXT: pushl $0x8
+// DISASM-NEXT: jmp 0x401200 <.plt>
.text
.type foo STT_GNU_IFUNC
@@ -89,3 +95,4 @@ _start:
call bar at plt
call bar2 at plt
call zed2 at plt
+ movl bar3 at GOT(%eax), %eax
diff --git a/lld/test/ELF/gnu-ifunc-plt.s b/lld/test/ELF/gnu-ifunc-plt.s
index b8b1f39a18fb..1ac31b8bf698 100644
--- a/lld/test/ELF/gnu-ifunc-plt.s
+++ b/lld/test/ELF/gnu-ifunc-plt.s
@@ -1,77 +1,81 @@
// REQUIRES: x86
-/// For non-preemptable ifunc, place ifunc PLT entries after regular PLT entries.
+/// For non-preemptable ifunc, place ifunc PLT entries to the .iplt section.
// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %S/Inputs/shared2-x86-64.s -o %t1.o
// RUN: ld.lld %t1.o --shared -soname=so -o %t.so
// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
// RUN: ld.lld --hash-style=sysv %t.so %t.o -o %tout
-// RUN: llvm-objdump -d --no-show-raw-insn %tout | FileCheck %s --check-prefix=DISASM
+// RUN: llvm-objdump -d --no-show-raw-insn --print-imm-hex %tout | FileCheck %s --check-prefix=DISASM
// RUN: llvm-objdump -s %tout | FileCheck %s --check-prefix=GOTPLT
// RUN: llvm-readobj -r --dynamic-table %tout | FileCheck %s
/// Check that the PLTRELSZ tag does not include the IRELATIVE relocations
// CHECK: DynamicSection [
-// CHECK: 0x0000000000000008 RELASZ 48 (bytes)
+// CHECK: 0x0000000000000008 RELASZ 72 (bytes)
// CHECK: 0x0000000000000002 PLTRELSZ 48 (bytes)
-// Check that the IRELATIVE relocations are after the JUMP_SLOT in the plt
-// CHECK: Relocations [
+/// Check that the IRELATIVE relocations are placed to the .rela.dyn section after
+/// other regular relocations (e.g. GLOB_DAT).
+// CHECK: Relocations [
// CHECK-NEXT: Section (4) .rela.dyn {
-// CHECK-NEXT: 0x203458 R_X86_64_IRELATIVE - 0x2012D8
-// CHECK-NEXT: 0x203460 R_X86_64_IRELATIVE - 0x2012D9
+// CHECK-NEXT: 0x202480 R_X86_64_GLOB_DAT bar3 0x0
+// CHECK-NEXT: 0x2034B0 R_X86_64_IRELATIVE - 0x201318
+// CHECK-NEXT: 0x2034B8 R_X86_64_IRELATIVE - 0x201319
// CHECK-NEXT: }
// CHECK-NEXT: Section (5) .rela.plt {
-// CHECK-NEXT: 0x203448 R_X86_64_JUMP_SLOT bar2 0x0
-// CHECK-NEXT: 0x203450 R_X86_64_JUMP_SLOT zed2 0x0
+// CHECK-NEXT: 0x2034A0 R_X86_64_JUMP_SLOT bar2 0x0
+// CHECK-NEXT: 0x2034A8 R_X86_64_JUMP_SLOT zed2 0x0
// CHECK-NEXT: }
-// Check that .got.plt entries point back to PLT header
+/// Check that .got.plt entries point back to PLT header
// GOTPLT: Contents of section .got.plt:
-// GOTPLT-NEXT: 203430 40232000 00000000 00000000 00000000
-// GOTPLT-NEXT: 203440 00000000 00000000 06132000 00000000
-// GOTPLT-NEXT: 203450 16132000 00000000 00000000 00000000
-// GOTPLT-NEXT: 203460 00000000 00000000
+// GOTPLT-NEXT: 203488 90232000 00000000 00000000 00000000
+// GOTPLT-NEXT: 203498 00000000 00000000 56132000 00000000
+// GOTPLT-NEXT: 2034a8 66132000 00000000 00000000 00000000
+// GOTPLT-NEXT: 2034b8 00000000 00000000
-// Check that a PLT header is written and the ifunc entries appear last
+/// Check that we have 2 PLT sections: one regular .plt section and one
+/// .iplt section for ifunc entries.
// DISASM: Disassembly of section .text:
// DISASM-EMPTY:
// DISASM-NEXT: <foo>:
-// DISASM-NEXT: 2012d8: retq
+// DISASM-NEXT: 201318: retq
// DISASM: <bar>:
-// DISASM-NEXT: 2012d9: retq
+// DISASM-NEXT: 201319: retq
// DISASM: <_start>:
-// DISASM-NEXT: 2012da: callq 0x201320
-// DISASM-NEXT: 2012df: callq 0x201330
+// DISASM-NEXT: 20131a: callq 0x201370
+// DISASM-NEXT: 20131f: callq 0x201380
// DISASM-NEXT: callq {{.*}} <bar2 at plt>
// DISASM-NEXT: callq {{.*}} <zed2 at plt>
+// DISASM-NEXT: jmpq *0x114c(%rip)
// DISASM-EMPTY:
// DISASM-NEXT: Disassembly of section .plt:
// DISASM-EMPTY:
// DISASM-NEXT: <.plt>:
-// DISASM-NEXT: 2012f0: pushq 8514(%rip)
-// DISASM-NEXT: 2012f6: jmpq *8516(%rip)
-// DISASM-NEXT: 2012fc: nopl (%rax)
+// DISASM-NEXT: 201340: pushq 0x214a(%rip)
+// DISASM-NEXT: 201346: jmpq *0x214c(%rip)
+// DISASM-NEXT: 20134c: nopl (%rax)
// DISASM-EMPTY:
// DISASM-NEXT: <bar2 at plt>:
-// DISASM-NEXT: 201300: jmpq *8514(%rip)
-// DISASM-NEXT: 201306: pushq $0
-// DISASM-NEXT: 20130b: jmp 0x2012f0 <.plt>
+// DISASM-NEXT: 201350: jmpq *0x214a(%rip)
+// DISASM-NEXT: 201356: pushq $0x0
+// DISASM-NEXT: 20135b: jmp 0x201340 <.plt>
// DISASM-EMPTY:
// DISASM-NEXT: <zed2 at plt>:
-// DISASM-NEXT: 201310: jmpq *8506(%rip)
-// DISASM-NEXT: 201316: pushq $1
-// DISASM-NEXT: 20131b: jmp 0x2012f0 <.plt>
+// DISASM-NEXT: 201360: jmpq *0x2142(%rip)
+// DISASM-NEXT: 201366: pushq $0x1
+// DISASM-NEXT: 20136b: jmp 0x201340 <.plt>
// DISASM-EMPTY:
// DISASM-NEXT: Disassembly of section .iplt:
// DISASM-EMPTY:
// DISASM-NEXT: <.iplt>:
-// DISASM-NEXT: 201320: jmpq *8498(%rip)
-// DISASM-NEXT: 201326: pushq $0
-// DISASM-NEXT: 20132b: jmp 0x2012f0 <.plt>
-// DISASM-NEXT: 201330: jmpq *8490(%rip)
-// DISASM-NEXT: 201336: pushq $1
-// DISASM-NEXT: 20133b: jmp 0x2012f0 <.plt>
+// DISASM-NEXT: 201370: jmpq *0x213a(%rip)
+// DISASM-NEXT: 201376: pushq $0x0
+// DISASM-NEXT: 20137b: jmp 0x201340 <.plt>
+// DISASM-NEXT: 201380: jmpq *0x2132(%rip)
+// DISASM-NEXT: 201386: pushq $0x1
+// DISASM-NEXT: 20138b: jmp 0x201340 <.plt>
.text
.type foo STT_GNU_IFUNC
@@ -90,3 +94,4 @@ _start:
call bar
call bar2
call zed2
+ jmp *bar3 at GOTPCREL(%rip)
More information about the llvm-commits
mailing list