mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-13 23:18:51 +00:00
d84b0f9851
This adds support for TSan C++ exception handling, where we need to add extra calls to __tsan_func_exit when a function is exitted via exception mechanisms. Otherwise the shadow stack gets corrupted (leaked). This patch moves and enhances the existing implementation of EscapeEnumerator that finds all possible function exit points, and adds extra EH cleanup blocks where needed. Differential Revision: https://reviews.llvm.org/D26177 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286893 91177308-0d34-0410-b5e6-96231b3b80d8
34 lines
1.3 KiB
LLVM
34 lines
1.3 KiB
LLVM
; Test marking string functions as nobuiltin in thread sanitizer.
|
|
;
|
|
; RUN: opt < %s -tsan -S | FileCheck %s
|
|
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"
|
|
target triple = "x86_64-unknown-linux-gnu"
|
|
|
|
declare i8* @memchr(i8* %a, i32 %b, i64 %c) nounwind
|
|
declare i32 @memcmp(i8* %a, i8* %b, i64 %c) nounwind
|
|
declare i32 @strcmp(i8* %a, i8* %b) nounwind
|
|
declare i8* @strcpy(i8* %a, i8* %b) nounwind
|
|
declare i8* @stpcpy(i8* %a, i8* %b) nounwind
|
|
declare i64 @strlen(i8* %a) nounwind
|
|
declare i64 @strnlen(i8* %a, i64 %b) nounwind
|
|
|
|
; CHECK: call{{.*}}@memchr{{.*}} #[[ATTR:[0-9]+]]
|
|
; CHECK: call{{.*}}@memcmp{{.*}} #[[ATTR]]
|
|
; CHECK: call{{.*}}@strcmp{{.*}} #[[ATTR]]
|
|
; CHECK: call{{.*}}@strcpy{{.*}} #[[ATTR]]
|
|
; CHECK: call{{.*}}@stpcpy{{.*}} #[[ATTR]]
|
|
; CHECK: call{{.*}}@strlen{{.*}} #[[ATTR]]
|
|
; CHECK: call{{.*}}@strnlen{{.*}} #[[ATTR]]
|
|
; attributes #[[ATTR]] = { nobuiltin }
|
|
|
|
define void @f1(i8* %a, i8* %b) nounwind uwtable sanitize_thread {
|
|
tail call i8* @memchr(i8* %a, i32 1, i64 12)
|
|
tail call i32 @memcmp(i8* %a, i8* %b, i64 12)
|
|
tail call i32 @strcmp(i8* %a, i8* %b)
|
|
tail call i8* @strcpy(i8* %a, i8* %b)
|
|
tail call i8* @stpcpy(i8* %a, i8* %b)
|
|
tail call i64 @strlen(i8* %a)
|
|
tail call i64 @strnlen(i8* %a, i64 12)
|
|
ret void
|
|
}
|