| 1 | //===-- CommandOptionArgumentTable.cpp ------------------------------------===// |
| 2 | // |
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | |
| 9 | #include "lldb/Interpreter/CommandOptionArgumentTable.h" |
| 10 | #include "lldb/DataFormatters/FormatManager.h" |
| 11 | #include "lldb/Target/Language.h" |
| 12 | #include "lldb/Utility/StreamString.h" |
| 13 | |
| 14 | using namespace lldb; |
| 15 | using namespace lldb_private; |
| 16 | |
| 17 | namespace lldb_private { |
| 18 | llvm::StringRef RegisterNameHelpTextCallback() { |
| 19 | return "Register names can be specified using the architecture specific " |
| 20 | "names. " |
| 21 | "They can also be specified using generic names. Not all generic " |
| 22 | "entities have " |
| 23 | "registers backing them on all architectures. When they don't the " |
| 24 | "generic name " |
| 25 | "will return an error.\n" |
| 26 | "The generic names defined in lldb are:\n" |
| 27 | "\n" |
| 28 | "pc - program counter register\n" |
| 29 | "ra - return address register\n" |
| 30 | "fp - frame pointer register\n" |
| 31 | "sp - stack pointer register\n" |
| 32 | "flags - the flags register\n" |
| 33 | "arg{1-6} - integer argument passing registers.\n" ; |
| 34 | } |
| 35 | |
| 36 | llvm::StringRef BreakpointIDHelpTextCallback() { |
| 37 | return "Breakpoints are identified using major and minor numbers; the major " |
| 38 | "number corresponds to the single entity that was created with a " |
| 39 | "'breakpoint " |
| 40 | "set' command; the minor numbers correspond to all the locations that " |
| 41 | "were " |
| 42 | "actually found/set based on the major breakpoint. A full breakpoint " |
| 43 | "ID might " |
| 44 | "look like 3.14, meaning the 14th location set for the 3rd " |
| 45 | "breakpoint. You " |
| 46 | "can specify all the locations of a breakpoint by just indicating the " |
| 47 | "major " |
| 48 | "breakpoint number. A valid breakpoint ID consists either of just the " |
| 49 | "major " |
| 50 | "number, or the major number followed by a dot and the location " |
| 51 | "number (e.g. " |
| 52 | "3 or 3.2 could both be valid breakpoint IDs.)" ; |
| 53 | } |
| 54 | |
| 55 | llvm::StringRef BreakpointIDRangeHelpTextCallback() { |
| 56 | return "A 'breakpoint ID list' is a manner of specifying multiple " |
| 57 | "breakpoints. " |
| 58 | "This can be done through several mechanisms. The easiest way is to " |
| 59 | "just " |
| 60 | "enter a space-separated list of breakpoint IDs. To specify all the " |
| 61 | "breakpoint locations under a major breakpoint, you can use the major " |
| 62 | "breakpoint number followed by '.*', eg. '5.*' means all the " |
| 63 | "locations under " |
| 64 | "breakpoint 5. You can also indicate a range of breakpoints by using " |
| 65 | "<start-bp-id> - <end-bp-id>. The start-bp-id and end-bp-id for a " |
| 66 | "range can " |
| 67 | "be any valid breakpoint IDs. It is not legal, however, to specify a " |
| 68 | "range " |
| 69 | "using specific locations that cross major breakpoint numbers. I.e. " |
| 70 | "3.2 - 3.7" |
| 71 | " is legal; 2 - 5 is legal; but 3.2 - 4.4 is not legal." ; |
| 72 | } |
| 73 | |
| 74 | llvm::StringRef BreakpointNameHelpTextCallback() { |
| 75 | return "A name that can be added to a breakpoint when it is created, or " |
| 76 | "later " |
| 77 | "on with the \"breakpoint name add\" command. " |
| 78 | "Breakpoint names can be used to specify breakpoints in all the " |
| 79 | "places breakpoint IDs " |
| 80 | "and breakpoint ID ranges can be used. As such they provide a " |
| 81 | "convenient way to group breakpoints, " |
| 82 | "and to operate on breakpoints you create without having to track the " |
| 83 | "breakpoint number. " |
| 84 | "Note, the attributes you set when using a breakpoint name in a " |
| 85 | "breakpoint command don't " |
| 86 | "adhere to the name, but instead are set individually on all the " |
| 87 | "breakpoints currently tagged with that " |
| 88 | "name. Future breakpoints " |
| 89 | "tagged with that name will not pick up the attributes previously " |
| 90 | "given using that name. " |
| 91 | "In order to distinguish breakpoint names from breakpoint IDs and " |
| 92 | "ranges, " |
| 93 | "names must start with a letter from a-z or A-Z and cannot contain " |
| 94 | "spaces, \".\" or \"-\". " |
| 95 | "Also, breakpoint names can only be applied to breakpoints, not to " |
| 96 | "breakpoint locations." ; |
| 97 | } |
| 98 | |
| 99 | llvm::StringRef GDBFormatHelpTextCallback() { |
| 100 | return "A GDB format consists of a repeat count, a format letter and a size " |
| 101 | "letter. " |
| 102 | "The repeat count is optional and defaults to 1. The format letter is " |
| 103 | "optional " |
| 104 | "and defaults to the previous format that was used. The size letter " |
| 105 | "is optional " |
| 106 | "and defaults to the previous size that was used.\n" |
| 107 | "\n" |
| 108 | "Format letters include:\n" |
| 109 | "o - octal\n" |
| 110 | "x - hexadecimal\n" |
| 111 | "d - decimal\n" |
| 112 | "u - unsigned decimal\n" |
| 113 | "t - binary\n" |
| 114 | "f - float\n" |
| 115 | "a - address\n" |
| 116 | "i - instruction\n" |
| 117 | "c - char\n" |
| 118 | "s - string\n" |
| 119 | "T - OSType\n" |
| 120 | "A - float as hex\n" |
| 121 | "\n" |
| 122 | "Size letters include:\n" |
| 123 | "b - 1 byte (byte)\n" |
| 124 | "h - 2 bytes (halfword)\n" |
| 125 | "w - 4 bytes (word)\n" |
| 126 | "g - 8 bytes (giant)\n" |
| 127 | "\n" |
| 128 | "Example formats:\n" |
| 129 | "32xb - show 32 1 byte hexadecimal integer values\n" |
| 130 | "16xh - show 16 2 byte hexadecimal integer values\n" |
| 131 | "64 - show 64 2 byte hexadecimal integer values (format and size " |
| 132 | "from the last format)\n" |
| 133 | "dw - show 1 4 byte decimal integer value\n" ; |
| 134 | } |
| 135 | |
| 136 | llvm::StringRef FormatHelpTextCallback() { |
| 137 | static std::string help_text; |
| 138 | |
| 139 | if (!help_text.empty()) |
| 140 | return help_text; |
| 141 | |
| 142 | StreamString sstr; |
| 143 | sstr << "One of the format names (or one-character names) that can be used " |
| 144 | "to show a variable's value:\n" ; |
| 145 | for (Format f = eFormatDefault; f < kNumFormats; f = Format(f + 1)) { |
| 146 | if (f != eFormatDefault) |
| 147 | sstr.PutChar(ch: '\n'); |
| 148 | |
| 149 | char format_char = FormatManager::GetFormatAsFormatChar(format: f); |
| 150 | if (format_char) |
| 151 | sstr.Printf(format: "'%c' or " , format_char); |
| 152 | |
| 153 | sstr.Printf(format: "\"%s\"" , FormatManager::GetFormatAsCString(format: f)); |
| 154 | } |
| 155 | |
| 156 | sstr.Flush(); |
| 157 | |
| 158 | help_text = std::string(sstr.GetString()); |
| 159 | |
| 160 | return help_text; |
| 161 | } |
| 162 | |
| 163 | llvm::StringRef LanguageTypeHelpTextCallback() { |
| 164 | static std::string help_text; |
| 165 | |
| 166 | if (!help_text.empty()) |
| 167 | return help_text; |
| 168 | |
| 169 | StreamString sstr; |
| 170 | sstr << "One of the following languages:\n" ; |
| 171 | |
| 172 | Language::PrintAllLanguages(s&: sstr, prefix: " " , suffix: "\n" ); |
| 173 | |
| 174 | sstr.Flush(); |
| 175 | |
| 176 | help_text = std::string(sstr.GetString()); |
| 177 | |
| 178 | return help_text; |
| 179 | } |
| 180 | |
| 181 | llvm::StringRef SummaryStringHelpTextCallback() { |
| 182 | return "A summary string is a way to extract information from variables in " |
| 183 | "order to present them using a summary.\n" |
| 184 | "Summary strings contain static text, variables, scopes and control " |
| 185 | "sequences:\n" |
| 186 | " - Static text can be any sequence of non-special characters, i.e. " |
| 187 | "anything but '{', '}', '$', or '\\'.\n" |
| 188 | " - Variables are sequences of characters beginning with ${, ending " |
| 189 | "with } and that contain symbols in the format described below.\n" |
| 190 | " - Scopes are any sequence of text between { and }. Anything " |
| 191 | "included in a scope will only appear in the output summary if there " |
| 192 | "were no errors.\n" |
| 193 | " - Control sequences are the usual C/C++ '\\a', '\\n', ..., plus " |
| 194 | "'\\$', '\\{' and '\\}'.\n" |
| 195 | "A summary string works by copying static text verbatim, turning " |
| 196 | "control sequences into their character counterpart, expanding " |
| 197 | "variables and trying to expand scopes.\n" |
| 198 | "A variable is expanded by giving it a value other than its textual " |
| 199 | "representation, and the way this is done depends on what comes after " |
| 200 | "the ${ marker.\n" |
| 201 | "The most common sequence if ${var followed by an expression path, " |
| 202 | "which is the text one would type to access a member of an aggregate " |
| 203 | "types, given a variable of that type" |
| 204 | " (e.g. if type T has a member named x, which has a member named y, " |
| 205 | "and if t is of type T, the expression path would be .x.y and the way " |
| 206 | "to fit that into a summary string would be" |
| 207 | " ${var.x.y}). You can also use ${*var followed by an expression path " |
| 208 | "and in that case the object referred by the path will be " |
| 209 | "dereferenced before being displayed." |
| 210 | " If the object is not a pointer, doing so will cause an error. For " |
| 211 | "additional details on expression paths, you can type 'help " |
| 212 | "expr-path'. \n" |
| 213 | "By default, summary strings attempt to display the summary for any " |
| 214 | "variable they reference, and if that fails the value. If neither can " |
| 215 | "be shown, nothing is displayed." |
| 216 | "In a summary string, you can also use an array index [n], or a " |
| 217 | "slice-like range [n-m]. This can have two different meanings " |
| 218 | "depending on what kind of object the expression" |
| 219 | " path refers to:\n" |
| 220 | " - if it is a scalar type (any basic type like int, float, ...) the " |
| 221 | "expression is a bitfield, i.e. the bits indicated by the indexing " |
| 222 | "operator are extracted out of the number" |
| 223 | " and displayed as an individual variable\n" |
| 224 | " - if it is an array or pointer the array items indicated by the " |
| 225 | "indexing operator are shown as the result of the variable. if the " |
| 226 | "expression is an array, real array items are" |
| 227 | " printed; if it is a pointer, the pointer-as-array syntax is used to " |
| 228 | "obtain the values (this means, the latter case can have no range " |
| 229 | "checking)\n" |
| 230 | "If you are trying to display an array for which the size is known, " |
| 231 | "you can also use [] instead of giving an exact range. This has the " |
| 232 | "effect of showing items 0 thru size - 1.\n" |
| 233 | "Additionally, a variable can contain an (optional) format code, as " |
| 234 | "in ${var.x.y%code}, where code can be any of the valid formats " |
| 235 | "described in 'help format', or one of the" |
| 236 | " special symbols only allowed as part of a variable:\n" |
| 237 | " %V: show the value of the object by default\n" |
| 238 | " %S: show the summary of the object by default\n" |
| 239 | " %@: show the runtime-provided object description (for " |
| 240 | "Objective-C, it calls NSPrintForDebugger; for C/C++ it does " |
| 241 | "nothing)\n" |
| 242 | " %L: show the location of the object (memory address or a " |
| 243 | "register name)\n" |
| 244 | " %#: show the number of children of the object\n" |
| 245 | " %T: show the type of the object\n" |
| 246 | "Another variable that you can use in summary strings is ${svar . " |
| 247 | "This sequence works exactly like ${var, including the fact that " |
| 248 | "${*svar is an allowed sequence, but uses" |
| 249 | " the object's synthetic children provider instead of the actual " |
| 250 | "objects. For instance, if you are using STL synthetic children " |
| 251 | "providers, the following summary string would" |
| 252 | " count the number of actual elements stored in an std::list:\n" |
| 253 | "type summary add -s \"${svar%#}\" -x \"std::list<\"" ; |
| 254 | } |
| 255 | |
| 256 | llvm::StringRef ExprPathHelpTextCallback() { |
| 257 | return "An expression path is the sequence of symbols that is used in C/C++ " |
| 258 | "to access a member variable of an aggregate object (class).\n" |
| 259 | "For instance, given a class:\n" |
| 260 | " class foo {\n" |
| 261 | " int a;\n" |
| 262 | " int b; .\n" |
| 263 | " foo* next;\n" |
| 264 | " };\n" |
| 265 | "the expression to read item b in the item pointed to by next for foo " |
| 266 | "aFoo would be aFoo.next->b.\n" |
| 267 | "Given that aFoo could just be any object of type foo, the string " |
| 268 | "'.next->b' is the expression path, because it can be attached to any " |
| 269 | "foo instance to achieve the effect.\n" |
| 270 | "Expression paths in LLDB include dot (.) and arrow (->) operators, " |
| 271 | "and most commands using expression paths have ways to also accept " |
| 272 | "the star (*) operator.\n" |
| 273 | "The meaning of these operators is the same as the usual one given to " |
| 274 | "them by the C/C++ standards.\n" |
| 275 | "LLDB also has support for indexing ([ ]) in expression paths, and " |
| 276 | "extends the traditional meaning of the square brackets operator to " |
| 277 | "allow bitfield extraction:\n" |
| 278 | "for objects of native types (int, float, char, ...) saying '[n-m]' " |
| 279 | "as an expression path (where n and m are any positive integers, e.g. " |
| 280 | "[3-5]) causes LLDB to extract" |
| 281 | " bits n thru m from the value of the variable. If n == m, [n] is " |
| 282 | "also allowed as a shortcut syntax. For arrays and pointers, " |
| 283 | "expression paths can only contain one index" |
| 284 | " and the meaning of the operation is the same as the one defined by " |
| 285 | "C/C++ (item extraction). Some commands extend bitfield-like syntax " |
| 286 | "for arrays and pointers with the" |
| 287 | " meaning of array slicing (taking elements n thru m inside the array " |
| 288 | "or pointed-to memory)." ; |
| 289 | } |
| 290 | |
| 291 | llvm::StringRef arch_helper() { |
| 292 | static StreamString g_archs_help; |
| 293 | if (g_archs_help.Empty()) { |
| 294 | StringList archs; |
| 295 | |
| 296 | ArchSpec::ListSupportedArchNames(list&: archs); |
| 297 | g_archs_help.Printf(format: "These are the supported architecture names:\n" ); |
| 298 | archs.Join(separator: "\n" , strm&: g_archs_help); |
| 299 | } |
| 300 | return g_archs_help.GetString(); |
| 301 | } |
| 302 | |
| 303 | template <int I> struct TableValidator : TableValidator<I + 1> { |
| 304 | static_assert( |
| 305 | g_argument_table[I].arg_type == I, |
| 306 | "g_argument_table order doesn't match CommandArgumentType enumeration" ); |
| 307 | }; |
| 308 | |
| 309 | template <> struct TableValidator<eArgTypeLastArg> {}; |
| 310 | |
| 311 | TableValidator<0> validator; |
| 312 | |
| 313 | } // namespace lldb_private |
| 314 | |