98 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 42; This check verifies that stack depth instrumentation works correctly.3; RUN: opt < %s -passes='module(sancov-module)' -sanitizer-coverage-level=1 -sanitizer-coverage-stack-depth -S | FileCheck %s --check-prefixes=L14; 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=L35 6target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"7target triple = "x86_64-unknown-linux-gnu"8 9@__sancov_lowest_stack = thread_local global i64 0, align 810 11;.12; L1: @__sancov_lowest_stack = thread_local(initialexec) global i64 -1, align 813;.14; L3: @__sancov_lowest_stack = thread_local(initialexec) global i64 -1, align 815; L3: @__sancov_gen_ = private global [1 x i32] zeroinitializer, section "__sancov_guards", comdat($foo), align 416; L3: @__sancov_gen_.1 = private global [1 x i32] zeroinitializer, section "__sancov_guards", comdat($bar), align 417; L3: @__sancov_gen_.2 = private global [1 x i32] zeroinitializer, section "__sancov_guards", comdat($_ZTW21__sancov_lowest_stack), align 418; L3: @__start___sancov_guards = extern_weak hidden global i3219; L3: @__stop___sancov_guards = extern_weak hidden global i3220; 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;.24define i32 @foo() {25; L1-LABEL: define i32 @foo() {26; L1-NEXT: entry:27; L1-NEXT: ret i32 728;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 733;34entry:35 36 ret i32 737}38 39define 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 i6444; 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:%.*]], !prof [[PROF1:![0-9]+]]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 i6459; 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:%.*]], !prof [[PROF1:![0-9]+]]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;69entry:70 71 %call = call i32 @foo()72 ret i32 %call73}74 75define 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_stack78;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_stack82;83 ret ptr @__sancov_lowest_stack84}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; L1: [[PROF1]] = !{!"branch_weights", i32 1, i32 1048575}94;.95; L3: [[META0]] = !{}96; L3: [[PROF1]] = !{!"branch_weights", i32 1, i32 1048575}97;.98