mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-15 16:09:57 +00:00
f268616d77
This is a fix for PR27844. When replacing uses of unsafe allocas, emit the new location immediately after each use. Without this, the pointer stays live from the function entry to the last use, while it's usually cheaper to recalculate. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272969 91177308-0d34-0410-b5e6-96231b3b80d8
41 lines
1.4 KiB
LLVM
41 lines
1.4 KiB
LLVM
; RUN: opt -safe-stack -S -mtriple=i386-pc-linux-gnu < %s -o - | FileCheck %s
|
|
; RUN: opt -safe-stack -S -mtriple=x86_64-pc-linux-gnu < %s -o - | FileCheck %s
|
|
|
|
%struct.foo = type { [16 x i8] }
|
|
|
|
@.str = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1
|
|
|
|
; struct { [16 x i8] }
|
|
|
|
define void @foo(i8* %a) nounwind uwtable safestack {
|
|
entry:
|
|
; CHECK: %[[USP:.*]] = load i8*, i8** @__safestack_unsafe_stack_ptr
|
|
|
|
; CHECK: %[[USST:.*]] = getelementptr i8, i8* %[[USP]], i32 -16
|
|
|
|
; CHECK: store i8* %[[USST]], i8** @__safestack_unsafe_stack_ptr
|
|
|
|
%a.addr = alloca i8*, align 8
|
|
%buf = alloca %struct.foo, align 1
|
|
|
|
; CHECK: %[[AADDR:.*]] = alloca i8*, align 8
|
|
; CHECK: store i8* {{.*}}, i8** %[[AADDR]], align 8
|
|
store i8* %a, i8** %a.addr, align 8
|
|
|
|
; CHECK: %[[BUFPTR:.*]] = getelementptr i8, i8* %[[USP]], i32 -16
|
|
; CHECK: %[[BUFPTR2:.*]] = bitcast i8* %[[BUFPTR]] to %struct.foo*
|
|
; CHECK: %[[GEP:.*]] = getelementptr inbounds %struct.foo, %struct.foo* %[[BUFPTR2]], i32 0, i32 0, i32 0
|
|
%gep = getelementptr inbounds %struct.foo, %struct.foo* %buf, i32 0, i32 0, i32 0
|
|
|
|
; CHECK: %[[A:.*]] = load i8*, i8** %[[AADDR]], align 8
|
|
%a2 = load i8*, i8** %a.addr, align 8
|
|
|
|
; CHECK: call i8* @strcpy(i8* %[[GEP]], i8* %[[A]])
|
|
%call = call i8* @strcpy(i8* %gep, i8* %a2)
|
|
|
|
; CHECK: store i8* %[[USP]], i8** @__safestack_unsafe_stack_ptr
|
|
ret void
|
|
}
|
|
|
|
declare i8* @strcpy(i8*, i8*)
|