12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clang_profgen -DCHECK_SYMBOLS -O3 -o %t.symbols %s 22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: llvm-nm %t.symbols | FileCheck %s --check-prefix=CHECK-SYMBOLS 32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clang_profgen -O3 -o %t %s 42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %run %t %t.profraw 52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: llvm-profdata merge -o %t.profdata %t.profraw 62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clang_profuse=%t.profdata -o - -S -emit-llvm %s | FileCheck %s 72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdint.h> 92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdlib.h> 102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifndef CHECK_SYMBOLS 122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdio.h> 132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint __llvm_profile_runtime = 0; 162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesuint64_t __llvm_profile_get_size_for_buffer(void); 172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint __llvm_profile_write_buffer(char *); 182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint write_buffer(uint64_t, const char *); 192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint main(int argc, const char *argv[]) { 202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // CHECK-LABEL: define i32 @main( 212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}, !prof !1 222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (argc < 2) 232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return 1; 242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines const uint64_t MaxSize = 10000; 262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines static char Buffer[MaxSize]; 272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint64_t Size = __llvm_profile_get_size_for_buffer(); 292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (Size > MaxSize) 302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return 1; 312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int Write = __llvm_profile_write_buffer(Buffer); 322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (__llvm_profile_write_buffer(Buffer)) 332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return Write; 342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef CHECK_SYMBOLS 362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // Don't write it out. Since we're checking the symbols, we don't have libc 372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // available. 382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return 0; 392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // Actually write it out so we can FileCheck the output. 412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines FILE *File = fopen(argv[1], "w"); 422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (!File) 432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return 1; 442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (fwrite(Buffer, 1, Size, File) != Size) 452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return 1; 462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return fclose(File); 472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK: !1 = metadata !{metadata !"branch_weights", i32 1, i32 2} 502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-SYMBOLS-NOT: ___cxx_global_var_init 522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-SYMBOLS-NOT: ___llvm_profile_register_write_file_atexit 532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-SYMBOLS-NOT: ___llvm_profile_set_filename 542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-SYMBOLS-NOT: ___llvm_profile_write_file 552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-SYMBOLS-NOT: _fdopen 562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-SYMBOLS-NOT: _fopen 572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-SYMBOLS-NOT: _fwrite 582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-SYMBOLS-NOT: _getenv 592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-SYMBOLS-NOT: _malloc 602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-SYMBOLS-NOT: _open 61