summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/AArch64/stack-guard-remat-bitcast.ll
diff options
context:
space:
mode:
authorAkira Hatanaka <ahatanaka@apple.com>2014-08-07 23:08:24 +0000
committerAkira Hatanaka <ahatanaka@apple.com>2014-08-07 23:08:24 +0000
commit5acc58fcfb403d1638856133088727c4e1a22fce (patch)
tree703dbd5fe012afcf1eb68ec66c210732c6c69da8 /llvm/test/CodeGen/AArch64/stack-guard-remat-bitcast.ll
parent80c8b2742fc6efa79f31d28359923b366a588277 (diff)
downloadbcm5719-llvm-5acc58fcfb403d1638856133088727c4e1a22fce.tar.gz
bcm5719-llvm-5acc58fcfb403d1638856133088727c4e1a22fce.zip
[stack protector] Look through bitcasts to get global variable
__stack_chk_guard. Handle the case where the pointer operand of the load instruction that loads the stack guard is not a global variable but instead a bitcast. %StackGuard = load i8** bitcast (i64** @__stack_chk_guard to i8**) call void @llvm.stackprotector(i8* %StackGuard, i8** %StackGuardSlot) Original test case provided by Ana Pazos. This fixes PR20558. llvm-svn: 215167
Diffstat (limited to 'llvm/test/CodeGen/AArch64/stack-guard-remat-bitcast.ll')
-rw-r--r--llvm/test/CodeGen/AArch64/stack-guard-remat-bitcast.ll26
1 files changed, 26 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/AArch64/stack-guard-remat-bitcast.ll b/llvm/test/CodeGen/AArch64/stack-guard-remat-bitcast.ll
new file mode 100644
index 00000000000..bedbf5facbb
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/stack-guard-remat-bitcast.ll
@@ -0,0 +1,26 @@
+; RUN: llc < %s -mtriple=arm64-apple-ios -relocation-model=pic | FileCheck %s
+
+@__stack_chk_guard = external global i64*
+
+; PR20558
+
+; CHECK: adrp [[R0:x[0-9]+]], ___stack_chk_guard@GOTPAGE
+; CHECK: ldr [[R1:x[0-9]+]], {{\[}}[[R0]], ___stack_chk_guard@GOTPAGEOFF{{\]}}
+; CHECK: ldr [[R2:x[0-9]+]], {{\[}}[[R1]]{{\]}}
+; CHECK: stur [[R2]], {{\[}}x29, [[SLOT0:[0-9#\-]+]]{{\]}}
+; CHECK: ldur [[R3:x[0-9]+]], {{\[}}x29, [[SLOT0]]{{\]}}
+; CHECK: sub [[R4:x[0-9]+]], [[R2]], [[R3]]
+; CHECK: cbnz [[R4]], LBB
+
+define i32 @test_stack_guard_remat2() {
+entry:
+ %StackGuardSlot = alloca i8*
+ %StackGuard = load i8** bitcast (i64** @__stack_chk_guard to i8**)
+ call void @llvm.stackprotector(i8* %StackGuard, i8** %StackGuardSlot)
+ %container = alloca [32 x i8], align 1
+ call void @llvm.stackprotectorcheck(i8** bitcast (i64** @__stack_chk_guard to i8**))
+ ret i32 -1
+}
+
+declare void @llvm.stackprotector(i8*, i8**)
+declare void @llvm.stackprotectorcheck(i8**)
OpenPOWER on IntegriCloud