/* Copyright (C) 2021 Free Software Foundation, Inc.
Contributed by Oracle.
This file is part of GNU Binutils.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, 51 Franklin Street - Fifth Floor, Boston,
MA 02110-1301, USA. */
#ifndef _SETTINGS_H
#define _SETTINGS_H
#include <stdio.h>
#include <regex.h>
#include "gp-defs.h"
#include "Histable.h"
#include "MemorySpace.h"
#include "Metric.h"
#include "dbe_types.h"
#include "dbe_structs.h"
#include "enums.h"
#include "vec.h"
class Emsgqueue;
class Application;
struct DispTab;
// Settings object
class Settings
{
public:
friend class DbeView;
friend class DbeSession;
Settings (Application *_app);
Settings (Settings *_settings);
virtual ~Settings ();
void read_rc (bool ipc_or_rdt_mode); // read all rc files
char *read_rc (char *path); // read rc file
void buildMasterTabList (); // build list of Tabs that can be invoked
void updateTabAvailability (); // update for datamode, leaklist
Cmd_status set_name_format (char *str); // from a string
Vector<DispTab*> *
get_TabList () // Get the list of tabs for this view
{
return tab_list;
}
Vector<bool> *
get_MemTabState () // Get the list and order of memory tabs for this view
{
return mem_tab_state;
}
Vector<int> *
get_MemTabOrder ()
{
return mem_tab_order;
}
// Set the list of memory tabs for this view
void set_MemTabState (Vector<bool>*sel);
// add a newly-defined memory object tab
void mobj_define (MemObjType_t *, bool state);
// add a newly-defined index object tab
void indxobj_define (int type, bool state);
Vector<bool> *
get_IndxTabState () // Get the list and order of index tabs for this view
{
return indx_tab_state;
}
Vector<int> *
get_IndxTabOrder ()
{
return indx_tab_order;
}
// Set the list of index tabs for this view
void set_IndxTabState (Vector<bool>*sel);
void
set_name_format (int fname_fmt, bool soname_fmt)
{
name_format = Histable::make_fmt (fname_fmt, soname_fmt);
}
Histable::NameFormat
get_name_format ()
{
return name_format;
}
// public methods for setting and accessing the settings
Cmd_status set_view_mode (char *str, bool rc); // from a string
void
set_view_mode (VMode mode)
{
view_mode = mode;
}
VMode
get_view_mode ()
{
return view_mode;
}
// set the en_desc expression/on/off
Cmd_status set_en_desc (char *str, bool rc); // from a string
// check if the lineage or the target name matches the en_desc expression
bool check_en_desc (const char *lineage, const char *targname);
char *set_limit (char *str, bool rc); // from a string
char *
set_limit (int _limit)
{
limit = _limit;
return NULL;
}
int
get_limit ()
{
return limit;
}
char *set_printmode (char *_pmode);
// processing compiler commentary visibility bits
Cmd_status proc_compcom (const char *cmd, bool isSrc, bool rc);
// return any error string from processing visibility settings
char *get_compcom_errstr (Cmd_status status, const char *cmd);
// methods for setting and getting strings, and individual settings
char *
get_str_scompcom ()
{
return str_scompcom;
}
char *
get_str_dcompcom ()
{
return str_dcompcom;
}
int
get_src_compcom ()
{
return src_compcom;
}
int
get_dis_compcom ()
{
return dis_compcom;
}
void
set_cmpline_visible (bool v)
{
cmpline_visible = v;
}
void
set_funcline_visible (bool v)
{
funcline_visible = v;
}
void
set_src_visible (int v)
{
src_visible = v;
}
int
get_src_visible ()
{
return src_visible;
}
void
set_srcmetric_visible (bool v)
{
srcmetric_visible = v;
}
bool
get_srcmetric_visible ()
{
return srcmetric_visible;
}
void
set_hex_visible (bool v)
{
hex_visible = v;
}
bool
get_hex_visible ()
{
return hex_visible;
}
// processing and accessing the threshold settings
Cmd_status proc_thresh (char *cmd, bool isSrc, bool rc);
int
get_thresh_src ()
{
return threshold_src;
}
int
get_thresh_dis ()
{
return threshold_dis;
}
// process a tlmode setting
Cmd_status proc_tlmode (char *cmd, bool rc);
void
set_tlmode (int _tlmode)
{
tlmode = _tlmode;
}
int
get_tlmode ()
{
return tlmode;
}
void
set_stack_align (int _stack_align)
{
stack_align = _stack_align;
}
int
get_stack_align ()
{
return stack_align;
}
void
set_stack_depth (int _stack_depth)
{
stack_depth = _stack_depth;
}
int
get_stack_depth ()
{
return stack_depth;
}
// process a tabs setting: called when the tab list is requested
Cmd_status proc_tabs (bool _rdtMode);
Cmd_status proc_tldata (const char *cmd, bool rc); // process a tldata setting
void set_tldata (const char* tldata_string);
char *get_tldata ();
char *
get_default_metrics ()
{
return str_dmetrics;
}
char *
get_default_sort ()
{
return str_dsort;
}
void
set_ignore_no_xhwcprof (bool v) // ignore no xhwcprof errors for dataspace
{
ignore_no_xhwcprof = v;
}
bool
get_ignore_no_xhwcprof ()
{
return ignore_no_xhwcprof;
}
void
set_ignore_fs_warn (bool v) // ignore filesystem warnings in experiments
{
ignore_fs_warn = v;
}
bool
get_ignore_fs_warn ()
{
return ignore_fs_warn;
}
// add a pathmap
static char *add_pathmap (Vector<pathmap_t*> *v, const char *from, const char *to);
void set_pathmaps (Vector<pathmap_t*> *newPathMap);
// add a LoadObject expansion setting
bool set_libexpand (char *, enum LibExpand, bool);
enum LibExpand get_lo_setting (char *);
// set LoadObject expansion defaults back to .rc specifications
bool set_libdefaults ();
void
set_compare_mode (int mode)
{
compare_mode = mode;
}
int
get_compare_mode ()
{
return compare_mode;
}
char *
get_machinemodel ()
{
return dbe_strdup (machinemodel);
}
char *preload_libdirs;
protected: // data
Application *app;
// default strings from .rc file
char *str_vmode;
char *str_en_desc;
char *str_datamode;
char *str_scompcom;
char *str_sthresh;
char *str_dcompcom;
char *str_dthresh;
char *str_dmetrics;
char *str_dsort;
char *str_tlmode;
char *str_tldata;
char *str_tabs;
char *str_rtabs;
char *str_search_path;
char *str_name_format;
char *str_limit;
char *str_printmode;
char *str_compare;
bool tabs_processed;
// Processed settings
bool en_desc; // controls for reading descendant processes
char * en_desc_usr; // selective descendants: user specificaton
regex_t * en_desc_cmp; // selective descendants: compiled specification
Histable::NameFormat name_format; // long/short/mangled naming for C++/Java
VMode view_mode; // Java mode
int src_compcom; // compiler commentary visibility for anno-src
int dis_compcom; // compiler commentary visibility for anno-dis
int threshold_src; // threshold for anno-src
int threshold_dis; // threshold for anno-dis
int cmpline_visible; // show compile-line flags
int funcline_visible; // show compile-line flags
int src_visible; // show source in disasm
bool srcmetric_visible; // show metrics for source in disasm
bool hex_visible; // show hex code in disasm
char* tldata; // timeline data type string
int tlmode; // timeline mode for bars
int stack_align; // timeline stack alignment
int stack_depth; // timeline stack depth
int limit; // print limit
enum PrintMode print_mode;// print mode
char print_delim; // the delimiter, if print mode = PM_DELIM_SEP_LIST
int compare_mode; // compare mode
char *machinemodel; // machine model for Memory Objects
bool ignore_no_xhwcprof; // ignore no -xhwcprof data in dataspace
bool ignore_fs_warn; // ignore file-system recording warning
void set_rc (const char *path, bool msg, Emsgqueue *commentq,
bool override, bool ipc_or_rdt_mode = false);
Vector<DispTab*> *tab_list;
Vector<pathmap_t*> *pathmaps;
Vector<lo_expand_t*> *lo_expands;
enum LibExpand lo_expand_default;
bool is_loexpand_default;
Vector<bool> *mem_tab_state;
Vector<int> *mem_tab_order;
Vector<bool> *indx_tab_state;
Vector<int> *indx_tab_order;
};
#endif /* ! _SETTINGS_H */