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 _COMMAND_H 22 #define _COMMAND_H 23 24 25 #include <stdio.h> 26 #include <sys/types.h> 27 28 #include "Metric.h" 29 #include "Hist_data.h" 30 #include "dbe_types.h" 31 #include "vec.h" 32 #include "enums.h" 33 34 // This enum lists all the commands parsed by er_print 35 // The ordering here is not important, but LAST_CMD must 36 // be defined as the last command for which a help line will exist 37 // Command.cc has a matching list, and the ordering in 38 // that list determines what shows up under the help and xhelp commands. 39 // In particular, the entry for HELP is the last one printed 40 // for the help command, and the entry for HHELP is the last 41 // one printed for xhelp. 42 43 enum CmdType 44 { 45 // Pathtree-related commands 46 FUNCS = 0, 47 HOTPCS, 48 HOTLINES, 49 FDETAIL, 50 OBJECTS, 51 LDETAIL, 52 PDETAIL, 53 SOURCE, 54 DISASM, 55 METRIC_LIST, 56 METRICS, 57 SORT, 58 GPROF, 59 GMETRIC_LIST, 60 FSINGLE, 61 CSINGLE, 62 CPREPEND, 63 CAPPEND, 64 CRMFIRST, 65 CRMLAST, 66 CALLTREE, 67 CALLFLAME, 68 69 // Source/disassembly control commands 70 SCOMPCOM, 71 STHRESH, 72 DCOMPCOM, 73 COMPCOM, 74 DTHRESH, 75 76 // Heap trace-related commands 77 LEAKS, 78 ALLOCS, 79 HEAP, 80 HEAPSTAT, 81 82 // I/O trace-related commands 83 IOACTIVITY, 84 IOVFD, 85 IOCALLSTACK, 86 IOSTAT, 87 88 // Race detection related commands 89 RACE_EVNTS, 90 RACE_SUM, 91 92 // Deadlock detection commands 93 DEADLOCK_EVNTS, 94 DEADLOCK_SUM, 95 96 // DataSpace commands 97 DOBJECTS, 98 DO_SINGLE, 99 DO_LAYOUT, 100 DO_METRIC_LIST, 101 102 // MemorySpace commands 103 MEMOBJ, 104 MEMOBJLIST, 105 MEMOBJDEF, 106 MEMOBJDROP, 107 MACHINEMODEL, 108 109 // Custom tab commands 110 INDXOBJDEF, 111 INDXOBJLIST, 112 INDXOBJ, 113 INDX_METRIC_LIST, 114 115 // Old-style filtering commands 116 OBJECT_LIST, 117 OBJECT_SELECT, 118 SAMPLE_LIST, 119 SAMPLE_SELECT, 120 THREAD_LIST, 121 THREAD_SELECT, 122 LWP_LIST, 123 LWP_SELECT, 124 CPU_LIST, 125 CPU_SELECT, 126 127 // Shared Object display commands 128 OBJECT_SHOW, 129 OBJECT_HIDE, 130 OBJECT_API, 131 OBJECTS_DEFAULT, 132 133 // the new filtering commands 134 FILTERS, 135 136 // Miscellaneous commands 137 COMPARE, 138 PRINTMODE, 139 HEADER, 140 OVERVIEW_NEW, 141 SAMPLE_DETAIL, 142 STATISTICS, 143 EXP_LIST, 144 DESCRIBE, 145 OUTFILE, 146 APPENDFILE, 147 LIMIT, 148 NAMEFMT, 149 VIEWMODE, 150 EN_DESC, 151 SETPATH, 152 ADDPATH, 153 PATHMAP, 154 LIBDIRS, 155 SCRIPT, 156 VERSION_cmd, 157 QUIT, 158 PROCSTATS, 159 160 // Experiments handling commands 161 ADD_EXP, 162 DROP_EXP, 163 OPEN_EXP, 164 165 // .rc-only Commands 166 DMETRICS, 167 DSORT, 168 TLMODE, 169 TLDATA, 170 TABS, 171 TIMELINE, 172 MPI_TIMELINE, 173 MPI_CHART, 174 TIMELINE_CLASSIC_TBR, 175 SOURCE_V2, 176 DISASM_V2, 177 RTABS, 178 DUALSOURCE, 179 SOURCEDISAM, 180 181 HELP, // this is the last of the commands listed with "help" 182 IFREQ, 183 DUMPNODES, 184 DUMPSTACKS, 185 DUMPUNK, 186 DUMPFUNC, 187 DUMPDOBJS, 188 DUMPMAP, 189 DUMPENTITIES, 190 DUMP_PROFILE, 191 DUMP_SYNC, 192 DUMP_HWC, 193 DUMP_HEAP, 194 DUMP_IOTRACE, 195 RACE_ACCS, 196 DMPI_FUNCS, 197 DMPI_MSGS, 198 DMPI_EVENTS, 199 DMEM, 200 DUMP_GC, 201 DKILL, 202 IGNORE_NO_XHWCPROF, 203 IGNORE_FS_WARN, 204 QQUIT, 205 HHELP, // this is the last command listed with "xhelp" 206 NO_CMD, // Dummy command, used for headers in help 207 DUMMY_CMD, // Dummy command, used for help 208 209 // unused commands 210 LOADOBJECT, 211 LOADOBJECT_LIST, 212 LOADOBJECT_SELECT, 213 214 // Internal-only Commands 215 LAST_CMD, // No more commands for which a help line is possible 216 STDIN, 217 COMMENT, 218 WHOAMI, 219 220 // Error return "commands" 221 AMBIGUOUS_CMD, 222 UNKNOWN_CMD 223 }; 224 225 typedef struct 226 { 227 const CmdType token; // command key 228 const char *str; // command string 229 const char *alt; // alternate command string 230 const char *arg; // argument string for help 231 const int arg_count; // no. of arguments 232 char **desc; // description for help 233 } Cmdtable; 234 235 // Command class: never instantiated, completely static 236 class Command 237 { 238 public: 239 240 // look up a string in the command table, return type, set number of args 241 static CmdType get_command (char *cmd, int &arg_count, int ¶m); 242 static const char *get_cmd_str (CmdType type); 243 static void print_help (char *prog_name, bool cmd_line, bool usermode, FILE *outf); 244 static char *get_err_string (Cmd_status err); 245 246 static const char *DEFAULT_METRICS; // default if no .rc files read 247 static const char *DEFAULT_SORT; // default if no .rc files read 248 static const char *DEFAULT_CMD; // token for default 249 static const char *ALL_CMD; // token for all 250 static const char *ANY_CMD; // token for any 251 static const char *NONE_CMD; // token for none 252 static const char *HWC_CMD; // token for all HWC 253 static const char *BIT_CMD; // token for any bit-derived metric 254 255 private: 256 static const int user_no; // the last user command 257 static const int hidden_no; // the last hidden command 258 static const int command_no; // the last parsable command 259 260 static void init_desc (); 261 static char *fmt_help (int nc, char head); 262 }; 263 264 // Analyzer display tabs 265 struct DispTab 266 { DispTabDispTab267 DispTab (int ntype, int num, bool vis, CmdType token) 268 { 269 type = ntype; 270 order = num; 271 visible = vis; 272 available = true; 273 cmdtoken = token; 274 } 275 setAvailabilityDispTab276 void setAvailability (bool val) { available = val; } 277 278 int type; // Display type 279 int order; // Order in which tabs should appear in GUI 280 bool visible; // Is Tab visible 281 bool available; // Is tab available for this experiment 282 CmdType cmdtoken; // command token 283 int param; // command parameter (used for memory space) 284 }; 285 286 #endif /* ! _COMMAND_H */ 287