1c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN: %clang_profgen -O2 -o %t %s
2c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN: %run %t %t.profraw 1 1
3c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN: llvm-profdata show --all-functions --counts %t.profraw  | FileCheck %s
4c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
5c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include <stdint.h>
6c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include <stdio.h>
7c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#include <stdlib.h>
8c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
9c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarint __llvm_profile_runtime = 0;
10c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainaruint64_t __llvm_profile_get_size_for_buffer(void);
11c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarint __llvm_profile_write_buffer(char *);
12c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarvoid __llvm_profile_reset_counters(void);
13c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarvoid __llvm_profile_merge_from_buffer(const char *, uint64_t);
14c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
15c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarint dumpBuffer(const char *FileN, const char *Buffer, uint64_t Size) {
16c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  FILE *File = fopen(FileN, "w");
17c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  if (!File)
18c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    return 1;
19c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  if (fwrite(Buffer, 1, Size, File) != Size)
20c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    return 1;
21c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  return fclose(File);
22c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar}
23c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
24c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarint g = 0;
25c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarvoid foo(char c) {
26c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  if (c == '1')
27c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    g++;
28c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  else
29c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    g--;
30c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar}
31c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
32c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar/* This function is not profiled */
33c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarvoid bar(int M) { g += M; }
34c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
35c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarint main(int argc, const char *argv[]) {
36c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  int i;
37c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  if (argc < 4)
38c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    return 1;
39c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
40c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  const uint64_t MaxSize = 10000;
41c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  static char Buffer[MaxSize];
42c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
43c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  uint64_t Size = __llvm_profile_get_size_for_buffer();
44c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  if (Size > MaxSize)
45c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    return 1;
46c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
47c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  /* Start profiling. */
48c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  __llvm_profile_reset_counters();
49c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  foo(argv[2][0]);
50c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  /* End profiling by freezing counters. */
51c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  if (__llvm_profile_write_buffer(Buffer))
52c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    return 1;
53c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
54c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  /* Its profile will be discarded. */
55c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  for (i = 0; i < 10; i++)
56c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    bar(1);
57c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
58c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  /* Start profiling again and merge in previously
59c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar     saved counters in buffer. */
60c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  __llvm_profile_reset_counters();
61c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  __llvm_profile_merge_from_buffer(Buffer, Size);
62c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  foo(argv[3][0]);
63c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  /* End profiling */
64c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  if (__llvm_profile_write_buffer(Buffer))
65c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    return 1;
66c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
67c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  /* Its profile will be discarded. */
68c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  bar(2);
69c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
70c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  /* Now it is time to dump the profile to file.  */
71c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  return dumpBuffer(argv[1], Buffer, Size);
72c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar}
73c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
74c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// Not profiled
75c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK-LABEL: dumpBuffer:
76c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK:        Counters: 3
77c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK-NEXT:   Function count: 0
78c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK-NEXT:   Block counts: [0, 0]
79c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
80c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// Profiled with entry count == 2
81c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK-LABEL:  foo:
82c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK:         Counters: 2
83c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK-NEXT:    Function count: 2
84c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK-NEXT:    Block counts: [2]
85c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
86c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// Not profiled
87c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK-LABEL:  bar:
88c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK:         Counters: 1
89c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK-NEXT     Function count: 0
90c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK-NEXT     Block counts: []
91c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
92c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// Not profiled
93c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK-LABEL:  main:
94c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK:         Counters: 6
95c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK-NEXT:    Function count: 0
96c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// CHECK-NEXT:    Block counts: [0, 0, 0, 0, 0]
97