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