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 _SETTINGS_H
22 #define _SETTINGS_H
23 
24 #include <stdio.h>
25 #include <regex.h>
26 
27 #include "gp-defs.h"
28 #include "Histable.h"
29 #include "MemorySpace.h"
30 #include "Metric.h"
31 #include "dbe_types.h"
32 #include "dbe_structs.h"
33 #include "enums.h"
34 #include "vec.h"
35 
36 class Emsgqueue;
37 class Application;
38 
39 struct DispTab;
40 
41 // Settings object
42 
43 class Settings
44 {
45 public:
46   friend class DbeView;
47   friend class DbeSession;
48 
49   Settings (Application *_app);
50   Settings (Settings *_settings);
51   virtual ~Settings ();
52   void read_rc (bool ipc_or_rdt_mode);  // read all rc files
53   char *read_rc (char *path);           // read rc file
54   void buildMasterTabList ();       // build list of Tabs that can be invoked
55   void updateTabAvailability ();    // update for datamode, leaklist
56   Cmd_status set_name_format (char *str); // from a string
57 
58   Vector<DispTab*> *
get_TabList()59   get_TabList ()        // Get the list of tabs for this view
60   {
61     return tab_list;
62   }
63 
64   Vector<bool> *
get_MemTabState()65   get_MemTabState ()    // Get the list and order of memory tabs for this view
66   {
67     return mem_tab_state;
68   }
69 
70   Vector<int> *
get_MemTabOrder()71   get_MemTabOrder ()
72   {
73     return mem_tab_order;
74   }
75 
76   // Set the list of memory tabs for this view
77   void set_MemTabState (Vector<bool>*sel);
78 
79   // add a newly-defined memory object tab
80   void mobj_define (MemObjType_t *, bool state);
81 
82   // add a newly-defined index object tab
83   void indxobj_define (int type, bool state);
84 
85   Vector<bool> *
get_IndxTabState()86   get_IndxTabState ()   // Get the list and order of index tabs for this view
87   {
88     return indx_tab_state;
89   }
90 
91   Vector<int> *
get_IndxTabOrder()92   get_IndxTabOrder ()
93   {
94     return indx_tab_order;
95   }
96 
97   // Set the list of index tabs for this view
98   void set_IndxTabState (Vector<bool>*sel);
99 
100   void
set_name_format(int fname_fmt,bool soname_fmt)101   set_name_format (int fname_fmt, bool soname_fmt)
102   {
103     name_format = Histable::make_fmt (fname_fmt, soname_fmt);
104   }
105 
106   Histable::NameFormat
get_name_format()107   get_name_format ()
108   {
109     return name_format;
110   }
111 
112   // public methods for setting and accessing the settings
113   Cmd_status set_view_mode (char *str, bool rc); // from a string
114 
115   void
set_view_mode(VMode mode)116   set_view_mode (VMode mode)
117   {
118     view_mode = mode;
119   }
120 
121   VMode
get_view_mode()122   get_view_mode ()
123   {
124     return view_mode;
125   }
126 
127   // set the en_desc expression/on/off
128   Cmd_status set_en_desc (char *str, bool rc); // from a string
129   // check if the lineage or the target name matches the en_desc expression
130   bool check_en_desc (const char *lineage, const char *targname);
131 
132   char *set_limit (char *str, bool rc); // from a string
133 
134   char *
set_limit(int _limit)135   set_limit (int _limit)
136   {
137     limit = _limit;
138     return NULL;
139   }
140 
141   int
get_limit()142   get_limit ()
143   {
144     return limit;
145   }
146 
147   char *set_printmode (char *_pmode);
148 
149   // processing compiler commentary visibility bits
150   Cmd_status proc_compcom (const char *cmd, bool isSrc, bool rc);
151 
152   // return any error string from processing visibility settings
153   char *get_compcom_errstr (Cmd_status status, const char *cmd);
154 
155   // methods for setting and getting strings, and individual settings
156 
157   char *
get_str_scompcom()158   get_str_scompcom ()
159   {
160     return str_scompcom;
161   }
162 
163   char *
get_str_dcompcom()164   get_str_dcompcom ()
165   {
166     return str_dcompcom;
167   }
168 
169   int
get_src_compcom()170   get_src_compcom ()
171   {
172     return src_compcom;
173   }
174 
175   int
get_dis_compcom()176   get_dis_compcom ()
177   {
178     return dis_compcom;
179   }
180 
181   void
set_cmpline_visible(bool v)182   set_cmpline_visible (bool v)
183   {
184     cmpline_visible = v;
185   }
186 
187   void
set_funcline_visible(bool v)188   set_funcline_visible (bool v)
189   {
190     funcline_visible = v;
191   }
192 
193   void
set_src_visible(int v)194   set_src_visible (int v)
195   {
196     src_visible = v;
197   }
198 
199   int
get_src_visible()200   get_src_visible ()
201   {
202     return src_visible;
203   }
204 
205   void
set_srcmetric_visible(bool v)206   set_srcmetric_visible (bool v)
207   {
208     srcmetric_visible = v;
209   }
210 
211   bool
get_srcmetric_visible()212   get_srcmetric_visible ()
213   {
214     return srcmetric_visible;
215   }
216 
217   void
set_hex_visible(bool v)218   set_hex_visible (bool v)
219   {
220     hex_visible = v;
221   }
222 
223   bool
get_hex_visible()224   get_hex_visible ()
225   {
226     return hex_visible;
227   }
228 
229   // processing and accessing the threshold settings
230   Cmd_status proc_thresh (char *cmd, bool isSrc, bool rc);
231 
232   int
get_thresh_src()233   get_thresh_src ()
234   {
235     return threshold_src;
236   }
237 
238   int
get_thresh_dis()239   get_thresh_dis ()
240   {
241     return threshold_dis;
242   }
243 
244   // process a tlmode setting
245   Cmd_status proc_tlmode (char *cmd, bool rc);
246 
247   void
set_tlmode(int _tlmode)248   set_tlmode (int _tlmode)
249   {
250     tlmode = _tlmode;
251   }
252 
253   int
get_tlmode()254   get_tlmode ()
255   {
256     return tlmode;
257   }
258 
259   void
set_stack_align(int _stack_align)260   set_stack_align (int _stack_align)
261   {
262     stack_align = _stack_align;
263   }
264 
265   int
get_stack_align()266   get_stack_align ()
267   {
268     return stack_align;
269   }
270 
271   void
set_stack_depth(int _stack_depth)272   set_stack_depth (int _stack_depth)
273   {
274     stack_depth = _stack_depth;
275   }
276 
277   int
get_stack_depth()278   get_stack_depth ()
279   {
280     return stack_depth;
281   }
282 
283   // process a tabs setting: called when the tab list is requested
284   Cmd_status proc_tabs (bool _rdtMode);
285 
286   Cmd_status proc_tldata (const char *cmd, bool rc); // process a tldata setting
287   void set_tldata (const char* tldata_string);
288   char *get_tldata ();
289 
290   char *
get_default_metrics()291   get_default_metrics ()
292   {
293     return str_dmetrics;
294   }
295 
296   char *
get_default_sort()297   get_default_sort ()
298   {
299     return str_dsort;
300   }
301 
302   void
set_ignore_no_xhwcprof(bool v)303   set_ignore_no_xhwcprof (bool v)   // ignore no xhwcprof errors for dataspace
304   {
305     ignore_no_xhwcprof = v;
306   }
307 
308   bool
get_ignore_no_xhwcprof()309   get_ignore_no_xhwcprof ()
310   {
311     return ignore_no_xhwcprof;
312   }
313 
314   void
set_ignore_fs_warn(bool v)315   set_ignore_fs_warn (bool v)   // ignore filesystem warnings in experiments
316   {
317     ignore_fs_warn = v;
318   }
319 
320   bool
get_ignore_fs_warn()321   get_ignore_fs_warn ()
322   {
323     return ignore_fs_warn;
324   }
325 
326   // add a pathmap
327   static char *add_pathmap (Vector<pathmap_t*> *v, const char *from, const char *to);
328   void set_pathmaps (Vector<pathmap_t*> *newPathMap);
329 
330   // add a LoadObject expansion setting
331   bool set_libexpand (char *, enum LibExpand, bool);
332   enum LibExpand get_lo_setting (char *);
333 
334   // set LoadObject expansion defaults back to .rc specifications
335   bool set_libdefaults ();
336 
337   void
set_compare_mode(int mode)338   set_compare_mode (int mode)
339   {
340     compare_mode = mode;
341   }
342 
343   int
get_compare_mode()344   get_compare_mode ()
345   {
346     return compare_mode;
347   }
348 
349   char *
get_machinemodel()350   get_machinemodel ()
351   {
352     return dbe_strdup (machinemodel);
353   }
354 
355   char *preload_libdirs;
356 
357 protected: // data
358   Application *app;
359 
360   // default strings from .rc file
361   char *str_vmode;
362   char *str_en_desc;
363   char *str_datamode;
364   char *str_scompcom;
365   char *str_sthresh;
366   char *str_dcompcom;
367   char *str_dthresh;
368   char *str_dmetrics;
369   char *str_dsort;
370   char *str_tlmode;
371   char *str_tldata;
372   char *str_tabs;
373   char *str_rtabs;
374   char *str_search_path;
375   char *str_name_format;
376   char *str_limit;
377   char *str_printmode;
378   char *str_compare;
379 
380   bool tabs_processed;
381 
382   // Processed settings
383   bool en_desc;             // controls for reading descendant processes
384   char * en_desc_usr;       // selective descendants: user specificaton
385   regex_t * en_desc_cmp;    // selective descendants: compiled specification
386   Histable::NameFormat name_format; // long/short/mangled naming for C++/Java
387   VMode view_mode;          // Java mode
388   int src_compcom;          // compiler commentary visibility for anno-src
389   int dis_compcom;          // compiler commentary visibility for anno-dis
390   int threshold_src;        // threshold for anno-src
391   int threshold_dis;        // threshold for anno-dis
392   int cmpline_visible;      // show compile-line flags
393   int funcline_visible;     // show compile-line flags
394   int src_visible;          // show source in disasm
395   bool srcmetric_visible;   // show metrics for source in disasm
396   bool hex_visible;         // show hex code in disasm
397   char* tldata;             // timeline data type string
398   int tlmode;               // timeline mode for bars
399   int stack_align;          // timeline stack alignment
400   int stack_depth;          // timeline stack depth
401   int limit;                // print limit
402   enum PrintMode print_mode;// print mode
403   char print_delim;         // the delimiter, if print mode = PM_DELIM_SEP_LIST
404   int compare_mode;         // compare mode
405 
406   char *machinemodel; // machine model for Memory Objects
407 
408   bool ignore_no_xhwcprof; // ignore no -xhwcprof data in dataspace
409   bool ignore_fs_warn; // ignore file-system recording warning
410 
411   void set_rc (const char *path, bool msg, Emsgqueue *commentq,
412 	       bool override, bool ipc_or_rdt_mode = false);
413 
414   Vector<DispTab*> *tab_list;
415   Vector<pathmap_t*> *pathmaps;
416   Vector<lo_expand_t*> *lo_expands;
417   enum LibExpand lo_expand_default;
418   bool is_loexpand_default;
419   Vector<bool> *mem_tab_state;
420   Vector<int> *mem_tab_order;
421   Vector<bool> *indx_tab_state;
422   Vector<int> *indx_tab_order;
423 };
424 
425 #endif /* ! _SETTINGS_H */
426