| ; NOTE: Do not autogenerate |
| ; The update tools can't understand this usage of split-file. (Maybe we should |
| ; add llc flags to set the PIC metadata.) |
| ; RUN: rm -rf %t && split-file %s %t && cd %t |
| ; RUN: cat a.ll nopic.ll > b.ll |
| ; RUN: cat a.ll pic.ll > c.ll |
| ; RUN: llc < b.ll | FileCheck %s |
| ; RUN: llc < c.ll -relocation-model=pic | FileCheck %s -check-prefix=PIC |
| |
| ;--- a.ll |
| target triple = "aarch64-unknown-linux-gnu" |
| |
| define dso_local void @f(ptr noundef %g) #0 { |
| ; CHECK: adrp x9, __stack_chk_guard |
| ; CHECK: ldr w9, [x9, :lo12:__stack_chk_guard] |
| ; CHECK: adrp x8, __stack_chk_guard |
| ; CHECK: ldr w8, [x8, :lo12:__stack_chk_guard] |
| |
| ; PIC: adrp x9, :got:__stack_chk_guard |
| ; PIC: ldr x9, [x9, :got_lo12:__stack_chk_guard] |
| ; PIC: ldr w9, [x9] |
| ; PIC: adrp x8, :got:__stack_chk_guard |
| ; PIC: ldr x8, [x8, :got_lo12:__stack_chk_guard] |
| ; PIC: ldr w8, [x8] |
| entry: |
| %g.addr = alloca ptr, align 8 |
| %x = alloca [1000 x i8], align 1 |
| store ptr %g, ptr %g.addr, align 8 |
| %0 = load ptr, ptr %g.addr, align 8 |
| %arraydecay = getelementptr inbounds [1000 x i8], ptr %x, i64 0, i64 0 |
| call void %0(ptr noundef %arraydecay) |
| ret void |
| } |
| |
| attributes #0 = { ssp } |
| |
| ;--- nopic.ll |
| !llvm.module.flags = !{!0} |
| !0 = !{i32 1, !"stack-protector-guard-value-width", i32 4} |
| |
| ;--- pic.ll |
| !llvm.module.flags = !{!0, !1} |
| !0 = !{i32 1, !"stack-protector-guard-value-width", i32 4} |
| !1 = !{i32 8, !"PIC Level", i32 2} |