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