brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · a994588 Raw
94 lines · c
1// RUN: %clang_pgogen -O2 -mllvm -pgo-function-entry-coverage -o %t %s2// RUN: %run %t %t.profraw 1 13// RUN: llvm-profdata show --all-functions --counts %t.profraw  | FileCheck %s4 5// FIXME: llvm-profdata exits with "Malformed instrumentation profile data"6// XFAIL: target={{.*windows.*}}7 8#include "profile_test.h"9#include <stdint.h>10#include <stdio.h>11#include <stdlib.h>12 13int __llvm_profile_runtime = 0;14uint64_t __llvm_profile_get_size_for_buffer(void);15int __llvm_profile_write_buffer(char *);16void __llvm_profile_reset_counters(void);17int __llvm_profile_merge_from_buffer(const char *, uint64_t);18 19__attribute__((noinline)) int dumpBuffer(const char *FileN, const char *Buffer,20                                         uint64_t Size) {21  FILE *File = fopen(FileN, "w");22  if (!File)23    return 1;24  if (fwrite(Buffer, 1, Size, File) != Size)25    return 1;26  return fclose(File);27}28 29int g = 0;30__attribute__((noinline)) void foo(char c) {31  if (c == '1')32    g++;33  else34    g--;35}36 37/* This function is not profiled */38__attribute__((noinline)) void bar(int M) { g += M; }39 40int main(int argc, const char *argv[]) {41  int i;42  if (argc < 4)43    return 1;44 45  const uint64_t MaxSize = 10000;46  static ALIGNED(sizeof(uint64_t)) char Buffer[MaxSize];47 48  uint64_t Size = __llvm_profile_get_size_for_buffer();49  if (Size > MaxSize)50    return 1;51 52  /* Start profiling. */53  __llvm_profile_reset_counters();54  foo(argv[2][0]);55  /* End profiling by freezing counters. */56  if (__llvm_profile_write_buffer(Buffer))57    return 1;58 59  /* Its profile will be discarded. */60  for (i = 0; i < 10; i++)61    bar(1);62 63  /* Start profiling again and merge in previously64     saved counters in buffer. */65  __llvm_profile_reset_counters();66  __llvm_profile_merge_from_buffer(Buffer, Size);67  foo(argv[3][0]);68  /* End profiling */69  if (__llvm_profile_write_buffer(Buffer))70    return 1;71 72  /* Its profile will be discarded. */73  bar(2);74 75  /* Now it is time to dump the profile to file.  */76  return dumpBuffer(argv[1], Buffer, Size);77}78 79// CHECK-LABEL: dumpBuffer:80// CHECK:        Counters: 181// CHECK-NEXT:    Block counts: [0]82 83// CHECK-LABEL:  foo:84// CHECK:         Counters: 185// CHECK-NEXT:    Block counts: [1]86 87// CHECK-LABEL:  bar:88// CHECK:         Counters: 189// CHECK-NEXT:    Block counts: [0]90 91// CHECK-LABEL:  main:92// CHECK:         Counters: 193// CHECK-NEXT:    Block counts: [0]94