1; RUN: llc < %s -mtriple=aarch64-w64-mingw32 | FileCheck %s 2; RUN: llc < %s -global-isel -global-isel-abort=2 -pass-remarks-missed=gisel* \ 3; RUN: -mtriple=aarch64-w64-mingw32 2>&1| FileCheck %s --check-prefixes=GISEL,FALLBACK 4 5@var = external local_unnamed_addr global i32, align 4 6@dsolocalvar = external dso_local local_unnamed_addr global i32, align 4 7@localvar = dso_local local_unnamed_addr global i32 0, align 4 8@localcommon = common dso_local local_unnamed_addr global i32 0, align 4 9@extvar = external dllimport local_unnamed_addr global i32, align 4 10 11define dso_local i32 @getVar() { 12; CHECK-LABEL: getVar: 13; CHECK: adrp x8, .refptr.var 14; CHECK: ldr x8, [x8, .refptr.var] 15; CHECK: ldr w0, [x8] 16; CHECK: ret 17entry: 18 %0 = load i32, i32* @var, align 4 19 ret i32 %0 20} 21 22define dso_local i32 @getDsoLocalVar() { 23; CHECK-LABEL: getDsoLocalVar: 24; CHECK: adrp x8, dsolocalvar 25; CHECK: ldr w0, [x8, dsolocalvar] 26; CHECK: ret 27entry: 28 %0 = load i32, i32* @dsolocalvar, align 4 29 ret i32 %0 30} 31 32define dso_local i32 @getLocalVar() { 33; CHECK-LABEL: getLocalVar: 34; CHECK: adrp x8, localvar 35; CHECK: ldr w0, [x8, localvar] 36; CHECK: ret 37entry: 38 %0 = load i32, i32* @localvar, align 4 39 ret i32 %0 40} 41 42define dso_local i32 @getLocalCommon() { 43; CHECK-LABEL: getLocalCommon: 44; CHECK: adrp x8, localcommon 45; CHECK: ldr w0, [x8, localcommon] 46; CHECK: ret 47entry: 48 %0 = load i32, i32* @localcommon, align 4 49 ret i32 %0 50} 51 52define dso_local i32 @getExtVar() { 53; CHECK-LABEL: getExtVar: 54; CHECK: adrp x8, __imp_extvar 55; CHECK: ldr x8, [x8, __imp_extvar] 56; CHECK: ldr w0, [x8] 57; CHECK: ret 58entry: 59 %0 = load i32, i32* @extvar, align 4 60 ret i32 %0 61} 62 63define dso_local void @callFunc() { 64; CHECK-LABEL: callFunc: 65; CHECK: b otherFunc 66entry: 67 tail call void @otherFunc() 68 ret void 69} 70 71declare dso_local void @otherFunc() 72 73; FALLBACK-NOT: remark:{{.*}}sspFunc 74define dso_local void @sspFunc() #0 { 75; CHECK-LABEL: sspFunc: 76; CHECK: adrp x8, .refptr.__stack_chk_guard 77; CHECK: ldr x8, [x8, .refptr.__stack_chk_guard] 78; CHECK: ldr x8, [x8] 79; GISEL-LABEL: sspFunc: 80; GISEL: adrp x8, .refptr.__stack_chk_guard 81; GISEL: ldr x8, [x8, .refptr.__stack_chk_guard] 82; GISEL: ldr x8, [x8] 83entry: 84 %c = alloca i8, align 1 85 call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull %c) 86 call void @ptrUser(i8* nonnull %c) 87 call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull %c) 88 ret void 89} 90 91declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) 92declare dso_local void @ptrUser(i8*) local_unnamed_addr #2 93declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) 94 95attributes #0 = { sspstrong } 96 97; CHECK: .section .rdata$.refptr.__stack_chk_guard,"dr",discard,.refptr.__stack_chk_guard 98; CHECK: .globl .refptr.__stack_chk_guard 99; CHECK: .refptr.__stack_chk_guard: 100; CHECK: .xword __stack_chk_guard 101; CHECK: .section .rdata$.refptr.var,"dr",discard,.refptr.var 102; CHECK: .globl .refptr.var 103; CHECK: .refptr.var: 104; CHECK: .xword var 105