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