(root)/
binutils-2.41/
gprofng/
libcollector/
collector.h
       1  /* Copyright (C) 2021-2023 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 ();
     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