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