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