blob: dd0c9cd4e09afb3e87183098ec6a7292d4813fc0 [file] [log] [blame]
Duncan P. N. Exon Smith8353a262014-03-19 22:10:27 +00001/*===- InstrProfiling.h- Support library for PGO instrumentation ----------===*\
2|*
3|* The LLVM Compiler Infrastructure
4|*
5|* This file is distributed under the University of Illinois Open Source
6|* License. See LICENSE.TXT for details.
7|*
8\*===----------------------------------------------------------------------===*/
9
Duncan P. N. Exon Smithbe0a5e12014-03-21 18:29:15 +000010#ifndef PROFILE_INSTRPROFILING_H__
11#define PROFILE_INSTRPROFILING_H__
12
Duncan P. N. Exon Smith8353a262014-03-19 22:10:27 +000013#define I386_FREEBSD (defined(__FreeBSD__) && defined(__i386__))
14
15#if !I386_FREEBSD
16#include <inttypes.h>
17#endif
18
19#if !defined(_MSC_VER) && !I386_FREEBSD
20#include <stdint.h>
21#endif
22
23#if defined(_MSC_VER)
24typedef unsigned int uint32_t;
25typedef unsigned long long uint64_t;
26#elif I386_FREEBSD
27/* System headers define 'size_t' incorrectly on x64 FreeBSD (prior to
28 * FreeBSD 10, r232261) when compiled in 32-bit mode.
29 */
30#define PRIu64 "llu"
31typedef unsigned int uint32_t;
32typedef unsigned long long uint64_t;
33#endif
34
Duncan P. N. Exon Smith812dcae2014-03-21 18:29:24 +000035#define PROFILE_HEADER_SIZE 7
36
Duncan P. N. Exon Smith9edbae02014-03-20 20:00:44 +000037typedef struct __llvm_profile_data {
Duncan P. N. Exon Smith8353a262014-03-19 22:10:27 +000038 const uint32_t NameSize;
39 const uint32_t NumCounters;
40 const uint64_t FuncHash;
41 const char *const Name;
Duncan P. N. Exon Smithf1212172014-03-20 19:44:31 +000042 uint64_t *const Counters;
Duncan P. N. Exon Smith9edbae02014-03-20 20:00:44 +000043} __llvm_profile_data;
Duncan P. N. Exon Smith8353a262014-03-19 22:10:27 +000044
Duncan P. N. Exon Smithcf4bb962014-03-21 18:29:19 +000045/*!
46 * \brief Get required size for profile buffer.
47 */
48uint64_t __llvm_profile_get_size_for_buffer(void);
Duncan P. N. Exon Smith8353a262014-03-19 22:10:27 +000049
50/*!
51 * \brief Write instrumentation data to the given buffer.
52 *
Duncan P. N. Exon Smithcf4bb962014-03-21 18:29:19 +000053 * \pre \c Buffer is the start of a buffer at least as big as \a
54 * __llvm_profile_get_size_for_buffer().
Duncan P. N. Exon Smith8353a262014-03-19 22:10:27 +000055 */
Duncan P. N. Exon Smithcf4bb962014-03-21 18:29:19 +000056int __llvm_profile_write_buffer(char *Buffer);
Duncan P. N. Exon Smithda0de8a22014-03-20 03:23:10 +000057
Duncan P. N. Exon Smith71704752014-03-20 20:55:00 +000058const __llvm_profile_data *__llvm_profile_data_begin(void);
59const __llvm_profile_data *__llvm_profile_data_end(void);
60const char *__llvm_profile_names_begin(void);
61const char *__llvm_profile_names_end(void);
62uint64_t *__llvm_profile_counters_begin(void);
63uint64_t *__llvm_profile_counters_end(void);
Duncan P. N. Exon Smithbe0a5e12014-03-21 18:29:15 +000064
65#define PROFILE_RANGE_SIZE(Range) \
66 (__llvm_profile_ ## Range ## _end() - __llvm_profile_ ## Range ## _begin())
67
68/*!
69 * \brief Write instrumentation data to the current file.
70 *
71 * Writes to the file with the last name given to \a __llvm_profile_set_filename(),
72 * or if it hasn't been called, the \c LLVM_PROFILE_FILE environment variable,
73 * or if that's not set, \c "default.profdata".
74 */
75int __llvm_profile_write_file(void);
76
77/*!
78 * \brief Set the filename for writing instrumentation data.
79 *
80 * Sets the filename to be used for subsequent calls to
81 * \a __llvm_profile_write_file().
82 *
83 * \c Name is not copied, so it must remain valid. Passing NULL resets the
84 * filename logic to the default behaviour.
85 */
86void __llvm_profile_set_filename(const char *Name);
87
88/*! \brief Register to write instrumentation data to file at exit. */
89int __llvm_profile_register_write_file_atexit(void);
90
91/*! \brief Get the magic token for the file format. */
92uint64_t __llvm_profile_get_magic(void);
93
94/*! \brief Get the version of the file format. */
95uint64_t __llvm_profile_get_version(void);
96
97#endif /* PROFILE_INSTRPROFILING_H__ */