xref: /netbsd-src/sys/external/bsd/compiler_rt/dist/lib/profile/InstrProfilingBuffer.c (revision ef84fd3bd8895f4e6be1e38baf19e6dc3255bc64)
161f2f256Sjoerg /*===- InstrProfilingBuffer.c - Write instrumentation to a memory buffer --===*\
261f2f256Sjoerg |*
361f2f256Sjoerg |*                     The LLVM Compiler Infrastructure
461f2f256Sjoerg |*
561f2f256Sjoerg |* This file is distributed under the University of Illinois Open Source
661f2f256Sjoerg |* License. See LICENSE.TXT for details.
761f2f256Sjoerg |*
861f2f256Sjoerg \*===----------------------------------------------------------------------===*/
961f2f256Sjoerg 
1061f2f256Sjoerg #include "InstrProfiling.h"
11*ef84fd3bSjoerg #include "InstrProfilingInternal.h"
1261f2f256Sjoerg 
13*ef84fd3bSjoerg COMPILER_RT_VISIBILITY
__llvm_profile_get_size_for_buffer(void)1461f2f256Sjoerg uint64_t __llvm_profile_get_size_for_buffer(void) {
15*ef84fd3bSjoerg   const __llvm_profile_data *DataBegin = __llvm_profile_begin_data();
16*ef84fd3bSjoerg   const __llvm_profile_data *DataEnd = __llvm_profile_end_data();
17*ef84fd3bSjoerg   const uint64_t *CountersBegin = __llvm_profile_begin_counters();
18*ef84fd3bSjoerg   const uint64_t *CountersEnd = __llvm_profile_end_counters();
19*ef84fd3bSjoerg   const char *NamesBegin = __llvm_profile_begin_names();
20*ef84fd3bSjoerg   const char *NamesEnd = __llvm_profile_end_names();
21*ef84fd3bSjoerg 
22*ef84fd3bSjoerg   return __llvm_profile_get_size_for_buffer_internal(
23*ef84fd3bSjoerg       DataBegin, DataEnd, CountersBegin, CountersEnd, NamesBegin, NamesEnd);
2461f2f256Sjoerg }
2561f2f256Sjoerg 
26*ef84fd3bSjoerg #define PROFILE_RANGE_SIZE(Range) (Range##End - Range##Begin)
2761f2f256Sjoerg 
28*ef84fd3bSjoerg COMPILER_RT_VISIBILITY
__llvm_profile_get_size_for_buffer_internal(const __llvm_profile_data * DataBegin,const __llvm_profile_data * DataEnd,const uint64_t * CountersBegin,const uint64_t * CountersEnd,const char * NamesBegin,const char * NamesEnd)29*ef84fd3bSjoerg uint64_t __llvm_profile_get_size_for_buffer_internal(
30*ef84fd3bSjoerg     const __llvm_profile_data *DataBegin, const __llvm_profile_data *DataEnd,
31*ef84fd3bSjoerg     const uint64_t *CountersBegin, const uint64_t *CountersEnd,
32*ef84fd3bSjoerg     const char *NamesBegin, const char *NamesEnd) {
33*ef84fd3bSjoerg   /* Match logic in __llvm_profile_write_buffer(). */
34*ef84fd3bSjoerg   const uint64_t NamesSize = PROFILE_RANGE_SIZE(Names) * sizeof(char);
35*ef84fd3bSjoerg   const uint8_t Padding = __llvm_profile_get_num_padding_bytes(NamesSize);
36*ef84fd3bSjoerg   return sizeof(__llvm_profile_header) +
37*ef84fd3bSjoerg          PROFILE_RANGE_SIZE(Data) * sizeof(__llvm_profile_data) +
38*ef84fd3bSjoerg          PROFILE_RANGE_SIZE(Counters) * sizeof(uint64_t) + NamesSize + Padding;
39*ef84fd3bSjoerg }
4030308f42Sjoerg 
__llvm_profile_write_buffer(char * Buffer)41*ef84fd3bSjoerg COMPILER_RT_VISIBILITY int __llvm_profile_write_buffer(char *Buffer) {
42*ef84fd3bSjoerg   return llvmWriteProfData(llvmBufferWriter, Buffer, 0, 0);
43*ef84fd3bSjoerg }
4461f2f256Sjoerg 
__llvm_profile_write_buffer_internal(char * Buffer,const __llvm_profile_data * DataBegin,const __llvm_profile_data * DataEnd,const uint64_t * CountersBegin,const uint64_t * CountersEnd,const char * NamesBegin,const char * NamesEnd)45*ef84fd3bSjoerg COMPILER_RT_VISIBILITY int __llvm_profile_write_buffer_internal(
46*ef84fd3bSjoerg     char *Buffer, const __llvm_profile_data *DataBegin,
47*ef84fd3bSjoerg     const __llvm_profile_data *DataEnd, const uint64_t *CountersBegin,
48*ef84fd3bSjoerg     const uint64_t *CountersEnd, const char *NamesBegin, const char *NamesEnd) {
49*ef84fd3bSjoerg   return llvmWriteProfDataImpl(llvmBufferWriter, Buffer, DataBegin, DataEnd,
50*ef84fd3bSjoerg                                CountersBegin, CountersEnd, 0, 0, NamesBegin,
51*ef84fd3bSjoerg                                NamesEnd);
5261f2f256Sjoerg }
53