1f8ca070dSDimitry Andric /*===- InstrProfilingPlatformLinux.c - Profile data Linux platform ------===*\
2f8ca070dSDimitry Andric |*
3f8ca070dSDimitry Andric |*                     The LLVM Compiler Infrastructure
4f8ca070dSDimitry Andric |*
5f8ca070dSDimitry Andric |* This file is distributed under the University of Illinois Open Source
6f8ca070dSDimitry Andric |* License. See LICENSE.TXT for details.
7f8ca070dSDimitry Andric |*
8f8ca070dSDimitry Andric \*===----------------------------------------------------------------------===*/
9f8ca070dSDimitry Andric 
104ba319b5SDimitry Andric #if defined(__linux__) || defined(__FreeBSD__) || defined(__Fuchsia__) || \
11*b5893f02SDimitry Andric     (defined(__sun__) && defined(__svr4__)) || defined(__NetBSD__)
12f8ca070dSDimitry Andric 
13f8ca070dSDimitry Andric #include <stdlib.h>
14f8ca070dSDimitry Andric 
158a51db9cSDimitry Andric #include "InstrProfiling.h"
168a51db9cSDimitry Andric 
17f8ca070dSDimitry Andric #define PROF_DATA_START INSTR_PROF_SECT_START(INSTR_PROF_DATA_SECT_NAME)
18f8ca070dSDimitry Andric #define PROF_DATA_STOP INSTR_PROF_SECT_STOP(INSTR_PROF_DATA_SECT_NAME)
19f8ca070dSDimitry Andric #define PROF_NAME_START INSTR_PROF_SECT_START(INSTR_PROF_NAME_SECT_NAME)
20f8ca070dSDimitry Andric #define PROF_NAME_STOP INSTR_PROF_SECT_STOP(INSTR_PROF_NAME_SECT_NAME)
21f8ca070dSDimitry Andric #define PROF_CNTS_START INSTR_PROF_SECT_START(INSTR_PROF_CNTS_SECT_NAME)
22f8ca070dSDimitry Andric #define PROF_CNTS_STOP INSTR_PROF_SECT_STOP(INSTR_PROF_CNTS_SECT_NAME)
2353b715b5SDimitry Andric #define PROF_VNODES_START INSTR_PROF_SECT_START(INSTR_PROF_VNODES_SECT_NAME)
2453b715b5SDimitry Andric #define PROF_VNODES_STOP INSTR_PROF_SECT_STOP(INSTR_PROF_VNODES_SECT_NAME)
25f8ca070dSDimitry Andric 
26f8ca070dSDimitry Andric /* Declare section start and stop symbols for various sections
27f8ca070dSDimitry Andric  * generated by compiler instrumentation.
28f8ca070dSDimitry Andric  */
29f8ca070dSDimitry Andric extern __llvm_profile_data PROF_DATA_START COMPILER_RT_VISIBILITY;
30f8ca070dSDimitry Andric extern __llvm_profile_data PROF_DATA_STOP COMPILER_RT_VISIBILITY;
31f8ca070dSDimitry Andric extern uint64_t PROF_CNTS_START COMPILER_RT_VISIBILITY;
32f8ca070dSDimitry Andric extern uint64_t PROF_CNTS_STOP COMPILER_RT_VISIBILITY;
33f8ca070dSDimitry Andric extern char PROF_NAME_START COMPILER_RT_VISIBILITY;
34f8ca070dSDimitry Andric extern char PROF_NAME_STOP COMPILER_RT_VISIBILITY;
3553b715b5SDimitry Andric extern ValueProfNode PROF_VNODES_START COMPILER_RT_VISIBILITY;
3653b715b5SDimitry Andric extern ValueProfNode PROF_VNODES_STOP COMPILER_RT_VISIBILITY;
37f8ca070dSDimitry Andric 
38f8ca070dSDimitry Andric /* Add dummy data to ensure the section is always created. */
39f8ca070dSDimitry Andric __llvm_profile_data
40f8ca070dSDimitry Andric     __prof_data_sect_data[0] COMPILER_RT_SECTION(INSTR_PROF_DATA_SECT_NAME_STR);
41f8ca070dSDimitry Andric uint64_t
42f8ca070dSDimitry Andric     __prof_cnts_sect_data[0] COMPILER_RT_SECTION(INSTR_PROF_CNTS_SECT_NAME_STR);
43f8ca070dSDimitry Andric char __prof_nms_sect_data[0] COMPILER_RT_SECTION(INSTR_PROF_NAME_SECT_NAME_STR);
4453b715b5SDimitry Andric ValueProfNode __prof_vnodes_sect_data[0] COMPILER_RT_SECTION(INSTR_PROF_VNODES_SECT_NAME_STR);
45f8ca070dSDimitry Andric 
46f8ca070dSDimitry Andric COMPILER_RT_VISIBILITY const __llvm_profile_data *
__llvm_profile_begin_data(void)47f8ca070dSDimitry Andric __llvm_profile_begin_data(void) {
48f8ca070dSDimitry Andric   return &PROF_DATA_START;
49f8ca070dSDimitry Andric }
50f8ca070dSDimitry Andric COMPILER_RT_VISIBILITY const __llvm_profile_data *
__llvm_profile_end_data(void)51f8ca070dSDimitry Andric __llvm_profile_end_data(void) {
52f8ca070dSDimitry Andric   return &PROF_DATA_STOP;
53f8ca070dSDimitry Andric }
__llvm_profile_begin_names(void)54f8ca070dSDimitry Andric COMPILER_RT_VISIBILITY const char *__llvm_profile_begin_names(void) {
55f8ca070dSDimitry Andric   return &PROF_NAME_START;
56f8ca070dSDimitry Andric }
__llvm_profile_end_names(void)57f8ca070dSDimitry Andric COMPILER_RT_VISIBILITY const char *__llvm_profile_end_names(void) {
58f8ca070dSDimitry Andric   return &PROF_NAME_STOP;
59f8ca070dSDimitry Andric }
__llvm_profile_begin_counters(void)60f8ca070dSDimitry Andric COMPILER_RT_VISIBILITY uint64_t *__llvm_profile_begin_counters(void) {
61f8ca070dSDimitry Andric   return &PROF_CNTS_START;
62f8ca070dSDimitry Andric }
__llvm_profile_end_counters(void)63f8ca070dSDimitry Andric COMPILER_RT_VISIBILITY uint64_t *__llvm_profile_end_counters(void) {
64f8ca070dSDimitry Andric   return &PROF_CNTS_STOP;
65f8ca070dSDimitry Andric }
6653b715b5SDimitry Andric 
6753b715b5SDimitry Andric COMPILER_RT_VISIBILITY ValueProfNode *
__llvm_profile_begin_vnodes(void)6853b715b5SDimitry Andric __llvm_profile_begin_vnodes(void) {
6953b715b5SDimitry Andric   return &PROF_VNODES_START;
7053b715b5SDimitry Andric }
__llvm_profile_end_vnodes(void)7153b715b5SDimitry Andric COMPILER_RT_VISIBILITY ValueProfNode *__llvm_profile_end_vnodes(void) {
7253b715b5SDimitry Andric   return &PROF_VNODES_STOP;
7353b715b5SDimitry Andric }
7453b715b5SDimitry Andric COMPILER_RT_VISIBILITY ValueProfNode *CurrentVNode = &PROF_VNODES_START;
7553b715b5SDimitry Andric COMPILER_RT_VISIBILITY ValueProfNode *EndVNode = &PROF_VNODES_STOP;
7653b715b5SDimitry Andric 
77f8ca070dSDimitry Andric #endif
78