Home | History | Annotate | Line # | Download | only in libcollector
      1 /* Copyright (C) 2021-2026 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 <signal.h>
     25 
     26 #include "gp-defs.h"
     27 #include "data_pckts.h"
     28 #include "libcol_util.h"
     29 #include "collector_module.h"
     30 
     31 #define GETRELTIME()    (__collector_gethrtime() - __collector_start_time)
     32 #define CALL_REAL(x)	(__real_##x)
     33 #define NULL_PTR(x)	(__real_##x == NULL)
     34 
     35 #define SYS_LIBC_NAME   "libc.so.6"
     36 
     37 #ifdef __has_attribute
     38 #if __has_attribute (__symver__)
     39 #define SYMVER_ATTRIBUTE(sym, symver)  __attribute__ ((__symver__ (#symver)))
     40 #endif
     41 #endif
     42 #ifndef SYMVER_ATTRIBUTE
     43 # define SYMVER_ATTRIBUTE(sym, symver)  __asm__(".symver " #sym "," #symver);
     44 #endif
     45 
     46 #if defined(__MUSL_LIBC)
     47 #define dlvsym(f, nm, v)  dlsym (f, nm)
     48 #define SIGEV_THREAD_ID   4
     49 #define DCL_FUNC_VER(REAL_DCL, sym, ver)
     50 #else
     51 #define DCL_FUNC_VER(REAL_DCL, sym, ver) \
     52   SYMVER_ATTRIBUTE (__collector_ ## sym, ver) \
     53   REAL_DCL (__collector_ ## sym)
     54 #endif
     55 
     56 extern hrtime_t __collector_start_time;
     57 
     58 /* ========================================================== */
     59 /* -------  internal function prototypes ----------------- */
     60 /* These will not be exported from libcollector.so */
     61 struct DataHandle;
     62 struct Heap;
     63 extern struct DataHandle *__collector_create_handle (char*);
     64 extern void __collector_delete_handle (struct DataHandle*);
     65 extern int __collector_write_record (struct DataHandle*, Common_packet*);
     66 extern int __collector_write_packet (struct DataHandle*, CM_Packet*);
     67 extern int __collector_write_string (struct DataHandle*, char*, int);
     68 extern FrameInfo __collector_get_frame_info (hrtime_t, int, void *);
     69 extern FrameInfo __collector_getUID (CM_Array *arg, FrameInfo uid);
     70 extern int __collector_getStackTrace (void *buf, int size, void *bptr,
     71 				      void *eptr, void *arg);
     72 extern void *__collector_ext_return_address (unsigned level);
     73 extern void __collector_mmap_fork_child_cleanup ();
     74 
     75 extern int __collector_ext_mmap_install (int);
     76 extern int __collector_ext_mmap_deinstall (int);
     77 extern int __collector_ext_update_map_segments (void);
     78 extern int __collector_check_segment (unsigned long addr,
     79 				      unsigned long *base,
     80 				      unsigned long *end, int maxnretries);
     81 extern int __collector_check_readable_segment (unsigned long addr,
     82 					       unsigned long *base,
     83 					       unsigned long *end, int maxnretries);
     84 extern int __collector_ext_line_init (int * pfollow_this_experiment,
     85 				      const char * progspec,
     86 				      const char *progname);
     87 extern int __collector_ext_line_install (char *, const char *);
     88 extern void __collector_ext_line_close ();
     89 extern void __collector_ext_unwind_init (int);
     90 extern void __collector_ext_unwind_close ();
     91 extern int __collector_ext_jstack_unwind (char*, int, ucontext_t *);
     92 extern void __collector_ext_dispatcher_fork_child_cleanup ();
     93 extern void __collector_ext_unwind_key_init (int isPthread, void * stack);
     94 extern void __collector_ext_dispatcher_tsd_create_key ();
     95 extern void __collector_ext_dispatcher_thread_timer_suspend ();
     96 extern int __collector_ext_dispatcher_thread_timer_resume ();
     97 extern int __collector_ext_dispatcher_install ();
     98 extern void __collector_ext_dispatcher_suspend ();
     99 extern void __collector_ext_dispatcher_restart ();
    100 extern void __collector_ext_dispatcher_deinstall ();
    101 extern void __collector_ext_usage_sample (Smpl_type type, char *name);
    102 extern void __collector_ext_profile_handler (siginfo_t *, ucontext_t *);
    103 extern int __collector_ext_clone_pthread (int (*fn)(void *), void *child_stack,
    104 					  int flags, void *arg, va_list va);
    105 extern int __collector_sigprof_install ();
    106 extern int __collector_ext_hwc_active ();
    107 extern void __collector_ext_hwc_check (siginfo_t *, ucontext_t *);
    108 extern int __collector_ext_hwc_lwp_init ();
    109 extern void __collector_ext_hwc_lwp_fini ();
    110 extern int __collector_ext_hwc_lwp_suspend ();
    111 extern int __collector_ext_hwc_lwp_resume ();
    112 extern int (*__collector_VM_ReadByteInstruction)(unsigned char *);
    113 extern int (*__collector_omp_stack_trace)(char*, int, hrtime_t, void*);
    114 extern hrtime_t (*__collector_gethrtime)();
    115 extern int (*__collector_mpi_stack_trace)(char*, int, hrtime_t);
    116 extern int __collector_open_experiment (const char *exp, const char *par,
    117 					sp_origin_t origin);
    118 extern void __collector_suspend_experiment (char *why);
    119 extern void __collector_resume_experiment ();
    120 extern void __collector_clean_state ();
    121 extern void __collector_close_experiment ();
    122 extern void __collector_terminate_expt ();
    123 extern void __collector_terminate_hook ();
    124 extern void __collector_sample (char *name);
    125 extern void __collector_pause ();
    126 extern void __collector_pause_m (const char *reason);
    127 extern void __collector_resume ();
    128 extern int collector_sigemt_sigaction (const struct sigaction*,
    129 				       struct sigaction*);
    130 extern int collector_sigchld_sigaction (const struct sigaction*,
    131 					struct sigaction*);
    132 
    133 extern int
    134 __collector_log_write (char *format, ...) __attribute__ ((format (printf, 1, 2)));
    135 
    136 /* -------  internal global data ----------------- */
    137 /* These will not be exported from libcollector.so */
    138 extern struct Heap *__collector_heap;
    139 
    140 /* experiment state flag  */
    141 typedef enum
    142 {
    143   EXP_INIT, EXP_OPEN, EXP_PAUSED, EXP_CLOSED
    144 } sp_state_t;
    145 extern volatile sp_state_t __collector_expstate;
    146 
    147 /* global flag, defines whether target is threaded or not
    148  *   if set, put _lwp_self() for thread id instead of thr_self()
    149  *	in output packets; should be set before any data packets
    150  *	are written, i.e., before signal handlers are installed.
    151  */
    152 extern int __collector_no_threads;
    153 extern int __collector_libthread_T1; /* T1 or not T1 */
    154 extern int __collector_sample_sig; /* set to signal used to trigger a sample */
    155 extern int __collector_sample_sig_warn; /* if 1, warning given on target use */
    156 extern int __collector_pause_sig; /* set to signal used to toggle pause-resume */
    157 extern int __collector_pause_sig_warn; /* if 1, warning given on target use */
    158 extern hrtime_t __collector_delay_start;
    159 extern int __collector_exp_active;
    160 
    161 /* global hrtime_t for next periodic sample */
    162 extern hrtime_t __collector_next_sample;
    163 extern int __collector_sample_period;
    164 
    165 /* global hrtime_t for experiment termination (-t) */
    166 extern hrtime_t __collector_terminate_time;
    167 extern int __collector_terminate_duration;
    168 extern char __collector_exp_dir_name[];
    169 extern int __collector_java_mode;
    170 extern int __collector_java_asyncgetcalltrace_loaded;
    171 extern int __collector_jprofile_start_attach ();
    172 
    173 /* --------- information controlling debug tracing ------------- */
    174 
    175 /* global flag, defines level of trace information */
    176 extern void __collector_dlog (int, int, char *, ...) __attribute__ ((format (printf, 3, 4)));
    177 
    178 #define STR(x)  ((x) ? (x) : "NULL")
    179 
    180 // To set collector_debug_opt use:
    181 //   SP_COLLECTOR_DEBUG=4 ; export SP_COLLECTOR_DEBUG ; collect ...
    182 enum
    183 {
    184   SP_DUMP_TIME      = 1,
    185   SP_DUMP_FLAG      = 2,
    186   SP_DUMP_JAVA      = 4,
    187   SP_DUMP_NOHEADER  = 8,
    188   SP_DUMP_UNWIND    = 16,
    189   SP_DUMP_STACK     = 32,
    190 };
    191 
    192 /* TprintfT(<level>,...) definitions.  Adjust per module as needed */
    193 enum
    194 {
    195   DBG_LT0 = 0, // for high-level configuration, unexpected errors/warnings
    196   DBG_LTT = 0, // for interposition on GLIBC functions
    197   DBG_LT1 = 1, // for configuration details, warnings
    198   DBG_LT2 = 2,
    199   DBG_LT3 = 3,
    200   DBG_LT4 = 4
    201 };
    202 
    203 #ifndef DEBUG
    204 #define DprintfT(flag, ...)
    205 #define tprintf(...)
    206 #define Tprintf(...)
    207 #define TprintfT(...)
    208 
    209 #else
    210 #define DprintfT(flag, ...)  __collector_dlog(SP_DUMP_FLAG | (flag), 0, __VA_ARGS__ )
    211 #define tprintf(...)  __collector_dlog( SP_DUMP_NOHEADER, __VA_ARGS__ )
    212 #define Tprintf(...)  __collector_dlog( 0, __VA_ARGS__ )
    213 #define TprintfT(...) __collector_dlog( SP_DUMP_TIME, __VA_ARGS__ )
    214 
    215 #endif /* DEBUG */
    216 
    217 #endif
    218