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