xref: /llvm-project/llvm/test/CodeGen/ARM/thumb-function-section-reloc.ll (revision df00dac828d7d0f88106d34b12a4eafaa8dd93ea)
1fa210dd6SAlex Richardson;; -ffunction-sections previously resulted in call relocations against the
2fa210dd6SAlex Richardson;; .text.foo section symbol instead of the actual function symbol.
3fa210dd6SAlex Richardson;; However, that results in a relocation against a symbol without the LSB set,
4fa210dd6SAlex Richardson;; so the linker thinks it is not linking against a Thumb symbol.
5fa210dd6SAlex Richardson;; Check that we use a relocation against the symbol for calls to functions
6fa210dd6SAlex Richardson;; marked as dso_local (foo$local)
7fa210dd6SAlex Richardson;; NB: Right now only R_ARM_PREL31 and R_ARM_ABS32 are converted to section
8fa210dd6SAlex Richardson;; plus offset, so this test can't use a call.
9fa210dd6SAlex Richardson; RUN: llc -mtriple=armv7a-none-linux-gnueabi --function-sections -o - --relocation-model=pic %s | FileCheck %s
10fa210dd6SAlex Richardson; RUN: llc -mtriple=armv7a-none-linux-gnueabi --function-sections --filetype=obj -o %t --relocation-model=pic %s
11fa210dd6SAlex Richardson; RUN: llvm-readobj -r --symbols %t | FileCheck %s --check-prefix=RELOCS
12fa210dd6SAlex Richardson;; Do not autogen (we check directives that are normally filtered out):
13fa210dd6SAlex Richardson; UTC-ARGS: --disable
14fa210dd6SAlex Richardson
15fa210dd6SAlex Richardson; RELOCS-LABEL: Relocations [
16fa210dd6SAlex Richardson; RELOCS-NEXT:   Section (5) .rel.ARM.exidx.text._ZdlPv {
17fa210dd6SAlex Richardson; RELOCS-NEXT:     0x0 R_ARM_PREL31 .text._ZdlPv
18fa210dd6SAlex Richardson; RELOCS-NEXT:   }
19fa210dd6SAlex Richardson; RELOCS-NEXT:   Section (7) .rel.text.test {
20*df00dac8SAlex Richardson; RELOCS-NEXT:     0x4 R_ARM_CALL .L_ZdlPv$local
210483b008SAlex Richardson; RELOCS-NEXT:     0xC R_ARM_ABS32 .L_ZdlPv$local
220483b008SAlex Richardson; RELOCS-NEXT:     0x10 R_ARM_ABS32 .L_ZdlPv$local
23*df00dac8SAlex Richardson; RELOCS-NEXT:     0x1C R_ARM_REL32 .L_ZdlPv$local
24fa210dd6SAlex Richardson; RELOCS-NEXT:   }
25fa210dd6SAlex Richardson; RELOCS-NEXT:   Section (9) .rel.ARM.exidx.text.test {
26fa210dd6SAlex Richardson; RELOCS-NEXT:     0x0 R_ARM_PREL31 .text.test
27fa210dd6SAlex Richardson; RELOCS-NEXT:   }
28fa210dd6SAlex Richardson; RELOCS-NEXT:   Section (11) .rel.data {
29fa210dd6SAlex Richardson; RELOCS-NEXT:     0x0 R_ARM_ABS32 _ZdlPv
30fa210dd6SAlex Richardson; RELOCS-NEXT:   }
31fa210dd6SAlex Richardson; RELOCS-NEXT: ]
32fa210dd6SAlex Richardson
33fa210dd6SAlex Richardson; RELOCS-LABEL: Symbols [
34fa210dd6SAlex Richardson; RELOCS:      Symbol {
350483b008SAlex Richardson; RELOCS:        Name: .L_ZdlPv$local
360483b008SAlex Richardson; RELOCS-NEXT:   Value: 0x1
370483b008SAlex Richardson; RELOCS-NEXT:   Size: 2
380483b008SAlex Richardson; RELOCS-NEXT:   Binding: Local (0x0)
390483b008SAlex Richardson; RELOCS-NEXT:   Type: Function (0x2)
400483b008SAlex Richardson; RELOCS-NEXT:   Other: 0
410483b008SAlex Richardson; RELOCS-NEXT:   Section: .text._ZdlPv (
420483b008SAlex Richardson; RELOCS-NEXT: }
43fa210dd6SAlex Richardson
44fa210dd6SAlex Richardsondefine dso_local void @_ZdlPv(ptr %ptr) local_unnamed_addr nounwind "target-features"="+armv7-a,+thumb-mode" {
45fa210dd6SAlex Richardson; CHECK-LABEL: 	.section	.text._ZdlPv,"ax",%progbits
46fa210dd6SAlex Richardson; CHECK-NEXT: 	.globl	_ZdlPv                          @ -- Begin function _ZdlPv
47fa210dd6SAlex Richardson; CHECK-NEXT: 	.p2align	1
48fa210dd6SAlex Richardson; CHECK-NEXT: 	.type	_ZdlPv,%function
49fa210dd6SAlex Richardson; CHECK-NEXT: 	.code	16                              @ @_ZdlPv
50fa210dd6SAlex Richardson; CHECK-NEXT: 	.thumb_func
51fa210dd6SAlex Richardson; CHECK-NEXT: _ZdlPv:
52fa210dd6SAlex Richardson; CHECK-NEXT: .L_ZdlPv$local:
530483b008SAlex Richardson; CHECK-NEXT: .type .L_ZdlPv$local,%function
54fa210dd6SAlex Richardson; CHECK-NEXT: 	.fnstart
55fa210dd6SAlex Richardson; CHECK-NEXT: @ %bb.0:
56fa210dd6SAlex Richardson; CHECK-NEXT: 	bx	lr
57fa210dd6SAlex Richardson; CHECK-NEXT: .Lfunc_end0:
58fa210dd6SAlex Richardson; CHECK-NEXT: 	.size	_ZdlPv, .Lfunc_end0-_ZdlPv
590483b008SAlex Richardson; CHECK-NEXT: 	.size .L_ZdlPv$local, .Lfunc_end0-_ZdlPv
60fa210dd6SAlex Richardson; CHECK-NEXT: 	.cantunwind
61fa210dd6SAlex Richardson; CHECK-NEXT: 	.fnend
62fa210dd6SAlex Richardson  ret void
63fa210dd6SAlex Richardson}
64fa210dd6SAlex Richardson
65fa210dd6SAlex Richardsondefine ptr @test(ptr %ptr) nounwind {
66fa210dd6SAlex Richardson; CHECK-LABEL: test:
67fa210dd6SAlex Richardson; CHECK:       @ %bb.0: @ %entry
68fa210dd6SAlex Richardson; CHECK-NEXT:    .save {r11, lr}
69fa210dd6SAlex Richardson; CHECK-NEXT:    push {r11, lr}
70*df00dac8SAlex Richardson; CHECK-NEXT:    bl .L_ZdlPv$local
71fa210dd6SAlex Richardson; CHECK-NEXT:    ldr r0, .LCPI1_0
72fa210dd6SAlex Richardson; CHECK-NEXT:    @APP
73fa210dd6SAlex Richardson; CHECK-NEXT:    .long .L_ZdlPv$local
74fa210dd6SAlex Richardson; CHECK-NEXT:    @NO_APP
75fa210dd6SAlex Richardson; CHECK-NEXT:    @APP
76fa210dd6SAlex Richardson; CHECK-NEXT:    .Ltmp0:
77fa210dd6SAlex Richardson; CHECK-NEXT:    .reloc .Ltmp0, R_ARM_ABS32, .L_ZdlPv$local
78fa210dd6SAlex Richardson; CHECK-NEXT:    .long 0
79fa210dd6SAlex Richardson; CHECK-NEXT:    @NO_APP
80fa210dd6SAlex Richardson; CHECK-NEXT:  .LPC1_0:
81fa210dd6SAlex Richardson; CHECK-NEXT:    add r0, pc, r0
82fa210dd6SAlex Richardson; CHECK-NEXT:    pop {r11, pc}
83fa210dd6SAlex Richardson; CHECK-NEXT:    .p2align 2
84fa210dd6SAlex Richardson; CHECK-NEXT:  @ %bb.1:
85fa210dd6SAlex Richardson; CHECK-NEXT:  .LCPI1_0:
86*df00dac8SAlex Richardson; CHECK-NEXT:    .long .L_ZdlPv$local-(.LPC1_0+8)
87fa210dd6SAlex Richardsonentry:
88fa210dd6SAlex Richardson  call void @_ZdlPv(ptr %ptr)
89fa210dd6SAlex Richardson  ; This inline assembly is needed to highlight the missing Thumb LSB since
90fa210dd6SAlex Richardson  ; only R_ARM_ABS32 is converted to section+offset
91fa210dd6SAlex Richardson  tail call void asm sideeffect ".4byte .L_ZdlPv$$local", ""()
92fa210dd6SAlex Richardson  tail call void asm sideeffect ".reloc ., R_ARM_ABS32, .L_ZdlPv$$local\0A.4byte 0", ""()
93fa210dd6SAlex Richardson  ret ptr @_ZdlPv
94fa210dd6SAlex Richardson}
95fa210dd6SAlex Richardson
96fa210dd6SAlex Richardson@fnptr = hidden local_unnamed_addr global ptr @_ZdlPv
97