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