diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-05-09 23:14:58 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-05-09 23:14:58 +0000 |
commit | 18d66b3c136a821b8aadabcd666f578da97a545b (patch) | |
tree | 8a76a917ad1f6b94c9c9d5121572e81e83769e17 /test/profile/instrprof-write-file.c | |
parent | 2e8e44123a1af21beacf1190fc9f9c8104088c5f (diff) |
InstrProf: Test the functions in the runtime
Check that the profile runtime works as expected. This tests the
functions that are meant to be available to advanced users.
In particular, check that the `atexit()` hook can be disabled by
defining a custom `__llvm_profile_runtime` variable, that the libc
dependencies are optional, and that the various functions for writing
out files work for basic cases.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@208460 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/profile/instrprof-write-file.c')
-rw-r--r-- | test/profile/instrprof-write-file.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/test/profile/instrprof-write-file.c b/test/profile/instrprof-write-file.c new file mode 100644 index 000000000..f5c2958e5 --- /dev/null +++ b/test/profile/instrprof-write-file.c @@ -0,0 +1,34 @@ +// RUN: %clang_profgen -o %t -O3 %s +// RUN: env LLVM_PROFILE_FILE=%t1.profraw %run %t %t2.profraw +// RUN: llvm-profdata merge -o %t1.profdata %t1.profraw +// RUN: %clang_profuse=%t1.profdata -o - -S -emit-llvm %s | FileCheck %s --check-prefix=CHECK1 --check-prefix=CHECK +// RUN: llvm-profdata merge -o %t2.profdata %t2.profraw +// RUN: %clang_profuse=%t2.profdata -o - -S -emit-llvm %s | FileCheck %s --check-prefix=CHECK2 --check-prefix=CHECK + +int __llvm_profile_write_file(void); +void __llvm_profile_set_filename(const char *); +int foo(int); +int main(int argc, const char *argv[]) { + // CHECK-LABEL: define i32 @main + // CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}, !prof !1 + if (argc < 2) + return 1; + + // Write out the profile. + __llvm_profile_write_file(); + + // Change the profile. + int Ret = foo(0); + + // It'll write out again at exit; change the filename so we get two files. + __llvm_profile_set_filename(argv[1]); + return Ret; +} +int foo(int X) { + // CHECK-LABEL: define i32 @foo + // CHECK1: br i1 %{{.*}}, label %{{.*}}, label %{{[^,]+$}} + // CHECK2: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}, !prof !2 + return X <= 0 ? -X : X; +} +// CHECK: !1 = metadata !{metadata !"branch_weights", i32 1, i32 2} +// CHECK2: !2 = metadata !{metadata !"branch_weights", i32 2, i32 1} |