12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines/*===- InstrProfiling.h- Support library for PGO instrumentation ----------===*\
22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines|*
32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines|*                     The LLVM Compiler Infrastructure
42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines|*
52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines|* This file is distributed under the University of Illinois Open Source
62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines|* License. See LICENSE.TXT for details.
72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines|*
82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines\*===----------------------------------------------------------------------===*/
92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifndef PROFILE_INSTRPROFILING_H_
112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define PROFILE_INSTRPROFILING_H_
122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if defined(__FreeBSD__) && defined(__i386__)
142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines/* System headers define 'size_t' incorrectly on x64 FreeBSD (prior to
162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines * FreeBSD 10, r232261) when compiled in 32-bit mode.
172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines */
182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define PRIu64 "llu"
192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef unsigned int uint32_t;
202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef unsigned long long uint64_t;
212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef uint32_t uintptr_t;
222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else /* defined(__FreeBSD__) && defined(__i386__) */
242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <inttypes.h>
262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdint.h>
272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif /* defined(__FreeBSD__) && defined(__i386__) */
292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define PROFILE_HEADER_SIZE 7
312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef struct __llvm_profile_data {
332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  const uint32_t NameSize;
342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  const uint32_t NumCounters;
352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  const uint64_t FuncHash;
362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  const char *const Name;
372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  uint64_t *const Counters;
382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} __llvm_profile_data;
392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines/*!
412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines * \brief Get required size for profile buffer.
422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines */
432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesuint64_t __llvm_profile_get_size_for_buffer(void);
442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines/*!
462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines * \brief Write instrumentation data to the given buffer.
472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines *
482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines * \pre \c Buffer is the start of a buffer at least as big as \a
492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines * __llvm_profile_get_size_for_buffer().
502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines */
512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint __llvm_profile_write_buffer(char *Buffer);
522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
536d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesconst __llvm_profile_data *__llvm_profile_begin_data(void);
546d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesconst __llvm_profile_data *__llvm_profile_end_data(void);
556d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesconst char *__llvm_profile_begin_names(void);
566d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesconst char *__llvm_profile_end_names(void);
576d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesuint64_t *__llvm_profile_begin_counters(void);
586d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesuint64_t *__llvm_profile_end_counters(void);
592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines/*!
612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines * \brief Write instrumentation data to the current file.
622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines *
632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines * Writes to the file with the last name given to \a __llvm_profile_set_filename(),
642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines * or if it hasn't been called, the \c LLVM_PROFILE_FILE environment variable,
652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines * or if that's not set, \c "default.profdata".
662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines */
672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint __llvm_profile_write_file(void);
682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines/*!
702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines * \brief Set the filename for writing instrumentation data.
712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines *
722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines * Sets the filename to be used for subsequent calls to
732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines * \a __llvm_profile_write_file().
742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines *
752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines * \c Name is not copied, so it must remain valid.  Passing NULL resets the
762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines * filename logic to the default behaviour.
772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines */
782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __llvm_profile_set_filename(const char *Name);
792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines/*! \brief Register to write instrumentation data to file at exit. */
812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint __llvm_profile_register_write_file_atexit(void);
822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines/*! \brief Initialize file handling. */
842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __llvm_profile_initialize_file(void);
852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines/*! \brief Get the magic token for the file format. */
872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesuint64_t __llvm_profile_get_magic(void);
882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines/*! \brief Get the version of the file format. */
902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesuint64_t __llvm_profile_get_version(void);
912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif /* PROFILE_INSTRPROFILING_H_ */
93