// UNSUPPORTED: windows
// The sanitizer-windows bot is saying:
// instrprof-write-buffer-internal.c.tmp.buf.profraw: Invalid instrumentation profile data (file header is corrupt)

// RUN: rm -f %t.buf.profraw %t.profraw
// RUN: %clang_profgen -w -o %t %s
// RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t %t.buf.profraw
// RUN: llvm-profdata show %t.buf.profraw | FileCheck %s -check-prefix=WRITE-BUFFER
// RUN: not llvm-profdata show %t.profraw 2>&1 | FileCheck %s -check-prefix=ALREADY-DUMPED

// WRITE-BUFFER: Instrumentation level: Front-end
// WRITE-BUFFER: Total functions: 1
// WRITE-BUFFER: Maximum function count: 1
// WRITE-BUFFER: Maximum internal block count: 0

// ALREADY-DUMPED: error: {{.+}}: empty raw profile file

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

const void *__llvm_profile_begin_data(void);
const void *__llvm_profile_end_data(void);
const char *__llvm_profile_begin_names(void);
const char *__llvm_profile_end_names(void);
uint64_t *__llvm_profile_begin_counters(void);
uint64_t *__llvm_profile_end_counters(void);

uint64_t __llvm_profile_get_size_for_buffer_internal(
    const void *DataBegin, const void *DataEnd,
    const uint64_t *CountersBegin, const uint64_t *CountersEnd,
    const char *NamesBegin, const char *NamesEnd);

int __llvm_profile_write_buffer_internal(
    char *Buffer, const void *DataBegin,
    const void *DataEnd, const uint64_t *CountersBegin,
    const uint64_t *CountersEnd, const char *NamesBegin,
    const char *NamesEnd);

void __llvm_profile_set_dumped(void);

int main(int argc, const char *argv[]) {
  uint64_t bufsize = __llvm_profile_get_size_for_buffer_internal(
      __llvm_profile_begin_data(), __llvm_profile_end_data(),
      __llvm_profile_begin_counters(), __llvm_profile_end_counters(),
      __llvm_profile_begin_names(), __llvm_profile_end_names());

  char *buf = malloc(bufsize);
  int ret = __llvm_profile_write_buffer_internal(buf,
      __llvm_profile_begin_data(), __llvm_profile_end_data(),
      __llvm_profile_begin_counters(), __llvm_profile_end_counters(),
      __llvm_profile_begin_names(), __llvm_profile_end_names());

  if (ret != 0) {
    fprintf(stderr, "failed to write buffer");
    return ret;
  }

  FILE *f = fopen(argv[1], "w");
  fwrite(buf, bufsize, 1, f);
  fclose(f);
  free(buf);

  __llvm_profile_set_dumped();

  return 0;
}
