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