mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
a17215eae4
This commit changes the way we get fake stack from ASan runtime (to find use-after-return errors) and the way we represent local variables: - __asan_stack_malloc function now returns pointer to newly allocated fake stack frame, or NULL if frame cannot be allocated. It doesn't take pointer to real stack as an input argument, it is calculated inside the runtime. - __asan_stack_free function doesn't take pointer to real stack as an input argument. Now this function is never called if fake stack frame wasn't allocated. - __asan_init version is bumped to reflect changes in the ABI. - new flag "-asan-stack-dynamic-alloca" allows to store all the function local variables in a dynamic alloca, instead of the static one. It reduces the stack space usage in use-after-return mode (dynamic alloca will not be called if the local variables are stored in a fake stack), and improves the debug info quality for local variables (they will not be described relatively to %rbp/%rsp, which are assumed to be clobbered by function calls). This flag is turned off by default for now, but I plan to turn it on after more testing. llvm-svn: 224062
62 lines
1.8 KiB
LLVM
62 lines
1.8 KiB
LLVM
; Test the ASan's stack layout.
|
|
; More tests in tests/Transforms/Utils/ASanStackFrameLayoutTest.cpp
|
|
; RUN: opt < %s -asan -asan-module -asan-stack-dynamic-alloca=0 -S \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-STATIC
|
|
; RUN: opt < %s -asan -asan-module -asan-stack-dynamic-alloca=1 -S \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-DYNAMIC
|
|
|
|
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-unknown-linux-gnu"
|
|
|
|
declare void @Use(i8*)
|
|
|
|
; CHECK: private unnamed_addr constant{{.*}}3 32 10 3 XXX 64 20 3 YYY 128 30 3 ZZZ
|
|
; CHECK: private unnamed_addr constant{{.*}}3 32 5 3 AAA 64 55 3 BBB 160 555 3 CCC
|
|
; CHECK: private unnamed_addr constant{{.*}}3 256 128 3 CCC 448 128 3 BBB 608 128 3 AAA
|
|
|
|
define void @Func1() sanitize_address {
|
|
entry:
|
|
; CHECK-LABEL: Func1
|
|
|
|
; CHECK-STATIC: alloca [192 x i8]
|
|
; CHECK-DYNAMIC: alloca i8, i64 192
|
|
|
|
; CHECK-NOT: alloca
|
|
; CHECK: ret void
|
|
%XXX = alloca [10 x i8], align 1
|
|
%YYY = alloca [20 x i8], align 1
|
|
%ZZZ = alloca [30 x i8], align 1
|
|
ret void
|
|
}
|
|
|
|
define void @Func2() sanitize_address {
|
|
entry:
|
|
; CHECK-LABEL: Func2
|
|
|
|
; CHECK-STATIC: alloca [864 x i8]
|
|
; CHECK-DYNAMIC: alloca i8, i64 864
|
|
|
|
; CHECK-NOT: alloca
|
|
; CHECK: ret void
|
|
%AAA = alloca [5 x i8], align 1
|
|
%BBB = alloca [55 x i8], align 1
|
|
%CCC = alloca [555 x i8], align 1
|
|
ret void
|
|
}
|
|
|
|
; Check that we reorder vars according to alignment and handle large alignments.
|
|
define void @Func3() sanitize_address {
|
|
entry:
|
|
; CHECK-LABEL: Func3
|
|
|
|
; CHECK-STATIC: alloca [768 x i8]
|
|
; CHECK-DYNAMIC: alloca i8, i64 768
|
|
|
|
; CHECK-NOT: alloca
|
|
; CHECK: ret void
|
|
%AAA = alloca [128 x i8], align 16
|
|
%BBB = alloca [128 x i8], align 64
|
|
%CCC = alloca [128 x i8], align 256
|
|
ret void
|
|
}
|