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 AndricCOMPILER_RT_VISIBILITY const char *__llvm_profile_begin_names(void) { 55f8ca070dSDimitry Andric return &PROF_NAME_START; 56f8ca070dSDimitry Andric } __llvm_profile_end_names(void)57f8ca070dSDimitry AndricCOMPILER_RT_VISIBILITY const char *__llvm_profile_end_names(void) { 58f8ca070dSDimitry Andric return &PROF_NAME_STOP; 59f8ca070dSDimitry Andric } __llvm_profile_begin_counters(void)60f8ca070dSDimitry AndricCOMPILER_RT_VISIBILITY uint64_t *__llvm_profile_begin_counters(void) { 61f8ca070dSDimitry Andric return &PROF_CNTS_START; 62f8ca070dSDimitry Andric } __llvm_profile_end_counters(void)63f8ca070dSDimitry AndricCOMPILER_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 AndricCOMPILER_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