• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# REQUIRES: aarch64
2# RUN: llvm-mc -filetype=obj -triple=aarch64-none-linux-gnu %s -o %t.o
3# RUN: llvm-mc -filetype=obj -triple=aarch64-none-linux-gnu %p/Inputs/aarch64-addrifunc.s -o %t1.o
4
5# RUN: ld.lld --shared --soname=t1.so %t1.o -o %t1.so
6# RUN: ld.lld --pie %t1.so %t.o -o %t
7# RUN: llvm-objdump -d --no-show-raw-insn --mattr=+bti --triple=aarch64-linux-gnu %t | FileCheck %s
8
9# When the address of an ifunc is taken using a non-got reference which clang
10# can do, LLD exports a canonical PLT entry that may have its address taken so
11# we must use bti c.
12
13# CHECK: Disassembly of section .plt:
14# CHECK: 0000000000010380 <.plt>:
15# CHECK-NEXT:    10380:         bti     c
16# CHECK-NEXT:                   stp     x16, x30, [sp, #-16]!
17# CHECK-NEXT:                   adrp    x16, #131072
18# CHECK-NEXT:                   ldr     x17, [x16, #1288]
19# CHECK-NEXT:                   add     x16, x16, #1288
20# CHECK-NEXT:                   br      x17
21# CHECK-NEXT:                   nop
22# CHECK-NEXT:                   nop
23# CHECK: 00000000000103a0 <func1@plt>:
24# CHECK-NEXT:    103a0:         bti     c
25# CHECK-NEXT:                   adrp    x16, #131072
26# CHECK-NEXT:                   ldr     x17, [x16, #1296]
27# CHECK-NEXT:                   add     x16, x16, #1296
28# CHECK-NEXT:                   br      x17
29# CHECK-NEXT:                   nop
30# CHECK-EMPTY:
31# CHECK: Disassembly of section .iplt:
32# CHECK-EMPTY:
33# CHECK-NEXT: 00000000000103c0 <myfunc>:
34# CHECK-NEXT:    103c0:         bti     c
35# CHECK-NEXT:                   adrp    x16, #131072
36# CHECK-NEXT:                   ldr     x17, [x16, #1304]
37# CHECK-NEXT:                   add     x16, x16, #1304
38# CHECK-NEXT:                   br      x17
39# CHECK-NEXT:                   nop
40
41.section ".note.gnu.property", "a"
42.long 4
43.long 0x10
44.long 0x5
45.asciz "GNU"
46
47.long 0xc0000000 // GNU_PROPERTY_AARCH64_FEATURE_1_AND
48.long 4
49.long 1          // GNU_PROPERTY_AARCH64_FEATURE_1_BTI
50.long 0
51
52.text
53.globl myfunc
54.type myfunc,@gnu_indirect_function
55myfunc:
56 ret
57
58.globl func1
59
60.text
61.globl _start
62.type _start, %function
63_start:
64  bl func1
65  adrp x8, myfunc
66  add x8, x8, :lo12:myfunc
67  ret
68