xref: /freebsd/contrib/llvm-project/compiler-rt/lib/profile/InstrProfiling.h (revision 1db9f3b21e39176dd5b67cf8ac378633b172463e)
1 /*===- InstrProfiling.h- Support library for PGO instrumentation ----------===*\
2 |*
3 |* Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 |* See https://llvm.org/LICENSE.txt for license information.
5 |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 |*
7 \*===----------------------------------------------------------------------===*/
8 
9 #ifndef PROFILE_INSTRPROFILING_H_
10 #define PROFILE_INSTRPROFILING_H_
11 
12 #include "InstrProfilingPort.h"
13 #include <stdio.h>
14 
15 #define INSTR_PROF_VISIBILITY COMPILER_RT_VISIBILITY
16 #include "profile/InstrProfData.inc"
17 
18 enum ValueKind {
19 #define VALUE_PROF_KIND(Enumerator, Value, Descr) Enumerator = Value,
20 #include "profile/InstrProfData.inc"
21 };
22 
23 typedef void *IntPtrT;
24 typedef struct COMPILER_RT_ALIGNAS(INSTR_PROF_DATA_ALIGNMENT)
25     __llvm_profile_data {
26 #define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer) Type Name;
27 #include "profile/InstrProfData.inc"
28 } __llvm_profile_data;
29 
30 typedef struct __llvm_profile_header {
31 #define INSTR_PROF_RAW_HEADER(Type, Name, Initializer) Type Name;
32 #include "profile/InstrProfData.inc"
33 } __llvm_profile_header;
34 
35 typedef struct ValueProfNode * PtrToNodeT;
36 typedef struct ValueProfNode {
37 #define INSTR_PROF_VALUE_NODE(Type, LLVMType, Name, Initializer) Type Name;
38 #include "profile/InstrProfData.inc"
39 } ValueProfNode;
40 
41 /*!
42  * \brief Return 1 if profile counters are continuously synced to the raw
43  * profile via an mmap(). This is in contrast to the default mode, in which
44  * the raw profile is written out at program exit time.
45  */
46 int __llvm_profile_is_continuous_mode_enabled(void);
47 
48 /*!
49  * \brief Enable continuous mode.
50  *
51  * See \ref __llvm_profile_is_continuous_mode_enabled. The behavior is undefined
52  * if continuous mode is already enabled, or if it cannot be enable due to
53  * conflicting options.
54  */
55 void __llvm_profile_enable_continuous_mode(void);
56 
57 /*!
58  * \brief Disable continuous mode.
59  *
60  */
61 void __llvm_profile_disable_continuous_mode(void);
62 
63 /*!
64  * \brief Set the page size.
65  *
66  * This is a pre-requisite for enabling continuous mode. The buffer size
67  * calculation code inside of libprofile cannot simply call getpagesize(), as
68  * it is not allowed to depend on libc.
69  */
70 void __llvm_profile_set_page_size(unsigned PageSize);
71 
72 /*!
73  * \brief Get number of bytes necessary to pad the argument to eight
74  * byte boundary.
75  */
76 uint8_t __llvm_profile_get_num_padding_bytes(uint64_t SizeInBytes);
77 
78 /*!
79  * \brief Get required size for profile buffer.
80  */
81 uint64_t __llvm_profile_get_size_for_buffer(void);
82 
83 /*!
84  * \brief Write instrumentation data to the given buffer.
85  *
86  * \pre \c Buffer is the start of a buffer at least as big as \a
87  * __llvm_profile_get_size_for_buffer().
88  */
89 int __llvm_profile_write_buffer(char *Buffer);
90 
91 const __llvm_profile_data *__llvm_profile_begin_data(void);
92 const __llvm_profile_data *__llvm_profile_end_data(void);
93 const char *__llvm_profile_begin_names(void);
94 const char *__llvm_profile_end_names(void);
95 char *__llvm_profile_begin_counters(void);
96 char *__llvm_profile_end_counters(void);
97 char *__llvm_profile_begin_bitmap(void);
98 char *__llvm_profile_end_bitmap(void);
99 ValueProfNode *__llvm_profile_begin_vnodes();
100 ValueProfNode *__llvm_profile_end_vnodes();
101 uint32_t *__llvm_profile_begin_orderfile();
102 
103 /*!
104  * \brief Clear profile counters to zero.
105  *
106  */
107 void __llvm_profile_reset_counters(void);
108 
109 /*!
110  * \brief Merge profile data from buffer.
111  *
112  * Read profile data from buffer \p Profile and merge with in-process profile
113  * counters and bitmaps. The client is expected to have checked or already
114  * know the profile data in the buffer matches the in-process counter
115  * structure before calling it. Returns 0 (success) if the profile data is
116  * valid. Upon reading invalid/corrupted profile data, returns 1 (failure).
117  */
118 int __llvm_profile_merge_from_buffer(const char *Profile, uint64_t Size);
119 
120 /*! \brief Check if profile in buffer matches the current binary.
121  *
122  *  Returns 0 (success) if the profile data in buffer \p Profile with size
123  *  \p Size was generated by the same binary and therefore matches
124  *  structurally the in-process counters and bitmaps. If the profile data in
125  *  buffer is not compatible, the interface returns 1 (failure).
126  */
127 int __llvm_profile_check_compatibility(const char *Profile,
128                                        uint64_t Size);
129 
130 /*!
131  * \brief Counts the number of times a target value is seen.
132  *
133  * Records the target value for the CounterIndex if not seen before. Otherwise,
134  * increments the counter associated w/ the target value.
135  * void __llvm_profile_instrument_target(uint64_t TargetValue, void *Data,
136  *                                       uint32_t CounterIndex);
137  */
138 void INSTR_PROF_VALUE_PROF_FUNC(
139 #define VALUE_PROF_FUNC_PARAM(ArgType, ArgName, ArgLLVMType) ArgType ArgName
140 #include "profile/InstrProfData.inc"
141     );
142 
143 void __llvm_profile_instrument_target_value(uint64_t TargetValue, void *Data,
144                                             uint32_t CounterIndex,
145                                             uint64_t CounterValue);
146 
147 /*!
148  * \brief Write instrumentation data to the current file.
149  *
150  * Writes to the file with the last name given to \a *
151  * __llvm_profile_set_filename(),
152  * or if it hasn't been called, the \c LLVM_PROFILE_FILE environment variable,
153  * or if that's not set, the last name set to INSTR_PROF_PROFILE_NAME_VAR,
154  * or if that's not set,  \c "default.profraw".
155  */
156 int __llvm_profile_write_file(void);
157 
158 int __llvm_orderfile_write_file(void);
159 /*!
160  * \brief this is a wrapper interface to \c __llvm_profile_write_file.
161  * After this interface is invoked, an already dumped flag will be set
162  * so that profile won't be dumped again during program exit.
163  * Invocation of interface __llvm_profile_reset_counters will clear
164  * the flag. This interface is designed to be used to collect profile
165  * data from user selected hot regions. The use model is
166  *      __llvm_profile_reset_counters();
167  *      ... hot region 1
168  *      __llvm_profile_dump();
169  *      .. some other code
170  *      __llvm_profile_reset_counters();
171  *       ... hot region 2
172  *      __llvm_profile_dump();
173  *
174  *  It is expected that on-line profile merging is on with \c %m specifier
175  *  used in profile filename . If merging is  not turned on, user is expected
176  *  to invoke __llvm_profile_set_filename  to specify different profile names
177  *  for different regions before dumping to avoid profile write clobbering.
178  */
179 int __llvm_profile_dump(void);
180 
181 int __llvm_orderfile_dump(void);
182 
183 /*!
184  * \brief Set the filename for writing instrumentation data.
185  *
186  * Sets the filename to be used for subsequent calls to
187  * \a __llvm_profile_write_file().
188  *
189  * \c Name is not copied, so it must remain valid.  Passing NULL resets the
190  * filename logic to the default behaviour.
191  *
192  * Note: There may be multiple copies of the profile runtime (one for each
193  * instrumented image/DSO). This API only modifies the filename within the
194  * copy of the runtime available to the calling image.
195  *
196  * Warning: This is a no-op if continuous mode (\ref
197  * __llvm_profile_is_continuous_mode_enabled) is on. The reason for this is
198  * that in continuous mode, profile counters are mmap()'d to the profile at
199  * program initialization time. Support for transferring the mmap'd profile
200  * counts to a new file has not been implemented.
201  */
202 void __llvm_profile_set_filename(const char *Name);
203 
204 /*!
205  * \brief Set the FILE object for writing instrumentation data. Return 0 if set
206  * successfully or return 1 if failed.
207  *
208  * Sets the FILE object to be used for subsequent calls to
209  * \a __llvm_profile_write_file(). The profile file name set by environment
210  * variable, command-line option, or calls to \a  __llvm_profile_set_filename
211  * will be ignored.
212  *
213  * \c File will not be closed after a call to \a __llvm_profile_write_file() but
214  * it may be flushed. Passing NULL restores default behavior.
215  *
216  * If \c EnableMerge is nonzero, the runtime will always merge profiling data
217  * with the contents of the profiling file. If EnableMerge is zero, the runtime
218  * may still merge the data if it would have merged for another reason (for
219  * example, because of a %m specifier in the file name).
220  *
221  * Note: There may be multiple copies of the profile runtime (one for each
222  * instrumented image/DSO). This API only modifies the file object within the
223  * copy of the runtime available to the calling image.
224  *
225  * Warning: This is a no-op if EnableMerge is 0 in continuous mode (\ref
226  * __llvm_profile_is_continuous_mode_enabled), because disable merging requires
227  * copying the old profile file to new profile file and this function is usually
228  * used when the proess doesn't have permission to open file.
229  */
230 int __llvm_profile_set_file_object(FILE *File, int EnableMerge);
231 
232 /*! \brief Register to write instrumentation data to file at exit. */
233 int __llvm_profile_register_write_file_atexit(void);
234 
235 /*! \brief Initialize file handling. */
236 void __llvm_profile_initialize_file(void);
237 
238 /*! \brief Initialize the profile runtime. */
239 void __llvm_profile_initialize(void);
240 
241 /*!
242  * \brief Return path prefix (excluding the base filename) of the profile data.
243  * This is useful for users using \c -fprofile-generate=./path_prefix who do
244  * not care about the default raw profile name. It is also useful to collect
245  * more than more profile data files dumped in the same directory (Online
246  * merge mode is turned on for instrumented programs with shared libs).
247  * Side-effect: this API call will invoke malloc with dynamic memory allocation.
248  */
249 const char *__llvm_profile_get_path_prefix();
250 
251 /*!
252  * \brief Return filename (including path) of the profile data. Note that if the
253  * user calls __llvm_profile_set_filename later after invoking this interface,
254  * the actual file name may differ from what is returned here.
255  * Side-effect: this API call will invoke malloc with dynamic memory allocation
256  * (the returned pointer must be passed to `free` to avoid a leak).
257  *
258  * Note: There may be multiple copies of the profile runtime (one for each
259  * instrumented image/DSO). This API only retrieves the filename from the copy
260  * of the runtime available to the calling image.
261  */
262 const char *__llvm_profile_get_filename();
263 
264 /*! \brief Get the magic token for the file format. */
265 uint64_t __llvm_profile_get_magic(void);
266 
267 /*! \brief Get the version of the file format. */
268 uint64_t __llvm_profile_get_version(void);
269 
270 /*! \brief Get the number of entries in the profile data section. */
271 uint64_t __llvm_profile_get_num_data(const __llvm_profile_data *Begin,
272                                      const __llvm_profile_data *End);
273 
274 /*! \brief Get the size of the profile data section in bytes. */
275 uint64_t __llvm_profile_get_data_size(const __llvm_profile_data *Begin,
276                                       const __llvm_profile_data *End);
277 
278 /*! \brief Get the size in bytes of a single counter entry. */
279 size_t __llvm_profile_counter_entry_size(void);
280 
281 /*! \brief Get the number of entries in the profile counters section. */
282 uint64_t __llvm_profile_get_num_counters(const char *Begin, const char *End);
283 
284 /*! \brief Get the size of the profile counters section in bytes. */
285 uint64_t __llvm_profile_get_counters_size(const char *Begin, const char *End);
286 
287 /*! \brief Get the number of bytes in the profile bitmap section. */
288 uint64_t __llvm_profile_get_num_bitmap_bytes(const char *Begin,
289                                              const char *End);
290 
291 /*! \brief Get the size of the profile name section in bytes. */
292 uint64_t __llvm_profile_get_name_size(const char *Begin, const char *End);
293 
294 /* ! \brief Given the sizes of the data and counter information, return the
295  * number of padding bytes before and after the counters, and after the names,
296  * in the raw profile.
297  *
298  * Note: When mmap() mode is disabled, no padding bytes before/after counters
299  * are needed. However, in mmap() mode, the counter section in the raw profile
300  * must be page-aligned: this API computes the number of padding bytes
301  * needed to achieve that.
302  */
303 void __llvm_profile_get_padding_sizes_for_counters(
304     uint64_t DataSize, uint64_t CountersSize, uint64_t NumBitmapBytes,
305     uint64_t NamesSize, uint64_t *PaddingBytesBeforeCounters,
306     uint64_t *PaddingBytesAfterCounters, uint64_t *PaddingBytesAfterBitmap,
307     uint64_t *PaddingBytesAfterNames);
308 
309 /*!
310  * \brief Set the flag that profile data has been dumped to the file.
311  * This is useful for users to disable dumping profile data to the file for
312  * certain processes in case the processes don't have permission to write to
313  * the disks, and trying to do so would result in side effects such as crashes.
314  */
315 void __llvm_profile_set_dumped();
316 
317 /*!
318  * This variable is defined in InstrProfilingRuntime.cpp as a hidden
319  * symbol. Its main purpose is to enable profile runtime user to
320  * bypass runtime initialization code -- if the client code explicitly
321  * define this variable, then InstProfileRuntime.o won't be linked in.
322  * Note that this variable's visibility needs to be hidden so that the
323  * definition of this variable in an instrumented shared library won't
324  * affect runtime initialization decision of the main program.
325  *  __llvm_profile_profile_runtime. */
326 COMPILER_RT_VISIBILITY extern int INSTR_PROF_PROFILE_RUNTIME_VAR;
327 
328 /*!
329  * This variable is defined in InstrProfilingVersionVar.c as a hidden symbol
330  * (except on Apple platforms where this symbol is checked by TAPI).  Its main
331  * purpose is to encode the raw profile version value and other format related
332  * information such as whether the profile is from IR based instrumentation. The
333  * variable is defined as weak so that compiler can emit an overriding
334  * definition depending on user option.
335  */
336 extern uint64_t INSTR_PROF_RAW_VERSION_VAR; /* __llvm_profile_raw_version */
337 
338 /*!
339  * This variable is a weak symbol defined in InstrProfiling.c. It allows
340  * compiler instrumentation to provide overriding definition with value
341  * from compiler command line. This variable has default visibility.
342  */
343 extern char INSTR_PROF_PROFILE_NAME_VAR[1]; /* __llvm_profile_filename. */
344 
345 #endif /* PROFILE_INSTRPROFILING_H_ */
346