xref: /netbsd-src/external/gpl3/binutils.old/dist/gprofng/src/collect.h (revision c42dbd0ed2e61fe6eda8590caa852ccf34719964)
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 _COLLECT_H
22 #define _COLLECT_H
23 
24 #include <Application.h>
25 
26 extern "C"
27 {
28   typedef void (*SignalHandler)(int);
29 }
30 
31 class Coll_Ctrl;
32 class Elf;
33 
34 #define MAXLABELS       10      /* maximum number of -C arguments */
35 #define STDEBUFSIZE     24000
36 
37 enum { MAX_LD_PRELOAD_TYPES = 3 };
38 
39 struct Process
40 {
ProcessProcess41   Process (pid_t _pid) : pid (_pid) { }
42   pid_t pid;
43 };
44 
45 struct DtraceTool
46 {
47   DtraceTool (char*);
48   ~DtraceTool ();
49 
50   char *name;       // Tool name as specified by -D flag
51   char *params;     // Tool parameters
52   char *dfile;      // Extracted d-script
53   char *mfile;      // Extracted metadata file
54   char *ofile;      // Output file
55   pid_t pid;
56 };
57 
58 // collect object
59 class collect : Application
60 {
61 public:
62   collect (int argc, char *argv[], char **envp);
63   virtual ~collect ();
64   void start (int argc, char *argv[]);
65   void  writeStr (int f, const char *buf);
66 
67   // the collector control class
68   Coll_Ctrl *cc;
69 
70 private:
71   enum Exec_status
72   {
73     EXEC_OK = 0, // found as runnable executable
74     EXEC_ELF_NOSHARE, // found, but built unshared
75     EXEC_IS_JAR, // found as a .jar file
76     EXEC_IS_CLASS, // found as a .class file but name missing .class
77     EXEC_IS_CLASSCLASS, // found as a .class file with explicit .class
78     EXEC_OPEN_FAIL, // could not be opened
79     EXEC_ELF_LIB, // internal error: bad elf library
80     EXEC_ELF_HEADER, // executable, with bad ELF header
81     EXEC_ELF_ARCH, // executable, but unrunnable architecture
82     EXEC_ISDIR, // a directory, not a file
83     EXEC_NOT_EXEC, // a file, but not executable
84     EXEC_NOT_FOUND // a directory, not a file
85   };
86 
87   // override methods in base class
88   void usage ();
89   void short_usage ();
90   void show_hwc_usage ();
91   int check_args (int argc, char *argv[]);
92   void check_target (int, char **);
93   Exec_status check_executable (char *);
94   Exec_status check_executable_arch (Elf *);
95   char *status_str (Exec_status, char *);
96   int do_flag (const char *);
97   char *find_java (void);
98   char *java_path;
99   char *java_how;
100   int putenv_libcollector ();
101   int putenv_libcollector_ld_audits ();
102   int putenv_libcollector_ld_preloads ();
103   int putenv_libcollector_ld_misc ();
104   void add_ld_preload (const char *lib);
105   int putenv_ld_preloads ();
106   int putenv_memso ();
107   int env_strip (char *env, const char *str);
108   int putenv_purged_ld_preloads (const char *var);
109   int putenv_append (const char *var, const char *val);
110   void get_count_data ();
111   void prepare_dbx ();
112   int traceme (const char *file, char *const argv[]);
113   int checkflagterm (const char *);
114   void dupflagseen (char);
115   void dupflagseen (const char *);
116   void validate_config (int);
117   void validate_java (const char *, const char *, int);
118   int set_output ();
119   void reset_output ();
120 
121   /* Logging warning messages */
122   char **collect_warnings;
123   int collect_warnings_idx;
124   void warn_open ();
125   void warn_close ();
126   void warn_write (const char *format, ...);
127   void warn_comment (const char *kind, int num, char *s = NULL, int len = 0);
128   char *warnfilename;
129   FILE *warn_file;
130 
131   /* MPI experiment handling */
132   void setup_MPI_expt ();   /* the founder experiment */
133   void write_MPI_founder_log ();
134   void close_MPI_founder_log (int, int);
135   void spawn_MPI_job (); /* run the MPI job */
136   void copy_collect_args (char ***);   /* copy collect args for an MPI target */
137   int disabled;
138   int jseen_global;         /* if -j flag was seen */
139   int verbose;
140   bool mem_so_me;           /* if T, preload mem.so, not libcollector */
141   int origargc;
142   char **arglist;
143   char **origargv;
144   char **origenvp;
145   int targ_index;           // index of name of target in origargv
146   bool is_64;
147   int nargs;
148   int njargs;
149   char *jargs;
150   int nlabels;
151   char *label[MAXLABELS];
152   char *sp_preload_list[MAX_LD_PRELOAD_TYPES + 1];  // +1 for NULL termination
153   char *sp_libpath_list[MAX_LD_PRELOAD_TYPES + 1];  // +1 for NULL termination
154 };
155 
156 #endif /* ! _COLLECT_H */
157