1*bdd1243dSDimitry Andric //===-- options.cpp - Command line options for llvm-debuginfo-analyzer----===//
2*bdd1243dSDimitry Andric //
3*bdd1243dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*bdd1243dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*bdd1243dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*bdd1243dSDimitry Andric //
7*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
8*bdd1243dSDimitry Andric //
9*bdd1243dSDimitry Andric // This handles the command line options for llvm-debuginfo-analyzer.
10*bdd1243dSDimitry Andric //
11*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
12*bdd1243dSDimitry Andric 
13*bdd1243dSDimitry Andric #include "Options.h"
14*bdd1243dSDimitry Andric #include "llvm/DebugInfo/LogicalView/Core/LVOptions.h"
15*bdd1243dSDimitry Andric #include "llvm/DebugInfo/LogicalView/Core/LVSort.h"
16*bdd1243dSDimitry Andric #include "llvm/Support/CommandLine.h"
17*bdd1243dSDimitry Andric 
18*bdd1243dSDimitry Andric using namespace llvm;
19*bdd1243dSDimitry Andric using namespace llvm::logicalview;
20*bdd1243dSDimitry Andric using namespace llvm::logicalview::cmdline;
21*bdd1243dSDimitry Andric 
22*bdd1243dSDimitry Andric /// @}
23*bdd1243dSDimitry Andric /// Command line options.
24*bdd1243dSDimitry Andric /// @{
25*bdd1243dSDimitry Andric 
OffsetParser(cl::Option & O)26*bdd1243dSDimitry Andric OffsetParser::OffsetParser(cl::Option &O) : parser<unsigned long long>(O) {}
27*bdd1243dSDimitry Andric OffsetParser::~OffsetParser() = default;
28*bdd1243dSDimitry Andric 
parse(cl::Option & O,StringRef ArgName,StringRef Arg,unsigned long long & Val)29*bdd1243dSDimitry Andric bool OffsetParser::parse(cl::Option &O, StringRef ArgName, StringRef Arg,
30*bdd1243dSDimitry Andric                          unsigned long long &Val) {
31*bdd1243dSDimitry Andric   char *End;
32*bdd1243dSDimitry Andric   std::string Argument(Arg);
33*bdd1243dSDimitry Andric   Val = strtoull(Argument.c_str(), &End, 0);
34*bdd1243dSDimitry Andric   if (*End)
35*bdd1243dSDimitry Andric     // Print an error message if unrecognized character.
36*bdd1243dSDimitry Andric     return O.error("'" + Arg + "' unrecognized character.");
37*bdd1243dSDimitry Andric   return false;
38*bdd1243dSDimitry Andric }
39*bdd1243dSDimitry Andric 
40*bdd1243dSDimitry Andric LVOptions cmdline::ReaderOptions;
41*bdd1243dSDimitry Andric 
42*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
43*bdd1243dSDimitry Andric // Specific options
44*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
45*bdd1243dSDimitry Andric cl::list<std::string>
46*bdd1243dSDimitry Andric     cmdline::InputFilenames(cl::desc("<input object files or .dSYM bundles>"),
47*bdd1243dSDimitry Andric                             cl::Positional, cl::ZeroOrMore);
48*bdd1243dSDimitry Andric 
49*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
50*bdd1243dSDimitry Andric // '--attribute' options
51*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
52*bdd1243dSDimitry Andric cl::OptionCategory
53*bdd1243dSDimitry Andric     cmdline::AttributeCategory("Attribute Options",
54*bdd1243dSDimitry Andric                                "These control extra attributes that are "
55*bdd1243dSDimitry Andric                                "added when the element is printed.");
56*bdd1243dSDimitry Andric 
57*bdd1243dSDimitry Andric // --attribute=<value>[,<value>,...]
58*bdd1243dSDimitry Andric cl::list<LVAttributeKind> cmdline::AttributeOptions(
59*bdd1243dSDimitry Andric     "attribute", cl::cat(AttributeCategory), cl::desc("Element attributes."),
60*bdd1243dSDimitry Andric     cl::Hidden, cl::CommaSeparated,
61*bdd1243dSDimitry Andric     values(clEnumValN(LVAttributeKind::All, "all", "Include all attributes."),
62*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Argument, "argument",
63*bdd1243dSDimitry Andric                       "Template parameters replaced by its arguments."),
64*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Base, "base",
65*bdd1243dSDimitry Andric                       "Base types (int, bool, etc.)."),
66*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Coverage, "coverage",
67*bdd1243dSDimitry Andric                       "Symbol location coverage."),
68*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Directories, "directories",
69*bdd1243dSDimitry Andric                       "Directories referenced in the debug information."),
70*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Discarded, "discarded",
71*bdd1243dSDimitry Andric                       "Discarded elements by the linker."),
72*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Discriminator, "discriminator",
73*bdd1243dSDimitry Andric                       "Discriminators for inlined function instances."),
74*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Encoded, "encoded",
75*bdd1243dSDimitry Andric                       "Template arguments encoded in the template name."),
76*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Extended, "extended",
77*bdd1243dSDimitry Andric                       "Advanced attributes alias."),
78*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Filename, "filename",
79*bdd1243dSDimitry Andric                       "Filename where the element is defined."),
80*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Files, "files",
81*bdd1243dSDimitry Andric                       "Files referenced in the debug information."),
82*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Format, "format",
83*bdd1243dSDimitry Andric                       "Object file format name."),
84*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Gaps, "gaps",
85*bdd1243dSDimitry Andric                       "Missing debug location (gaps)."),
86*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Generated, "generated",
87*bdd1243dSDimitry Andric                       "Compiler generated elements."),
88*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Global, "global",
89*bdd1243dSDimitry Andric                       "Element referenced across Compile Units."),
90*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Inserted, "inserted",
91*bdd1243dSDimitry Andric                       "Generated inlined abstract references."),
92*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Level, "level",
93*bdd1243dSDimitry Andric                       "Lexical scope level (File=0, Compile Unit=1)."),
94*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Linkage, "linkage", "Linkage name."),
95*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Local, "local",
96*bdd1243dSDimitry Andric                       "Element referenced only in the Compile Unit."),
97*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Location, "location",
98*bdd1243dSDimitry Andric                       "Element debug location."),
99*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Offset, "offset",
100*bdd1243dSDimitry Andric                       "Debug information offset."),
101*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Pathname, "pathname",
102*bdd1243dSDimitry Andric                       "Pathname where the element is defined."),
103*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Producer, "producer",
104*bdd1243dSDimitry Andric                       "Toolchain identification name."),
105*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Publics, "publics",
106*bdd1243dSDimitry Andric                       "Function names that are public."),
107*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Qualified, "qualified",
108*bdd1243dSDimitry Andric                       "The element type include parents in its name."),
109*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Qualifier, "qualifier",
110*bdd1243dSDimitry Andric                       "Line qualifiers (Newstatement, BasicBlock, etc.)."),
111*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Range, "range",
112*bdd1243dSDimitry Andric                       "Debug location ranges."),
113*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Reference, "reference",
114*bdd1243dSDimitry Andric                       "Element declaration and definition references."),
115*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Register, "register",
116*bdd1243dSDimitry Andric                       "Processor register names."),
117*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Standard, "standard",
118*bdd1243dSDimitry Andric                       "Basic attributes alias."),
119*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Subrange, "subrange",
120*bdd1243dSDimitry Andric                       "Subrange encoding information for arrays."),
121*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::System, "system",
122*bdd1243dSDimitry Andric                       "Display PDB's MS system elements."),
123*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Typename, "typename",
124*bdd1243dSDimitry Andric                       "Include Parameters in templates."),
125*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Underlying, "underlying",
126*bdd1243dSDimitry Andric                       "Underlying type for type definitions."),
127*bdd1243dSDimitry Andric            clEnumValN(LVAttributeKind::Zero, "zero", "Zero line numbers.")));
128*bdd1243dSDimitry Andric 
129*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
130*bdd1243dSDimitry Andric // '--compare' options
131*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
132*bdd1243dSDimitry Andric cl::OptionCategory
133*bdd1243dSDimitry Andric     cmdline::CompareCategory("Compare Options",
134*bdd1243dSDimitry Andric                              "These control the view comparison.");
135*bdd1243dSDimitry Andric 
136*bdd1243dSDimitry Andric // --compare-context
137*bdd1243dSDimitry Andric static cl::opt<bool, true>
138*bdd1243dSDimitry Andric     CompareContext("compare-context", cl::cat(CompareCategory),
139*bdd1243dSDimitry Andric                    cl::desc("Add the view as compare context."), cl::Hidden,
140*bdd1243dSDimitry Andric                    cl::ZeroOrMore, cl::location(ReaderOptions.Compare.Context),
141*bdd1243dSDimitry Andric                    cl::init(false));
142*bdd1243dSDimitry Andric 
143*bdd1243dSDimitry Andric // --compare=<value>[,<value>,...]
144*bdd1243dSDimitry Andric cl::list<LVCompareKind> cmdline::CompareElements(
145*bdd1243dSDimitry Andric     "compare", cl::cat(CompareCategory), cl::desc("Elements to compare."),
146*bdd1243dSDimitry Andric     cl::Hidden, cl::CommaSeparated,
147*bdd1243dSDimitry Andric     values(clEnumValN(LVCompareKind::All, "all", "Compare all elements."),
148*bdd1243dSDimitry Andric            clEnumValN(LVCompareKind::Lines, "lines", "Lines."),
149*bdd1243dSDimitry Andric            clEnumValN(LVCompareKind::Scopes, "scopes", "Scopes."),
150*bdd1243dSDimitry Andric            clEnumValN(LVCompareKind::Symbols, "symbols", "Symbols."),
151*bdd1243dSDimitry Andric            clEnumValN(LVCompareKind::Types, "types", "Types.")));
152*bdd1243dSDimitry Andric 
153*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
154*bdd1243dSDimitry Andric // '--output' options
155*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
156*bdd1243dSDimitry Andric cl::OptionCategory
157*bdd1243dSDimitry Andric     cmdline::OutputCategory("Output Options",
158*bdd1243dSDimitry Andric                             "These control the output generated.");
159*bdd1243dSDimitry Andric 
160*bdd1243dSDimitry Andric // --output-file=<filename>
161*bdd1243dSDimitry Andric cl::opt<std::string>
162*bdd1243dSDimitry Andric     cmdline::OutputFilename("output-file", cl::cat(OutputCategory),
163*bdd1243dSDimitry Andric                             cl::desc("Redirect output to the specified file."),
164*bdd1243dSDimitry Andric                             cl::Hidden, cl::value_desc("filename"),
165*bdd1243dSDimitry Andric                             cl::init("-"));
166*bdd1243dSDimitry Andric 
167*bdd1243dSDimitry Andric // --output-folder=<path>
168*bdd1243dSDimitry Andric static cl::opt<std::string, true>
169*bdd1243dSDimitry Andric     OutputFolder("output-folder", cl::cat(OutputCategory),
170*bdd1243dSDimitry Andric                  cl::desc("Folder name for view splitting."),
171*bdd1243dSDimitry Andric                  cl::value_desc("pathname"), cl::Hidden, cl::ZeroOrMore,
172*bdd1243dSDimitry Andric                  cl::location(ReaderOptions.Output.Folder));
173*bdd1243dSDimitry Andric 
174*bdd1243dSDimitry Andric // --output-level=<level>
175*bdd1243dSDimitry Andric static cl::opt<unsigned, true>
176*bdd1243dSDimitry Andric     OutputLevel("output-level", cl::cat(OutputCategory),
177*bdd1243dSDimitry Andric                 cl::desc("Only print to a depth of N elements."),
178*bdd1243dSDimitry Andric                 cl::value_desc("N"), cl::Hidden, cl::ZeroOrMore,
179*bdd1243dSDimitry Andric                 cl::location(ReaderOptions.Output.Level), cl::init(-1U));
180*bdd1243dSDimitry Andric 
181*bdd1243dSDimitry Andric // --ouput=<value>[,<value>,...]
182*bdd1243dSDimitry Andric cl::list<LVOutputKind> cmdline::OutputOptions(
183*bdd1243dSDimitry Andric     "output", cl::cat(OutputCategory), cl::desc("Outputs for view."),
184*bdd1243dSDimitry Andric     cl::Hidden, cl::CommaSeparated,
185*bdd1243dSDimitry Andric     values(clEnumValN(LVOutputKind::All, "all", "All outputs."),
186*bdd1243dSDimitry Andric            clEnumValN(LVOutputKind::Split, "split",
187*bdd1243dSDimitry Andric                       "Split the output by Compile Units."),
188*bdd1243dSDimitry Andric            clEnumValN(LVOutputKind::Text, "text",
189*bdd1243dSDimitry Andric                       "Use a free form text output."),
190*bdd1243dSDimitry Andric            clEnumValN(LVOutputKind::Json, "json",
191*bdd1243dSDimitry Andric                       "Use JSON as the output format.")));
192*bdd1243dSDimitry Andric 
193*bdd1243dSDimitry Andric // --output-sort
194*bdd1243dSDimitry Andric static cl::opt<LVSortMode, true> OutputSort(
195*bdd1243dSDimitry Andric     "output-sort", cl::cat(OutputCategory),
196*bdd1243dSDimitry Andric     cl::desc("Primary key when ordering logical view (default: line)."),
197*bdd1243dSDimitry Andric     cl::Hidden, cl::ZeroOrMore,
198*bdd1243dSDimitry Andric     values(clEnumValN(LVSortMode::Kind, "kind", "Sort by element kind."),
199*bdd1243dSDimitry Andric            clEnumValN(LVSortMode::Line, "line", "Sort by element line number."),
200*bdd1243dSDimitry Andric            clEnumValN(LVSortMode::Name, "name", "Sort by element name."),
201*bdd1243dSDimitry Andric            clEnumValN(LVSortMode::Offset, "offset", "Sort by element offset.")),
202*bdd1243dSDimitry Andric     cl::location(ReaderOptions.Output.SortMode), cl::init(LVSortMode::Line));
203*bdd1243dSDimitry Andric 
204*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
205*bdd1243dSDimitry Andric // '--print' options
206*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
207*bdd1243dSDimitry Andric cl::OptionCategory
208*bdd1243dSDimitry Andric     cmdline::PrintCategory("Print Options",
209*bdd1243dSDimitry Andric                            "These control which elements are printed.");
210*bdd1243dSDimitry Andric 
211*bdd1243dSDimitry Andric // --print=<value>[,<value>,...]
212*bdd1243dSDimitry Andric cl::list<LVPrintKind> cmdline::PrintOptions(
213*bdd1243dSDimitry Andric     "print", cl::cat(PrintCategory), cl::desc("Element to print."),
214*bdd1243dSDimitry Andric     cl::CommaSeparated,
215*bdd1243dSDimitry Andric     values(clEnumValN(LVPrintKind::All, "all", "All elements."),
216*bdd1243dSDimitry Andric            clEnumValN(LVPrintKind::Elements, "elements",
217*bdd1243dSDimitry Andric                       "Instructions, lines, scopes, symbols and types."),
218*bdd1243dSDimitry Andric            clEnumValN(LVPrintKind::Instructions, "instructions",
219*bdd1243dSDimitry Andric                       "Assembler instructions."),
220*bdd1243dSDimitry Andric            clEnumValN(LVPrintKind::Lines, "lines",
221*bdd1243dSDimitry Andric                       "Lines referenced in the debug information."),
222*bdd1243dSDimitry Andric            clEnumValN(LVPrintKind::Scopes, "scopes",
223*bdd1243dSDimitry Andric                       "A lexical block (Function, Class, etc.)."),
224*bdd1243dSDimitry Andric            clEnumValN(LVPrintKind::Sizes, "sizes",
225*bdd1243dSDimitry Andric                       "Scope contributions to the debug information."),
226*bdd1243dSDimitry Andric            clEnumValN(LVPrintKind::Summary, "summary",
227*bdd1243dSDimitry Andric                       "Summary of elements missing/added/matched/printed."),
228*bdd1243dSDimitry Andric            clEnumValN(LVPrintKind::Symbols, "symbols",
229*bdd1243dSDimitry Andric                       "Symbols (Variable, Members, etc.)."),
230*bdd1243dSDimitry Andric            clEnumValN(LVPrintKind::Types, "types",
231*bdd1243dSDimitry Andric                       "Types (Pointer, Reference, etc.)."),
232*bdd1243dSDimitry Andric            clEnumValN(LVPrintKind::Warnings, "warnings",
233*bdd1243dSDimitry Andric                       "Warnings detected.")));
234*bdd1243dSDimitry Andric 
235*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
236*bdd1243dSDimitry Andric // '--report' options
237*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
238*bdd1243dSDimitry Andric cl::OptionCategory
239*bdd1243dSDimitry Andric     cmdline::ReportCategory("Report Options",
240*bdd1243dSDimitry Andric                             "These control how the elements are printed.");
241*bdd1243dSDimitry Andric 
242*bdd1243dSDimitry Andric // --report=<value>[,<value>,...]
243*bdd1243dSDimitry Andric cl::list<LVReportKind> cmdline::ReportOptions(
244*bdd1243dSDimitry Andric     "report", cl::cat(ReportCategory),
245*bdd1243dSDimitry Andric     cl::desc("Reports layout used for print, compare and select."), cl::Hidden,
246*bdd1243dSDimitry Andric     cl::CommaSeparated,
247*bdd1243dSDimitry Andric     values(clEnumValN(LVReportKind::All, "all", "Generate all reports."),
248*bdd1243dSDimitry Andric            clEnumValN(LVReportKind::Children, "children",
249*bdd1243dSDimitry Andric                       "Selected elements are displayed in a tree view "
250*bdd1243dSDimitry Andric                       "(Include children)"),
251*bdd1243dSDimitry Andric            clEnumValN(LVReportKind::List, "list",
252*bdd1243dSDimitry Andric                       "Selected elements are displayed in a tabular format."),
253*bdd1243dSDimitry Andric            clEnumValN(LVReportKind::Parents, "parents",
254*bdd1243dSDimitry Andric                       "Selected elements are displayed in a tree view. "
255*bdd1243dSDimitry Andric                       "(Include parents)"),
256*bdd1243dSDimitry Andric            clEnumValN(LVReportKind::View, "view",
257*bdd1243dSDimitry Andric                       "Selected elements are displayed in a tree view "
258*bdd1243dSDimitry Andric                       "(Include parents and children.")));
259*bdd1243dSDimitry Andric 
260*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
261*bdd1243dSDimitry Andric // '--select' options
262*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
263*bdd1243dSDimitry Andric cl::OptionCategory
264*bdd1243dSDimitry Andric     cmdline::SelectCategory("Select Options",
265*bdd1243dSDimitry Andric                             "These control which elements are selected.");
266*bdd1243dSDimitry Andric 
267*bdd1243dSDimitry Andric // --select-nocase
268*bdd1243dSDimitry Andric static cl::opt<bool, true>
269*bdd1243dSDimitry Andric     SelectIgnoreCase("select-nocase", cl::cat(SelectCategory),
270*bdd1243dSDimitry Andric                      cl::desc("Ignore case distinctions when searching."),
271*bdd1243dSDimitry Andric                      cl::Hidden, cl::ZeroOrMore,
272*bdd1243dSDimitry Andric                      cl::location(ReaderOptions.Select.IgnoreCase),
273*bdd1243dSDimitry Andric                      cl::init(false));
274*bdd1243dSDimitry Andric 
275*bdd1243dSDimitry Andric // --select-regex
276*bdd1243dSDimitry Andric static cl::opt<bool, true> SelectUseRegex(
277*bdd1243dSDimitry Andric     "select-regex", cl::cat(SelectCategory),
278*bdd1243dSDimitry Andric     cl::desc("Treat any <pattern> strings as regular expressions when "
279*bdd1243dSDimitry Andric              "selecting instead of just as an exact string match."),
280*bdd1243dSDimitry Andric     cl::Hidden, cl::ZeroOrMore, cl::location(ReaderOptions.Select.UseRegex),
281*bdd1243dSDimitry Andric     cl::init(false));
282*bdd1243dSDimitry Andric 
283*bdd1243dSDimitry Andric // --select=<pattern>
284*bdd1243dSDimitry Andric cl::list<std::string> cmdline::SelectPatterns(
285*bdd1243dSDimitry Andric     "select", cl::cat(SelectCategory),
286*bdd1243dSDimitry Andric     cl::desc("Search elements matching the given pattern."), cl::Hidden,
287*bdd1243dSDimitry Andric     cl::value_desc("pattern"), cl::CommaSeparated);
288*bdd1243dSDimitry Andric 
289*bdd1243dSDimitry Andric // --select-offsets=<value>[,<value>,...]
290*bdd1243dSDimitry Andric OffsetOptionList cmdline::SelectOffsets("select-offsets",
291*bdd1243dSDimitry Andric                                         cl::cat(SelectCategory),
292*bdd1243dSDimitry Andric                                         cl::desc("Offset element to print."),
293*bdd1243dSDimitry Andric                                         cl::Hidden, cl::value_desc("offset"),
294*bdd1243dSDimitry Andric                                         cl::CommaSeparated, cl::ZeroOrMore);
295*bdd1243dSDimitry Andric 
296*bdd1243dSDimitry Andric // --select-elements=<value>[,<value>,...]
297*bdd1243dSDimitry Andric cl::list<LVElementKind> cmdline::SelectElements(
298*bdd1243dSDimitry Andric     "select-elements", cl::cat(SelectCategory),
299*bdd1243dSDimitry Andric     cl::desc("Conditions to use when printing elements."), cl::Hidden,
300*bdd1243dSDimitry Andric     cl::CommaSeparated,
301*bdd1243dSDimitry Andric     values(clEnumValN(LVElementKind::Discarded, "Discarded",
302*bdd1243dSDimitry Andric                       "Discarded elements by the linker."),
303*bdd1243dSDimitry Andric            clEnumValN(LVElementKind::Global, "Global",
304*bdd1243dSDimitry Andric                       "Element referenced across Compile Units."),
305*bdd1243dSDimitry Andric            clEnumValN(LVElementKind::Optimized, "Optimized",
306*bdd1243dSDimitry Andric                       "Generated inlined abstract references.")));
307*bdd1243dSDimitry Andric 
308*bdd1243dSDimitry Andric // --select-lines=<value>[,<value>,...]
309*bdd1243dSDimitry Andric cl::list<LVLineKind> cmdline::SelectLines(
310*bdd1243dSDimitry Andric     "select-lines", cl::cat(SelectCategory),
311*bdd1243dSDimitry Andric     cl::desc("Line kind to use when printing lines."), cl::Hidden,
312*bdd1243dSDimitry Andric     cl::CommaSeparated,
313*bdd1243dSDimitry Andric     values(
314*bdd1243dSDimitry Andric         clEnumValN(LVLineKind::IsAlwaysStepInto, "AlwaysStepInto",
315*bdd1243dSDimitry Andric                    "Always Step Into."),
316*bdd1243dSDimitry Andric         clEnumValN(LVLineKind::IsBasicBlock, "BasicBlock", "Basic block."),
317*bdd1243dSDimitry Andric         clEnumValN(LVLineKind::IsDiscriminator, "Discriminator",
318*bdd1243dSDimitry Andric                    "Discriminator."),
319*bdd1243dSDimitry Andric         clEnumValN(LVLineKind::IsEndSequence, "EndSequence", "End sequence."),
320*bdd1243dSDimitry Andric         clEnumValN(LVLineKind::IsEpilogueBegin, "EpilogueBegin.",
321*bdd1243dSDimitry Andric                    "Epilogue begin."),
322*bdd1243dSDimitry Andric         clEnumValN(LVLineKind::IsLineDebug, "LineDebug", "Debug line."),
323*bdd1243dSDimitry Andric         clEnumValN(LVLineKind::IsLineAssembler, "LineAssembler",
324*bdd1243dSDimitry Andric                    "Assembler line."),
325*bdd1243dSDimitry Andric         clEnumValN(LVLineKind::IsNeverStepInto, "NeverStepInto",
326*bdd1243dSDimitry Andric                    "Never Step Into."),
327*bdd1243dSDimitry Andric         clEnumValN(LVLineKind::IsNewStatement, "NewStatement",
328*bdd1243dSDimitry Andric                    "New statement."),
329*bdd1243dSDimitry Andric         clEnumValN(LVLineKind::IsPrologueEnd, "PrologueEnd", "Prologue end.")));
330*bdd1243dSDimitry Andric 
331*bdd1243dSDimitry Andric // --select-scopes=<value>[,<value>,...]
332*bdd1243dSDimitry Andric cl::list<LVScopeKind> cmdline::SelectScopes(
333*bdd1243dSDimitry Andric     "select-scopes", cl::cat(SelectCategory),
334*bdd1243dSDimitry Andric     cl::desc("Scope kind to use when printing scopes."), cl::Hidden,
335*bdd1243dSDimitry Andric     cl::CommaSeparated,
336*bdd1243dSDimitry Andric     values(
337*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsAggregate, "Aggregate",
338*bdd1243dSDimitry Andric                    "Class, Structure or Union."),
339*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsArray, "Array", "Array."),
340*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsBlock, "Block", "Lexical block."),
341*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsCallSite, "CallSite", "Call site block."),
342*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsCatchBlock, "CatchBlock",
343*bdd1243dSDimitry Andric                    "Exception catch block."),
344*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsClass, "Class", "Class."),
345*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsCompileUnit, "CompileUnit", "Compile unit."),
346*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsEntryPoint, "EntryPoint",
347*bdd1243dSDimitry Andric                    "Function entry point."),
348*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsEnumeration, "Enumeration", "Enumeration."),
349*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsFunction, "Function", "Function."),
350*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsFunctionType, "FunctionType",
351*bdd1243dSDimitry Andric                    "Function type."),
352*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsInlinedFunction, "InlinedFunction",
353*bdd1243dSDimitry Andric                    "Inlined function."),
354*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsLabel, "Label", "Label."),
355*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsLexicalBlock, "LexicalBlock",
356*bdd1243dSDimitry Andric                    "Lexical block."),
357*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsNamespace, "Namespace", "Namespace."),
358*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsRoot, "Root", "Root."),
359*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsStructure, "Structure", "Structure."),
360*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsSubprogram, "Subprogram", "Subprogram."),
361*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsTemplate, "Template", "Template."),
362*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsTemplateAlias, "TemplateAlias",
363*bdd1243dSDimitry Andric                    "Template alias."),
364*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsTemplatePack, "TemplatePack",
365*bdd1243dSDimitry Andric                    "Template pack."),
366*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsTryBlock, "TryBlock", "Exception try block."),
367*bdd1243dSDimitry Andric         clEnumValN(LVScopeKind::IsUnion, "Union", "Union.")));
368*bdd1243dSDimitry Andric 
369*bdd1243dSDimitry Andric // --select-symbols=<value>[,<value>,...]
370*bdd1243dSDimitry Andric cl::list<LVSymbolKind> cmdline::SelectSymbols(
371*bdd1243dSDimitry Andric     "select-symbols", cl::cat(SelectCategory),
372*bdd1243dSDimitry Andric     cl::desc("Symbol kind to use when printing symbols."), cl::Hidden,
373*bdd1243dSDimitry Andric     cl::CommaSeparated,
374*bdd1243dSDimitry Andric     values(clEnumValN(LVSymbolKind::IsCallSiteParameter, "CallSiteParameter",
375*bdd1243dSDimitry Andric                       "Call site parameter."),
376*bdd1243dSDimitry Andric            clEnumValN(LVSymbolKind::IsConstant, "Constant", "Constant."),
377*bdd1243dSDimitry Andric            clEnumValN(LVSymbolKind::IsInheritance, "Inheritance",
378*bdd1243dSDimitry Andric                       "Inheritance."),
379*bdd1243dSDimitry Andric            clEnumValN(LVSymbolKind::IsMember, "Member", "Member."),
380*bdd1243dSDimitry Andric            clEnumValN(LVSymbolKind::IsParameter, "Parameter", "Parameter."),
381*bdd1243dSDimitry Andric            clEnumValN(LVSymbolKind::IsUnspecified, "Unspecified",
382*bdd1243dSDimitry Andric                       "Unspecified parameter."),
383*bdd1243dSDimitry Andric            clEnumValN(LVSymbolKind::IsVariable, "Variable", "Variable.")));
384*bdd1243dSDimitry Andric 
385*bdd1243dSDimitry Andric // --select-types=<value>[,<value>,...]
386*bdd1243dSDimitry Andric cl::list<LVTypeKind> cmdline::SelectTypes(
387*bdd1243dSDimitry Andric     "select-types", cl::cat(SelectCategory),
388*bdd1243dSDimitry Andric     cl::desc("Type kind to use when printing types."), cl::Hidden,
389*bdd1243dSDimitry Andric     cl::CommaSeparated,
390*bdd1243dSDimitry Andric     values(
391*bdd1243dSDimitry Andric         clEnumValN(LVTypeKind::IsBase, "Base", "Base Type (int, bool, etc.)."),
392*bdd1243dSDimitry Andric         clEnumValN(LVTypeKind::IsConst, "Const", "Constant specifier."),
393*bdd1243dSDimitry Andric         clEnumValN(LVTypeKind::IsEnumerator, "Enumerator", "Enumerator."),
394*bdd1243dSDimitry Andric         clEnumValN(LVTypeKind::IsImport, "Import", "Import."),
395*bdd1243dSDimitry Andric         clEnumValN(LVTypeKind::IsImportDeclaration, "ImportDeclaration",
396*bdd1243dSDimitry Andric                    "Import declaration."),
397*bdd1243dSDimitry Andric         clEnumValN(LVTypeKind::IsImportModule, "ImportModule",
398*bdd1243dSDimitry Andric                    "Import module."),
399*bdd1243dSDimitry Andric         clEnumValN(LVTypeKind::IsPointer, "Pointer", "Pointer."),
400*bdd1243dSDimitry Andric         clEnumValN(LVTypeKind::IsPointerMember, "PointerMember",
401*bdd1243dSDimitry Andric                    "Pointer to member."),
402*bdd1243dSDimitry Andric         clEnumValN(LVTypeKind::IsReference, "Reference", "Reference type."),
403*bdd1243dSDimitry Andric         clEnumValN(LVTypeKind::IsRestrict, "Restrict", "Restrict specifier."),
404*bdd1243dSDimitry Andric         clEnumValN(LVTypeKind::IsRvalueReference, "RvalueReference",
405*bdd1243dSDimitry Andric                    "Rvalue reference."),
406*bdd1243dSDimitry Andric         clEnumValN(LVTypeKind::IsSubrange, "Subrange", "Array subrange."),
407*bdd1243dSDimitry Andric         clEnumValN(LVTypeKind::IsTemplateParam, "TemplateParam",
408*bdd1243dSDimitry Andric                    "Template Parameter."),
409*bdd1243dSDimitry Andric         clEnumValN(LVTypeKind::IsTemplateTemplateParam, "TemplateTemplateParam",
410*bdd1243dSDimitry Andric                    "Template template parameter."),
411*bdd1243dSDimitry Andric         clEnumValN(LVTypeKind::IsTemplateTypeParam, "TemplateTypeParam",
412*bdd1243dSDimitry Andric                    "Template type parameter."),
413*bdd1243dSDimitry Andric         clEnumValN(LVTypeKind::IsTemplateValueParam, "TemplateValueParam",
414*bdd1243dSDimitry Andric                    "Template value parameter."),
415*bdd1243dSDimitry Andric         clEnumValN(LVTypeKind::IsTypedef, "Typedef", "Type definition."),
416*bdd1243dSDimitry Andric         clEnumValN(LVTypeKind::IsUnspecified, "Unspecified",
417*bdd1243dSDimitry Andric                    "Unspecified type."),
418*bdd1243dSDimitry Andric         clEnumValN(LVTypeKind::IsVolatile, "Volatile", "Volatile specifier.")));
419*bdd1243dSDimitry Andric 
420*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
421*bdd1243dSDimitry Andric // '--warning' options
422*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
423*bdd1243dSDimitry Andric cl::OptionCategory
424*bdd1243dSDimitry Andric     cmdline::WarningCategory("Warning Options",
425*bdd1243dSDimitry Andric                              "These control the generated warnings.");
426*bdd1243dSDimitry Andric 
427*bdd1243dSDimitry Andric // --warning=<value>[,<value>,...]
428*bdd1243dSDimitry Andric cl::list<LVWarningKind> cmdline::WarningOptions(
429*bdd1243dSDimitry Andric     "warning", cl::cat(WarningCategory), cl::desc("Warnings to generate."),
430*bdd1243dSDimitry Andric     cl::Hidden, cl::CommaSeparated,
431*bdd1243dSDimitry Andric     values(
432*bdd1243dSDimitry Andric         clEnumValN(LVWarningKind::All, "all", "All warnings."),
433*bdd1243dSDimitry Andric         clEnumValN(LVWarningKind::Coverages, "coverages",
434*bdd1243dSDimitry Andric                    "Invalid symbol coverages values."),
435*bdd1243dSDimitry Andric         clEnumValN(LVWarningKind::Lines, "lines", "Debug lines that are zero."),
436*bdd1243dSDimitry Andric         clEnumValN(LVWarningKind::Locations, "locations",
437*bdd1243dSDimitry Andric                    "Invalid symbol locations."),
438*bdd1243dSDimitry Andric         clEnumValN(LVWarningKind::Ranges, "ranges", "Invalid code ranges.")));
439*bdd1243dSDimitry Andric 
440*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
441*bdd1243dSDimitry Andric // '--internal' options
442*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
443*bdd1243dSDimitry Andric cl::OptionCategory
444*bdd1243dSDimitry Andric     cmdline::InternalCategory("Internal Options",
445*bdd1243dSDimitry Andric                               "Internal traces and extra debugging code.");
446*bdd1243dSDimitry Andric 
447*bdd1243dSDimitry Andric // --internal=<value>[,<value>,...]
448*bdd1243dSDimitry Andric cl::list<LVInternalKind> cmdline::InternalOptions(
449*bdd1243dSDimitry Andric     "internal", cl::cat(InternalCategory), cl::desc("Traces to enable."),
450*bdd1243dSDimitry Andric     cl::Hidden, cl::CommaSeparated,
451*bdd1243dSDimitry Andric     values(
452*bdd1243dSDimitry Andric         clEnumValN(LVInternalKind::All, "all", "Enable all traces."),
453*bdd1243dSDimitry Andric         clEnumValN(LVInternalKind::Cmdline, "cmdline", "Print command line."),
454*bdd1243dSDimitry Andric         clEnumValN(LVInternalKind::ID, "id", "Print unique element ID"),
455*bdd1243dSDimitry Andric         clEnumValN(LVInternalKind::Integrity, "integrity",
456*bdd1243dSDimitry Andric                    "Check elements integrity."),
457*bdd1243dSDimitry Andric         clEnumValN(LVInternalKind::None, "none", "Ignore element line number."),
458*bdd1243dSDimitry Andric         clEnumValN(LVInternalKind::Tag, "tag", "Debug information tags.")));
459*bdd1243dSDimitry Andric 
460*bdd1243dSDimitry Andric /// @}
461*bdd1243dSDimitry Andric 
462*bdd1243dSDimitry Andric // Copy local options into a globally accessible data structure.
propagateOptions()463*bdd1243dSDimitry Andric void llvm::logicalview::cmdline::propagateOptions() {
464*bdd1243dSDimitry Andric   // Traverse list of options and update the given set (Using case and Regex).
465*bdd1243dSDimitry Andric   auto UpdatePattern = [&](auto &List, auto &Set, bool IgnoreCase,
466*bdd1243dSDimitry Andric                            bool UseRegex) {
467*bdd1243dSDimitry Andric     if (!List.empty())
468*bdd1243dSDimitry Andric       for (std::string &Pattern : List)
469*bdd1243dSDimitry Andric         Set.insert((IgnoreCase && !UseRegex) ? StringRef(Pattern).lower()
470*bdd1243dSDimitry Andric                                              : Pattern);
471*bdd1243dSDimitry Andric   };
472*bdd1243dSDimitry Andric 
473*bdd1243dSDimitry Andric   // Handle --select.
474*bdd1243dSDimitry Andric   UpdatePattern(SelectPatterns, ReaderOptions.Select.Generic,
475*bdd1243dSDimitry Andric                 ReaderOptions.Select.IgnoreCase, ReaderOptions.Select.UseRegex);
476*bdd1243dSDimitry Andric 
477*bdd1243dSDimitry Andric   // Traverse list of options and update the given set.
478*bdd1243dSDimitry Andric   auto UpdateSet = [&](auto &List, auto &Set) {
479*bdd1243dSDimitry Andric     std::copy(List.begin(), List.end(), std::inserter(Set, Set.begin()));
480*bdd1243dSDimitry Andric   };
481*bdd1243dSDimitry Andric 
482*bdd1243dSDimitry Andric   // Handle options sets.
483*bdd1243dSDimitry Andric   UpdateSet(AttributeOptions, ReaderOptions.Attribute.Kinds);
484*bdd1243dSDimitry Andric   UpdateSet(PrintOptions, ReaderOptions.Print.Kinds);
485*bdd1243dSDimitry Andric   UpdateSet(OutputOptions, ReaderOptions.Output.Kinds);
486*bdd1243dSDimitry Andric   UpdateSet(ReportOptions, ReaderOptions.Report.Kinds);
487*bdd1243dSDimitry Andric   UpdateSet(WarningOptions, ReaderOptions.Warning.Kinds);
488*bdd1243dSDimitry Andric   UpdateSet(InternalOptions, ReaderOptions.Internal.Kinds);
489*bdd1243dSDimitry Andric 
490*bdd1243dSDimitry Andric   UpdateSet(SelectElements, ReaderOptions.Select.Elements);
491*bdd1243dSDimitry Andric   UpdateSet(SelectLines, ReaderOptions.Select.Lines);
492*bdd1243dSDimitry Andric   UpdateSet(SelectScopes, ReaderOptions.Select.Scopes);
493*bdd1243dSDimitry Andric   UpdateSet(SelectSymbols, ReaderOptions.Select.Symbols);
494*bdd1243dSDimitry Andric   UpdateSet(SelectTypes, ReaderOptions.Select.Types);
495*bdd1243dSDimitry Andric   UpdateSet(SelectOffsets, ReaderOptions.Select.Offsets);
496*bdd1243dSDimitry Andric   UpdateSet(CompareElements, ReaderOptions.Compare.Elements);
497*bdd1243dSDimitry Andric 
498*bdd1243dSDimitry Andric   // Resolve any options dependencies (ie. --print=all should set other
499*bdd1243dSDimitry Andric   // print options, etc.).
500*bdd1243dSDimitry Andric   ReaderOptions.resolveDependencies();
501*bdd1243dSDimitry Andric }
502