1 /* Copyright (C) 2021 Free Software Foundation, Inc. 2 Contributed by Oracle. 3 4 This file is part of GNU Binutils. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3, or (at your option) 9 any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, 51 Franklin Street - Fifth Floor, Boston, 19 MA 02110-1301, USA. */ 20 21 #ifndef _COLLECTOR_H 22 #define _COLLECTOR_H 23 24 #include <ucontext.h> 25 #include <signal.h> 26 27 #include "gp-defs.h" 28 #include "data_pckts.h" 29 #include "libcol_util.h" 30 #include "collector_module.h" 31 32 #define GETRELTIME() (__collector_gethrtime() - __collector_start_time) 33 34 extern hrtime_t __collector_start_time; 35 36 /* ========================================================== */ 37 /* ------- internal function prototypes ----------------- */ 38 /* These will not be exported from libcollector.so */ 39 struct DataHandle; 40 struct Heap; 41 extern struct DataHandle *__collector_create_handle (char*); 42 extern void __collector_delete_handle (struct DataHandle*); 43 extern int __collector_write_record (struct DataHandle*, Common_packet*); 44 extern int __collector_write_packet (struct DataHandle*, CM_Packet*); 45 extern int __collector_write_string (struct DataHandle*, char*, int); 46 extern FrameInfo __collector_get_frame_info (hrtime_t, int, void *); 47 extern FrameInfo __collector_getUID (CM_Array *arg, FrameInfo uid); 48 extern int __collector_getStackTrace (void *buf, int size, void *bptr, void *eptr, void *arg); 49 extern void *__collector_ext_return_address (unsigned level); 50 extern void __collector_mmap_fork_child_cleanup (); 51 52 extern int __collector_ext_mmap_install (int); 53 extern int __collector_ext_mmap_deinstall (int); 54 extern int __collector_ext_update_map_segments (void); 55 extern int __collector_check_segment (unsigned long addr, 56 unsigned long *base, 57 unsigned long *end, int maxnretries); 58 extern int __collector_check_readable_segment (unsigned long addr, 59 unsigned long *base, 60 unsigned long *end, int maxnretries); 61 extern int __collector_ext_line_init (int * pfollow_this_experiment, 62 const char * progspec, 63 const char *progname); 64 extern int __collector_ext_line_install (char *, const char *); 65 extern void __collector_ext_line_close (); 66 extern void __collector_ext_unwind_init (int); 67 extern void __collector_ext_unwind_close (); 68 extern int __collector_ext_jstack_unwind (char*, int, ucontext_t *); 69 extern void __collector_ext_dispatcher_fork_child_cleanup (); 70 extern void __collector_ext_unwind_key_init (int isPthread, void * stack); 71 extern void __collector_ext_dispatcher_tsd_create_key (); 72 extern void __collector_ext_dispatcher_thread_timer_suspend (); 73 extern int __collector_ext_dispatcher_thread_timer_resume (); 74 extern int __collector_ext_dispatcher_install (); 75 extern void __collector_ext_dispatcher_suspend (); 76 extern void __collector_ext_dispatcher_restart (); 77 extern void __collector_ext_dispatcher_deinstall (); 78 extern void __collector_ext_usage_sample (Smpl_type type, char *name); 79 extern void __collector_ext_profile_handler (siginfo_t *, ucontext_t *); 80 extern int __collector_ext_clone_pthread (int (*fn)(void *), void *child_stack, int flags, void *arg, 81 va_list va /* pid_t *ptid, struct user_desc *tlspid_t *" ctid" */); 82 83 /* D-light related functions */ 84 extern int __collector_sigprof_install (); 85 extern int __collector_ext_hwc_active (); 86 extern void __collector_ext_hwc_check (siginfo_t *, ucontext_t *); 87 extern int __collector_ext_hwc_lwp_init (); 88 extern void __collector_ext_hwc_lwp_fini (); 89 extern int __collector_ext_hwc_lwp_suspend (); 90 extern int __collector_ext_hwc_lwp_resume (); 91 extern int (*__collector_VM_ReadByteInstruction)(unsigned char *); 92 extern int (*__collector_omp_stack_trace)(char*, int, hrtime_t, void*); 93 extern hrtime_t (*__collector_gethrtime)(); 94 extern int (*__collector_mpi_stack_trace)(char*, int, hrtime_t); 95 extern int __collector_open_experiment (const char *exp, const char *par, sp_origin_t origin); 96 extern void __collector_suspend_experiment (char *why); 97 extern void __collector_resume_experiment (); 98 extern void __collector_clean_state (); 99 extern void __collector_close_experiment (); 100 extern void __collector_terminate_expt (); 101 extern void __collector_terminate_hook (); 102 extern void __collector_sample (char *name); 103 extern void __collector_pause (); 104 extern void __collector_pause_m (); 105 extern void __collector_resume (); 106 extern int collector_sigemt_sigaction (const struct sigaction*, 107 struct sigaction*); 108 extern int collector_sigchld_sigaction (const struct sigaction*, 109 struct sigaction*); 110 111 extern int 112 __collector_log_write (char *format, ...) __attribute__ ((format (printf, 1, 2))); 113 114 /* ------- internal global data ----------------- */ 115 /* These will not be exported from libcollector.so */ 116 extern struct Heap *__collector_heap; 117 118 /* experiment state flag */ 119 typedef enum 120 { 121 EXP_INIT, EXP_OPEN, EXP_PAUSED, EXP_CLOSED 122 } sp_state_t; 123 extern volatile sp_state_t __collector_expstate; 124 125 /* global flag, defines whether target is threaded or not 126 * if set, put _lwp_self() for thread id instead of thr_self() 127 * in output packets; should be set before any data packets 128 * are written, i.e., before signal handlers are installed. 129 */ 130 extern int __collector_no_threads; 131 extern int __collector_libthread_T1; /* T1 or not T1 */ 132 extern int __collector_sample_sig; /* set to signal used to trigger a sample */ 133 extern int __collector_sample_sig_warn; /* if 1, warning given on target use */ 134 extern int __collector_pause_sig; /* set to signal used to toggle pause-resume */ 135 extern int __collector_pause_sig_warn; /* if 1, warning given on target use */ 136 extern hrtime_t __collector_delay_start; 137 extern int __collector_exp_active; 138 139 /* global hrtime_t for next periodic sample */ 140 extern hrtime_t __collector_next_sample; 141 extern int __collector_sample_period; 142 143 /* global hrtime_t for experiment termination (-t) */ 144 extern hrtime_t __collector_terminate_time; 145 extern int __collector_terminate_duration; 146 extern char __collector_exp_dir_name[]; 147 extern int __collector_java_mode; 148 extern int __collector_java_asyncgetcalltrace_loaded; 149 extern int __collector_jprofile_start_attach (); 150 151 /* --------- information controlling debug tracing ------------- */ 152 153 /* global flag, defines level of trace information */ 154 extern void __collector_dlog (int, int, char *, ...) __attribute__ ((format (printf, 3, 4))); 155 156 #define STR(x) ((x) ? (x) : "NULL") 157 158 // To set collector_debug_opt use: 159 // SP_COLLECTOR_DEBUG=4 ; export SP_COLLECTOR_DEBUG ; collect ... 160 enum 161 { 162 SP_DUMP_TIME = 1, 163 SP_DUMP_FLAG = 2, 164 SP_DUMP_JAVA = 4, 165 SP_DUMP_NOHEADER = 8, 166 SP_DUMP_UNWIND = 16, 167 SP_DUMP_STACK = 32, 168 }; 169 170 #ifndef DEBUG 171 #define DprintfT(flag, ...) 172 #define tprintf(...) 173 #define Tprintf(...) 174 #define TprintfT(...) 175 176 #else 177 #define DprintfT(flag, ...) __collector_dlog(SP_DUMP_FLAG | (flag), 0, __VA_ARGS__ ) 178 #define tprintf(...) __collector_dlog( SP_DUMP_NOHEADER, __VA_ARGS__ ) 179 #define Tprintf(...) __collector_dlog( 0, __VA_ARGS__ ) 180 #define TprintfT(...) __collector_dlog( SP_DUMP_TIME, __VA_ARGS__ ) 181 182 #endif /* DEBUG */ 183 184 // To find the glibc version: 185 // objdump -T /lib*/*so /lib*/*/*.so | grep popen 186 // IMPORTANT: The GLIBC_* versions below must match those in mapfile.<variant> 187 #if ARCH(Aarch64) 188 #define SYS_LIBC_NAME "libc.so.6" 189 #define SYS_PTHREAD_CREATE_VERSION "GLIBC_2.17" 190 #define SYS_DLOPEN_VERSION "GLIBC_2.17" 191 #define SYS_POPEN_VERSION "GLIBC_2.17" 192 #define SYS_FOPEN_X_VERSION "GLIBC_2.17" 193 #define SYS_FGETPOS_X_VERSION "GLIBC_2.17" 194 195 #elif ARCH(Intel) 196 #define SYS_LIBC_NAME "libc.so.6" 197 #define SYS_POSIX_SPAWN_VERSION "GLIBC_2.15" 198 #if WSIZE(32) 199 #define SYS_PTHREAD_CREATE_VERSION "GLIBC_2.1" 200 #define SYS_DLOPEN_VERSION "GLIBC_2.1" 201 #define SYS_POPEN_VERSION "GLIBC_2.1" 202 #define SYS_TIMER_X_VERSION "GLIBC_2.2" 203 #define SYS_FOPEN_X_VERSION "GLIBC_2.1" 204 #define SYS_FGETPOS_X_VERSION "GLIBC_2.2" 205 #define SYS_FGETPOS64_X_VERSION "GLIBC_2.2" 206 #define SYS_OPEN64_X_VERSION "GLIBC_2.2" 207 #define SYS_PREAD_X_VERSION "GLIBC_2.2" 208 #define SYS_PWRITE_X_VERSION "GLIBC_2.2" 209 #define SYS_PWRITE64_X_VERSION "GLIBC_2.2" 210 #else /* WSIZE(64) */ 211 #define SYS_PTHREAD_CREATE_VERSION "GLIBC_2.2.5" 212 #define SYS_DLOPEN_VERSION "GLIBC_2.2.5" 213 #define SYS_POPEN_VERSION "GLIBC_2.2.5" 214 #define SYS_TIMER_X_VERSION "GLIBC_2.3.3" 215 #define SYS_FOPEN_X_VERSION "GLIBC_2.2.5" 216 #define SYS_FGETPOS_X_VERSION "GLIBC_2.2.5" 217 #endif 218 219 #elif ARCH(SPARC) 220 #define SYS_LIBC_NAME "libc.so.6" 221 #define SYS_DLOPEN_VERSION "GLIBC_2.1" 222 #if WSIZE(32) 223 #define SYS_PTHREAD_CREATE_VERSION "GLIBC_2.1" 224 #define SYS_POPEN_VERSION "GLIBC_2.1" 225 #define SYS_FOPEN_X_VERSION "GLIBC_2.1" 226 #define SYS_FGETPOS_X_VERSION "GLIBC_2.2" 227 #else /* WSIZE(64) */ 228 #define SYS_PTHREAD_CREATE_VERSION "GLIBC_2.2" 229 #define SYS_POPEN_VERSION "GLIBC_2.2" 230 #define SYS_TIMER_X_VERSION "GLIBC_2.3.3" 231 #define SYS_FOPEN_X_VERSION "GLIBC_2.2" 232 #define SYS_FGETPOS_X_VERSION "GLIBC_2.2" 233 #endif 234 #endif 235 236 #endif 237