|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 4 |
1 | 2 | ; This check verifies that stack depth instrumentation works correctly.
|
2 |
| -; RUN: opt < %s -passes='module(sancov-module)' -sanitizer-coverage-level=1 \ |
3 |
| -; RUN: -sanitizer-coverage-stack-depth -S | FileCheck %s |
4 |
| -; RUN: opt < %s -passes='module(sancov-module)' -sanitizer-coverage-level=3 \ |
5 |
| -; RUN: -sanitizer-coverage-stack-depth -sanitizer-coverage-trace-pc-guard \ |
6 |
| -; RUN: -S | FileCheck %s |
| 3 | +; RUN: opt < %s -passes='module(sancov-module)' -sanitizer-coverage-level=1 -sanitizer-coverage-stack-depth -S | FileCheck %s --check-prefixes=L1 |
| 4 | +; RUN: opt < %s -passes='module(sancov-module)' -sanitizer-coverage-level=3 -sanitizer-coverage-stack-depth -S -sanitizer-coverage-trace-pc-guard | FileCheck %s --check-prefixes=L3 |
7 | 5 |
|
8 | 6 | target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
9 | 7 | target triple = "x86_64-unknown-linux-gnu"
|
10 | 8 |
|
11 |
| -; CHECK: @__sancov_lowest_stack = thread_local(initialexec) global i64 -1 |
12 | 9 | @__sancov_lowest_stack = thread_local global i64 0, align 8
|
13 | 10 |
|
| 11 | +;. |
| 12 | +; L1: @__sancov_lowest_stack = thread_local(initialexec) global i64 -1, align 8 |
| 13 | +;. |
| 14 | +; L3: @__sancov_lowest_stack = thread_local(initialexec) global i64 -1, align 8 |
| 15 | +; L3: @__sancov_gen_ = private global [1 x i32] zeroinitializer, section "__sancov_guards", comdat($foo), align 4 |
| 16 | +; L3: @__sancov_gen_.1 = private global [1 x i32] zeroinitializer, section "__sancov_guards", comdat($bar), align 4 |
| 17 | +; L3: @__sancov_gen_.2 = private global [1 x i32] zeroinitializer, section "__sancov_guards", comdat($_ZTW21__sancov_lowest_stack), align 4 |
| 18 | +; L3: @__start___sancov_guards = extern_weak hidden global i32 |
| 19 | +; L3: @__stop___sancov_guards = extern_weak hidden global i32 |
| 20 | +; L3: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 2, ptr @sancov.module_ctor_trace_pc_guard, ptr @sancov.module_ctor_trace_pc_guard }] |
| 21 | +; L3: @llvm.used = appending global [1 x ptr] [ptr @sancov.module_ctor_trace_pc_guard], section "llvm.metadata" |
| 22 | +; L3: @llvm.compiler.used = appending global [3 x ptr] [ptr @__sancov_gen_, ptr @__sancov_gen_.1, ptr @__sancov_gen_.2], section "llvm.metadata" |
| 23 | +;. |
14 | 24 | define i32 @foo() {
|
| 25 | +; L1-LABEL: define i32 @foo() { |
| 26 | +; L1-NEXT: entry: |
| 27 | +; L1-NEXT: ret i32 7 |
| 28 | +; |
| 29 | +; L3-LABEL: define i32 @foo() comdat { |
| 30 | +; L3-NEXT: entry: |
| 31 | +; L3-NEXT: call void @__sanitizer_cov_trace_pc_guard(ptr @__sancov_gen_) #[[ATTR2:[0-9]+]] |
| 32 | +; L3-NEXT: ret i32 7 |
| 33 | +; |
15 | 34 | entry:
|
16 |
| -; CHECK-LABEL: define i32 @foo |
17 |
| -; CHECK-NOT: call ptr @llvm.frameaddress.p0(i32 0) |
18 |
| -; CHECK-NOT: @__sancov_lowest_stack |
19 |
| -; CHECK: ret i32 7 |
20 | 35 |
|
21 | 36 | ret i32 7
|
22 | 37 | }
|
23 | 38 |
|
24 | 39 | define i32 @bar() {
|
| 40 | +; L1-LABEL: define i32 @bar() { |
| 41 | +; L1-NEXT: entry: |
| 42 | +; L1-NEXT: [[TMP0:%.*]] = call ptr @llvm.frameaddress.p0(i32 0) |
| 43 | +; L1-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[TMP0]] to i64 |
| 44 | +; L1-NEXT: [[TMP2:%.*]] = load i64, ptr @__sancov_lowest_stack, align 8, !nosanitize [[META0:![0-9]+]] |
| 45 | +; L1-NEXT: [[TMP3:%.*]] = icmp ult i64 [[TMP1]], [[TMP2]] |
| 46 | +; L1-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP5:%.*]] |
| 47 | +; L1: 4: |
| 48 | +; L1-NEXT: store i64 [[TMP1]], ptr @__sancov_lowest_stack, align 8, !nosanitize [[META0]] |
| 49 | +; L1-NEXT: br label [[TMP5]] |
| 50 | +; L1: 5: |
| 51 | +; L1-NEXT: [[CALL:%.*]] = call i32 @foo() |
| 52 | +; L1-NEXT: ret i32 [[CALL]] |
| 53 | +; |
| 54 | +; L3-LABEL: define i32 @bar() comdat { |
| 55 | +; L3-NEXT: entry: |
| 56 | +; L3-NEXT: call void @__sanitizer_cov_trace_pc_guard(ptr @__sancov_gen_.1) #[[ATTR2]] |
| 57 | +; L3-NEXT: [[TMP0:%.*]] = call ptr @llvm.frameaddress.p0(i32 0) |
| 58 | +; L3-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[TMP0]] to i64 |
| 59 | +; L3-NEXT: [[TMP2:%.*]] = load i64, ptr @__sancov_lowest_stack, align 8, !nosanitize [[META0:![0-9]+]] |
| 60 | +; L3-NEXT: [[TMP3:%.*]] = icmp ult i64 [[TMP1]], [[TMP2]] |
| 61 | +; L3-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP5:%.*]] |
| 62 | +; L3: 4: |
| 63 | +; L3-NEXT: store i64 [[TMP1]], ptr @__sancov_lowest_stack, align 8, !nosanitize [[META0]] |
| 64 | +; L3-NEXT: br label [[TMP5]] |
| 65 | +; L3: 5: |
| 66 | +; L3-NEXT: [[CALL:%.*]] = call i32 @foo() |
| 67 | +; L3-NEXT: ret i32 [[CALL]] |
| 68 | +; |
25 | 69 | entry:
|
26 |
| -; CHECK-LABEL: define i32 @bar |
27 |
| -; CHECK: [[framePtr:%[^ \t]+]] = call ptr @llvm.frameaddress.p0(i32 0) |
28 |
| -; CHECK: [[frameInt:%[^ \t]+]] = ptrtoint ptr [[framePtr]] to [[intType:i[0-9]+]] |
29 |
| -; CHECK: [[lowest:%[^ \t]+]] = load [[intType]], ptr @__sancov_lowest_stack |
30 |
| -; CHECK: [[cmp:%[^ \t]+]] = icmp ult [[intType]] [[frameInt]], [[lowest]] |
31 |
| -; CHECK: br i1 [[cmp]], label %[[ifLabel:[^ \t]+]], label |
32 |
| -; CHECK: [[ifLabel]]: |
33 |
| -; CHECK: store [[intType]] [[frameInt]], ptr @__sancov_lowest_stack |
34 |
| -; CHECK: %call = call i32 @foo() |
35 |
| -; CHECK: ret i32 %call |
36 | 70 |
|
37 | 71 | %call = call i32 @foo()
|
38 | 72 | ret i32 %call
|
39 | 73 | }
|
40 | 74 |
|
41 | 75 | define weak_odr hidden ptr @_ZTW21__sancov_lowest_stack() {
|
| 76 | +; L1-LABEL: define weak_odr hidden ptr @_ZTW21__sancov_lowest_stack() { |
| 77 | +; L1-NEXT: ret ptr @__sancov_lowest_stack |
| 78 | +; |
| 79 | +; L3-LABEL: define weak_odr hidden ptr @_ZTW21__sancov_lowest_stack() comdat { |
| 80 | +; L3-NEXT: call void @__sanitizer_cov_trace_pc_guard(ptr @__sancov_gen_.2) #[[ATTR2]] |
| 81 | +; L3-NEXT: ret ptr @__sancov_lowest_stack |
| 82 | +; |
42 | 83 | ret ptr @__sancov_lowest_stack
|
43 | 84 | }
|
| 85 | +;. |
| 86 | +; L1: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(none) } |
| 87 | +;. |
| 88 | +; L3: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(none) } |
| 89 | +; L3: attributes #[[ATTR1:[0-9]+]] = { nounwind } |
| 90 | +; L3: attributes #[[ATTR2]] = { nomerge } |
| 91 | +;. |
| 92 | +; L1: [[META0]] = !{} |
| 93 | +;. |
| 94 | +; L3: [[META0]] = !{} |
| 95 | +;. |
0 commit comments