161f2f256Sjoerg // RUN: %clang_profgen -DCHECK_SYMBOLS -O3 -o %t.symbols %s
261f2f256Sjoerg // RUN: llvm-nm %t.symbols | FileCheck %s --check-prefix=CHECK-SYMBOLS
361f2f256Sjoerg // RUN: %clang_profgen -O3 -o %t %s
461f2f256Sjoerg // RUN: %run %t %t.profraw
561f2f256Sjoerg // RUN: llvm-profdata merge -o %t.profdata %t.profraw
661f2f256Sjoerg // RUN: %clang_profuse=%t.profdata -o - -S -emit-llvm %s | FileCheck %s
761f2f256Sjoerg
861f2f256Sjoerg #include <stdint.h>
961f2f256Sjoerg #include <stdlib.h>
1061f2f256Sjoerg
1161f2f256Sjoerg #ifndef CHECK_SYMBOLS
1261f2f256Sjoerg #include <stdio.h>
1361f2f256Sjoerg #endif
1461f2f256Sjoerg
1561f2f256Sjoerg int __llvm_profile_runtime = 0;
1661f2f256Sjoerg uint64_t __llvm_profile_get_size_for_buffer(void);
1761f2f256Sjoerg int __llvm_profile_write_buffer(char *);
1861f2f256Sjoerg int write_buffer(uint64_t, const char *);
main(int argc,const char * argv[])1961f2f256Sjoerg int main(int argc, const char *argv[]) {
20*ef84fd3bSjoerg // CHECK-LABEL: define {{.*}} @main(
21*ef84fd3bSjoerg // CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}, !prof ![[PD1:[0-9]+]]
2261f2f256Sjoerg if (argc < 2)
2361f2f256Sjoerg return 1;
2461f2f256Sjoerg
2561f2f256Sjoerg const uint64_t MaxSize = 10000;
2661f2f256Sjoerg static char Buffer[MaxSize];
2761f2f256Sjoerg
2861f2f256Sjoerg uint64_t Size = __llvm_profile_get_size_for_buffer();
2961f2f256Sjoerg if (Size > MaxSize)
3061f2f256Sjoerg return 1;
3161f2f256Sjoerg int Write = __llvm_profile_write_buffer(Buffer);
3261f2f256Sjoerg if (__llvm_profile_write_buffer(Buffer))
3361f2f256Sjoerg return Write;
3461f2f256Sjoerg
3561f2f256Sjoerg #ifdef CHECK_SYMBOLS
3661f2f256Sjoerg // Don't write it out. Since we're checking the symbols, we don't have libc
3761f2f256Sjoerg // available.
3861f2f256Sjoerg return 0;
3961f2f256Sjoerg #else
4061f2f256Sjoerg // Actually write it out so we can FileCheck the output.
4161f2f256Sjoerg FILE *File = fopen(argv[1], "w");
4261f2f256Sjoerg if (!File)
4361f2f256Sjoerg return 1;
4461f2f256Sjoerg if (fwrite(Buffer, 1, Size, File) != Size)
4561f2f256Sjoerg return 1;
4661f2f256Sjoerg return fclose(File);
4761f2f256Sjoerg #endif
4861f2f256Sjoerg }
49*ef84fd3bSjoerg // CHECK: ![[PD1]] = !{!"branch_weights", i32 1, i32 2}
5061f2f256Sjoerg
5161f2f256Sjoerg // CHECK-SYMBOLS-NOT: ___cxx_global_var_init
5261f2f256Sjoerg // CHECK-SYMBOLS-NOT: ___llvm_profile_register_write_file_atexit
5361f2f256Sjoerg // CHECK-SYMBOLS-NOT: ___llvm_profile_set_filename
5461f2f256Sjoerg // CHECK-SYMBOLS-NOT: ___llvm_profile_write_file
5561f2f256Sjoerg // CHECK-SYMBOLS-NOT: _fdopen
5661f2f256Sjoerg // CHECK-SYMBOLS-NOT: _fopen
5761f2f256Sjoerg // CHECK-SYMBOLS-NOT: _fwrite
5861f2f256Sjoerg // CHECK-SYMBOLS-NOT: _getenv
59*ef84fd3bSjoerg // CHECK-SYMBOLS-NOT: getenv
6061f2f256Sjoerg // CHECK-SYMBOLS-NOT: _malloc
61*ef84fd3bSjoerg // CHECK-SYMBOLS-NOT: malloc
62*ef84fd3bSjoerg // CHECK-SYMBOLS-NOT: _calloc
63*ef84fd3bSjoerg // CHECK-SYMBOLS-NOT: calloc
64*ef84fd3bSjoerg // CHECK-SYMBOLS-NOT: _free
65*ef84fd3bSjoerg // CHECK-SYMBOLS-NOT: free
6661f2f256Sjoerg // CHECK-SYMBOLS-NOT: _open
67