xref: /llvm-project/llvm/lib/DebugInfo/LogicalView/Core/LVOptions.cpp (revision 026a29e8b38aad79568de033d0e8e5d2e6bb4250)
1c28a977bSCarlos Alberto Enciso //===-- LVOptions.cpp -----------------------------------------------------===//
2c28a977bSCarlos Alberto Enciso //
3c28a977bSCarlos Alberto Enciso // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4c28a977bSCarlos Alberto Enciso // See https://llvm.org/LICENSE.txt for license information.
5c28a977bSCarlos Alberto Enciso // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6c28a977bSCarlos Alberto Enciso //
7c28a977bSCarlos Alberto Enciso //===----------------------------------------------------------------------===//
8c28a977bSCarlos Alberto Enciso //
9c28a977bSCarlos Alberto Enciso // This implements the LVOptions class.
10c28a977bSCarlos Alberto Enciso //
11c28a977bSCarlos Alberto Enciso //===----------------------------------------------------------------------===//
12c28a977bSCarlos Alberto Enciso 
13c28a977bSCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVOptions.h"
140332a8e7SCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVReader.h"
150332a8e7SCarlos Alberto Enciso #include "llvm/Support/Errc.h"
16c28a977bSCarlos Alberto Enciso 
17c28a977bSCarlos Alberto Enciso using namespace llvm;
18c28a977bSCarlos Alberto Enciso using namespace llvm::logicalview;
19c28a977bSCarlos Alberto Enciso 
20c28a977bSCarlos Alberto Enciso #define DEBUG_TYPE "Options"
21c28a977bSCarlos Alberto Enciso 
22c28a977bSCarlos Alberto Enciso //===----------------------------------------------------------------------===//
23c28a977bSCarlos Alberto Enciso // Options extracted from the command line.
24c28a977bSCarlos Alberto Enciso //===----------------------------------------------------------------------===//
25c28a977bSCarlos Alberto Enciso static LVOptions Options;
getOptions()26c28a977bSCarlos Alberto Enciso LVOptions *LVOptions::getOptions() { return &Options; }
setOptions(LVOptions * CmdOptions)27c28a977bSCarlos Alberto Enciso void LVOptions::setOptions(LVOptions *CmdOptions) { Options = *CmdOptions; }
28c28a977bSCarlos Alberto Enciso 
resolveDependencies()29c28a977bSCarlos Alberto Enciso void LVOptions::resolveDependencies() {
30c28a977bSCarlos Alberto Enciso   // Attributes that are classified as standard options.
31c28a977bSCarlos Alberto Enciso   auto StandardAttributes = [&]() {
32c28a977bSCarlos Alberto Enciso     // Set the 'standard' attribute to indicate its associated attributes.
33c28a977bSCarlos Alberto Enciso     setAttributeStandard();
34c28a977bSCarlos Alberto Enciso 
35c28a977bSCarlos Alberto Enciso     setAttributeBase();
36c28a977bSCarlos Alberto Enciso     setAttributeCoverage();
37c28a977bSCarlos Alberto Enciso     setAttributeDirectories();
38c28a977bSCarlos Alberto Enciso     setAttributeDiscriminator();
39c28a977bSCarlos Alberto Enciso     setAttributeFilename();
40c28a977bSCarlos Alberto Enciso     setAttributeFiles();
41c28a977bSCarlos Alberto Enciso     setAttributeFormat();
42c28a977bSCarlos Alberto Enciso     setAttributeLevel();
43c28a977bSCarlos Alberto Enciso     setAttributeProducer();
44c28a977bSCarlos Alberto Enciso     setAttributePublics();
45c28a977bSCarlos Alberto Enciso     setAttributeRange();
46c28a977bSCarlos Alberto Enciso     setAttributeReference();
47c28a977bSCarlos Alberto Enciso     setAttributeZero();
48c28a977bSCarlos Alberto Enciso   };
49c28a977bSCarlos Alberto Enciso 
50c28a977bSCarlos Alberto Enciso   // Attributes that are classified as extended options.
51c28a977bSCarlos Alberto Enciso   auto ExtendedAttributes = [&]() {
52c28a977bSCarlos Alberto Enciso     // Set the 'extended' attribute to indicate its associated attributes.
53c28a977bSCarlos Alberto Enciso     setAttributeExtended();
54c28a977bSCarlos Alberto Enciso 
55c28a977bSCarlos Alberto Enciso     setAttributeArgument();
56c28a977bSCarlos Alberto Enciso     setAttributeDiscarded();
57c28a977bSCarlos Alberto Enciso     setAttributeEncoded();
58c28a977bSCarlos Alberto Enciso     setAttributeGaps();
59c28a977bSCarlos Alberto Enciso     setAttributeGenerated();
60c28a977bSCarlos Alberto Enciso     setAttributeGlobal();
61c28a977bSCarlos Alberto Enciso     setAttributeInserted();
62c28a977bSCarlos Alberto Enciso     setAttributeLinkage();
63c28a977bSCarlos Alberto Enciso     setAttributeLocal();
64c28a977bSCarlos Alberto Enciso     setAttributeLocation();
65c28a977bSCarlos Alberto Enciso     setAttributeOffset();
66c28a977bSCarlos Alberto Enciso     setAttributePathname();
67c28a977bSCarlos Alberto Enciso     setAttributeQualified();
68c28a977bSCarlos Alberto Enciso     setAttributeQualifier();
69c28a977bSCarlos Alberto Enciso     setAttributeRegister();
70c28a977bSCarlos Alberto Enciso     setAttributeSubrange();
71c28a977bSCarlos Alberto Enciso     setAttributeSystem();
72c28a977bSCarlos Alberto Enciso     setAttributeTypename();
73c28a977bSCarlos Alberto Enciso   };
74c28a977bSCarlos Alberto Enciso 
75c28a977bSCarlos Alberto Enciso   // '--Attribute=standard' settings.
76c28a977bSCarlos Alberto Enciso   if (getAttributeStandard())
77c28a977bSCarlos Alberto Enciso     StandardAttributes();
78c28a977bSCarlos Alberto Enciso 
79c28a977bSCarlos Alberto Enciso   // '--Attribute=extended' settings.
80c28a977bSCarlos Alberto Enciso   if (getAttributeExtended())
81c28a977bSCarlos Alberto Enciso     ExtendedAttributes();
82c28a977bSCarlos Alberto Enciso 
83c28a977bSCarlos Alberto Enciso   // '--Attribute=all' settings.
84c28a977bSCarlos Alberto Enciso   if (getAttributeAll()) {
85c28a977bSCarlos Alberto Enciso     StandardAttributes();
86c28a977bSCarlos Alberto Enciso     ExtendedAttributes();
87c28a977bSCarlos Alberto Enciso   }
88c28a977bSCarlos Alberto Enciso 
89c28a977bSCarlos Alberto Enciso   // '--attribute=pathname' supersedes '--attribute=filename'.
90c28a977bSCarlos Alberto Enciso   if (getAttributePathname())
91c28a977bSCarlos Alberto Enciso     resetAttributeFilename();
92c28a977bSCarlos Alberto Enciso 
93c28a977bSCarlos Alberto Enciso   // Assume '--output=text' as default
94c28a977bSCarlos Alberto Enciso   if (!getOutputText() && !getOutputJson())
95c28a977bSCarlos Alberto Enciso     setOutputText();
96c28a977bSCarlos Alberto Enciso 
97c28a977bSCarlos Alberto Enciso   // '--output=all' settings.
98c28a977bSCarlos Alberto Enciso   if (getOutputAll()) {
99c28a977bSCarlos Alberto Enciso     setOutputJson();
100c28a977bSCarlos Alberto Enciso     setOutputSplit();
101c28a977bSCarlos Alberto Enciso     setOutputText();
102c28a977bSCarlos Alberto Enciso   }
103c28a977bSCarlos Alberto Enciso 
104c28a977bSCarlos Alberto Enciso   // A view split folder was specified.
105c28a977bSCarlos Alberto Enciso   if (getOutputFolder().length())
106c28a977bSCarlos Alberto Enciso     setOutputSplit();
107c28a977bSCarlos Alberto Enciso 
108c28a977bSCarlos Alberto Enciso   // Always use the full pathname with splitted output.
109c28a977bSCarlos Alberto Enciso   if (getOutputSplit())
110c28a977bSCarlos Alberto Enciso     setAttributePathname();
111c28a977bSCarlos Alberto Enciso 
112c28a977bSCarlos Alberto Enciso   // '--print=elements' settings.
113c28a977bSCarlos Alberto Enciso   if (getPrintElements()) {
114c28a977bSCarlos Alberto Enciso     setPrintInstructions();
115c28a977bSCarlos Alberto Enciso     setPrintLines();
116c28a977bSCarlos Alberto Enciso     setPrintScopes();
117c28a977bSCarlos Alberto Enciso     setPrintSymbols();
118c28a977bSCarlos Alberto Enciso     setPrintTypes();
119c28a977bSCarlos Alberto Enciso   }
120c28a977bSCarlos Alberto Enciso 
121c28a977bSCarlos Alberto Enciso   // '--print=all' settings.
122c28a977bSCarlos Alberto Enciso   if (getPrintAll()) {
123c28a977bSCarlos Alberto Enciso     setPrintInstructions();
124c28a977bSCarlos Alberto Enciso     setPrintLines();
125c28a977bSCarlos Alberto Enciso     setPrintScopes();
126c28a977bSCarlos Alberto Enciso     setPrintSizes();
127c28a977bSCarlos Alberto Enciso     setPrintSymbols();
128c28a977bSCarlos Alberto Enciso     setPrintSummary();
129c28a977bSCarlos Alberto Enciso     setPrintTypes();
130c28a977bSCarlos Alberto Enciso     setPrintWarnings();
131c28a977bSCarlos Alberto Enciso   }
132c28a977bSCarlos Alberto Enciso 
133c28a977bSCarlos Alberto Enciso   // '--warning=all' settings.
134c28a977bSCarlos Alberto Enciso   if (getWarningAll()) {
135c28a977bSCarlos Alberto Enciso     setWarningCoverages();
136c28a977bSCarlos Alberto Enciso     setWarningLines();
137c28a977bSCarlos Alberto Enciso     setWarningLocations();
138c28a977bSCarlos Alberto Enciso     setWarningRanges();
139c28a977bSCarlos Alberto Enciso   }
140c28a977bSCarlos Alberto Enciso 
141c28a977bSCarlos Alberto Enciso   // '--internal=all' settings.
142c28a977bSCarlos Alberto Enciso   if (getInternalAll()) {
143c28a977bSCarlos Alberto Enciso     setInternalCmdline();
144c28a977bSCarlos Alberto Enciso     setInternalID();
145c28a977bSCarlos Alberto Enciso     setInternalIntegrity();
146c28a977bSCarlos Alberto Enciso     setInternalNone();
147c28a977bSCarlos Alberto Enciso     setInternalTag();
148c28a977bSCarlos Alberto Enciso   }
149c28a977bSCarlos Alberto Enciso 
150c28a977bSCarlos Alberto Enciso   // '--compare=all' settings.
151c28a977bSCarlos Alberto Enciso   if (getCompareAll()) {
152c28a977bSCarlos Alberto Enciso     setCompareLines();
153c28a977bSCarlos Alberto Enciso     setCompareScopes();
154c28a977bSCarlos Alberto Enciso     setCompareSymbols();
155c28a977bSCarlos Alberto Enciso     setCompareTypes();
156c28a977bSCarlos Alberto Enciso   }
157c28a977bSCarlos Alberto Enciso 
158c28a977bSCarlos Alberto Enciso   // Compare the scopes if a request for compare symbols, types, lines.
159c28a977bSCarlos Alberto Enciso   if (getCompareLines() || getCompareSymbols() || getCompareTypes())
160c28a977bSCarlos Alberto Enciso     setCompareScopes();
161c28a977bSCarlos Alberto Enciso 
162c28a977bSCarlos Alberto Enciso   // Generic request for comparison.
163c28a977bSCarlos Alberto Enciso   if (getCompareScopes())
164c28a977bSCarlos Alberto Enciso     setCompareExecute();
165c28a977bSCarlos Alberto Enciso 
166c28a977bSCarlos Alberto Enciso   // Print any logical line (debug or instruction).
167c28a977bSCarlos Alberto Enciso   if (getPrintInstructions() || getPrintLines())
168c28a977bSCarlos Alberto Enciso     setPrintAnyLine();
169c28a977bSCarlos Alberto Enciso 
170c28a977bSCarlos Alberto Enciso   // Print any logical element (line, scope, symbol or type).
171c28a977bSCarlos Alberto Enciso   if (getPrintAnyLine() || getPrintScopes() || getPrintSymbols() ||
172c28a977bSCarlos Alberto Enciso       getPrintTypes())
173c28a977bSCarlos Alberto Enciso     setPrintAnyElement();
174c28a977bSCarlos Alberto Enciso 
175c28a977bSCarlos Alberto Enciso   // Print 'sizes' or 'summary'.
176c28a977bSCarlos Alberto Enciso   if (getPrintSizes() && getPrintSummary())
177c28a977bSCarlos Alberto Enciso     setPrintSizesSummary();
178c28a977bSCarlos Alberto Enciso 
179c28a977bSCarlos Alberto Enciso   // Generic request for printing.
180c28a977bSCarlos Alberto Enciso   if (getPrintAll() || getPrintAnyElement() || getPrintSizesSummary() ||
181c28a977bSCarlos Alberto Enciso       getPrintWarnings())
182c28a977bSCarlos Alberto Enciso     setPrintExecute();
183c28a977bSCarlos Alberto Enciso 
184c28a977bSCarlos Alberto Enciso   // '--reports=all' settings.
185c28a977bSCarlos Alberto Enciso   if (getReportAll()) {
186c28a977bSCarlos Alberto Enciso     setReportChildren();
187c28a977bSCarlos Alberto Enciso     setReportList();
188c28a977bSCarlos Alberto Enciso     setReportParents();
189c28a977bSCarlos Alberto Enciso     setReportView();
190c28a977bSCarlos Alberto Enciso   }
191c28a977bSCarlos Alberto Enciso 
192c28a977bSCarlos Alberto Enciso   // '--report=view' is a shortcut for '--report=parents,children'.
193c28a977bSCarlos Alberto Enciso   if (getReportView()) {
194c28a977bSCarlos Alberto Enciso     setReportChildren();
195c28a977bSCarlos Alberto Enciso     setReportParents();
196c28a977bSCarlos Alberto Enciso   }
197c28a977bSCarlos Alberto Enciso 
198c28a977bSCarlos Alberto Enciso   // The report will include: Parents or Children.
199c28a977bSCarlos Alberto Enciso   if (getReportParents() || getReportChildren() || getReportView())
200c28a977bSCarlos Alberto Enciso     setReportAnyView();
201c28a977bSCarlos Alberto Enciso 
202c28a977bSCarlos Alberto Enciso   // The report will include: List or Parents or Children.
203c28a977bSCarlos Alberto Enciso   if (getReportList() || getReportAnyView())
204c28a977bSCarlos Alberto Enciso     setReportExecute();
205c28a977bSCarlos Alberto Enciso 
206c28a977bSCarlos Alberto Enciso   // If a view or element comparison has been requested, the following options
207c28a977bSCarlos Alberto Enciso   // must be set, in order to get a correct compare:
208c28a977bSCarlos Alberto Enciso   // 1) Sort the CUs, to get a fast compare.
209c28a977bSCarlos Alberto Enciso   // 2) Encode template instantiations, so the names include template
210c28a977bSCarlos Alberto Enciso   //    parameter information.
211c28a977bSCarlos Alberto Enciso   // 3) Include qualified types.
212c28a977bSCarlos Alberto Enciso   // 4) Include any inserted abstract references.
213c28a977bSCarlos Alberto Enciso   // 5) For added/missing elements add the '+' or '-' tags.
214c28a977bSCarlos Alberto Enciso   if (getCompareExecute()) {
215c28a977bSCarlos Alberto Enciso     resetPrintExecute();
216c28a977bSCarlos Alberto Enciso     setComparePrint();
217c28a977bSCarlos Alberto Enciso     setSortMode(LVSortMode::Line);
218c28a977bSCarlos Alberto Enciso     setAttributeAdded();
219c28a977bSCarlos Alberto Enciso     setAttributeArgument();
220c28a977bSCarlos Alberto Enciso     setAttributeEncoded();
221c28a977bSCarlos Alberto Enciso     setAttributeInserted();
222c28a977bSCarlos Alberto Enciso     setAttributeMissing();
223c28a977bSCarlos Alberto Enciso     setAttributeQualified();
224c28a977bSCarlos Alberto Enciso   }
225c28a977bSCarlos Alberto Enciso 
226c28a977bSCarlos Alberto Enciso   // Enable formatting for printing (indentation, print children).
227c28a977bSCarlos Alberto Enciso   setPrintFormatting();
228c28a977bSCarlos Alberto Enciso 
229c28a977bSCarlos Alberto Enciso   // These attributes are dependent on the capture of location information.
230c28a977bSCarlos Alberto Enciso   if (getAttributeCoverage() || getAttributeGaps() || getAttributeRegister())
231c28a977bSCarlos Alberto Enciso     setAttributeLocation();
232c28a977bSCarlos Alberto Enciso 
233c28a977bSCarlos Alberto Enciso   // Location information is only relevant when printing symbols.
234c28a977bSCarlos Alberto Enciso   if (!getPrintSymbols()) {
235c28a977bSCarlos Alberto Enciso     resetAttributeCoverage();
236c28a977bSCarlos Alberto Enciso     resetAttributeGaps();
237c28a977bSCarlos Alberto Enciso     resetAttributeLocation();
238c28a977bSCarlos Alberto Enciso     resetAttributeRegister();
239c28a977bSCarlos Alberto Enciso   }
240c28a977bSCarlos Alberto Enciso 
241c28a977bSCarlos Alberto Enciso   // Quick check for printing any element source information.
242c28a977bSCarlos Alberto Enciso   if (getAttributeFilename() || getAttributePathname())
243c28a977bSCarlos Alberto Enciso     setAttributeAnySource();
244c28a977bSCarlos Alberto Enciso 
245c28a977bSCarlos Alberto Enciso   // Quick check for printing any location information.
246c28a977bSCarlos Alberto Enciso   if (getAttributeLocation() || getAttributeRange())
247c28a977bSCarlos Alberto Enciso     setAttributeAnyLocation();
248c28a977bSCarlos Alberto Enciso 
249c28a977bSCarlos Alberto Enciso   if (getAttributeRange() || getPrintAnyLine())
250c28a977bSCarlos Alberto Enciso     setGeneralCollectRanges();
251c28a977bSCarlos Alberto Enciso 
252c28a977bSCarlos Alberto Enciso   calculateIndentationSize();
253c28a977bSCarlos Alberto Enciso 
254c28a977bSCarlos Alberto Enciso   // Print collected command line options.
255c28a977bSCarlos Alberto Enciso   LLVM_DEBUG({ dump(); });
256c28a977bSCarlos Alberto Enciso }
257c28a977bSCarlos Alberto Enciso 
calculateIndentationSize()258c28a977bSCarlos Alberto Enciso void LVOptions::calculateIndentationSize() {
259c28a977bSCarlos Alberto Enciso #ifndef NDEBUG
260c28a977bSCarlos Alberto Enciso   if (getInternalID()) {
261c28a977bSCarlos Alberto Enciso     std::string String = hexSquareString(0);
262c28a977bSCarlos Alberto Enciso     IndentationSize += String.length();
263c28a977bSCarlos Alberto Enciso   }
264c28a977bSCarlos Alberto Enciso #endif
265c28a977bSCarlos Alberto Enciso   if (getCompareExecute() && (getAttributeAdded() || getAttributeMissing()))
266c28a977bSCarlos Alberto Enciso     ++IndentationSize;
267c28a977bSCarlos Alberto Enciso   if (getAttributeOffset()) {
268c28a977bSCarlos Alberto Enciso     std::string String = hexSquareString(0);
269c28a977bSCarlos Alberto Enciso     IndentationSize += String.length();
270c28a977bSCarlos Alberto Enciso   }
271c28a977bSCarlos Alberto Enciso   if (getAttributeLevel()) {
272c28a977bSCarlos Alberto Enciso     std::stringstream Stream;
273c28a977bSCarlos Alberto Enciso     Stream.str(std::string());
274c28a977bSCarlos Alberto Enciso     Stream << "[" << std::setfill('0') << std::setw(3) << 0 << "]";
275c28a977bSCarlos Alberto Enciso     IndentationSize += Stream.tellp();
276c28a977bSCarlos Alberto Enciso   }
277c28a977bSCarlos Alberto Enciso   if (getAttributeGlobal())
278c28a977bSCarlos Alberto Enciso     ++IndentationSize;
279c28a977bSCarlos Alberto Enciso }
280c28a977bSCarlos Alberto Enciso 
281c28a977bSCarlos Alberto Enciso // Print the current values for all the options, after the dependencies
282c28a977bSCarlos Alberto Enciso // has been resolved.
print(raw_ostream & OS) const283c28a977bSCarlos Alberto Enciso void LVOptions::print(raw_ostream &OS) const {
284c28a977bSCarlos Alberto Enciso   // --attribute
285c28a977bSCarlos Alberto Enciso   OS << "** Attributes **\n"
286c28a977bSCarlos Alberto Enciso      << "All:           " << getAttributeAll() << ", "
287c28a977bSCarlos Alberto Enciso      << "Argument:      " << getAttributeArgument() << ", "
288c28a977bSCarlos Alberto Enciso      << "Base:          " << getAttributeBase() << ", "
289c28a977bSCarlos Alberto Enciso      << "Coverage:      " << getAttributeCoverage() << "\n"
290c28a977bSCarlos Alberto Enciso      << "Directories:   " << getAttributeDirectories() << ", "
291c28a977bSCarlos Alberto Enciso      << "Discarded:     " << getAttributeDiscarded() << ", "
292c28a977bSCarlos Alberto Enciso      << "Discriminator: " << getAttributeDiscriminator() << ", "
293c28a977bSCarlos Alberto Enciso      << "Encoded:       " << getAttributeEncoded() << "\n"
294c28a977bSCarlos Alberto Enciso      << "Extended:      " << getAttributeExtended() << ", "
295c28a977bSCarlos Alberto Enciso      << "Filename:      " << getAttributeFilename() << ", "
296c28a977bSCarlos Alberto Enciso      << "Files:         " << getAttributeFiles() << ", "
297c28a977bSCarlos Alberto Enciso      << "Format:        " << getAttributeFormat() << "\n"
298c28a977bSCarlos Alberto Enciso      << "Gaps:          " << getAttributeGaps() << ", "
299c28a977bSCarlos Alberto Enciso      << "Generated:     " << getAttributeGenerated() << ", "
300c28a977bSCarlos Alberto Enciso      << "Global:        " << getAttributeGlobal() << ", "
301c28a977bSCarlos Alberto Enciso      << "Inserted:      " << getAttributeInserted() << "\n"
302c28a977bSCarlos Alberto Enciso      << "Level:         " << getAttributeLevel() << ", "
303c28a977bSCarlos Alberto Enciso      << "Linkage:       " << getAttributeLinkage() << ", "
304c28a977bSCarlos Alberto Enciso      << "Local:         " << getAttributeLocal() << ", "
305c28a977bSCarlos Alberto Enciso      << "Location:      " << getAttributeLocation() << "\n"
306c28a977bSCarlos Alberto Enciso      << "Offset:        " << getAttributeOffset() << ", "
307c28a977bSCarlos Alberto Enciso      << "Pathname:      " << getAttributePathname() << ", "
308c28a977bSCarlos Alberto Enciso      << "Producer:      " << getAttributeProducer() << ", "
309c28a977bSCarlos Alberto Enciso      << "Publics:       " << getAttributePublics() << "\n"
310c28a977bSCarlos Alberto Enciso      << "Qualified:     " << getAttributeQualified() << ", "
311c28a977bSCarlos Alberto Enciso      << "Qualifier:     " << getAttributeQualifier() << ", "
312c28a977bSCarlos Alberto Enciso      << "Range:         " << getAttributeRange() << ", "
313c28a977bSCarlos Alberto Enciso      << "Reference:     " << getAttributeReference() << "\n"
314c28a977bSCarlos Alberto Enciso      << "Register:      " << getAttributeRegister() << ", "
315c28a977bSCarlos Alberto Enciso      << "Standard:      " << getAttributeStandard() << ", "
316c28a977bSCarlos Alberto Enciso      << "Subrange:      " << getAttributeSubrange() << ", "
317c28a977bSCarlos Alberto Enciso      << "System:        " << getAttributeSystem() << "\n"
318c28a977bSCarlos Alberto Enciso      << "Typename:      " << getAttributeTypename() << ", "
319c28a977bSCarlos Alberto Enciso      << "Underlying:    " << getAttributeUnderlying() << ", "
320c28a977bSCarlos Alberto Enciso      << "Zero:          " << getAttributeZero() << "\n";
321c28a977bSCarlos Alberto Enciso   OS << "Added:         " << getAttributeAdded() << ", "
322c28a977bSCarlos Alberto Enciso      << "AnyLocation:   " << getAttributeAnyLocation() << ", "
323c28a977bSCarlos Alberto Enciso      << "AnySource:     " << getAttributeAnySource() << ", "
324c28a977bSCarlos Alberto Enciso      << "Missing:       " << getAttributeMissing() << "\n"
325c28a977bSCarlos Alberto Enciso      << "\n";
326c28a977bSCarlos Alberto Enciso 
327c28a977bSCarlos Alberto Enciso   // --compare
328c28a977bSCarlos Alberto Enciso   OS << "** Compare **\n"
329c28a977bSCarlos Alberto Enciso      << "All:     " << getCompareAll() << ", "
330c28a977bSCarlos Alberto Enciso      << "Lines:   " << getCompareLines() << ", "
331c28a977bSCarlos Alberto Enciso      << "Scopes:  " << getCompareScopes() << ", "
332c28a977bSCarlos Alberto Enciso      << "Symbols: " << getCompareSymbols() << ", "
333c28a977bSCarlos Alberto Enciso      << "Types:   " << getCompareTypes() << "\n";
334c28a977bSCarlos Alberto Enciso   OS << "Context: " << getCompareContext() << ", "
335c28a977bSCarlos Alberto Enciso      << "Execute: " << getCompareExecute() << ", "
336c28a977bSCarlos Alberto Enciso      << "Print:   " << getComparePrint() << "\n"
337c28a977bSCarlos Alberto Enciso      << "\n";
338c28a977bSCarlos Alberto Enciso 
339c28a977bSCarlos Alberto Enciso   // --print
340c28a977bSCarlos Alberto Enciso   OS << "** Print **\n"
341c28a977bSCarlos Alberto Enciso      << "All:          " << getPrintAll() << ", "
342c28a977bSCarlos Alberto Enciso      << "Elements:     " << getPrintElements() << ", "
343c28a977bSCarlos Alberto Enciso      << "Instructions: " << getPrintInstructions() << ", "
344c28a977bSCarlos Alberto Enciso      << "Lines:        " << getPrintLines() << "\n"
345c28a977bSCarlos Alberto Enciso      << "Scopes:       " << getPrintScopes() << ", "
346c28a977bSCarlos Alberto Enciso      << "Sizes:        " << getPrintSizes() << ", "
347c28a977bSCarlos Alberto Enciso      << "Summary:      " << getPrintSummary() << ", "
348c28a977bSCarlos Alberto Enciso      << "Symbols:      " << getPrintSymbols() << "\n"
349c28a977bSCarlos Alberto Enciso      << "Types:        " << getPrintTypes() << ", "
350c28a977bSCarlos Alberto Enciso      << "Warnings:     " << getPrintWarnings() << "\n";
351c28a977bSCarlos Alberto Enciso   OS << "AnyElemeny:   " << getPrintAnyElement() << ", "
352c28a977bSCarlos Alberto Enciso      << "AnyLine:      " << getPrintAnyLine() << ", "
353c28a977bSCarlos Alberto Enciso      << "Execute:      " << getPrintExecute() << ", "
354c28a977bSCarlos Alberto Enciso      << "Formatting:   " << getPrintFormatting() << "\n"
355c28a977bSCarlos Alberto Enciso      << "Offset:       " << getPrintOffset() << ", "
356c28a977bSCarlos Alberto Enciso      << "SizesSummary: " << getPrintSizesSummary() << "\n"
357c28a977bSCarlos Alberto Enciso      << "\n";
358c28a977bSCarlos Alberto Enciso 
359c28a977bSCarlos Alberto Enciso   // --report
360c28a977bSCarlos Alberto Enciso   OS << "** Report **\n"
361c28a977bSCarlos Alberto Enciso      << "All:      " << getReportAll() << ", "
362c28a977bSCarlos Alberto Enciso      << "Children: " << getReportChildren() << ", "
363c28a977bSCarlos Alberto Enciso      << "List:     " << getReportList() << ", "
364c28a977bSCarlos Alberto Enciso      << "Parents:  " << getReportParents() << ", "
365c28a977bSCarlos Alberto Enciso      << "View:     " << getReportView() << "\n";
366c28a977bSCarlos Alberto Enciso   OS << "AnyView:  " << getReportAnyView() << ", "
367c28a977bSCarlos Alberto Enciso      << "Execute:  " << getReportExecute() << "\n"
368c28a977bSCarlos Alberto Enciso      << "\n";
369c28a977bSCarlos Alberto Enciso 
370c28a977bSCarlos Alberto Enciso   // --select
371c28a977bSCarlos Alberto Enciso   OS << "** Select **\n"
372c28a977bSCarlos Alberto Enciso      << "IgnoreCase:     " << getSelectIgnoreCase() << ", "
373c28a977bSCarlos Alberto Enciso      << "UseRegex:       " << getSelectUseRegex() << ", "
374c28a977bSCarlos Alberto Enciso      << "Execute:        " << getSelectExecute() << ", "
375c28a977bSCarlos Alberto Enciso      << "GenericKind:    " << getSelectGenericKind() << "\n"
376c28a977bSCarlos Alberto Enciso      << "GenericPattern: " << getSelectGenericPattern() << ", "
377c28a977bSCarlos Alberto Enciso      << "OffsetPattern:  " << getSelectOffsetPattern() << "\n"
378c28a977bSCarlos Alberto Enciso      << "\n";
379c28a977bSCarlos Alberto Enciso 
380c28a977bSCarlos Alberto Enciso   // --warning
381c28a977bSCarlos Alberto Enciso   OS << "** Warning **\n"
382c28a977bSCarlos Alberto Enciso      << "All:       " << getWarningAll() << ", "
383c28a977bSCarlos Alberto Enciso      << "Coverage:  " << getWarningCoverages() << ", "
384c28a977bSCarlos Alberto Enciso      << "Lines:     " << getWarningLines() << ", "
385c28a977bSCarlos Alberto Enciso      << "Locations: " << getWarningLocations() << ", "
386c28a977bSCarlos Alberto Enciso      << "Ranges:    " << getWarningRanges() << "\n"
387c28a977bSCarlos Alberto Enciso      << "\n";
388c28a977bSCarlos Alberto Enciso 
389c28a977bSCarlos Alberto Enciso   // --internal
390c28a977bSCarlos Alberto Enciso   OS << "** Internal **\n"
391c28a977bSCarlos Alberto Enciso      << "All:       " << Options.getInternalAll() << ", "
392c28a977bSCarlos Alberto Enciso      << "Cmdline:   " << Options.getInternalCmdline() << ", "
393c28a977bSCarlos Alberto Enciso      << "ID:        " << Options.getInternalID() << ", "
394c28a977bSCarlos Alberto Enciso      << "Integrity: " << Options.getInternalIntegrity() << ", "
395c28a977bSCarlos Alberto Enciso      << "None:      " << Options.getInternalNone() << "\n"
396c28a977bSCarlos Alberto Enciso      << "Tag:       " << Options.getInternalTag() << "\n"
397c28a977bSCarlos Alberto Enciso      << "\n";
398c28a977bSCarlos Alberto Enciso }
3990332a8e7SCarlos Alberto Enciso 
4000332a8e7SCarlos Alberto Enciso //===----------------------------------------------------------------------===//
4010332a8e7SCarlos Alberto Enciso // Logical element selection using patterns.
4020332a8e7SCarlos Alberto Enciso //===----------------------------------------------------------------------===//
getPatterns()4030332a8e7SCarlos Alberto Enciso LVPatterns *LVPatterns::getPatterns() {
4040332a8e7SCarlos Alberto Enciso   static LVPatterns Patterns;
4050332a8e7SCarlos Alberto Enciso   return &Patterns;
4060332a8e7SCarlos Alberto Enciso }
4070332a8e7SCarlos Alberto Enciso 
createMatchEntry(LVMatchInfo & Filters,StringRef Pattern,bool IgnoreCase,bool UseRegex)4080332a8e7SCarlos Alberto Enciso Error LVPatterns::createMatchEntry(LVMatchInfo &Filters, StringRef Pattern,
4090332a8e7SCarlos Alberto Enciso                                    bool IgnoreCase, bool UseRegex) {
4100332a8e7SCarlos Alberto Enciso   LVMatch Match;
4110332a8e7SCarlos Alberto Enciso   // Process pattern as regular expression.
4120332a8e7SCarlos Alberto Enciso   if (UseRegex) {
4130332a8e7SCarlos Alberto Enciso     Match.Pattern = std::string(Pattern);
4140332a8e7SCarlos Alberto Enciso     if (Pattern.size()) {
4150332a8e7SCarlos Alberto Enciso       Match.RE = std::make_shared<Regex>(Pattern, IgnoreCase ? Regex::IgnoreCase
4160332a8e7SCarlos Alberto Enciso                                                              : Regex::NoFlags);
4170332a8e7SCarlos Alberto Enciso       std::string Error;
4180332a8e7SCarlos Alberto Enciso       if (!Match.RE->isValid(Error))
4190332a8e7SCarlos Alberto Enciso         return createStringError(errc::invalid_argument,
4200332a8e7SCarlos Alberto Enciso                                  "Error in regular expression: %s",
4210332a8e7SCarlos Alberto Enciso                                  Error.c_str());
4220332a8e7SCarlos Alberto Enciso 
4230332a8e7SCarlos Alberto Enciso       Match.Mode = LVMatchMode::Regex;
4240332a8e7SCarlos Alberto Enciso       Filters.push_back(Match);
4250332a8e7SCarlos Alberto Enciso       return Error::success();
4260332a8e7SCarlos Alberto Enciso     }
4270332a8e7SCarlos Alberto Enciso   }
4280332a8e7SCarlos Alberto Enciso 
4290332a8e7SCarlos Alberto Enciso   // Process pattern as an exact string match, depending on the case.
4300332a8e7SCarlos Alberto Enciso   Match.Pattern = std::string(Pattern);
4310332a8e7SCarlos Alberto Enciso   if (Match.Pattern.size()) {
4320332a8e7SCarlos Alberto Enciso     Match.Mode = IgnoreCase ? LVMatchMode::NoCase : LVMatchMode::Match;
4330332a8e7SCarlos Alberto Enciso     Filters.push_back(Match);
4340332a8e7SCarlos Alberto Enciso   }
4350332a8e7SCarlos Alberto Enciso 
4360332a8e7SCarlos Alberto Enciso   return Error::success();
4370332a8e7SCarlos Alberto Enciso }
4380332a8e7SCarlos Alberto Enciso 
addGenericPatterns(StringSet<> & Patterns)4390332a8e7SCarlos Alberto Enciso void LVPatterns::addGenericPatterns(StringSet<> &Patterns) {
4400332a8e7SCarlos Alberto Enciso   addPatterns(Patterns, GenericMatchInfo);
4410332a8e7SCarlos Alberto Enciso   if (GenericMatchInfo.size()) {
4420332a8e7SCarlos Alberto Enciso     options().setSelectGenericPattern();
4430332a8e7SCarlos Alberto Enciso     options().setSelectExecute();
4440332a8e7SCarlos Alberto Enciso   }
4450332a8e7SCarlos Alberto Enciso }
4460332a8e7SCarlos Alberto Enciso 
addOffsetPatterns(const LVOffsetSet & Patterns)4470332a8e7SCarlos Alberto Enciso void LVPatterns::addOffsetPatterns(const LVOffsetSet &Patterns) {
4480332a8e7SCarlos Alberto Enciso   for (const LVOffset &Entry : Patterns)
4490332a8e7SCarlos Alberto Enciso     OffsetMatchInfo.push_back(Entry);
4500332a8e7SCarlos Alberto Enciso   if (OffsetMatchInfo.size()) {
4510332a8e7SCarlos Alberto Enciso     options().setSelectOffsetPattern();
4520332a8e7SCarlos Alberto Enciso     options().setSelectExecute();
4530332a8e7SCarlos Alberto Enciso   }
4540332a8e7SCarlos Alberto Enciso }
4550332a8e7SCarlos Alberto Enciso 
addPatterns(StringSet<> & Patterns,LVMatchInfo & Filters)4560332a8e7SCarlos Alberto Enciso void LVPatterns::addPatterns(StringSet<> &Patterns, LVMatchInfo &Filters) {
4570332a8e7SCarlos Alberto Enciso   bool IgnoreCase = options().getSelectIgnoreCase();
4580332a8e7SCarlos Alberto Enciso   bool UseRegex = options().getSelectUseRegex();
4590332a8e7SCarlos Alberto Enciso   for (const StringSet<>::value_type &Entry : Patterns) {
4600332a8e7SCarlos Alberto Enciso     StringRef Pattern = Entry.first();
4610332a8e7SCarlos Alberto Enciso     if (Error Err = createMatchEntry(Filters, Pattern, IgnoreCase, UseRegex))
4620332a8e7SCarlos Alberto Enciso       consumeError(std::move(Err));
4630332a8e7SCarlos Alberto Enciso   }
4640332a8e7SCarlos Alberto Enciso 
4650332a8e7SCarlos Alberto Enciso   LLVM_DEBUG({
4660332a8e7SCarlos Alberto Enciso     dbgs() << "\nPattern Information:\n";
4670332a8e7SCarlos Alberto Enciso     for (LVMatch &Match : Filters)
4680332a8e7SCarlos Alberto Enciso       dbgs() << "Mode: "
4690332a8e7SCarlos Alberto Enciso              << (Match.Mode == LVMatchMode::Match ? "Match" : "Regex")
4700332a8e7SCarlos Alberto Enciso              << " Pattern: '" << Match.Pattern << "'\n";
4710332a8e7SCarlos Alberto Enciso   });
4720332a8e7SCarlos Alberto Enciso }
4730332a8e7SCarlos Alberto Enciso 
addElement(LVElement * Element)4740332a8e7SCarlos Alberto Enciso void LVPatterns::addElement(LVElement *Element) {
4750332a8e7SCarlos Alberto Enciso   // Mark any element that matches a given pattern.
4760332a8e7SCarlos Alberto Enciso   Element->setIsMatched();
4770332a8e7SCarlos Alberto Enciso   options().setSelectExecute();
4780332a8e7SCarlos Alberto Enciso   if (options().getReportList())
4790332a8e7SCarlos Alberto Enciso     getReaderCompileUnit()->addMatched(Element);
4800332a8e7SCarlos Alberto Enciso   if (options().getReportAnyView()) {
4810332a8e7SCarlos Alberto Enciso     getReaderCompileUnit()->addMatched(Element->getIsScope()
4820332a8e7SCarlos Alberto Enciso                                            ? static_cast<LVScope *>(Element)
4830332a8e7SCarlos Alberto Enciso                                            : Element->getParentScope());
4840332a8e7SCarlos Alberto Enciso     // Mark element as matched.
4850332a8e7SCarlos Alberto Enciso     if (!Element->getIsScope())
4860332a8e7SCarlos Alberto Enciso       Element->setHasPattern();
4870332a8e7SCarlos Alberto Enciso   }
4880332a8e7SCarlos Alberto Enciso }
4890332a8e7SCarlos Alberto Enciso 
updateReportOptions()4900332a8e7SCarlos Alberto Enciso void LVPatterns::updateReportOptions() {
4910332a8e7SCarlos Alberto Enciso   if (ElementRequest.size() || LineRequest.size() || ScopeRequest.size() ||
4920332a8e7SCarlos Alberto Enciso       SymbolRequest.size() || TypeRequest.size()) {
4930332a8e7SCarlos Alberto Enciso     options().setSelectGenericKind();
4940332a8e7SCarlos Alberto Enciso     options().setSelectExecute();
4950332a8e7SCarlos Alberto Enciso   }
4960332a8e7SCarlos Alberto Enciso 
4970332a8e7SCarlos Alberto Enciso   // If we have selected requests and there are no specified report options,
4980332a8e7SCarlos Alberto Enciso   // assume the 'details' option.
4990332a8e7SCarlos Alberto Enciso   if (options().getSelectExecute() && !options().getReportExecute()) {
5000332a8e7SCarlos Alberto Enciso     options().setReportExecute();
5010332a8e7SCarlos Alberto Enciso     options().setReportList();
5020332a8e7SCarlos Alberto Enciso   }
5030332a8e7SCarlos Alberto Enciso }
5040332a8e7SCarlos Alberto Enciso 
5050332a8e7SCarlos Alberto Enciso // Match a general pattern.
matchPattern(StringRef Input,const LVMatchInfo & MatchInfo)5060332a8e7SCarlos Alberto Enciso bool LVPatterns::matchPattern(StringRef Input, const LVMatchInfo &MatchInfo) {
5070332a8e7SCarlos Alberto Enciso   bool Matched = false;
508de1e911fSCarlos Alberto Enciso   // Do not match an empty 'Input'.
509de1e911fSCarlos Alberto Enciso   if (Input.empty())
510de1e911fSCarlos Alberto Enciso     return Matched;
5110332a8e7SCarlos Alberto Enciso   // Traverse all match specifications.
5120332a8e7SCarlos Alberto Enciso   for (const LVMatch &Match : MatchInfo) {
5130332a8e7SCarlos Alberto Enciso     switch (Match.Mode) {
5140332a8e7SCarlos Alberto Enciso     case LVMatchMode::Match:
515*026a29e8SKazu Hirata       Matched = Input == Match.Pattern;
5160332a8e7SCarlos Alberto Enciso       break;
5170332a8e7SCarlos Alberto Enciso     case LVMatchMode::NoCase:
5180332a8e7SCarlos Alberto Enciso       Matched = Input.equals_insensitive(Match.Pattern);
5190332a8e7SCarlos Alberto Enciso       break;
5200332a8e7SCarlos Alberto Enciso     case LVMatchMode::Regex:
5210332a8e7SCarlos Alberto Enciso       Matched = Match.RE->match(Input);
5220332a8e7SCarlos Alberto Enciso       break;
5230332a8e7SCarlos Alberto Enciso     default:
5240332a8e7SCarlos Alberto Enciso       break;
5250332a8e7SCarlos Alberto Enciso     }
5260332a8e7SCarlos Alberto Enciso     // Return if we have a match.
5270332a8e7SCarlos Alberto Enciso     if (Matched)
5280332a8e7SCarlos Alberto Enciso       return true;
5290332a8e7SCarlos Alberto Enciso   }
5300332a8e7SCarlos Alberto Enciso   return Matched;
5310332a8e7SCarlos Alberto Enciso }
5320332a8e7SCarlos Alberto Enciso 
printElement(const LVLine * Line) const5330332a8e7SCarlos Alberto Enciso bool LVPatterns::printElement(const LVLine *Line) const {
5340332a8e7SCarlos Alberto Enciso   return (options().getPrintLines() && Line->getIsLineDebug()) ||
5350332a8e7SCarlos Alberto Enciso          (options().getPrintInstructions() && Line->getIsLineAssembler());
5360332a8e7SCarlos Alberto Enciso }
5370332a8e7SCarlos Alberto Enciso 
printObject(const LVLocation * Location) const5380332a8e7SCarlos Alberto Enciso bool LVPatterns::printObject(const LVLocation *Location) const {
5390332a8e7SCarlos Alberto Enciso   if (options().getAttributeAll())
5400332a8e7SCarlos Alberto Enciso     return true;
5410332a8e7SCarlos Alberto Enciso   bool DoPrint = options().getAttributeAnyLocation();
5420332a8e7SCarlos Alberto Enciso   // Consider the case of filler locations.
5430332a8e7SCarlos Alberto Enciso   if (DoPrint && Location && Location->getIsGapEntry())
5440332a8e7SCarlos Alberto Enciso     DoPrint = options().getAttributeGaps();
5450332a8e7SCarlos Alberto Enciso   return DoPrint;
5460332a8e7SCarlos Alberto Enciso }
5470332a8e7SCarlos Alberto Enciso 
printElement(const LVScope * Scope) const5480332a8e7SCarlos Alberto Enciso bool LVPatterns::printElement(const LVScope *Scope) const {
5490332a8e7SCarlos Alberto Enciso   // A scope will be printed depending on the following rules:
5500332a8e7SCarlos Alberto Enciso   // - Request to print scopes.
5510332a8e7SCarlos Alberto Enciso   // - Request to print any of its children.
5520332a8e7SCarlos Alberto Enciso   // - If the scope is Root or CompileUnit:
5530332a8e7SCarlos Alberto Enciso   //     Request to print summary, sizes or warnings.
5540332a8e7SCarlos Alberto Enciso   return options().getPrintScopes() ||
5550332a8e7SCarlos Alberto Enciso          (options().getPrintSymbols() && Scope->getHasSymbols()) ||
5560332a8e7SCarlos Alberto Enciso          (options().getPrintAnyLine() && Scope->getHasLines()) ||
5570332a8e7SCarlos Alberto Enciso          (options().getPrintTypes() && Scope->getHasTypes()) ||
5580332a8e7SCarlos Alberto Enciso          ((options().getPrintSizesSummary() || options().getPrintWarnings()) &&
5590332a8e7SCarlos Alberto Enciso           (Scope->getIsRoot() || Scope->getIsCompileUnit()));
5600332a8e7SCarlos Alberto Enciso }
5610332a8e7SCarlos Alberto Enciso 
printElement(const LVSymbol * Symbol) const5620332a8e7SCarlos Alberto Enciso bool LVPatterns::printElement(const LVSymbol *Symbol) const {
5630332a8e7SCarlos Alberto Enciso   // Print compiler generated symbols only if command line option.
5640332a8e7SCarlos Alberto Enciso   if (Symbol->getIsArtificial())
5650332a8e7SCarlos Alberto Enciso     return options().getAttributeGenerated() && options().getPrintSymbols();
5660332a8e7SCarlos Alberto Enciso   return options().getPrintSymbols();
5670332a8e7SCarlos Alberto Enciso }
5680332a8e7SCarlos Alberto Enciso 
printElement(const LVType * Type) const5690332a8e7SCarlos Alberto Enciso bool LVPatterns::printElement(const LVType *Type) const {
5700332a8e7SCarlos Alberto Enciso   // Print array subranges only if print types is requested.
5710332a8e7SCarlos Alberto Enciso   if (Type->getIsSubrange())
5720332a8e7SCarlos Alberto Enciso     return options().getAttributeSubrange() && options().getPrintTypes();
5730332a8e7SCarlos Alberto Enciso   return options().getPrintTypes();
5740332a8e7SCarlos Alberto Enciso }
5750332a8e7SCarlos Alberto Enciso 
print(raw_ostream & OS) const5760332a8e7SCarlos Alberto Enciso void LVPatterns::print(raw_ostream &OS) const {
5770332a8e7SCarlos Alberto Enciso   OS << "LVPatterns\n";
5780332a8e7SCarlos Alberto Enciso   LLVM_DEBUG(dbgs() << "Print Patterns\n");
5790332a8e7SCarlos Alberto Enciso }
580