diff options
author | Stephen Hines <srhines@google.com> | 2015-03-23 12:10:34 -0700 |
---|---|---|
committer | Stephen Hines <srhines@google.com> | 2015-03-23 12:10:34 -0700 |
commit | ebe69fe11e48d322045d5949c83283927a0d790b (patch) | |
tree | c92f1907a6b8006628a4b01615f38264d29834ea /test/Instrumentation | |
parent | b7d2e72b02a4cb8034f32f8247a2558d2434e121 (diff) | |
download | external_llvm-ebe69fe11e48d322045d5949c83283927a0d790b.zip external_llvm-ebe69fe11e48d322045d5949c83283927a0d790b.tar.gz external_llvm-ebe69fe11e48d322045d5949c83283927a0d790b.tar.bz2 |
Update aosp/master LLVM for rebase to r230699.
Change-Id: I2b5be30509658cb8266be782de0ab24f9099f9b9
Diffstat (limited to 'test/Instrumentation')
49 files changed, 879 insertions, 270 deletions
diff --git a/test/Instrumentation/AddressSanitizer/X86/asm_mov.ll b/test/Instrumentation/AddressSanitizer/X86/asm_mov.ll index 7f5d3b0..4162d9d 100644 --- a/test/Instrumentation/AddressSanitizer/X86/asm_mov.ll +++ b/test/Instrumentation/AddressSanitizer/X86/asm_mov.ll @@ -145,8 +145,8 @@ entry: attributes #0 = { nounwind uwtable sanitize_address "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } attributes #1 = { nounwind } -!0 = metadata !{i32 98, i32 122, i32 160} -!1 = metadata !{i32 305, i32 329, i32 367} -!2 = metadata !{i32 512, i32 537, i32 576} -!3 = metadata !{i32 721, i32 746, i32 785} -!4 = metadata !{i32 929, i32 957, i32 999} +!0 = !{i32 98, i32 122, i32 160} +!1 = !{i32 305, i32 329, i32 367} +!2 = !{i32 512, i32 537, i32 576} +!3 = !{i32 721, i32 746, i32 785} +!4 = !{i32 929, i32 957, i32 999} diff --git a/test/Instrumentation/AddressSanitizer/X86/bug_11395.ll b/test/Instrumentation/AddressSanitizer/X86/bug_11395.ll index 63477aa..3f944c3 100644 --- a/test/Instrumentation/AddressSanitizer/X86/bug_11395.ll +++ b/test/Instrumentation/AddressSanitizer/X86/bug_11395.ll @@ -64,10 +64,10 @@ entry: ret void } -!0 = metadata !{metadata !5, metadata !5, i64 0} -!1 = metadata !{metadata !"omnipotent char", metadata !2} -!2 = metadata !{metadata !"Simple C/C++ TBAA", null} -!3 = metadata !{metadata !6, metadata !6, i64 0} -!4 = metadata !{i32 156132, i32 156164, i32 156205, i32 156238, i32 156282, i32 156332, i32 156370, i32 156408, i32 156447, i32 156486, i32 156536, i32 156574, i32 156612, i32 156651, i32 156690, i32 156740, i32 156778, i32 156816, i32 156855, i32 156894, i32 156944, i32 156982, i32 157020, i32 157059, i32 157098, i32 157148, i32 157186, i32 157224, i32 157263, i32 157302, i32 157352, i32 157390, i32 157428, i32 157467, i32 157506, i32 157556, i32 157594, i32 157632, i32 157671, i32 157710, i32 157760, i32 157798, i32 157836, i32 157875, i32 157914, i32 157952, i32 157996, i32 158046, i32 158099, i32 158140, i32 158179, i32 158218, i32 158268, i32 158321, i32 158362, i32 158401, i32 158440, i32 158490, i32 158543, i32 158584, i32 158623, i32 158662, i32 158712, i32 158765, i32 158806, i32 158845, i32 158884, i32 158922, i32 158963, i32 158996, i32 159029, i32 159062, i32 159109, i32 159154, i32 159199, i32 159243, i32 159286, i32 159329, i32 159375, i32 159422, i32 159478, i32 159522, i32 159566} -!5 = metadata !{metadata !"any pointer", metadata !1} -!6 = metadata !{metadata !"int", metadata !1} +!0 = !{!5, !5, i64 0} +!1 = !{!"omnipotent char", !2} +!2 = !{!"Simple C/C++ TBAA", null} +!3 = !{!6, !6, i64 0} +!4 = !{i32 156132, i32 156164, i32 156205, i32 156238, i32 156282, i32 156332, i32 156370, i32 156408, i32 156447, i32 156486, i32 156536, i32 156574, i32 156612, i32 156651, i32 156690, i32 156740, i32 156778, i32 156816, i32 156855, i32 156894, i32 156944, i32 156982, i32 157020, i32 157059, i32 157098, i32 157148, i32 157186, i32 157224, i32 157263, i32 157302, i32 157352, i32 157390, i32 157428, i32 157467, i32 157506, i32 157556, i32 157594, i32 157632, i32 157671, i32 157710, i32 157760, i32 157798, i32 157836, i32 157875, i32 157914, i32 157952, i32 157996, i32 158046, i32 158099, i32 158140, i32 158179, i32 158218, i32 158268, i32 158321, i32 158362, i32 158401, i32 158440, i32 158490, i32 158543, i32 158584, i32 158623, i32 158662, i32 158712, i32 158765, i32 158806, i32 158845, i32 158884, i32 158922, i32 158963, i32 158996, i32 159029, i32 159062, i32 159109, i32 159154, i32 159199, i32 159243, i32 159286, i32 159329, i32 159375, i32 159422, i32 159478, i32 159522, i32 159566} +!5 = !{!"any pointer", !1} +!6 = !{!"int", !1} diff --git a/test/Instrumentation/AddressSanitizer/basic.ll b/test/Instrumentation/AddressSanitizer/basic.ll index d9997e2..8020660 100644 --- a/test/Instrumentation/AddressSanitizer/basic.ll +++ b/test/Instrumentation/AddressSanitizer/basic.ll @@ -170,4 +170,4 @@ define void @memintr_test(i8* %a, i8* %b) nounwind uwtable sanitize_address { ; CHECK: ret void ; PROF -; CHECK: ![[PROF]] = metadata !{metadata !"branch_weights", i32 1, i32 100000} +; CHECK: ![[PROF]] = !{!"branch_weights", i32 1, i32 100000} diff --git a/test/Instrumentation/AddressSanitizer/debug_info.ll b/test/Instrumentation/AddressSanitizer/debug_info.ll index ea51551..c0939c5 100644 --- a/test/Instrumentation/AddressSanitizer/debug_info.ll +++ b/test/Instrumentation/AddressSanitizer/debug_info.ll @@ -11,8 +11,8 @@ entry: %p.addr = alloca i32, align 4 %r = alloca i32, align 4 store i32 %p, i32* %p.addr, align 4 - call void @llvm.dbg.declare(metadata !{i32* %p.addr}, metadata !10, metadata !{metadata !"0x102"}), !dbg !11 - call void @llvm.dbg.declare(metadata !{i32* %r}, metadata !12, metadata !{metadata !"0x102"}), !dbg !14 + call void @llvm.dbg.declare(metadata i32* %p.addr, metadata !10, metadata !{!"0x102"}), !dbg !11 + call void @llvm.dbg.declare(metadata i32* %r, metadata !12, metadata !{!"0x102"}), !dbg !14 %0 = load i32* %p.addr, align 4, !dbg !14 %add = add nsw i32 %0, 1, !dbg !14 store i32 %add, i32* %r, align 4, !dbg !14 @@ -33,30 +33,30 @@ declare void @llvm.dbg.declare(metadata, metadata, metadata) nounwind readnone !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!17} -!0 = metadata !{metadata !"0x11\004\00clang version 3.3 (trunk 169314)\001\00\000\00\000", metadata !16, metadata !1, metadata !1, metadata !3, metadata !1, null} ; [ DW_TAG_compile_unit ] [/usr/local/google/llvm_cmake_clang/tmp/debuginfo/a.cc] [DW_LANG_C_plus_plus] -!1 = metadata !{i32 0} -!3 = metadata !{metadata !5} -!5 = metadata !{metadata !"0x2e\00zzz\00zzz\00_Z3zzzi\001\000\001\000\006\00256\000\001", metadata !16, metadata !6, metadata !7, null, i32 (i32)* @_Z3zzzi, null, null, metadata !1} ; [ DW_TAG_subprogram ] [line 1] [def] [zzz] -!6 = metadata !{metadata !"0x29", metadata !16} ; [ DW_TAG_file_type ] -!7 = metadata !{metadata !"0x15\00\000\000\000\000\000\000", i32 0, null, null, metadata !8, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!8 = metadata !{metadata !9, metadata !9} -!9 = metadata !{metadata !"0x24\00int\000\0032\0032\000\000\005", null, null} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] -!10 = metadata !{metadata !"0x101\00p\0016777217\000", metadata !5, metadata !6, metadata !9} ; [ DW_TAG_arg_variable ] [p] [line 1] -!11 = metadata !{i32 1, i32 0, metadata !5, null} -!12 = metadata !{metadata !"0x100\00r\002\000", metadata !13, metadata !6, metadata !9} ; [ DW_TAG_auto_variable ] [r] [line 2] +!0 = !{!"0x11\004\00clang version 3.3 (trunk 169314)\001\00\000\00\000", !16, !1, !1, !3, !1, null} ; [ DW_TAG_compile_unit ] [/usr/local/google/llvm_cmake_clang/tmp/debuginfo/a.cc] [DW_LANG_C_plus_plus] +!1 = !{i32 0} +!3 = !{!5} +!5 = !{!"0x2e\00zzz\00zzz\00_Z3zzzi\001\000\001\000\006\00256\000\001", !16, !6, !7, null, i32 (i32)* @_Z3zzzi, null, null, !1} ; [ DW_TAG_subprogram ] [line 1] [def] [zzz] +!6 = !{!"0x29", !16} ; [ DW_TAG_file_type ] +!7 = !{!"0x15\00\000\000\000\000\000\000", i32 0, null, null, !8, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!8 = !{!9, !9} +!9 = !{!"0x24\00int\000\0032\0032\000\000\005", null, null} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = !{!"0x101\00p\0016777217\000", !5, !6, !9} ; [ DW_TAG_arg_variable ] [p] [line 1] +!11 = !MDLocation(line: 1, scope: !5) +!12 = !{!"0x100\00r\002\000", !13, !6, !9} ; [ DW_TAG_auto_variable ] [r] [line 2] ; Verify that debug descriptors for argument and local variable will be replaced ; with descriptors that end with OpDeref (encoded as 2). ; CHECK: ![[ARG_ID]] = {{.*}} ; [ DW_TAG_arg_variable ] [p] [line 1] -; CHECK: ![[OPDEREF]] = metadata !{metadata !"0x102\006"} +; CHECK: ![[OPDEREF]] = !{!"0x102\006"} ; CHECK: ![[VAR_ID]] = {{.*}} ; [ DW_TAG_auto_variable ] [r] [line 2] ; Verify that there are no more variable descriptors. ; CHECK-NOT: DW_TAG_arg_variable ; CHECK-NOT: DW_TAG_auto_variable -!13 = metadata !{metadata !"0xb\001\000\000", metadata !16, metadata !5} ; [ DW_TAG_lexical_block ] [/usr/local/google/llvm_cmake_clang/tmp/debuginfo/a.cc] -!14 = metadata !{i32 2, i32 0, metadata !13, null} -!15 = metadata !{i32 3, i32 0, metadata !13, null} -!16 = metadata !{metadata !"a.cc", metadata !"/usr/local/google/llvm_cmake_clang/tmp/debuginfo"} -!17 = metadata !{i32 1, metadata !"Debug Info Version", i32 2} +!13 = !{!"0xb\001\000\000", !16, !5} ; [ DW_TAG_lexical_block ] [/usr/local/google/llvm_cmake_clang/tmp/debuginfo/a.cc] +!14 = !MDLocation(line: 2, scope: !13) +!15 = !MDLocation(line: 3, scope: !13) +!16 = !{!"a.cc", !"/usr/local/google/llvm_cmake_clang/tmp/debuginfo"} +!17 = !{i32 1, !"Debug Info Version", i32 2} diff --git a/test/Instrumentation/AddressSanitizer/do-not-instrument-cstring.ll b/test/Instrumentation/AddressSanitizer/do-not-instrument-cstring.ll index de6a4de..f096ac1 100644 --- a/test/Instrumentation/AddressSanitizer/do-not-instrument-cstring.ll +++ b/test/Instrumentation/AddressSanitizer/do-not-instrument-cstring.ll @@ -1,6 +1,7 @@ ; RUN: opt < %s -asan -asan-module -S | FileCheck %s target datalayout = "e" +target triple = "x86_64-apple-darwin10.0.0" @foo = private global [19 x i8] c"scannerWithString:\00", section "__TEXT,__objc_methname,cstring_literals" diff --git a/test/Instrumentation/AddressSanitizer/do-not-touch-comdat-global.ll b/test/Instrumentation/AddressSanitizer/do-not-touch-comdat-global.ll index 8d14e83..fcc166e 100644 --- a/test/Instrumentation/AddressSanitizer/do-not-touch-comdat-global.ll +++ b/test/Instrumentation/AddressSanitizer/do-not-touch-comdat-global.ll @@ -5,7 +5,7 @@ target datalayout = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32" target triple = "i686-pc-windows-msvc" ; no action should be taken for these globals $global_noinst = comdat largest -@aliasee = private unnamed_addr constant [2 x i8] [i8 1, i8 2], comdat $global_noinst +@aliasee = private unnamed_addr constant [2 x i8] [i8 1, i8 2], comdat($global_noinst) @global_noinst = unnamed_addr alias [2 x i8]* @aliasee ; CHECK-NOT: {{asan_gen.*global_noinst}} ; CHECK-DAG: @global_noinst = unnamed_addr alias [2 x i8]* @aliasee diff --git a/test/Instrumentation/AddressSanitizer/global_metadata.ll b/test/Instrumentation/AddressSanitizer/global_metadata.ll index fd5a8c6..3901745 100644 --- a/test/Instrumentation/AddressSanitizer/global_metadata.ll +++ b/test/Instrumentation/AddressSanitizer/global_metadata.ll @@ -53,15 +53,15 @@ attributes #1 = { nounwind sanitize_address "less-precise-fpmad"="false" "no-fra !llvm.asan.globals = !{!0, !1, !2, !3, !4} !llvm.ident = !{!5} -!0 = metadata !{i32* @global, metadata !6, metadata !"global", i1 false, i1 false} -!1 = metadata !{i32* @dyn_init_global, metadata !7, metadata !"dyn_init_global", i1 true, i1 false} -!2 = metadata !{i32* @blacklisted_global, null, null, i1 false, i1 true} -!3 = metadata !{i32* @_ZZ4funcvE10static_var, metadata !8, metadata !"static_var", i1 false, i1 false} -!4 = metadata !{[14 x i8]* @.str, metadata !9, metadata !"<string literal>", i1 false, i1 false} +!0 = !{i32* @global, !6, !"global", i1 false, i1 false} +!1 = !{i32* @dyn_init_global, !7, !"dyn_init_global", i1 true, i1 false} +!2 = !{i32* @blacklisted_global, null, null, i1 false, i1 true} +!3 = !{i32* @_ZZ4funcvE10static_var, !8, !"static_var", i1 false, i1 false} +!4 = !{[14 x i8]* @.str, !9, !"<string literal>", i1 false, i1 false} -!5 = metadata !{metadata !"clang version 3.5.0 (211282)"} +!5 = !{!"clang version 3.5.0 (211282)"} -!6 = metadata !{metadata !"/tmp/asan-globals.cpp", i32 5, i32 5} -!7 = metadata !{metadata !"/tmp/asan-globals.cpp", i32 7, i32 5} -!8 = metadata !{metadata !"/tmp/asan-globals.cpp", i32 12, i32 14} -!9 = metadata !{metadata !"/tmp/asan-globals.cpp", i32 14, i32 25} +!6 = !{!"/tmp/asan-globals.cpp", i32 5, i32 5} +!7 = !{!"/tmp/asan-globals.cpp", i32 7, i32 5} +!8 = !{!"/tmp/asan-globals.cpp", i32 12, i32 14} +!9 = !{!"/tmp/asan-globals.cpp", i32 14, i32 25} diff --git a/test/Instrumentation/AddressSanitizer/instrument-dynamic-allocas.ll b/test/Instrumentation/AddressSanitizer/instrument-dynamic-allocas.ll new file mode 100644 index 0000000..25807bb --- /dev/null +++ b/test/Instrumentation/AddressSanitizer/instrument-dynamic-allocas.ll @@ -0,0 +1,24 @@ +; Test asan internal compiler flags: +; -asan-instrument-allocas=1 + +; RUN: opt < %s -asan -asan-module -asan-instrument-allocas=1 -S | FileCheck %s --check-prefix=CHECK-ALLOCA +; RUN: opt < %s -asan -asan-module -asan-instrument-allocas=0 -S | FileCheck %s --check-prefix=CHECK-NOALLOCA +; RUN: opt < %s -asan -asan-module -S | FileCheck %s --check-prefix=CHECK-NOALLOCA +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" + +define void @foo(i32 %len) sanitize_address { +entry: +; CHECK-ALLOCA: store i32 -892679478 +; CHECK-ALLOCA: store i32 -875836469 +; CHECK-NOALLOCA-NOT: store i32 -892679478 +; CHECK-NOALLOCA-NOT: store i32 -875836469 + %0 = alloca i32, align 4 + %1 = alloca i8* + store i32 %len, i32* %0, align 4 + %2 = load i32* %0, align 4 + %3 = zext i32 %2 to i64 + %4 = alloca i8, i64 %3, align 32 + ret void +} + diff --git a/test/Instrumentation/AddressSanitizer/instrument_global.ll b/test/Instrumentation/AddressSanitizer/instrument_global.ll index 80791d9..259c815 100644 --- a/test/Instrumentation/AddressSanitizer/instrument_global.ll +++ b/test/Instrumentation/AddressSanitizer/instrument_global.ll @@ -69,7 +69,7 @@ entry: !llvm.asan.globals = !{!0} -!0 = metadata !{[10 x i32]* @GlobDy, null, null, i1 true, i1 false} +!0 = !{[10 x i32]* @GlobDy, null, null, i1 true, i1 false} ; CHECK-LABEL: define internal void @asan.module_ctor ; CHECK-NOT: ret diff --git a/test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll b/test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll index c2bb0aa..b89ca44 100644 --- a/test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll +++ b/test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll @@ -7,10 +7,10 @@ target triple = "x86_64-unknown-linux-gnu" @YYY = global i32 0, align 4 ; W/o dynamic initializer. ; Clang will emit the following metadata identifying @xxx as dynamically ; initialized. -!0 = metadata !{i32* @xxx, null, null, i1 true, i1 false} -!1 = metadata !{i32* @XXX, null, null, i1 true, i1 false} -!2 = metadata !{i32* @yyy, null, null, i1 false, i1 false} -!3 = metadata !{i32* @YYY, null, null, i1 false, i1 false} +!0 = !{i32* @xxx, null, null, i1 true, i1 false} +!1 = !{i32* @XXX, null, null, i1 true, i1 false} +!2 = !{i32* @yyy, null, null, i1 false, i1 false} +!3 = !{i32* @YYY, null, null, i1 false, i1 false} !llvm.asan.globals = !{!0, !1, !2, !3} define i32 @initializer() uwtable { diff --git a/test/Instrumentation/AddressSanitizer/keep-instrumented_functions.ll b/test/Instrumentation/AddressSanitizer/keep-instrumented_functions.ll deleted file mode 100644 index 8726b8e..0000000 --- a/test/Instrumentation/AddressSanitizer/keep-instrumented_functions.ll +++ /dev/null @@ -1,23 +0,0 @@ -; Test the -asan-keep-uninstrumented-functions flag: FOO should get cloned -; RUN: opt < %s -asan -asan-module -asan-keep-uninstrumented-functions -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-S128" -target triple = "x86_64-unknown-linux-gnu" - -@a = global i32 0, align 4 - -define i32 @main() sanitize_address { -entry: - tail call void @FOO(i32* @a) - ret i32 0 -} - -define void @FOO(i32* nocapture %x) sanitize_address { -entry: - store i32 1, i32* %x, align 4 - ret void -} - -; main should not be cloned since it is not being instrumented by asan. -; CHECK-NOT: NOASAN_main -; CHECK: define void @FOO{{.*}} section "ASAN" -; CHECK: define void @NOASAN_FOO{{.*}} section "NOASAN" diff --git a/test/Instrumentation/AddressSanitizer/stack_dynamic_alloca.ll b/test/Instrumentation/AddressSanitizer/stack_dynamic_alloca.ll new file mode 100644 index 0000000..43711b7 --- /dev/null +++ b/test/Instrumentation/AddressSanitizer/stack_dynamic_alloca.ll @@ -0,0 +1,42 @@ +; RUN: opt < %s -asan -asan-module -asan-stack-dynamic-alloca \ +; RUN: -asan-use-after-return -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-S128" +target triple = "x86_64-unknown-linux-gnu" + +define void @Func1() sanitize_address { +entry: +; CHECK-LABEL: Func1 + +; CHECK: entry: +; CHECK: load i32* @__asan_option_detect_stack_use_after_return + +; CHECK: <label>:[[UAR_ENABLED_BB:[0-9]+]] +; CHECK: [[FAKE_STACK_RT:%[0-9]+]] = call i64 @__asan_stack_malloc_ + +; CHECK: <label>:[[FAKE_STACK_BB:[0-9]+]] +; CHECK: [[FAKE_STACK:%[0-9]+]] = phi i64 [ 0, %entry ], [ [[FAKE_STACK_RT]], %[[UAR_ENABLED_BB]] ] +; CHECK: icmp eq i64 [[FAKE_STACK]], 0 + +; CHECK: <label>:[[NO_FAKE_STACK_BB:[0-9]+]] +; CHECK: %MyAlloca = alloca i8, i64 +; CHECK: [[ALLOCA:%[0-9]+]] = ptrtoint i8* %MyAlloca + +; CHECK: phi i64 [ [[FAKE_STACK]], %[[FAKE_STACK_BB]] ], [ [[ALLOCA]], %[[NO_FAKE_STACK_BB]] ] + +; CHECK: ret void + + %XXX = alloca [20 x i8], align 1 + ret void +} + +; Test that dynamic alloca is not used for functions with inline assembly. +define void @Func2() sanitize_address { +entry: +; CHECK-LABEL: Func2 +; CHECK: alloca [96 x i8] +; CHECK: ret void + + %XXX = alloca [20 x i8], align 1 + call void asm sideeffect "mov %%rbx, %%rcx", "~{dirflag},~{fpsr},~{flags}"() nounwind + ret void +} diff --git a/test/Instrumentation/AddressSanitizer/stack_layout.ll b/test/Instrumentation/AddressSanitizer/stack_layout.ll index c027acf..97e3bbb 100644 --- a/test/Instrumentation/AddressSanitizer/stack_layout.ll +++ b/test/Instrumentation/AddressSanitizer/stack_layout.ll @@ -1,6 +1,9 @@ ; Test the ASan's stack layout. ; More tests in tests/Transforms/Utils/ASanStackFrameLayoutTest.cpp -; RUN: opt < %s -asan -asan-module -S | FileCheck %s +; 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" @@ -14,7 +17,10 @@ declare void @Use(i8*) define void @Func1() sanitize_address { entry: ; CHECK-LABEL: Func1 -; CHECK: alloca [192 x i8] + +; 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 @@ -26,7 +32,10 @@ entry: define void @Func2() sanitize_address { entry: ; CHECK-LABEL: Func2 -; CHECK: alloca [864 x i8] + +; 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 @@ -39,7 +48,10 @@ entry: define void @Func3() sanitize_address { entry: ; CHECK-LABEL: Func3 -; CHECK: alloca [768 x i8] + +; 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 diff --git a/test/Instrumentation/AddressSanitizer/ubsan.ll b/test/Instrumentation/AddressSanitizer/ubsan.ll index 22e4172..5535efe 100644 --- a/test/Instrumentation/AddressSanitizer/ubsan.ll +++ b/test/Instrumentation/AddressSanitizer/ubsan.ll @@ -49,4 +49,4 @@ cont: ; preds = %handler.dynamic_typ ret void } -!0 = metadata !{} +!0 = !{} diff --git a/test/Instrumentation/AddressSanitizer/undecidable-dynamic-alloca-1.ll b/test/Instrumentation/AddressSanitizer/undecidable-dynamic-alloca-1.ll new file mode 100644 index 0000000..c67fb50 --- /dev/null +++ b/test/Instrumentation/AddressSanitizer/undecidable-dynamic-alloca-1.ll @@ -0,0 +1,23 @@ +; Test that undecidable dynamic allocas are skipped by ASan. + +; RUN: opt < %s -asan -asan-module -asan-instrument-allocas=1 -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" + +define void @g(i64 %n) sanitize_address { +entry: + %cmp = icmp sgt i64 %n, 100 + br i1 %cmp, label %do_alloca, label %done + +do_alloca: +; CHECK-NOT: store i32 -892679478 + %0 = alloca i8, i64 %n, align 1 + call void @f(i8* %0) + br label %done + +done: + ret void +} + +declare void @f(i8*) + diff --git a/test/Instrumentation/DataFlowSanitizer/abilist.ll b/test/Instrumentation/DataFlowSanitizer/abilist.ll index ebf55d9..9a45dbc 100644 --- a/test/Instrumentation/DataFlowSanitizer/abilist.ll +++ b/test/Instrumentation/DataFlowSanitizer/abilist.ll @@ -1,5 +1,6 @@ ; RUN: opt < %s -dfsan -dfsan-args-abi -dfsan-abilist=%S/Inputs/abilist.txt -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-S128" +target triple = "x86_64-unknown-linux-gnu" ; CHECK: i32 @discard(i32 %a, i32 %b) define i32 @discard(i32 %a, i32 %b) { diff --git a/test/Instrumentation/DataFlowSanitizer/args-unreachable-bb.ll b/test/Instrumentation/DataFlowSanitizer/args-unreachable-bb.ll index a699f75..1133462 100644 --- a/test/Instrumentation/DataFlowSanitizer/args-unreachable-bb.ll +++ b/test/Instrumentation/DataFlowSanitizer/args-unreachable-bb.ll @@ -1,5 +1,6 @@ ; RUN: opt < %s -dfsan -verify -dfsan-args-abi -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-S128" +target triple = "x86_64-unknown-linux-gnu" ; CHECK-LABEL: @"dfs$unreachable_bb1" define i8 @unreachable_bb1() { diff --git a/test/Instrumentation/DataFlowSanitizer/arith.ll b/test/Instrumentation/DataFlowSanitizer/arith.ll index dc61896..db33e45 100644 --- a/test/Instrumentation/DataFlowSanitizer/arith.ll +++ b/test/Instrumentation/DataFlowSanitizer/arith.ll @@ -1,5 +1,6 @@ ; RUN: opt < %s -dfsan -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-S128" +target triple = "x86_64-unknown-linux-gnu" define i8 @add(i8 %a, i8 %b) { ; CHECK: @"dfs$add" diff --git a/test/Instrumentation/DataFlowSanitizer/call.ll b/test/Instrumentation/DataFlowSanitizer/call.ll index 813f4c1..dadb40f 100644 --- a/test/Instrumentation/DataFlowSanitizer/call.ll +++ b/test/Instrumentation/DataFlowSanitizer/call.ll @@ -1,5 +1,6 @@ ; RUN: opt < %s -dfsan -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-S128" +target triple = "x86_64-unknown-linux-gnu" ; CHECK: @__dfsan_arg_tls = external thread_local(initialexec) global [64 x i16] ; CHECK: @__dfsan_retval_tls = external thread_local(initialexec) global i16 diff --git a/test/Instrumentation/DataFlowSanitizer/debug-nonzero-labels.ll b/test/Instrumentation/DataFlowSanitizer/debug-nonzero-labels.ll index eb28c2c..16de9cc 100644 --- a/test/Instrumentation/DataFlowSanitizer/debug-nonzero-labels.ll +++ b/test/Instrumentation/DataFlowSanitizer/debug-nonzero-labels.ll @@ -1,5 +1,6 @@ ; RUN: opt < %s -dfsan -dfsan-args-abi -dfsan-debug-nonzero-labels -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-S128" +target triple = "x86_64-unknown-linux-gnu" declare i32 @g() diff --git a/test/Instrumentation/DataFlowSanitizer/debug.ll b/test/Instrumentation/DataFlowSanitizer/debug.ll index cfc9dd9..837e953 100644 --- a/test/Instrumentation/DataFlowSanitizer/debug.ll +++ b/test/Instrumentation/DataFlowSanitizer/debug.ll @@ -21,16 +21,16 @@ attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointe !llvm.module.flags = !{!9, !10} !llvm.ident = !{!11} -!0 = metadata !{metadata !"0x11\004\00clang version 3.6.0 \000\00\000\00\001", metadata !1, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/debug.cpp] [DW_LANG_C_plus_plus] -!1 = metadata !{metadata !"debug.cpp", metadata !"/tmp/dbginfo"} -!2 = metadata !{} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !"0x2e\00main\00main\00\001\000\001\000\000\00256\000\001", metadata !1, metadata !5, metadata !6, null, i32 ()* @main, null, null, metadata !2} ; [ DW_TAG_subprogram ] [line 1] [def] [main] -!5 = metadata !{metadata !"0x29", metadata !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/debug.cpp] -!6 = metadata !{metadata !"0x15\00\000\000\000\000\000\000", null, null, null, metadata !7, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!7 = metadata !{metadata !8} -!8 = metadata !{metadata !"0x24\00int\000\0032\0032\000\000\005", null, null} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] -!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} -!10 = metadata !{i32 2, metadata !"Debug Info Version", i32 2} -!11 = metadata !{metadata !"clang version 3.6.0 "} -!12 = metadata !{i32 2, i32 1, metadata !4, null} +!0 = !{!"0x11\004\00clang version 3.6.0 \000\00\000\00\001", !1, !2, !2, !3, !2, !2} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/debug.cpp] [DW_LANG_C_plus_plus] +!1 = !{!"debug.cpp", !"/tmp/dbginfo"} +!2 = !{} +!3 = !{!4} +!4 = !{!"0x2e\00main\00main\00\001\000\001\000\000\00256\000\001", !1, !5, !6, null, i32 ()* @main, null, null, !2} ; [ DW_TAG_subprogram ] [line 1] [def] [main] +!5 = !{!"0x29", !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/debug.cpp] +!6 = !{!"0x15\00\000\000\000\000\000\000", null, null, null, !7, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = !{!8} +!8 = !{!"0x24\00int\000\0032\0032\000\000\005", null, null} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!9 = !{i32 2, !"Dwarf Version", i32 4} +!10 = !{i32 2, !"Debug Info Version", i32 2} +!11 = !{!"clang version 3.6.0 "} +!12 = !MDLocation(line: 2, column: 1, scope: !4) diff --git a/test/Instrumentation/DataFlowSanitizer/load.ll b/test/Instrumentation/DataFlowSanitizer/load.ll index 8324224..4d36c09 100644 --- a/test/Instrumentation/DataFlowSanitizer/load.ll +++ b/test/Instrumentation/DataFlowSanitizer/load.ll @@ -1,6 +1,7 @@ ; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-load=1 -S | FileCheck %s --check-prefix=COMBINE_PTR_LABEL ; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-load=0 -S | FileCheck %s --check-prefix=NO_COMBINE_PTR_LABEL 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" define {} @load0({}* %p) { ; COMBINE_PTR_LABEL: @"dfs$load0" diff --git a/test/Instrumentation/DataFlowSanitizer/memset.ll b/test/Instrumentation/DataFlowSanitizer/memset.ll index 062ef1a..7b3cb68 100644 --- a/test/Instrumentation/DataFlowSanitizer/memset.ll +++ b/test/Instrumentation/DataFlowSanitizer/memset.ll @@ -1,5 +1,6 @@ ; RUN: opt < %s -dfsan -dfsan-args-abi -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-S128" +target triple = "x86_64-unknown-linux-gnu" declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) diff --git a/test/Instrumentation/DataFlowSanitizer/prefix-rename.ll b/test/Instrumentation/DataFlowSanitizer/prefix-rename.ll index f3c36b1..b14de5f 100644 --- a/test/Instrumentation/DataFlowSanitizer/prefix-rename.ll +++ b/test/Instrumentation/DataFlowSanitizer/prefix-rename.ll @@ -1,6 +1,7 @@ ; RUN: opt < %s -dfsan -S | FileCheck %s ; RUN: opt < %s -dfsan -dfsan-args-abi -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-S128" +target triple = "x86_64-unknown-linux-gnu" ; CHECK: module asm ".symver dfs$f1,dfs$f@@version1" module asm ".symver f1,f@@version1" diff --git a/test/Instrumentation/DataFlowSanitizer/store.ll b/test/Instrumentation/DataFlowSanitizer/store.ll index d14bdb6..365b62d 100644 --- a/test/Instrumentation/DataFlowSanitizer/store.ll +++ b/test/Instrumentation/DataFlowSanitizer/store.ll @@ -1,6 +1,7 @@ ; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-store=1 -S | FileCheck %s --check-prefix=COMBINE_PTR_LABEL ; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-store=0 -S | FileCheck %s --check-prefix=NO_COMBINE_PTR_LABEL 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" define void @store0({} %v, {}* %p) { ; COMBINE_PTR_LABEL: @"dfs$store0" diff --git a/test/Instrumentation/DataFlowSanitizer/union-large.ll b/test/Instrumentation/DataFlowSanitizer/union-large.ll index a388f73..0408239 100644 --- a/test/Instrumentation/DataFlowSanitizer/union-large.ll +++ b/test/Instrumentation/DataFlowSanitizer/union-large.ll @@ -1,5 +1,6 @@ ; RUN: opt < %s -dfsan -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-S128" +target triple = "x86_64-unknown-linux-gnu" ; Check that we use dfsan_union in large functions instead of __dfsan_union. diff --git a/test/Instrumentation/DataFlowSanitizer/union.ll b/test/Instrumentation/DataFlowSanitizer/union.ll index 2b31081..7fcba2c 100644 --- a/test/Instrumentation/DataFlowSanitizer/union.ll +++ b/test/Instrumentation/DataFlowSanitizer/union.ll @@ -1,5 +1,6 @@ ; RUN: opt < %s -dfsan -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-S128" +target triple = "x86_64-unknown-linux-gnu" @a = common global i32 0 @b = common global i32 0 diff --git a/test/Instrumentation/InstrProfiling/linkage.ll b/test/Instrumentation/InstrProfiling/linkage.ll new file mode 100644 index 0000000..0a92d5d --- /dev/null +++ b/test/Instrumentation/InstrProfiling/linkage.ll @@ -0,0 +1,46 @@ +;; Check that runtime symbols get appropriate linkage. + +; RUN: opt < %s -mtriple=x86_64-apple-macosx10.10.0 -instrprof -S | FileCheck %s +; RUN: opt < %s -mtriple=x86_64-unknown-linux -instrprof -S | FileCheck %s + +@__llvm_profile_name_foo = hidden constant [3 x i8] c"foo" +@__llvm_profile_name_foo_weak = weak hidden constant [8 x i8] c"foo_weak" +@"__llvm_profile_name_linkage.ll:foo_internal" = internal constant [23 x i8] c"linkage.ll:foo_internal" +@__llvm_profile_name_foo_inline = linkonce_odr hidden constant [10 x i8] c"foo_inline" + +; CHECK: @__llvm_profile_counters_foo = hidden global +; CHECK: @__llvm_profile_data_foo = hidden constant +define void @foo() { + call void @llvm.instrprof.increment(i8* getelementptr inbounds ([3 x i8]* @__llvm_profile_name_foo, i32 0, i32 0), i64 0, i32 1, i32 0) + ret void +} + +; CHECK: @__llvm_profile_counters_foo_weak = weak hidden global +; CHECK: @__llvm_profile_data_foo_weak = weak hidden constant +define weak void @foo_weak() { + call void @llvm.instrprof.increment(i8* getelementptr inbounds ([8 x i8]* @__llvm_profile_name_foo_weak, i32 0, i32 0), i64 0, i32 1, i32 0) + ret void +} + +; CHECK: @"__llvm_profile_counters_linkage.ll:foo_internal" = internal global +; CHECK: @"__llvm_profile_data_linkage.ll:foo_internal" = internal constant +define internal void @foo_internal() { + call void @llvm.instrprof.increment(i8* getelementptr inbounds ([23 x i8]* @"__llvm_profile_name_linkage.ll:foo_internal", i32 0, i32 0), i64 0, i32 1, i32 0) + ret void +} + +; CHECK: @__llvm_profile_counters_foo_inline = linkonce_odr hidden global +; CHECK: @__llvm_profile_data_foo_inline = linkonce_odr hidden constant +define linkonce_odr void @foo_inline() { + call void @llvm.instrprof.increment(i8* getelementptr inbounds ([10 x i8]* @__llvm_profile_name_foo_inline, i32 0, i32 0), i64 0, i32 1, i32 0) + ret void +} + +declare void @llvm.instrprof.increment(i8*, i64, i32, i32) + +; CHECK: @__llvm_profile_runtime = external global i32 + +; CHECK: define linkonce_odr hidden i32 @__llvm_profile_runtime_user() {{.*}} { +; CHECK: %[[REG:.*]] = load i32* @__llvm_profile_runtime +; CHECK: ret i32 %[[REG]] +; CHECK: } diff --git a/test/Instrumentation/InstrProfiling/no-counters.ll b/test/Instrumentation/InstrProfiling/no-counters.ll new file mode 100644 index 0000000..0716b0d --- /dev/null +++ b/test/Instrumentation/InstrProfiling/no-counters.ll @@ -0,0 +1,10 @@ +;; No instrumentation should be emitted if there are no counter increments. + +; RUN: opt < %s -instrprof -S | FileCheck %s +; CHECK-NOT: @__llvm_profile_counters +; CHECK-NOT: @__llvm_profile_data +; CHECK-NOT: @__llvm_profile_runtime + +define void @foo() { + ret void +} diff --git a/test/Instrumentation/InstrProfiling/noruntime.ll b/test/Instrumentation/InstrProfiling/noruntime.ll new file mode 100644 index 0000000..e69445d --- /dev/null +++ b/test/Instrumentation/InstrProfiling/noruntime.ll @@ -0,0 +1,16 @@ +;; Check that we don't emit the runtime hooks if the user provided them. + +; RUN: opt < %s -instrprof -S | FileCheck %s +; CHECK-NOT: define {{.*}} @__llvm_profile_runtime_user() +; CHECK-NOT: load i32* @__llvm_profile_runtime + +@__llvm_profile_runtime = global i32 0, align 4 + +@__llvm_profile_name_foo = hidden constant [3 x i8] c"foo" + +define void @foo() { + call void @llvm.instrprof.increment(i8* getelementptr inbounds ([3 x i8]* @__llvm_profile_name_foo, i32 0, i32 0), i64 0, i32 1, i32 0) + ret void +} + +declare void @llvm.instrprof.increment(i8*, i64, i32, i32) diff --git a/test/Instrumentation/InstrProfiling/platform.ll b/test/Instrumentation/InstrProfiling/platform.ll new file mode 100644 index 0000000..e032768 --- /dev/null +++ b/test/Instrumentation/InstrProfiling/platform.ll @@ -0,0 +1,29 @@ +;; Checks for platform specific section names and initialization code. + +; RUN: opt < %s -mtriple=x86_64-apple-macosx10.10.0 -instrprof -S | FileCheck %s -check-prefix=MACHO +; RUN: opt < %s -mtriple=x86_64-unknown-linux -instrprof -S | FileCheck %s -check-prefix=ELF + +@__llvm_profile_name_foo = hidden constant [3 x i8] c"foo" +; MACHO: @__llvm_profile_name_foo = hidden constant [3 x i8] c"foo", section "__DATA,__llvm_prf_names", align 1 +; ELF: @__llvm_profile_name_foo = hidden constant [3 x i8] c"foo", section "__llvm_prf_names", align 1 + +; MACHO: @__llvm_profile_counters_foo = hidden global [1 x i64] zeroinitializer, section "__DATA,__llvm_prf_cnts", align 8 +; ELF: @__llvm_profile_counters_foo = hidden global [1 x i64] zeroinitializer, section "__llvm_prf_cnts", align 8 + +; MACHO: @__llvm_profile_data_foo = hidden constant {{.*}}, section "__DATA,__llvm_prf_data", align 8 +; ELF: @__llvm_profile_data_foo = hidden constant {{.*}}, section "__llvm_prf_data", align 8 +define void @foo() { + call void @llvm.instrprof.increment(i8* getelementptr inbounds ([3 x i8]* @__llvm_profile_name_foo, i32 0, i32 0), i64 0, i32 1, i32 0) + ret void +} + +declare void @llvm.instrprof.increment(i8*, i64, i32, i32) + +;; Emit registration functions for platforms that don't find the +;; symbols by their sections. + +; MACHO-NOT: define internal void @__llvm_profile_register_functions +; ELF: define internal void @__llvm_profile_register_functions + +; MACHO-NOT: define internal void @__llvm_profile_init +; ELF: define internal void @__llvm_profile_init diff --git a/test/Instrumentation/InstrProfiling/profiling.ll b/test/Instrumentation/InstrProfiling/profiling.ll new file mode 100644 index 0000000..246bf6b --- /dev/null +++ b/test/Instrumentation/InstrProfiling/profiling.ll @@ -0,0 +1,38 @@ +; RUN: opt < %s -instrprof -S | FileCheck %s + +target triple = "x86_64-apple-macosx10.10.0" + +@__llvm_profile_name_foo = hidden constant [3 x i8] c"foo" +; CHECK: @__llvm_profile_name_foo = hidden constant [3 x i8] c"foo", section "__DATA,__llvm_prf_names", align 1 +@__llvm_profile_name_bar = hidden constant [4 x i8] c"bar\00" +; CHECK: @__llvm_profile_name_bar = hidden constant [4 x i8] c"bar\00", section "__DATA,__llvm_prf_names", align 1 +@baz_prof_name = hidden constant [3 x i8] c"baz" +; CHECK: @baz_prof_name = hidden constant [3 x i8] c"baz", section "__DATA,__llvm_prf_names", align 1 + +; CHECK: @__llvm_profile_counters_foo = hidden global [1 x i64] zeroinitializer, section "__DATA,__llvm_prf_cnts", align 8 +; CHECK: @__llvm_profile_data_foo = hidden constant {{.*}}, section "__DATA,__llvm_prf_data", align 8 +define void @foo() { + call void @llvm.instrprof.increment(i8* getelementptr inbounds ([3 x i8]* @__llvm_profile_name_foo, i32 0, i32 0), i64 0, i32 1, i32 0) + ret void +} + +; CHECK: @__llvm_profile_counters_bar = hidden global [1 x i64] zeroinitializer, section "__DATA,__llvm_prf_cnts", align 8 +; CHECK: @__llvm_profile_data_bar = hidden constant {{.*}}, section "__DATA,__llvm_prf_data", align 8 +define void @bar() { + call void @llvm.instrprof.increment(i8* getelementptr inbounds ([4 x i8]* @__llvm_profile_name_bar, i32 0, i32 0), i64 0, i32 1, i32 0) + ret void +} + +; CHECK: @__llvm_profile_counters_baz = hidden global [3 x i64] zeroinitializer, section "__DATA,__llvm_prf_cnts", align 8 +; CHECK: @__llvm_profile_data_baz = hidden constant {{.*}}, section "__DATA,__llvm_prf_data", align 8 +define void @baz() { + call void @llvm.instrprof.increment(i8* getelementptr inbounds ([3 x i8]* @baz_prof_name, i32 0, i32 0), i64 0, i32 3, i32 0) + call void @llvm.instrprof.increment(i8* getelementptr inbounds ([3 x i8]* @baz_prof_name, i32 0, i32 0), i64 0, i32 3, i32 1) + call void @llvm.instrprof.increment(i8* getelementptr inbounds ([3 x i8]* @baz_prof_name, i32 0, i32 0), i64 0, i32 3, i32 2) + ret void +} + +declare void @llvm.instrprof.increment(i8*, i64, i32, i32) + +; CHECK: @__llvm_profile_runtime = external global i32 +; CHECK: @llvm.used = appending global {{.*}} @__llvm_profile_data_foo {{.*}} @__llvm_profile_data_bar {{.*}} @__llvm_profile_data_baz {{.*}} section "llvm.metadata" diff --git a/test/Instrumentation/MemorySanitizer/atomics.ll b/test/Instrumentation/MemorySanitizer/atomics.ll index c8f3b88..28736ad 100644 --- a/test/Instrumentation/MemorySanitizer/atomics.ll +++ b/test/Instrumentation/MemorySanitizer/atomics.ll @@ -1,4 +1,6 @@ ; RUN: opt < %s -msan -msan-check-access-address=0 -S | FileCheck %s +; RUN: opt < %s -msan -msan-check-access-address=0 -msan-track-origins=1 -S | FileCheck %s +; RUN: opt < %s -msan -msan-check-access-address=0 -msan-track-origins=2 -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-S128" target triple = "x86_64-unknown-linux-gnu" diff --git a/test/Instrumentation/MemorySanitizer/check-constant-shadow.ll b/test/Instrumentation/MemorySanitizer/check-constant-shadow.ll index 11e4410..f147944 100644 --- a/test/Instrumentation/MemorySanitizer/check-constant-shadow.ll +++ b/test/Instrumentation/MemorySanitizer/check-constant-shadow.ll @@ -1,10 +1,11 @@ -; RUN: opt < %s -msan -msan-check-constant-shadow=1 -S | FileCheck %s +; RUN: opt < %s -msan -msan-check-access-address=0 -msan-check-constant-shadow=1 -msan-track-origins=1 -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-S128" target triple = "x86_64-unknown-linux-gnu" ; Test that returning a literal undef from main() triggers an MSan warning. +; main() is special: it inserts check for the return value define i32 @main() nounwind uwtable sanitize_memory { entry: ret i32 undef @@ -13,3 +14,40 @@ entry: ; CHECK-LABEL: @main ; CHECK: call void @__msan_warning_noreturn ; CHECK: ret i32 undef + + +; This function stores known initialized value. +; Expect 2 stores: one for the shadow (0), one for the value (42), but no origin. +define void @StoreConstant(i32* nocapture %p) nounwind uwtable sanitize_memory { +entry: + store i32 42, i32* %p, align 4 + ret void +} + +; CHECK-LABEL: @StoreConstant +; CHECK-NOT: store i32 +; CHECK: store i32 0, +; CHECK-NOT: store i32 +; CHECK: store i32 42, +; CHECK-NOT: store i32 +; CHECK: ret void + + +; This function stores known uninitialized value. +; Expect 3 stores: shadow, value and origin. +; Expect no icmp(s): everything here is unconditional. +define void @StoreUndef(i32* nocapture %p) nounwind uwtable sanitize_memory { +entry: + store i32 undef, i32* %p, align 4 + ret void +} + +; CHECK-LABEL: @StoreUndef +; CHECK-NOT: icmp +; CHECK: store i32 +; CHECK-NOT: icmp +; CHECK: store i32 +; CHECK-NOT: icmp +; CHECK: store i32 +; CHECK-NOT: icmp +; CHECK: ret void diff --git a/test/Instrumentation/MemorySanitizer/do-not-emit-module-limits.ll b/test/Instrumentation/MemorySanitizer/do-not-emit-module-limits.ll deleted file mode 100644 index 7d0a62a..0000000 --- a/test/Instrumentation/MemorySanitizer/do-not-emit-module-limits.ll +++ /dev/null @@ -1,21 +0,0 @@ -; Test that MSan does not emit undefined symbol __executable_start when it is -; not needed (i.e. without -msan-wrap-indirect-calls). - -; RUN: opt < %s -msan -S | FileCheck %s - -target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" - -; Function Attrs: nounwind uwtable -define void @_Z1fv() #0 { -entry: - ret void -} - -attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } - -!llvm.ident = !{!0} - -!0 = metadata !{metadata !"clang version 3.5.0 (208165)"} - -; CHECK-NOT: __executable_start diff --git a/test/Instrumentation/MemorySanitizer/missing_origin.ll b/test/Instrumentation/MemorySanitizer/missing_origin.ll index 673e853..f7385b9 100644 --- a/test/Instrumentation/MemorySanitizer/missing_origin.ll +++ b/test/Instrumentation/MemorySanitizer/missing_origin.ll @@ -17,3 +17,17 @@ entry: ; CHECK: [[A:%.*]] = load i32* {{.*}}@__msan_param_origin_tls, ; CHECK: store i32 [[A]], i32* @__msan_retval_origin_tls ; CHECK: ret <4 x i32> + + +; Regression test for origin propagation in "select i1, float, float". +; https://code.google.com/p/memory-sanitizer/issues/detail?id=78 + +define float @SelectFloat(i1 %b, float %x, float %y) nounwind uwtable sanitize_memory { +entry: + %z = select i1 %b, float %x, float %y + ret float %z +} + +; CHECK-LABEL: @SelectFloat( +; CHECK-NOT: select {{.*}} i32 0, i32 0 +; CHECK: ret float diff --git a/test/Instrumentation/MemorySanitizer/origin-alignment.ll b/test/Instrumentation/MemorySanitizer/origin-alignment.ll new file mode 100644 index 0000000..ce0dbfc --- /dev/null +++ b/test/Instrumentation/MemorySanitizer/origin-alignment.ll @@ -0,0 +1,73 @@ +; RUN: opt < %s -msan -msan-check-access-address=0 -msan-track-origins=1 -S | FileCheck -check-prefix=CHECK -check-prefix=CHECK-ORIGINS1 %s +; RUN: opt < %s -msan -msan-check-access-address=0 -msan-track-origins=2 -S | FileCheck -check-prefix=CHECK -check-prefix=CHECK-ORIGINS2 %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-S128" +target triple = "x86_64-unknown-linux-gnu" + + +; Check origin instrumentation of stores. +; Check that debug info for origin propagation code is set correctly. + +@a8 = global i8 0, align 8 +@a4 = global i8 0, align 4 +@a2 = global i8 0, align 2 +@a1 = global i8 0, align 1 + +; 8-aligned store => 8-aligned origin store, origin address is not realigned +define void @Store8(i8 %x) sanitize_memory { +entry: + store i8 %x, i8* @a8, align 8 + ret void +} + +; CHECK-LABEL: @Store8 +; CHECK-ORIGINS1: [[ORIGIN:%[01-9a-z]+]] = load {{.*}} @__msan_param_origin_tls +; CHECK-ORIGINS2: [[ORIGIN0:%[01-9a-z]+]] = load {{.*}} @__msan_param_origin_tls +; CHECK-ORIGINS2: [[ORIGIN:%[01-9a-z]+]] = call i32 @__msan_chain_origin(i32 [[ORIGIN0]]) +; CHECK: store i32 [[ORIGIN]], i32* inttoptr (i64 add (i64 and (i64 ptrtoint {{.*}} to i32*), align 8 +; CHECK: ret void + + +; 4-aligned store => 4-aligned origin store, origin address is not realigned +define void @Store4(i8 %x) sanitize_memory { +entry: + store i8 %x, i8* @a4, align 4 + ret void +} + +; CHECK-LABEL: @Store4 +; CHECK-ORIGINS1: [[ORIGIN:%[01-9a-z]+]] = load {{.*}} @__msan_param_origin_tls +; CHECK-ORIGINS2: [[ORIGIN0:%[01-9a-z]+]] = load {{.*}} @__msan_param_origin_tls +; CHECK-ORIGINS2: [[ORIGIN:%[01-9a-z]+]] = call i32 @__msan_chain_origin(i32 [[ORIGIN0]]) +; CHECK: store i32 [[ORIGIN]], i32* inttoptr (i64 add (i64 and (i64 ptrtoint {{.*}} to i32*), align 4 +; CHECK: ret void + + +; 2-aligned store => 4-aligned origin store, origin address is realigned +define void @Store2(i8 %x) sanitize_memory { +entry: + store i8 %x, i8* @a2, align 2 + ret void +} + +; CHECK-LABEL: @Store2 +; CHECK-ORIGINS1: [[ORIGIN:%[01-9a-z]+]] = load {{.*}} @__msan_param_origin_tls +; CHECK-ORIGINS2: [[ORIGIN0:%[01-9a-z]+]] = load {{.*}} @__msan_param_origin_tls +; CHECK-ORIGINS2: [[ORIGIN:%[01-9a-z]+]] = call i32 @__msan_chain_origin(i32 [[ORIGIN0]]) +; CHECK: store i32 [[ORIGIN]], i32* inttoptr (i64 and (i64 add (i64 and (i64 ptrtoint {{.*}} i64 -4) to i32*), align 4 +; CHECK: ret void + + +; 1-aligned store => 4-aligned origin store, origin address is realigned +define void @Store1(i8 %x) sanitize_memory { +entry: + store i8 %x, i8* @a1, align 1 + ret void +} + +; CHECK-LABEL: @Store1 +; CHECK-ORIGINS1: [[ORIGIN:%[01-9a-z]+]] = load {{.*}} @__msan_param_origin_tls +; CHECK-ORIGINS2: [[ORIGIN0:%[01-9a-z]+]] = load {{.*}} @__msan_param_origin_tls +; CHECK-ORIGINS2: [[ORIGIN:%[01-9a-z]+]] = call i32 @__msan_chain_origin(i32 [[ORIGIN0]]) +; CHECK: store i32 [[ORIGIN]], i32* inttoptr (i64 and (i64 add (i64 and (i64 ptrtoint {{.*}} i64 -4) to i32*), align 4 +; CHECK: ret void diff --git a/test/Instrumentation/MemorySanitizer/store-long-origin.ll b/test/Instrumentation/MemorySanitizer/store-long-origin.ll new file mode 100644 index 0000000..128f810 --- /dev/null +++ b/test/Instrumentation/MemorySanitizer/store-long-origin.ll @@ -0,0 +1,89 @@ +; RUN: opt < %s -msan -msan-check-access-address=0 -msan-track-origins=1 -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-S128" +target triple = "x86_64-unknown-linux-gnu" + + +; Test origin for longer stores. + +define void @Store8(i64* nocapture %p, i64 %x) sanitize_memory { +entry: + store i64 %x, i64* %p, align 8 + ret void +} + +; Single 8-byte origin store +; CHECK-LABEL: define void @Store8( +; CHECK: store i64 {{.*}}, align 8 +; CHECK: store i64 {{.*}}, align 8 +; CHECK: store i64 {{.*}}, align 8 +; CHECK: ret void + +define void @Store8_align4(i64* nocapture %p, i64 %x) sanitize_memory { +entry: + store i64 %x, i64* %p, align 4 + ret void +} + +; Two 4-byte origin stores +; CHECK-LABEL: define void @Store8_align4( +; CHECK: store i64 {{.*}}, align 4 +; CHECK: store i32 {{.*}}, align 4 +; CHECK: getelementptr i32* {{.*}}, i32 1 +; CHECK: store i32 {{.*}}, align 4 +; CHECK: store i64 {{.*}}, align 4 +; CHECK: ret void + +%struct.S = type { i32, i32, i32 } + +define void @StoreAgg(%struct.S* nocapture %p, %struct.S %x) sanitize_memory { +entry: + store %struct.S %x, %struct.S* %p, align 4 + ret void +} + +; Three 4-byte origin stores +; CHECK-LABEL: define void @StoreAgg( +; CHECK: store { i32, i32, i32 } {{.*}}, align 4 +; CHECK: store i32 {{.*}}, align 4 +; CHECK: getelementptr i32* {{.*}}, i32 1 +; CHECK: store i32 {{.*}}, align 4 +; CHECK: getelementptr i32* {{.*}}, i32 2 +; CHECK: store i32 {{.*}}, align 4 +; CHECK: store %struct.S {{.*}}, align 4 +; CHECK: ret void + + +define void @StoreAgg8(%struct.S* nocapture %p, %struct.S %x) sanitize_memory { +entry: + store %struct.S %x, %struct.S* %p, align 8 + ret void +} + +; 8-byte + 4-byte origin stores +; CHECK-LABEL: define void @StoreAgg8( +; CHECK: store { i32, i32, i32 } {{.*}}, align 8 +; CHECK: store i64 {{.*}}, align 8 +; CHECK: getelementptr i32* {{.*}}, i32 2 +; CHECK: store i32 {{.*}}, align 8 +; CHECK: store %struct.S {{.*}}, align 8 +; CHECK: ret void + + +%struct.Q = type { i64, i64, i64 } +define void @StoreAgg24(%struct.Q* nocapture %p, %struct.Q %x) sanitize_memory { +entry: + store %struct.Q %x, %struct.Q* %p, align 8 + ret void +} + +; 3 8-byte origin stores +; CHECK-LABEL: define void @StoreAgg24( +; CHECK: store { i64, i64, i64 } {{.*}}, align 8 +; CHECK: store i64 {{.*}}, align 8 +; CHECK: getelementptr i64* {{.*}}, i32 1 +; CHECK: store i64 {{.*}}, align 8 +; CHECK: getelementptr i64* {{.*}}, i32 2 +; CHECK: store i64 {{.*}}, align 8 +; CHECK: store %struct.Q {{.*}}, align 8 +; CHECK: ret void diff --git a/test/Instrumentation/MemorySanitizer/store-origin.ll b/test/Instrumentation/MemorySanitizer/store-origin.ll index bde4e90..c2948b1 100644 --- a/test/Instrumentation/MemorySanitizer/store-origin.ll +++ b/test/Instrumentation/MemorySanitizer/store-origin.ll @@ -11,8 +11,8 @@ target triple = "x86_64-unknown-linux-gnu" ; Function Attrs: nounwind define void @Store(i32* nocapture %p, i32 %x) #0 { entry: - tail call void @llvm.dbg.value(metadata !{i32* %p}, i64 0, metadata !11, metadata !{metadata !"0x102"}), !dbg !16 - tail call void @llvm.dbg.value(metadata !{i32 %x}, i64 0, metadata !12, metadata !{metadata !"0x102"}), !dbg !16 + tail call void @llvm.dbg.value(metadata i32* %p, i64 0, metadata !11, metadata !{!"0x102"}), !dbg !16 + tail call void @llvm.dbg.value(metadata i32 %x, i64 0, metadata !12, metadata !{!"0x102"}), !dbg !16 store i32 %x, i32* %p, align 4, !dbg !17, !tbaa !18 ret void, !dbg !22 } @@ -27,29 +27,29 @@ attributes #1 = { nounwind readnone } !llvm.module.flags = !{!13, !14} !llvm.ident = !{!15} -!0 = metadata !{metadata !"0x11\0012\00clang version 3.5.0 (204220)\001\00\000\00\001", metadata !1, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2} ; [ DW_TAG_compile_unit ] [/tmp/build0/../2.cc] [DW_LANG_C99] -!1 = metadata !{metadata !"../2.cc", metadata !"/tmp/build0"} -!2 = metadata !{} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !"0x2e\00Store\00Store\00\001\000\001\000\006\00256\001\001", metadata !1, metadata !5, metadata !6, null, void (i32*, i32)* @Store, null, null, metadata !10} ; [ DW_TAG_subprogram ] [line 1] [def] [Store] -!5 = metadata !{metadata !"0x29", metadata !1} ; [ DW_TAG_file_type ] [/tmp/build0/../2.cc] -!6 = metadata !{metadata !"0x15\00\000\000\000\000\000\000", i32 0, null, null, metadata !7, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!7 = metadata !{null, metadata !8, metadata !9} -!8 = metadata !{metadata !"0xf\00\000\0064\0064\000\000", null, null, metadata !9} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int] -!9 = metadata !{metadata !"0x24\00int\000\0032\0032\000\000\005", null, null} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] -!10 = metadata !{metadata !11, metadata !12} -!11 = metadata !{metadata !"0x101\00p\0016777217\000", metadata !4, metadata !5, metadata !8} ; [ DW_TAG_arg_variable ] [p] [line 1] -!12 = metadata !{metadata !"0x101\00x\0033554433\000", metadata !4, metadata !5, metadata !9} ; [ DW_TAG_arg_variable ] [x] [line 1] -!13 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} -!14 = metadata !{i32 1, metadata !"Debug Info Version", i32 2} -!15 = metadata !{metadata !"clang version 3.5.0 (204220)"} -!16 = metadata !{i32 1, i32 0, metadata !4, null} -!17 = metadata !{i32 2, i32 0, metadata !4, null} -!18 = metadata !{metadata !19, metadata !19, i64 0} -!19 = metadata !{metadata !"int", metadata !20, i64 0} -!20 = metadata !{metadata !"omnipotent char", metadata !21, i64 0} -!21 = metadata !{metadata !"Simple C/C++ TBAA"} -!22 = metadata !{i32 3, i32 0, metadata !4, null} +!0 = !{!"0x11\0012\00clang version 3.5.0 (204220)\001\00\000\00\001", !1, !2, !2, !3, !2, !2} ; [ DW_TAG_compile_unit ] [/tmp/build0/../2.cc] [DW_LANG_C99] +!1 = !{!"../2.cc", !"/tmp/build0"} +!2 = !{} +!3 = !{!4} +!4 = !{!"0x2e\00Store\00Store\00\001\000\001\000\006\00256\001\001", !1, !5, !6, null, void (i32*, i32)* @Store, null, null, !10} ; [ DW_TAG_subprogram ] [line 1] [def] [Store] +!5 = !{!"0x29", !1} ; [ DW_TAG_file_type ] [/tmp/build0/../2.cc] +!6 = !{!"0x15\00\000\000\000\000\000\000", i32 0, null, null, !7, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = !{null, !8, !9} +!8 = !{!"0xf\00\000\0064\0064\000\000", null, null, !9} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int] +!9 = !{!"0x24\00int\000\0032\0032\000\000\005", null, null} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = !{!11, !12} +!11 = !{!"0x101\00p\0016777217\000", !4, !5, !8} ; [ DW_TAG_arg_variable ] [p] [line 1] +!12 = !{!"0x101\00x\0033554433\000", !4, !5, !9} ; [ DW_TAG_arg_variable ] [x] [line 1] +!13 = !{i32 2, !"Dwarf Version", i32 4} +!14 = !{i32 1, !"Debug Info Version", i32 2} +!15 = !{!"clang version 3.5.0 (204220)"} +!16 = !MDLocation(line: 1, scope: !4) +!17 = !MDLocation(line: 2, scope: !4) +!18 = !{!19, !19, i64 0} +!19 = !{!"int", !20, i64 0} +!20 = !{!"omnipotent char", !21, i64 0} +!21 = !{!"Simple C/C++ TBAA"} +!22 = !MDLocation(line: 3, scope: !4) ; CHECK: @Store diff --git a/test/Instrumentation/MemorySanitizer/wrap_indirect_calls.ll b/test/Instrumentation/MemorySanitizer/wrap_indirect_calls.ll deleted file mode 100644 index 65037cb..0000000 --- a/test/Instrumentation/MemorySanitizer/wrap_indirect_calls.ll +++ /dev/null @@ -1,60 +0,0 @@ -; RUN: opt < %s -msan -msan-check-access-address=0 -msan-wrap-indirect-calls=zzz -msan-wrap-indirect-calls-fast=0 -S | FileCheck %s -; RUN: opt < %s -msan -msan-check-access-address=0 -msan-wrap-indirect-calls=zzz -msan-wrap-indirect-calls-fast=1 -S | FileCheck -check-prefix=CHECK-FAST %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-S128" -target triple = "x86_64-unknown-linux-gnu" - -; Test for -msan-wrap-indirect-calls functionality. -; Replaces indirect call to %f with a call to whatever is returned from the -; wrapper function. - -; This does not depend on the sanitize_memory attribute. -define i32 @func1(i32 (i32, i32)* nocapture %f, i32 %x, i32 %y) { -entry: - %call = tail call i32 %f(i32 %x, i32 %y) - ret i32 %call -} - -; CHECK: @func1 -; CHECK: bitcast i32 (i32, i32)* %f to void ()* -; CHECK: call void ()* (void ()*)* @zzz(void ()* -; CHECK: [[A:%[01-9a-z_.]+]] = bitcast void ()* {{.*}} to i32 (i32, i32)* -; CHECK: call i32 {{.*}}[[A]](i32 {{.*}}, i32 {{.*}}) -; CHECK: ret i32 - -; CHECK-FAST: @func1 -; CHECK-FAST: bitcast i32 (i32, i32)* %f to void ()* -; CHECK-FAST-DAG: icmp ult void ()* {{.*}}, bitcast (i32* @__executable_start to void ()*) -; CHECK-FAST-DAG: icmp uge void ()* {{.*}}, bitcast (i32* @_end to void ()*) -; CHECK-FAST: or i1 -; CHECK-FAST: br i1 -; CHECK-FAST: call void ()* (void ()*)* @zzz(void ()* -; CHECK-FAST: br label -; CHECK-FAST: [[A:%[01-9a-z_.]+]] = phi i32 (i32, i32)* [ %f, %entry ], [ {{.*}} ] -; CHECK-FAST: call i32 {{.*}}[[A]](i32 {{.*}}, i32 {{.*}}) -; CHECK-FAST: ret i32 - - -; The same test, but with a complex expression as the call target. - -declare i8* @callee(i32) - -define i8* @func2(i64 %x) #1 { -entry: - %call = tail call i8* bitcast (i8* (i32)* @callee to i8* (i64)*)(i64 %x) - ret i8* %call -} - -; CHECK: @func2 -; CHECK: call {{.*}} @zzz -; CHECK: [[A:%[01-9a-z_.]+]] = bitcast void ()* {{.*}} to i8* (i64)* -; CHECK: call i8* {{.*}}[[A]](i64 {{.*}}) -; CHECK: ret i8* - -; CHECK-FAST: @func2 -; CHECK-FAST: {{br i1 or .* icmp ult .* bitcast .* @callee .* @__executable_start.* icmp uge .* bitcast .* @callee .* @_end}} -; CHECK-FAST: {{call .* @zzz.* bitcast .*@callee}} -; CHECK-FAST: bitcast void ()* {{.*}} to i8* (i64)* -; CHECK-FAST: br label -; CHECK-FAST: [[A:%[01-9a-z_.]+]] = phi i8* (i64)* [{{.*bitcast .* @callee.*, %entry.*}}], [ {{.*}} ] -; CHECK-FAST: call i8* {{.*}}[[A]](i64 {{.*}}) -; CHECK-FAST: ret i8* diff --git a/test/Instrumentation/SanitizerCoverage/coverage-dbg.ll b/test/Instrumentation/SanitizerCoverage/coverage-dbg.ll index eea93b8..a1b23f1 100644 --- a/test/Instrumentation/SanitizerCoverage/coverage-dbg.ll +++ b/test/Instrumentation/SanitizerCoverage/coverage-dbg.ll @@ -15,8 +15,8 @@ ; and add sanitize_address to @_ZN1A1fEv ; Test that __sanitizer_cov call has !dbg pointing to the opening { of A::f(). -; CHECK: call void @__sanitizer_cov(), !dbg [[A:!.*]] -; CHECK: [[A]] = metadata !{i32 6, i32 0, metadata !{{.*}}, null} +; CHECK: call void @__sanitizer_cov(i32*{{.*}}), !dbg [[A:!.*]] +; CHECK: [[A]] = !MDLocation(line: 6, scope: !{{.*}}) target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" @@ -27,7 +27,7 @@ target triple = "x86_64-unknown-linux-gnu" ; Function Attrs: nounwind readonly uwtable define i32 @_ZN1A1fEv(%struct.A* nocapture readonly %this) #0 align 2 { entry: - tail call void @llvm.dbg.value(metadata !{%struct.A* %this}, i64 0, metadata !15, metadata !{metadata !"0x102"}), !dbg !20 + tail call void @llvm.dbg.value(metadata %struct.A* %this, i64 0, metadata !15, metadata !{!"0x102"}), !dbg !20 %x = getelementptr inbounds %struct.A* %this, i64 0, i32 0, !dbg !21 %0 = load i32* %x, align 4, !dbg !21 ret i32 %0, !dbg !21 @@ -43,25 +43,25 @@ attributes #1 = { nounwind readnone } !llvm.module.flags = !{!17, !18} !llvm.ident = !{!19} -!0 = metadata !{metadata !"0x11\004\00clang version 3.5.0 (210251)\001\00\000\00\001", metadata !1, metadata !2, metadata !3, metadata !12, metadata !2, metadata !2} ; [ DW_TAG_compile_unit ] [/code/llvm/build0/../1.cc] [DW_LANG_C_plus_plus] -!1 = metadata !{metadata !"../1.cc", metadata !"/code/llvm/build0"} -!2 = metadata !{} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !"0x13\00A\001\0032\0032\000\000\000", metadata !1, null, null, metadata !5, null, null, metadata !"_ZTS1A"} ; [ DW_TAG_structure_type ] [A] [line 1, size 32, align 32, offset 0] [def] [from ] -!5 = metadata !{metadata !6, metadata !8} -!6 = metadata !{metadata !"0xd\00x\003\0032\0032\000\000", metadata !1, metadata !"_ZTS1A", metadata !7} ; [ DW_TAG_member ] [x] [line 3, size 32, align 32, offset 0] [from int] -!7 = metadata !{metadata !"0x24\00int\000\0032\0032\000\000\005", null, null} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] -!8 = metadata !{metadata !"0x2e\00f\00f\00_ZN1A1fEv\002\000\000\000\006\00256\001\002", metadata !1, metadata !"_ZTS1A", metadata !9, null, null, null, i32 0, null} ; [ DW_TAG_subprogram ] [line 2] [f] -!9 = metadata !{metadata !"0x15\00\000\000\000\000\000\000", i32 0, null, null, metadata !10, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!10 = metadata !{metadata !7, metadata !11} -!11 = metadata !{metadata !"0xf\00\000\0064\0064\000\001088", null, null, metadata !"_ZTS1A"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from _ZTS1A] -!12 = metadata !{metadata !13} -!13 = metadata !{metadata !"0x2e\00f\00f\00_ZN1A1fEv\006\000\001\000\006\00256\001\006", metadata !1, metadata !"_ZTS1A", metadata !9, null, i32 (%struct.A*)* @_ZN1A1fEv, null, metadata !8, metadata !14} ; [ DW_TAG_subprogram ] [line 6] [def] [f] -!14 = metadata !{metadata !15} -!15 = metadata !{metadata !"0x101\00this\0016777216\001088", metadata !13, null, metadata !16} ; [ DW_TAG_arg_variable ] [this] [line 0] -!16 = metadata !{metadata !"0xf\00\000\0064\0064\000\000", null, null, metadata !"_ZTS1A"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from _ZTS1A] -!17 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} -!18 = metadata !{i32 2, metadata !"Debug Info Version", i32 2} -!19 = metadata !{metadata !"clang version 3.5.0 (210251)"} -!20 = metadata !{i32 0, i32 0, metadata !13, null} -!21 = metadata !{i32 7, i32 0, metadata !13, null} +!0 = !{!"0x11\004\00clang version 3.5.0 (210251)\001\00\000\00\001", !1, !2, !3, !12, !2, !2} ; [ DW_TAG_compile_unit ] [/code/llvm/build0/../1.cc] [DW_LANG_C_plus_plus] +!1 = !{!"../1.cc", !"/code/llvm/build0"} +!2 = !{} +!3 = !{!4} +!4 = !{!"0x13\00A\001\0032\0032\000\000\000", !1, null, null, !5, null, null, !"_ZTS1A"} ; [ DW_TAG_structure_type ] [A] [line 1, size 32, align 32, offset 0] [def] [from ] +!5 = !{!6, !8} +!6 = !{!"0xd\00x\003\0032\0032\000\000", !1, !"_ZTS1A", !7} ; [ DW_TAG_member ] [x] [line 3, size 32, align 32, offset 0] [from int] +!7 = !{!"0x24\00int\000\0032\0032\000\000\005", null, null} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!8 = !{!"0x2e\00f\00f\00_ZN1A1fEv\002\000\000\000\006\00256\001\002", !1, !"_ZTS1A", !9, null, null, null, i32 0, null} ; [ DW_TAG_subprogram ] [line 2] [f] +!9 = !{!"0x15\00\000\000\000\000\000\000", i32 0, null, null, !10, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!10 = !{!7, !11} +!11 = !{!"0xf\00\000\0064\0064\000\001088", null, null, !"_ZTS1A"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from _ZTS1A] +!12 = !{!13} +!13 = !{!"0x2e\00f\00f\00_ZN1A1fEv\006\000\001\000\006\00256\001\006", !1, !"_ZTS1A", !9, null, i32 (%struct.A*)* @_ZN1A1fEv, null, !8, !14} ; [ DW_TAG_subprogram ] [line 6] [def] [f] +!14 = !{!15} +!15 = !{!"0x101\00this\0016777216\001088", !13, null, !16} ; [ DW_TAG_arg_variable ] [this] [line 0] +!16 = !{!"0xf\00\000\0064\0064\000\000", null, null, !"_ZTS1A"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from _ZTS1A] +!17 = !{i32 2, !"Dwarf Version", i32 4} +!18 = !{i32 2, !"Debug Info Version", i32 2} +!19 = !{!"clang version 3.5.0 (210251)"} +!20 = !MDLocation(line: 0, scope: !13) +!21 = !MDLocation(line: 7, scope: !13) diff --git a/test/Instrumentation/SanitizerCoverage/coverage.ll b/test/Instrumentation/SanitizerCoverage/coverage.ll index da0498d..1595727 100644 --- a/test/Instrumentation/SanitizerCoverage/coverage.ll +++ b/test/Instrumentation/SanitizerCoverage/coverage.ll @@ -2,7 +2,7 @@ ; RUN: opt < %s -sancov -sanitizer-coverage-level=1 -S | FileCheck %s --check-prefix=CHECK1 ; RUN: opt < %s -sancov -sanitizer-coverage-level=2 -S | FileCheck %s --check-prefix=CHECK2 ; RUN: opt < %s -sancov -sanitizer-coverage-level=2 -sanitizer-coverage-block-threshold=10 -S | FileCheck %s --check-prefix=CHECK2 -; RUN: opt < %s -sancov -sanitizer-coverage-level=2 -sanitizer-coverage-block-threshold=1 -S | FileCheck %s --check-prefix=CHECK1 +; RUN: opt < %s -sancov -sanitizer-coverage-level=2 -sanitizer-coverage-block-threshold=1 -S | FileCheck %s --check-prefix=CHECK_WITH_CHECK ; RUN: opt < %s -sancov -sanitizer-coverage-level=3 -sanitizer-coverage-block-threshold=10 -S | FileCheck %s --check-prefix=CHECK3 ; RUN: opt < %s -sancov -sanitizer-coverage-level=4 -S | FileCheck %s --check-prefix=CHECK4 @@ -12,7 +12,7 @@ ; RUN: opt < %s -sancov -sanitizer-coverage-level=2 -sanitizer-coverage-block-threshold=10 \ ; RUN: -S | FileCheck %s --check-prefix=CHECK2 ; RUN: opt < %s -sancov -sanitizer-coverage-level=2 -sanitizer-coverage-block-threshold=1 \ -; RUN: -S | FileCheck %s --check-prefix=CHECK1 +; RUN: -S | FileCheck %s --check-prefix=CHECK_WITH_CHECK 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" @@ -29,33 +29,44 @@ entry: ret void } +; CHECK0-NOT: @llvm.global_ctors = {{.*}}{ i32 2, void ()* @sancov.module_ctor } +; CHECK1: @llvm.global_ctors = {{.*}}{ i32 2, void ()* @sancov.module_ctor } +; CHECK2: @llvm.global_ctors = {{.*}}{ i32 2, void ()* @sancov.module_ctor } + ; CHECK0-NOT: call void @__sanitizer_cov( ; CHECK0-NOT: call void @__sanitizer_cov_module_init( ; CHECK1-LABEL: define void @foo -; CHECK1: %0 = load atomic i8* @__sancov_gen_cov_foo monotonic, align 1 -; CHECK1: %1 = icmp eq i8 0, %0 +; CHECK1: %0 = load atomic i32* {{.*}} monotonic, align 4, !nosanitize +; CHECK1: %1 = icmp sge i32 0, %0 ; CHECK1: br i1 %1, label %2, label %3 -; CHECK1: call void @__sanitizer_cov +; CHECK1: call void @__sanitizer_cov(i32*{{.*}}) +; CHECK1: call void asm sideeffect "", ""() ; CHECK1-NOT: call void @__sanitizer_cov -; CHECK1: store atomic i8 1, i8* @__sancov_gen_cov_foo monotonic, align 1 +; CHECK1: ret void ; CHECK1-LABEL: define internal void @sancov.module_ctor ; CHECK1-NOT: ret -; CHECK1: call void @__sanitizer_cov_module_init(i64 2) +; CHECK1: call void @__sanitizer_cov_module_init({{.*}}, i64 2, ; CHECK1: ret +; CHECK_WITH_CHECK-LABEL: define void @foo +; CHECK_WITH_CHECK: __sanitizer_cov_with_check +; CHECK_WITH_CHECK: ret void ; CHECK2-LABEL: define void @foo ; CHECK2: call void @__sanitizer_cov +; CHECK2: call void asm sideeffect "", ""() ; CHECK2: call void @__sanitizer_cov +; CHECK2: call void asm sideeffect "", ""() ; CHECK2: call void @__sanitizer_cov +; CHECK2: call void asm sideeffect "", ""() ; CHECK2-NOT: call void @__sanitizer_cov ; CHECK2: ret void ; CHECK2-LABEL: define internal void @sancov.module_ctor ; CHECK2-NOT: ret -; CHECK2: call void @__sanitizer_cov_module_init(i64 4) +; CHECK2: call void @__sanitizer_cov_module_init({{.*}}, i64 4, ; CHECK2: ret ; CHECK3-LABEL: define void @foo diff --git a/test/Instrumentation/SanitizerCoverage/coverage2-dbg.ll b/test/Instrumentation/SanitizerCoverage/coverage2-dbg.ll index 9b26329..cb436a8 100644 --- a/test/Instrumentation/SanitizerCoverage/coverage2-dbg.ll +++ b/test/Instrumentation/SanitizerCoverage/coverage2-dbg.ll @@ -17,17 +17,17 @@ target triple = "x86_64-unknown-linux-gnu" ; Check that __sanitizer_cov call has !dgb pointing to the beginning ; of appropriate basic blocks. ; CHECK-LABEL:_Z3fooPi -; CHECK: call void @__sanitizer_cov(), !dbg [[A:!.*]] -; CHECK: call void @__sanitizer_cov(), !dbg [[B:!.*]] -; CHECK: call void @__sanitizer_cov(), !dbg [[C:!.*]] +; CHECK: call void @__sanitizer_cov(i32*{{.*}}), !dbg [[A:!.*]] +; CHECK: call void @__sanitizer_cov(i32*{{.*}}), !dbg [[B:!.*]] +; CHECK: call void @__sanitizer_cov(i32*{{.*}}), !dbg [[C:!.*]] ; CHECK: ret void -; CHECK: [[A]] = metadata !{i32 1, i32 0, metadata !{{.*}}, null} -; CHECK: [[B]] = metadata !{i32 3, i32 5, metadata !{{.*}}, null} -; CHECK: [[C]] = metadata !{i32 4, i32 1, metadata !{{.*}}, null} +; CHECK: [[A]] = !MDLocation(line: 1, scope: !{{.*}}) +; CHECK: [[B]] = !MDLocation(line: 3, column: 5, scope: !{{.*}}) +; CHECK: [[C]] = !MDLocation(line: 4, column: 1, scope: !{{.*}}) define void @_Z3fooPi(i32* %a) #0 { entry: - tail call void @llvm.dbg.value(metadata !{i32* %a}, i64 0, metadata !11, metadata !{metadata !"0x102"}), !dbg !15 + tail call void @llvm.dbg.value(metadata i32* %a, i64 0, metadata !11, metadata !{!"0x102"}), !dbg !15 %tobool = icmp eq i32* %a, null, !dbg !16 br i1 %tobool, label %if.end, label %if.then, !dbg !16 @@ -49,27 +49,27 @@ attributes #1 = { nounwind readnone } !llvm.module.flags = !{!12, !13} !llvm.ident = !{!14} -!0 = metadata !{metadata !"0x11\004\00clang version 3.6.0 (217079)\001\00\000\00\001", metadata !1, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2} ; [ DW_TAG_compile_unit ] [FOO/if.cc] [DW_LANG_C_plus_plus] -!1 = metadata !{metadata !"if.cc", metadata !"FOO"} -!2 = metadata !{} -!3 = metadata !{metadata !4} -!4 = metadata !{metadata !"0x2e\00foo\00foo\00_Z3fooPi\001\000\001\000\006\00256\001\001", metadata !1, metadata !5, metadata !6, null, void (i32*)* @_Z3fooPi, null, null, metadata !10} ; [ DW_TAG_subprogram ] [line 1] [def] [foo] -!5 = metadata !{metadata !"0x29", metadata !1} ; [ DW_TAG_file_type ] [FOO/if.cc] -!6 = metadata !{metadata !"0x15\00\000\000\000\000\000\000", i32 0, null, null, metadata !7, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] -!7 = metadata !{null, metadata !8} -!8 = metadata !{metadata !"0xf\00\000\0064\0064\000\000", null, null, metadata !9} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int] -!9 = metadata !{metadata !"0x24\00int\000\0032\0032\000\000\005", null, null} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] -!10 = metadata !{metadata !11} -!11 = metadata !{metadata !"0x101\00a\0016777217\000", metadata !4, metadata !5, metadata !8} ; [ DW_TAG_arg_variable ] [a] [line 1] -!12 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} -!13 = metadata !{i32 2, metadata !"Debug Info Version", i32 2} -!14 = metadata !{metadata !"clang version 3.6.0 (217079)"} -!15 = metadata !{i32 1, i32 15, metadata !4, null} -!16 = metadata !{i32 2, i32 7, metadata !17, null} -!17 = metadata !{metadata !"0xb\002\007\000", metadata !1, metadata !4} ; [ DW_TAG_lexical_block ] [FOO/if.cc] -!18 = metadata !{i32 3, i32 5, metadata !17, null} -!19 = metadata !{metadata !20, metadata !20, i64 0} -!20 = metadata !{metadata !"int", metadata !21, i64 0} -!21 = metadata !{metadata !"omnipotent char", metadata !22, i64 0} -!22 = metadata !{metadata !"Simple C/C++ TBAA"} -!23 = metadata !{i32 4, i32 1, metadata !4, null} +!0 = !{!"0x11\004\00clang version 3.6.0 (217079)\001\00\000\00\001", !1, !2, !2, !3, !2, !2} ; [ DW_TAG_compile_unit ] [FOO/if.cc] [DW_LANG_C_plus_plus] +!1 = !{!"if.cc", !"FOO"} +!2 = !{} +!3 = !{!4} +!4 = !{!"0x2e\00foo\00foo\00_Z3fooPi\001\000\001\000\006\00256\001\001", !1, !5, !6, null, void (i32*)* @_Z3fooPi, null, null, !10} ; [ DW_TAG_subprogram ] [line 1] [def] [foo] +!5 = !{!"0x29", !1} ; [ DW_TAG_file_type ] [FOO/if.cc] +!6 = !{!"0x15\00\000\000\000\000\000\000", i32 0, null, null, !7, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] +!7 = !{null, !8} +!8 = !{!"0xf\00\000\0064\0064\000\000", null, null, !9} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from int] +!9 = !{!"0x24\00int\000\0032\0032\000\000\005", null, null} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] +!10 = !{!11} +!11 = !{!"0x101\00a\0016777217\000", !4, !5, !8} ; [ DW_TAG_arg_variable ] [a] [line 1] +!12 = !{i32 2, !"Dwarf Version", i32 4} +!13 = !{i32 2, !"Debug Info Version", i32 2} +!14 = !{!"clang version 3.6.0 (217079)"} +!15 = !MDLocation(line: 1, column: 15, scope: !4) +!16 = !MDLocation(line: 2, column: 7, scope: !17) +!17 = !{!"0xb\002\007\000", !1, !4} ; [ DW_TAG_lexical_block ] [FOO/if.cc] +!18 = !MDLocation(line: 3, column: 5, scope: !17) +!19 = !{!20, !20, i64 0} +!20 = !{!"int", !21, i64 0} +!21 = !{!"omnipotent char", !22, i64 0} +!22 = !{!"Simple C/C++ TBAA"} +!23 = !MDLocation(line: 4, column: 1, scope: !4) diff --git a/test/Instrumentation/SanitizerCoverage/tracing.ll b/test/Instrumentation/SanitizerCoverage/tracing.ll index c39cb1c..8c3a6df 100644 --- a/test/Instrumentation/SanitizerCoverage/tracing.ll +++ b/test/Instrumentation/SanitizerCoverage/tracing.ll @@ -1,5 +1,5 @@ ; Test -sanitizer-coverage-experimental-tracing -; RUN: opt < %s -sancov -sanitizer-coverage-level=1 -sanitizer-coverage-experimental-tracing -S | FileCheck %s --check-prefix=CHECK1 +; RUN: opt < %s -sancov -sanitizer-coverage-level=2 -sanitizer-coverage-experimental-tracing -S | FileCheck %s --check-prefix=CHECK1 ; RUN: opt < %s -sancov -sanitizer-coverage-level=3 -sanitizer-coverage-experimental-tracing -S | FileCheck %s --check-prefix=CHECK3 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" diff --git a/test/Instrumentation/ThreadSanitizer/capture.ll b/test/Instrumentation/ThreadSanitizer/capture.ll new file mode 100644 index 0000000..d6c62f0 --- /dev/null +++ b/test/Instrumentation/ThreadSanitizer/capture.ll @@ -0,0 +1,91 @@ +; 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-S128" + +declare void @escape(i32*) + +@sink = global i32* null, align 4 + +define void @captured0() nounwind uwtable sanitize_thread { +entry: + %ptr = alloca i32, align 4 + ; escapes due to call + call void @escape(i32* %ptr) + store i32 42, i32* %ptr, align 4 + ret void +} +; CHECK-LABEL: define void @captured0 +; CHECK: __tsan_write +; CHECK: ret void + +define void @captured1() nounwind uwtable sanitize_thread { +entry: + %ptr = alloca i32, align 4 + ; escapes due to store into global + store i32* %ptr, i32** @sink, align 8 + store i32 42, i32* %ptr, align 4 + ret void +} +; CHECK-LABEL: define void @captured1 +; CHECK: __tsan_write +; CHECK: __tsan_write +; CHECK: ret void + +define void @captured2() nounwind uwtable sanitize_thread { +entry: + %ptr = alloca i32, align 4 + %tmp = alloca i32*, align 8 + ; transitive escape + store i32* %ptr, i32** %tmp, align 8 + %0 = load i32** %tmp, align 8 + store i32* %0, i32** @sink, align 8 + store i32 42, i32* %ptr, align 4 + ret void +} +; CHECK-LABEL: define void @captured2 +; CHECK: __tsan_write +; CHECK: __tsan_write +; CHECK: ret void + +define void @notcaptured0() nounwind uwtable sanitize_thread { +entry: + %ptr = alloca i32, align 4 + store i32 42, i32* %ptr, align 4 + ; escapes due to call + call void @escape(i32* %ptr) + ret void +} +; CHECK-LABEL: define void @notcaptured0 +; CHECK: __tsan_write +; CHECK: ret void + +define void @notcaptured1() nounwind uwtable sanitize_thread { +entry: + %ptr = alloca i32, align 4 + store i32 42, i32* %ptr, align 4 + ; escapes due to store into global + store i32* %ptr, i32** @sink, align 8 + ret void +} +; CHECK-LABEL: define void @notcaptured1 +; CHECK: __tsan_write +; CHECK: __tsan_write +; CHECK: ret void + +define void @notcaptured2() nounwind uwtable sanitize_thread { +entry: + %ptr = alloca i32, align 4 + %tmp = alloca i32*, align 8 + store i32 42, i32* %ptr, align 4 + ; transitive escape + store i32* %ptr, i32** %tmp, align 8 + %0 = load i32** %tmp, align 8 + store i32* %0, i32** @sink, align 8 + ret void +} +; CHECK-LABEL: define void @notcaptured2 +; CHECK: __tsan_write +; CHECK: __tsan_write +; CHECK: ret void + + diff --git a/test/Instrumentation/ThreadSanitizer/read_from_global.ll b/test/Instrumentation/ThreadSanitizer/read_from_global.ll index 33614a3..037dd56 100644 --- a/test/Instrumentation/ThreadSanitizer/read_from_global.ll +++ b/test/Instrumentation/ThreadSanitizer/read_from_global.ll @@ -54,6 +54,6 @@ entry: ; CHECK: = load ; CHECK: ret void -!0 = metadata !{metadata !"Simple C/C++ TBAA", null} -!1 = metadata !{metadata !"vtable pointer", metadata !0} -!2 = metadata !{metadata !1, metadata !1, i64 0} +!0 = !{!"Simple C/C++ TBAA", null} +!1 = !{!"vtable pointer", !0} +!2 = !{!1, !1, i64 0} diff --git a/test/Instrumentation/ThreadSanitizer/unaligned.ll b/test/Instrumentation/ThreadSanitizer/unaligned.ll new file mode 100644 index 0000000..7a240e3 --- /dev/null +++ b/test/Instrumentation/ThreadSanitizer/unaligned.ll @@ -0,0 +1,143 @@ +; 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-S128" + +define i16 @test_unaligned_read2(i16* %a) sanitize_thread { +entry: + %tmp1 = load i16* %a, align 1 + ret i16 %tmp1 +} + +; CHECK-LABEL: define i16 @test_unaligned_read2(i16* %a) +; CHECK: call void @__tsan_func_entry(i8* %0) +; CHECK-NEXT: %1 = bitcast i16* %a to i8* +; CHECK-NEXT: call void @__tsan_unaligned_read2(i8* %1) +; CHECK-NEXT: %tmp1 = load i16* %a, align 1 +; CHECK-NEXT: call void @__tsan_func_exit() +; CHECK: ret i16 + +define i32 @test_unaligned_read4(i32* %a) sanitize_thread { +entry: + %tmp1 = load i32* %a, align 2 + ret i32 %tmp1 +} + +; CHECK-LABEL: define i32 @test_unaligned_read4(i32* %a) +; CHECK: call void @__tsan_func_entry(i8* %0) +; CHECK-NEXT: %1 = bitcast i32* %a to i8* +; CHECK-NEXT: call void @__tsan_unaligned_read4(i8* %1) +; CHECK-NEXT: %tmp1 = load i32* %a, align 2 +; CHECK-NEXT: call void @__tsan_func_exit() +; CHECK: ret i32 + +define i64 @test_unaligned_read8(i64* %a) sanitize_thread { +entry: + %tmp1 = load i64* %a, align 4 + ret i64 %tmp1 +} + +; CHECK-LABEL: define i64 @test_unaligned_read8(i64* %a) +; CHECK: call void @__tsan_func_entry(i8* %0) +; CHECK-NEXT: %1 = bitcast i64* %a to i8* +; CHECK-NEXT: call void @__tsan_unaligned_read8(i8* %1) +; CHECK-NEXT: %tmp1 = load i64* %a, align 4 +; CHECK-NEXT: call void @__tsan_func_exit() +; CHECK: ret i64 + +define i128 @test_unaligned_read16(i128* %a) sanitize_thread { +entry: + %tmp1 = load i128* %a, align 1 + ret i128 %tmp1 +} + +; CHECK-LABEL: define i128 @test_unaligned_read16(i128* %a) +; CHECK: call void @__tsan_func_entry(i8* %0) +; CHECK-NEXT: %1 = bitcast i128* %a to i8* +; CHECK-NEXT: call void @__tsan_unaligned_read16(i8* %1) +; CHECK-NEXT: %tmp1 = load i128* %a, align 1 +; CHECK-NEXT: call void @__tsan_func_exit() +; CHECK: ret i128 + +define i128 @test_aligned_read16(i128* %a) sanitize_thread { +entry: + %tmp1 = load i128* %a, align 8 + ret i128 %tmp1 +} + +; CHECK-LABEL: define i128 @test_aligned_read16(i128* %a) +; CHECK: call void @__tsan_func_entry(i8* %0) +; CHECK-NEXT: %1 = bitcast i128* %a to i8* +; CHECK-NEXT: call void @__tsan_read16(i8* %1) +; CHECK-NEXT: %tmp1 = load i128* %a, align 8 +; CHECK-NEXT: call void @__tsan_func_exit() +; CHECK: ret i128 + +define void @test_unaligned_write2(i16* %a) sanitize_thread { +entry: + store i16 1, i16* %a, align 1 + ret void +} + +; CHECK-LABEL: define void @test_unaligned_write2(i16* %a) +; CHECK: call void @__tsan_func_entry(i8* %0) +; CHECK-NEXT: %1 = bitcast i16* %a to i8* +; CHECK-NEXT: call void @__tsan_unaligned_write2(i8* %1) +; CHECK-NEXT: store i16 1, i16* %a, align 1 +; CHECK-NEXT: call void @__tsan_func_exit() +; CHECK: ret void + +define void @test_unaligned_write4(i32* %a) sanitize_thread { +entry: + store i32 1, i32* %a, align 1 + ret void +} + +; CHECK-LABEL: define void @test_unaligned_write4(i32* %a) +; CHECK: call void @__tsan_func_entry(i8* %0) +; CHECK-NEXT: %1 = bitcast i32* %a to i8* +; CHECK-NEXT: call void @__tsan_unaligned_write4(i8* %1) +; CHECK-NEXT: store i32 1, i32* %a, align 1 +; CHECK-NEXT: call void @__tsan_func_exit() +; CHECK: ret void + +define void @test_unaligned_write8(i64* %a) sanitize_thread { +entry: + store i64 1, i64* %a, align 1 + ret void +} + +; CHECK-LABEL: define void @test_unaligned_write8(i64* %a) +; CHECK: call void @__tsan_func_entry(i8* %0) +; CHECK-NEXT: %1 = bitcast i64* %a to i8* +; CHECK-NEXT: call void @__tsan_unaligned_write8(i8* %1) +; CHECK-NEXT: store i64 1, i64* %a, align 1 +; CHECK-NEXT: call void @__tsan_func_exit() +; CHECK: ret void + +define void @test_unaligned_write16(i128* %a) sanitize_thread { +entry: + store i128 1, i128* %a, align 1 + ret void +} + +; CHECK-LABEL: define void @test_unaligned_write16(i128* %a) +; CHECK: call void @__tsan_func_entry(i8* %0) +; CHECK-NEXT: %1 = bitcast i128* %a to i8* +; CHECK-NEXT: call void @__tsan_unaligned_write16(i8* %1) +; CHECK-NEXT: store i128 1, i128* %a, align 1 +; CHECK-NEXT: call void @__tsan_func_exit() +; CHECK: ret void + +define void @test_aligned_write16(i128* %a) sanitize_thread { +entry: + store i128 1, i128* %a, align 8 + ret void +} + +; CHECK-LABEL: define void @test_aligned_write16(i128* %a) +; CHECK: call void @__tsan_func_entry(i8* %0) +; CHECK-NEXT: %1 = bitcast i128* %a to i8* +; CHECK-NEXT: call void @__tsan_write16(i8* %1) +; CHECK-NEXT: store i128 1, i128* %a, align 8 +; CHECK-NEXT: call void @__tsan_func_exit() +; CHECK: ret void diff --git a/test/Instrumentation/ThreadSanitizer/vptr_read.ll b/test/Instrumentation/ThreadSanitizer/vptr_read.ll index 811ad8d..cccdeb8 100644 --- a/test/Instrumentation/ThreadSanitizer/vptr_read.ll +++ b/test/Instrumentation/ThreadSanitizer/vptr_read.ll @@ -8,6 +8,6 @@ entry: %0 = load i8* %a, align 8, !tbaa !0 ret i8 %0 } -!0 = metadata !{metadata !2, metadata !2, i64 0} -!1 = metadata !{metadata !"Simple C/C++ TBAA", null} -!2 = metadata !{metadata !"vtable pointer", metadata !1} +!0 = !{!2, !2, i64 0} +!1 = !{!"Simple C/C++ TBAA", null} +!2 = !{!"vtable pointer", !1} diff --git a/test/Instrumentation/ThreadSanitizer/vptr_update.ll b/test/Instrumentation/ThreadSanitizer/vptr_update.ll index 83d28b6..78f7f31 100644 --- a/test/Instrumentation/ThreadSanitizer/vptr_update.ll +++ b/test/Instrumentation/ThreadSanitizer/vptr_update.ll @@ -35,6 +35,6 @@ entry: ret void } -!0 = metadata !{metadata !2, metadata !2, i64 0} -!1 = metadata !{metadata !"Simple C/C++ TBAA", null} -!2 = metadata !{metadata !"vtable pointer", metadata !1} +!0 = !{!2, !2, i64 0} +!1 = !{!"Simple C/C++ TBAA", null} +!2 = !{!"vtable pointer", !1} |