123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- /*===- InstrProfiling.h- Support library for PGO instrumentation ----------===*\
- |*
- |* Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- |* See https://llvm.org/LICENSE.txt for license information.
- |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- |*
- \*===----------------------------------------------------------------------===*/
- #ifndef PROFILE_INSTRPROFILING_INTERNALH_
- #define PROFILE_INSTRPROFILING_INTERNALH_
- #include <stddef.h>
- #include "InstrProfiling.h"
- /*!
- * \brief Write instrumentation data to the given buffer, given explicit
- * pointers to the live data in memory. This function is probably not what you
- * want. Use __llvm_profile_get_size_for_buffer instead. Use this function if
- * your program has a custom memory layout.
- */
- uint64_t __llvm_profile_get_size_for_buffer_internal(
- const __llvm_profile_data *DataBegin, const __llvm_profile_data *DataEnd,
- const char *CountersBegin, const char *CountersEnd, const char *NamesBegin,
- const char *NamesEnd);
- /*!
- * \brief Write instrumentation data to the given buffer, given explicit
- * pointers to the live data in memory. This function is probably not what you
- * want. Use __llvm_profile_write_buffer instead. Use this function if your
- * program has a custom memory layout.
- *
- * \pre \c Buffer is the start of a buffer at least as big as \a
- * __llvm_profile_get_size_for_buffer_internal().
- */
- int __llvm_profile_write_buffer_internal(
- char *Buffer, const __llvm_profile_data *DataBegin,
- const __llvm_profile_data *DataEnd, const char *CountersBegin,
- const char *CountersEnd, const char *NamesBegin, const char *NamesEnd);
- /*!
- * The data structure describing the data to be written by the
- * low level writer callback function.
- *
- * If \ref ProfDataIOVec.Data is null, and \ref ProfDataIOVec.UseZeroPadding is
- * 0, the write is skipped (the writer simply advances ElmSize*NumElm bytes).
- *
- * If \ref ProfDataIOVec.Data is null, and \ref ProfDataIOVec.UseZeroPadding is
- * nonzero, ElmSize*NumElm zero bytes are written.
- */
- typedef struct ProfDataIOVec {
- const void *Data;
- size_t ElmSize;
- size_t NumElm;
- int UseZeroPadding;
- } ProfDataIOVec;
- struct ProfDataWriter;
- typedef uint32_t (*WriterCallback)(struct ProfDataWriter *This, ProfDataIOVec *,
- uint32_t NumIOVecs);
- typedef struct ProfDataWriter {
- WriterCallback Write;
- void *WriterCtx;
- } ProfDataWriter;
- /*!
- * The data structure for buffered IO of profile data.
- */
- typedef struct ProfBufferIO {
- ProfDataWriter *FileWriter;
- uint32_t OwnFileWriter;
- /* The start of the buffer. */
- uint8_t *BufferStart;
- /* Total size of the buffer. */
- uint32_t BufferSz;
- /* Current byte offset from the start of the buffer. */
- uint32_t CurOffset;
- } ProfBufferIO;
- /* The creator interface used by testing. */
- ProfBufferIO *lprofCreateBufferIOInternal(void *File, uint32_t BufferSz);
- /*!
- * This is the interface to create a handle for buffered IO.
- */
- ProfBufferIO *lprofCreateBufferIO(ProfDataWriter *FileWriter);
- /*!
- * The interface to destroy the bufferIO handle and reclaim
- * the memory.
- */
- void lprofDeleteBufferIO(ProfBufferIO *BufferIO);
- /*!
- * This is the interface to write \c Data of \c Size bytes through
- * \c BufferIO. Returns 0 if successful, otherwise return -1.
- */
- int lprofBufferIOWrite(ProfBufferIO *BufferIO, const uint8_t *Data,
- uint32_t Size);
- /*!
- * The interface to flush the remaining data in the buffer.
- * through the low level writer callback.
- */
- int lprofBufferIOFlush(ProfBufferIO *BufferIO);
- /* The low level interface to write data into a buffer. It is used as the
- * callback by other high level writer methods such as buffered IO writer
- * and profile data writer. */
- uint32_t lprofBufferWriter(ProfDataWriter *This, ProfDataIOVec *IOVecs,
- uint32_t NumIOVecs);
- void initBufferWriter(ProfDataWriter *BufferWriter, char *Buffer);
- struct ValueProfData;
- struct ValueProfRecord;
- struct InstrProfValueData;
- struct ValueProfNode;
- /*!
- * The class that defines a set of methods to read value profile
- * data for streaming/serialization from the instrumentation runtime.
- */
- typedef struct VPDataReaderType {
- uint32_t (*InitRTRecord)(const __llvm_profile_data *Data,
- uint8_t *SiteCountArray[]);
- /* Function pointer to getValueProfRecordHeader method. */
- uint32_t (*GetValueProfRecordHeaderSize)(uint32_t NumSites);
- /* Function pointer to getFristValueProfRecord method. */
- struct ValueProfRecord *(*GetFirstValueProfRecord)(struct ValueProfData *);
- /* Return the number of value data for site \p Site. */
- uint32_t (*GetNumValueDataForSite)(uint32_t VK, uint32_t Site);
- /* Return the total size of the value profile data of the
- * current function. */
- uint32_t (*GetValueProfDataSize)(void);
- /*!
- * Read the next \p N value data for site \p Site and store the data
- * in \p Dst. \p StartNode is the first value node to start with if
- * it is not null. The function returns the pointer to the value
- * node pointer to be used as the \p StartNode of the next batch reading.
- * If there is nothing left, it returns NULL.
- */
- struct ValueProfNode *(*GetValueData)(uint32_t ValueKind, uint32_t Site,
- struct InstrProfValueData *Dst,
- struct ValueProfNode *StartNode,
- uint32_t N);
- } VPDataReaderType;
- /* Write profile data to destination. If SkipNameDataWrite is set to 1,
- the name data is already in destination, we just skip over it. */
- int lprofWriteData(ProfDataWriter *Writer, VPDataReaderType *VPDataReader,
- int SkipNameDataWrite);
- int lprofWriteDataImpl(ProfDataWriter *Writer,
- const __llvm_profile_data *DataBegin,
- const __llvm_profile_data *DataEnd,
- const char *CountersBegin, const char *CountersEnd,
- VPDataReaderType *VPDataReader, const char *NamesBegin,
- const char *NamesEnd, int SkipNameDataWrite);
- /* Merge value profile data pointed to by SrcValueProfData into
- * in-memory profile counters pointed by to DstData. */
- void lprofMergeValueProfData(struct ValueProfData *SrcValueProfData,
- __llvm_profile_data *DstData);
- VPDataReaderType *lprofGetVPDataReader();
- /* Internal interface used by test to reset the max number of
- * tracked values per value site to be \p MaxVals.
- */
- void lprofSetMaxValsPerSite(uint32_t MaxVals);
- void lprofSetupValueProfiler();
- /* Return the profile header 'signature' value associated with the current
- * executable or shared library. The signature value can be used to for
- * a profile name that is unique to this load module so that it does not
- * collide with profiles from other binaries. It also allows shared libraries
- * to dump merged profile data into its own profile file. */
- uint64_t lprofGetLoadModuleSignature();
- /*
- * Return non zero value if the profile data has already been
- * dumped to the file.
- */
- unsigned lprofProfileDumped(void);
- void lprofSetProfileDumped(unsigned);
- COMPILER_RT_VISIBILITY extern void (*FreeHook)(void *);
- COMPILER_RT_VISIBILITY extern uint8_t *DynamicBufferIOBuffer;
- COMPILER_RT_VISIBILITY extern uint32_t VPBufferSize;
- COMPILER_RT_VISIBILITY extern uint32_t VPMaxNumValsPerSite;
- /* Pointer to the start of static value counters to be allocted. */
- COMPILER_RT_VISIBILITY extern ValueProfNode *CurrentVNode;
- COMPILER_RT_VISIBILITY extern ValueProfNode *EndVNode;
- extern void (*VPMergeHook)(struct ValueProfData *, __llvm_profile_data *);
- /*
- * Write binary ids into profiles if writer is given.
- * Return -1 if an error occurs, otherwise, return total size of binary ids.
- */
- int __llvm_write_binary_ids(ProfDataWriter *Writer);
- #endif
|