summaryrefslogtreecommitdiff
path: root/test/profile/instrprof-write-file.c
diff options
context:
space:
mode:
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>2014-05-09 23:14:58 +0000
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>2014-05-09 23:14:58 +0000
commit18d66b3c136a821b8aadabcd666f578da97a545b (patch)
tree8a76a917ad1f6b94c9c9d5121572e81e83769e17 /test/profile/instrprof-write-file.c
parent2e8e44123a1af21beacf1190fc9f9c8104088c5f (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.c34
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}