xref: /netbsd-src/sys/external/bsd/compiler_rt/dist/lib/profile/InstrProfilingInternal.h (revision ef84fd3bd8895f4e6be1e38baf19e6dc3255bc64)
1*ef84fd3bSjoerg /*===- InstrProfiling.h- Support library for PGO instrumentation ----------===*\
2*ef84fd3bSjoerg |*
3*ef84fd3bSjoerg |*                     The LLVM Compiler Infrastructure
4*ef84fd3bSjoerg |*
5*ef84fd3bSjoerg |* This file is distributed under the University of Illinois Open Source
6*ef84fd3bSjoerg |* License. See LICENSE.TXT for details.
7*ef84fd3bSjoerg |*
8*ef84fd3bSjoerg \*===----------------------------------------------------------------------===*/
9*ef84fd3bSjoerg 
10*ef84fd3bSjoerg #ifndef PROFILE_INSTRPROFILING_INTERNALH_
11*ef84fd3bSjoerg #define PROFILE_INSTRPROFILING_INTERNALH_
12*ef84fd3bSjoerg 
13*ef84fd3bSjoerg #include "InstrProfiling.h"
14*ef84fd3bSjoerg #include "stddef.h"
15*ef84fd3bSjoerg 
16*ef84fd3bSjoerg /*!
17*ef84fd3bSjoerg  * \brief Write instrumentation data to the given buffer, given explicit
18*ef84fd3bSjoerg  * pointers to the live data in memory.  This function is probably not what you
19*ef84fd3bSjoerg  * want.  Use __llvm_profile_get_size_for_buffer instead.  Use this function if
20*ef84fd3bSjoerg  * your program has a custom memory layout.
21*ef84fd3bSjoerg  */
22*ef84fd3bSjoerg uint64_t __llvm_profile_get_size_for_buffer_internal(
23*ef84fd3bSjoerg     const __llvm_profile_data *DataBegin, const __llvm_profile_data *DataEnd,
24*ef84fd3bSjoerg     const uint64_t *CountersBegin, const uint64_t *CountersEnd,
25*ef84fd3bSjoerg     const char *NamesBegin, const char *NamesEnd);
26*ef84fd3bSjoerg 
27*ef84fd3bSjoerg /*!
28*ef84fd3bSjoerg  * \brief Write instrumentation data to the given buffer, given explicit
29*ef84fd3bSjoerg  * pointers to the live data in memory.  This function is probably not what you
30*ef84fd3bSjoerg  * want.  Use __llvm_profile_write_buffer instead.  Use this function if your
31*ef84fd3bSjoerg  * program has a custom memory layout.
32*ef84fd3bSjoerg  *
33*ef84fd3bSjoerg  * \pre \c Buffer is the start of a buffer at least as big as \a
34*ef84fd3bSjoerg  * __llvm_profile_get_size_for_buffer_internal().
35*ef84fd3bSjoerg  */
36*ef84fd3bSjoerg int __llvm_profile_write_buffer_internal(
37*ef84fd3bSjoerg     char *Buffer, const __llvm_profile_data *DataBegin,
38*ef84fd3bSjoerg     const __llvm_profile_data *DataEnd, const uint64_t *CountersBegin,
39*ef84fd3bSjoerg     const uint64_t *CountersEnd, const char *NamesBegin, const char *NamesEnd);
40*ef84fd3bSjoerg 
41*ef84fd3bSjoerg /*!
42*ef84fd3bSjoerg  * The data structure describing the data to be written by the
43*ef84fd3bSjoerg  * low level writer callback function.
44*ef84fd3bSjoerg  */
45*ef84fd3bSjoerg typedef struct ProfDataIOVec {
46*ef84fd3bSjoerg   const void *Data;
47*ef84fd3bSjoerg   size_t ElmSize;
48*ef84fd3bSjoerg   size_t NumElm;
49*ef84fd3bSjoerg } ProfDataIOVec;
50*ef84fd3bSjoerg 
51*ef84fd3bSjoerg typedef uint32_t (*WriterCallback)(ProfDataIOVec *, uint32_t NumIOVecs,
52*ef84fd3bSjoerg                                    void **WriterCtx);
53*ef84fd3bSjoerg 
54*ef84fd3bSjoerg /*!
55*ef84fd3bSjoerg  * The data structure for buffered IO of profile data.
56*ef84fd3bSjoerg  */
57*ef84fd3bSjoerg typedef struct ProfBufferIO {
58*ef84fd3bSjoerg   /* File handle.  */
59*ef84fd3bSjoerg   void *File;
60*ef84fd3bSjoerg   /* Low level IO callback. */
61*ef84fd3bSjoerg   WriterCallback FileWriter;
62*ef84fd3bSjoerg   /* The start of the buffer. */
63*ef84fd3bSjoerg   uint8_t *BufferStart;
64*ef84fd3bSjoerg   /* Total size of the buffer. */
65*ef84fd3bSjoerg   uint32_t BufferSz;
66*ef84fd3bSjoerg   /* Current byte offset from the start of the buffer. */
67*ef84fd3bSjoerg   uint32_t CurOffset;
68*ef84fd3bSjoerg } ProfBufferIO;
69*ef84fd3bSjoerg 
70*ef84fd3bSjoerg /* The creator interface used by testing.  */
71*ef84fd3bSjoerg ProfBufferIO *llvmCreateBufferIOInternal(void *File, uint32_t DefaultBufferSz);
72*ef84fd3bSjoerg /*!
73*ef84fd3bSjoerg  * This is the interface to create a handle for buffered IO.
74*ef84fd3bSjoerg  */
75*ef84fd3bSjoerg ProfBufferIO *llvmCreateBufferIO(WriterCallback FileWriter, void *File,
76*ef84fd3bSjoerg                                  uint32_t DefaultBufferSz);
77*ef84fd3bSjoerg /*!
78*ef84fd3bSjoerg  * The interface to destroy the bufferIO handle and reclaim
79*ef84fd3bSjoerg  * the memory.
80*ef84fd3bSjoerg  */
81*ef84fd3bSjoerg void llvmDeleteBufferIO(ProfBufferIO *BufferIO);
82*ef84fd3bSjoerg 
83*ef84fd3bSjoerg /*!
84*ef84fd3bSjoerg  * This is the interface to write \c Data of \c Size bytes through
85*ef84fd3bSjoerg  * \c BufferIO. Returns 0 if successful, otherwise return -1.
86*ef84fd3bSjoerg  */
87*ef84fd3bSjoerg int llvmBufferIOWrite(ProfBufferIO *BufferIO, const uint8_t *Data,
88*ef84fd3bSjoerg                       uint32_t Size);
89*ef84fd3bSjoerg /*!
90*ef84fd3bSjoerg  * The interface to flush the remaining data in the buffer.
91*ef84fd3bSjoerg  * through the low level writer callback.
92*ef84fd3bSjoerg  */
93*ef84fd3bSjoerg int llvmBufferIOFlush(ProfBufferIO *BufferIO);
94*ef84fd3bSjoerg 
95*ef84fd3bSjoerg /* The low level interface to write data into a buffer. It is used as the
96*ef84fd3bSjoerg  * callback by other high level writer methods such as buffered IO writer
97*ef84fd3bSjoerg  * and profile data writer.  */
98*ef84fd3bSjoerg uint32_t llvmBufferWriter(ProfDataIOVec *IOVecs, uint32_t NumIOVecs,
99*ef84fd3bSjoerg                           void **WriterCtx);
100*ef84fd3bSjoerg 
101*ef84fd3bSjoerg int llvmWriteProfData(WriterCallback Writer, void *WriterCtx,
102*ef84fd3bSjoerg                       struct ValueProfData **ValueDataArray,
103*ef84fd3bSjoerg                       const uint64_t ValueDataSize);
104*ef84fd3bSjoerg int llvmWriteProfDataImpl(WriterCallback Writer, void *WriterCtx,
105*ef84fd3bSjoerg                           const __llvm_profile_data *DataBegin,
106*ef84fd3bSjoerg                           const __llvm_profile_data *DataEnd,
107*ef84fd3bSjoerg                           const uint64_t *CountersBegin,
108*ef84fd3bSjoerg                           const uint64_t *CountersEnd,
109*ef84fd3bSjoerg                           struct ValueProfData **ValueDataBeginArray,
110*ef84fd3bSjoerg                           const uint64_t ValueDataSize, const char *NamesBegin,
111*ef84fd3bSjoerg                           const char *NamesEnd);
112*ef84fd3bSjoerg 
113*ef84fd3bSjoerg extern char *(*GetEnvHook)(const char *);
114*ef84fd3bSjoerg extern void (*FreeHook)(void *);
115*ef84fd3bSjoerg extern void* (*CallocHook)(size_t, size_t);
116*ef84fd3bSjoerg extern uint32_t VPBufferSize;
117*ef84fd3bSjoerg 
118*ef84fd3bSjoerg #endif
119