xref: /llvm-project/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst (revision 5e7662efec36b0117cfdf85c0182e026e0019c4e)
1c28a977bSCarlos Alberto Encisollvm-debuginfo-analyzer - Print a logical representation of low-level debug information.
2c28a977bSCarlos Alberto Enciso========================================================================================
3c28a977bSCarlos Alberto Enciso
4c28a977bSCarlos Alberto Enciso.. program:: llvm-debuginfo-analyzer
5c28a977bSCarlos Alberto Enciso
6c28a977bSCarlos Alberto Enciso.. contents::
7c28a977bSCarlos Alberto Enciso   :local:
8c28a977bSCarlos Alberto Enciso
9c28a977bSCarlos Alberto EncisoSYNOPSIS
10c28a977bSCarlos Alberto Enciso--------
11c28a977bSCarlos Alberto Enciso:program:`llvm-debuginfo-analyzer` [*options*] [*filename ...*]
12c28a977bSCarlos Alberto Enciso
13c28a977bSCarlos Alberto EncisoDESCRIPTION
14c28a977bSCarlos Alberto Enciso-----------
15c28a977bSCarlos Alberto Enciso:program:`llvm-debuginfo-analyzer` parses debug and text sections in
16c28a977bSCarlos Alberto Encisobinary object files and prints their contents in a logical view, which
17c28a977bSCarlos Alberto Encisois a human readable representation that closely matches the structure
18c28a977bSCarlos Alberto Encisoof the original user source code. Supported object file formats include
19b19cfb91SCarlos Alberto EncisoELF, Mach-O, WebAssembly, PDB and COFF.
20c28a977bSCarlos Alberto Enciso
21c28a977bSCarlos Alberto EncisoThe **logical view** abstracts the complexity associated with the
22c28a977bSCarlos Alberto Encisodifferent low-level representations of the debugging information that
23c28a977bSCarlos Alberto Encisois embedded in the object file. :program:`llvm-debuginfo-analyzer`
24c28a977bSCarlos Alberto Encisoproduces a canonical view of the debug information regardless of how it
25c28a977bSCarlos Alberto Encisois formatted. The same logical view will be seen regardless of object
26c28a977bSCarlos Alberto Encisofile format, assuming the debug information correctly represents the
27c28a977bSCarlos Alberto Encisosame original source code.
28c28a977bSCarlos Alberto Enciso
29c28a977bSCarlos Alberto EncisoThe logical view includes the following **logical elements**: *type*,
30c28a977bSCarlos Alberto Enciso*scope*, *symbol* and *line*, which are the basic software elements used
31c28a977bSCarlos Alberto Encisoin the C/C++ programming language. Each logical element has a set of
32c28a977bSCarlos Alberto Enciso**attributes**, such as *types*, *classes*, *functions*, *variables*,
33c28a977bSCarlos Alberto Enciso*parameters*, etc. The :option:`--attribute` can be used to specify which
34c28a977bSCarlos Alberto Encisoattributes to include when printing a logical element. A logical element
35c28a977bSCarlos Alberto Encisomay have a **kind** that describes specific types of elements. For
36c28a977bSCarlos Alberto Encisoinstance, a *scope* could have a kind value of *function*, *class*,
37c28a977bSCarlos Alberto Enciso*namespace*.
38c28a977bSCarlos Alberto Enciso
39c28a977bSCarlos Alberto Enciso:program:`llvm-debuginfo-analyzer` defaults to print a pre-defined
40c28a977bSCarlos Alberto Encisolayout of logical elements and attributes. The command line options can
41c28a977bSCarlos Alberto Encisobe used to control the printed elements (:option:`--print`), using a
42c28a977bSCarlos Alberto Encisospecific layout (:option:`--report`), matching a given pattern
43c28a977bSCarlos Alberto Enciso(:option:`--select`, :option:`--select-offsets`). Also, the output can
44c28a977bSCarlos Alberto Encisobe limited to specified logical elements using (:option:`--select-lines`,
45c28a977bSCarlos Alberto Enciso:option:`--select-scopes`, :option:`--select-symbols`,
46c28a977bSCarlos Alberto Enciso:option:`--select-types`).
47c28a977bSCarlos Alberto Enciso
48c28a977bSCarlos Alberto Enciso:program:`llvm-debuginfo-analyzer` can also compare a set of logical
49c28a977bSCarlos Alberto Encisoviews (:option:`--compare`), to find differences and identify possible
50c28a977bSCarlos Alberto Encisodebug information syntax issues (:option:`--warning`) in any object file.
51c28a977bSCarlos Alberto Enciso
52c28a977bSCarlos Alberto EncisoOPTIONS
53c28a977bSCarlos Alberto Enciso-------
54c28a977bSCarlos Alberto Enciso:program:`llvm-debuginfo-analyzer` options are separated into several
55c28a977bSCarlos Alberto Encisocategories, each tailored to a different purpose:
56c28a977bSCarlos Alberto Enciso
57c28a977bSCarlos Alberto Enciso  * :ref:`general_` - Standard LLVM options to display help, version, etc.
58c28a977bSCarlos Alberto Enciso  * :ref:`attributes_` - Describe how to include different details when
59c28a977bSCarlos Alberto Enciso    printing an element.
60c28a977bSCarlos Alberto Enciso  * :ref:`print_` - Specify which elements will be included when printing
61c28a977bSCarlos Alberto Enciso    the view.
62c28a977bSCarlos Alberto Enciso  * :ref:`output_` - Describe the supported formats when printing the view.
63c28a977bSCarlos Alberto Enciso  * :ref:`report_` - Describe the format layouts for view printing.
64c28a977bSCarlos Alberto Enciso  * :ref:`select_` - Allows to use specific criteria or conditions to
65c28a977bSCarlos Alberto Enciso    select which elements to print.
66c28a977bSCarlos Alberto Enciso  * :ref:`compare_` - Compare logical views and print missing and/or
67c28a977bSCarlos Alberto Enciso    added elements.
68c28a977bSCarlos Alberto Enciso  * :ref:`warning_` - Print the warnings detected during the creation
69c28a977bSCarlos Alberto Enciso    of the view.
70c28a977bSCarlos Alberto Enciso  * :ref:`internal_` - Internal analysis of the logical view.
71c28a977bSCarlos Alberto Enciso
72c28a977bSCarlos Alberto Enciso.. _general_:
73c28a977bSCarlos Alberto Enciso
74c28a977bSCarlos Alberto EncisoGENERAL
75c28a977bSCarlos Alberto Enciso~~~~~~~
76c28a977bSCarlos Alberto EncisoThis section describes the standard help options, used to display the
77c28a977bSCarlos Alberto Encisousage, version, response files, etc.
78c28a977bSCarlos Alberto Enciso
79c28a977bSCarlos Alberto Enciso.. option:: -h, --help
80c28a977bSCarlos Alberto Enciso
81c28a977bSCarlos Alberto Enciso Show help and usage for this command. (--help-hidden for more).
82c28a977bSCarlos Alberto Enciso
83c28a977bSCarlos Alberto Enciso.. option:: --help-list
84c28a977bSCarlos Alberto Enciso
85c28a977bSCarlos Alberto Enciso Show help and usage for this command without grouping the options
86c28a977bSCarlos Alberto Enciso into categories (--help-list-hidden for more).
87c28a977bSCarlos Alberto Enciso
88c28a977bSCarlos Alberto Enciso.. option:: --help-hidden
89c28a977bSCarlos Alberto Enciso
90c28a977bSCarlos Alberto Enciso Display all available options.
91c28a977bSCarlos Alberto Enciso
92c28a977bSCarlos Alberto Enciso.. option:: --print-all-options
93c28a977bSCarlos Alberto Enciso
94c28a977bSCarlos Alberto Enciso Print all option values after command line parsing.
95c28a977bSCarlos Alberto Enciso
96c28a977bSCarlos Alberto Enciso.. option:: --print-options
97c28a977bSCarlos Alberto Enciso
98c28a977bSCarlos Alberto Enciso Print non-default options after command line parsing
99c28a977bSCarlos Alberto Enciso
100c28a977bSCarlos Alberto Enciso.. option:: --version
101c28a977bSCarlos Alberto Enciso
102c28a977bSCarlos Alberto Enciso Display the version of the tool.
103c28a977bSCarlos Alberto Enciso
104c28a977bSCarlos Alberto Enciso.. option:: @<FILE>
105c28a977bSCarlos Alberto Enciso
106c28a977bSCarlos Alberto Enciso Read command-line options from `<FILE>`.
107c28a977bSCarlos Alberto Enciso
108c28a977bSCarlos Alberto EncisoIf no input file is specified, :program:`llvm-debuginfo-analyzer`
109c28a977bSCarlos Alberto Encisodefaults to read `a.out` and return an error when no input file is found.
110c28a977bSCarlos Alberto Enciso
111c28a977bSCarlos Alberto EncisoIf `-` is used as the input file, :program:`llvm-debuginfo-analyzer`
112c28a977bSCarlos Alberto Encisoreads the input from its standard input stream.
113c28a977bSCarlos Alberto Enciso
114c28a977bSCarlos Alberto Enciso.. _attributes_:
115c28a977bSCarlos Alberto Enciso
116c28a977bSCarlos Alberto EncisoATTRIBUTES
117c28a977bSCarlos Alberto Enciso~~~~~~~~~~
118c28a977bSCarlos Alberto EncisoThe following options enable attributes given for the printed elements.
119c28a977bSCarlos Alberto EncisoThe attributes are divided in categories based on the type of data being
120c28a977bSCarlos Alberto Encisoadded, such as: internal offsets in the binary file, location descriptors,
121c28a977bSCarlos Alberto Encisoregister names, user source filenames, additional element transformations,
122c28a977bSCarlos Alberto Encisotoolchain name, binary file format, etc.
123c28a977bSCarlos Alberto Enciso
124c28a977bSCarlos Alberto Enciso.. option:: --attribute=<value[,value,...]>
125c28a977bSCarlos Alberto Enciso
126c28a977bSCarlos Alberto Enciso With **value** being one of the options in the following lists.
127c28a977bSCarlos Alberto Enciso
128c28a977bSCarlos Alberto Enciso .. code-block:: text
129c28a977bSCarlos Alberto Enciso
130c28a977bSCarlos Alberto Enciso   =all: Include all the below attributes.
131c28a977bSCarlos Alberto Enciso   =extended: Add low-level attributes.
132c28a977bSCarlos Alberto Enciso   =standard: Add standard high-level attributes.
133c28a977bSCarlos Alberto Enciso
134c28a977bSCarlos Alberto Enciso The following attributes describe the most common information for a
135c28a977bSCarlos Alberto Enciso logical element. They help to identify the lexical scope level; the
136c28a977bSCarlos Alberto Enciso element visibility across modules (global, local); the toolchain name
137c28a977bSCarlos Alberto Enciso that produced the binary file.
138c28a977bSCarlos Alberto Enciso
139c28a977bSCarlos Alberto Enciso .. code-block:: text
140c28a977bSCarlos Alberto Enciso
141c28a977bSCarlos Alberto Enciso   =global: Element referenced across Compile Units.
142c28a977bSCarlos Alberto Enciso   =format: Object file format name.
143c28a977bSCarlos Alberto Enciso   =level: Lexical scope level (File=0, Compile Unit=1).
144c28a977bSCarlos Alberto Enciso   =local: Element referenced only in the Compile Unit.
145c28a977bSCarlos Alberto Enciso   =producer: Toolchain identification name.
146c28a977bSCarlos Alberto Enciso
147c28a977bSCarlos Alberto Enciso The following attributes describe files and directory names from the
148c28a977bSCarlos Alberto Enciso user source code, where the elements are declared or defined; functions
149c28a977bSCarlos Alberto Enciso with public visibility across modules. These options allow to map the
150c28a977bSCarlos Alberto Enciso elements to their user code location, for cross references purposes.
151c28a977bSCarlos Alberto Enciso
152c28a977bSCarlos Alberto Enciso .. code-block:: text
153c28a977bSCarlos Alberto Enciso
154c28a977bSCarlos Alberto Enciso   =directories: Directories referenced in the debug information.
155c28a977bSCarlos Alberto Enciso   =filename: Filename where the element is defined.
156c28a977bSCarlos Alberto Enciso   =files: Files referenced in the debug information.
157c28a977bSCarlos Alberto Enciso   =pathname: Pathname where the object is defined.
158c28a977bSCarlos Alberto Enciso   =publics: Function names that are public.
159c28a977bSCarlos Alberto Enciso
160c28a977bSCarlos Alberto Enciso The following attributes describe additional logical element source
161c28a977bSCarlos Alberto Enciso transformations, in order to display built-in types (int, bool, etc.);
162c28a977bSCarlos Alberto Enciso parameters and arguments used during template instantiation; parent
163c28a977bSCarlos Alberto Enciso name hierarchy; array dimensions information; compiler generated
164c28a977bSCarlos Alberto Enciso elements and the underlying types associated with the types aliases.
165c28a977bSCarlos Alberto Enciso
166c28a977bSCarlos Alberto Enciso .. code-block:: text
167c28a977bSCarlos Alberto Enciso
168c28a977bSCarlos Alberto Enciso   =argument: Template parameters replaced by its arguments.
169c28a977bSCarlos Alberto Enciso   =base: Base types (int, bool, etc.).
170c28a977bSCarlos Alberto Enciso   =generated: Compiler generated elements.
171c28a977bSCarlos Alberto Enciso   =encoded: Template arguments encoded in the template name.
172c28a977bSCarlos Alberto Enciso   =qualified: The element type include parents in its name.
173c28a977bSCarlos Alberto Enciso   =reference: Element declaration and definition references.
174c28a977bSCarlos Alberto Enciso   =subrange: Subrange encoding information for arrays.
175c28a977bSCarlos Alberto Enciso   =typename: Template parameters.
176c28a977bSCarlos Alberto Enciso   =underlying: Underlying type for type definitions.
177c28a977bSCarlos Alberto Enciso
178c28a977bSCarlos Alberto Enciso The following attributes describe the debug location information for
179c28a977bSCarlos Alberto Enciso a symbol or scope. It includes the symbol percentage coverage and any
180c28a977bSCarlos Alberto Enciso gaps within the location layout; ranges determining the code sections
181c28a977bSCarlos Alberto Enciso attached to a function. When descriptors are used, the target processor
182c28a977bSCarlos Alberto Enciso registers are displayed.
183c28a977bSCarlos Alberto Enciso
184c28a977bSCarlos Alberto Enciso .. code-block:: text
185c28a977bSCarlos Alberto Enciso
186c28a977bSCarlos Alberto Enciso   =coverage: Symbol location coverage.
187c28a977bSCarlos Alberto Enciso   =gaps: Missing debug location (gaps).
188c28a977bSCarlos Alberto Enciso   =location: Symbol debug location.
189c28a977bSCarlos Alberto Enciso   =range: Debug location ranges.
190c28a977bSCarlos Alberto Enciso   =register: Processor register names.
191c28a977bSCarlos Alberto Enciso
192c28a977bSCarlos Alberto Enciso The following attributes are associated with low level details, such
193c28a977bSCarlos Alberto Enciso as: offsets in the binary file; discriminators added to the lines of
194c28a977bSCarlos Alberto Enciso inlined functions in order to distinguish specific instances; debug
195c28a977bSCarlos Alberto Enciso lines state machine registers; elements discarded by the compiler
196c28a977bSCarlos Alberto Enciso (inlining) or by the linker optimizations (dead-stripping); system
197c28a977bSCarlos Alberto Enciso compile units generated by the MS toolchain in PDBs.
198c28a977bSCarlos Alberto Enciso
199c28a977bSCarlos Alberto Enciso .. code-block:: text
200c28a977bSCarlos Alberto Enciso
201c28a977bSCarlos Alberto Enciso   =discarded: Discarded elements by the linker.
202c28a977bSCarlos Alberto Enciso   =discriminator: Discriminators for inlined function instances.
203c28a977bSCarlos Alberto Enciso   =inserted: Generated inlined abstract references.
204c28a977bSCarlos Alberto Enciso   =linkage: Object file linkage name.
205c28a977bSCarlos Alberto Enciso   =offset: Debug information offset.
206c28a977bSCarlos Alberto Enciso   =qualifier: Line qualifiers (Newstatement, BasicBlock, etc).
207c28a977bSCarlos Alberto Enciso   =zero: Zero line numbers.
208c28a977bSCarlos Alberto Enciso
209c28a977bSCarlos Alberto Enciso The following attribute described specific information for the **PE/COFF**
210c28a977bSCarlos Alberto Enciso file format. It includes MS runtime types.
211c28a977bSCarlos Alberto Enciso
212c28a977bSCarlos Alberto Enciso .. code-block:: text
213c28a977bSCarlos Alberto Enciso
214c28a977bSCarlos Alberto Enciso   =system: Display PDB's MS system elements.
215c28a977bSCarlos Alberto Enciso
216c28a977bSCarlos Alberto Enciso The above attributes are grouped into *standard* and *extended*
217c28a977bSCarlos Alberto Enciso categories that can be enabled.
218c28a977bSCarlos Alberto Enciso
219c28a977bSCarlos Alberto Enciso The *standard* group, contains those attributes that add sufficient
220c28a977bSCarlos Alberto Enciso information to describe a logical element and that can cover the
221c28a977bSCarlos Alberto Enciso normal situations while dealing with debug information.
222c28a977bSCarlos Alberto Enciso
223c28a977bSCarlos Alberto Enciso .. code-block:: text
224c28a977bSCarlos Alberto Enciso
225c28a977bSCarlos Alberto Enciso   =base
226c28a977bSCarlos Alberto Enciso   =coverage
227c28a977bSCarlos Alberto Enciso   =directories
228c28a977bSCarlos Alberto Enciso   =discriminator
229c28a977bSCarlos Alberto Enciso   =filename
230c28a977bSCarlos Alberto Enciso   =files
231c28a977bSCarlos Alberto Enciso   =format
232c28a977bSCarlos Alberto Enciso   =level
233c28a977bSCarlos Alberto Enciso   =producer
234c28a977bSCarlos Alberto Enciso   =publics
235c28a977bSCarlos Alberto Enciso   =range
236c28a977bSCarlos Alberto Enciso   =reference
237c28a977bSCarlos Alberto Enciso   =zero
238c28a977bSCarlos Alberto Enciso
239c28a977bSCarlos Alberto Enciso The *extended* group, contains those attributes that require a more
240c28a977bSCarlos Alberto Enciso extended knowledge about debug information. They are intended when a
241c28a977bSCarlos Alberto Enciso lower level of detail is required.
242c28a977bSCarlos Alberto Enciso
243c28a977bSCarlos Alberto Enciso .. code-block:: text
244c28a977bSCarlos Alberto Enciso
245c28a977bSCarlos Alberto Enciso   =argument
246c28a977bSCarlos Alberto Enciso   =discarded
247c28a977bSCarlos Alberto Enciso   =encoded
248c28a977bSCarlos Alberto Enciso   =gaps
249c28a977bSCarlos Alberto Enciso   =generated
250c28a977bSCarlos Alberto Enciso   =global
251c28a977bSCarlos Alberto Enciso   =inserted
252c28a977bSCarlos Alberto Enciso   =linkage
253c28a977bSCarlos Alberto Enciso   =local
254c28a977bSCarlos Alberto Enciso   =location
255c28a977bSCarlos Alberto Enciso   =offset
256c28a977bSCarlos Alberto Enciso   =operation
257c28a977bSCarlos Alberto Enciso   =pathname
258c28a977bSCarlos Alberto Enciso   =qualified
259c28a977bSCarlos Alberto Enciso   =qualifier
260c28a977bSCarlos Alberto Enciso   =register
261c28a977bSCarlos Alberto Enciso   =subrange
262c28a977bSCarlos Alberto Enciso   =system
263c28a977bSCarlos Alberto Enciso   =typename
264c28a977bSCarlos Alberto Enciso
265c28a977bSCarlos Alberto Enciso.. _print_:
266c28a977bSCarlos Alberto Enciso
267c28a977bSCarlos Alberto EncisoPRINT
268c28a977bSCarlos Alberto Enciso~~~~~
269c28a977bSCarlos Alberto EncisoThe following options describe the elements to print. The layout used
270c28a977bSCarlos Alberto Encisois determined by the :option:`--report`. In the tree layout, all the
271c28a977bSCarlos Alberto Encisoelements have their enclosing lexical scopes printed, even when not
272c28a977bSCarlos Alberto Encisoexplicitly specified.
273c28a977bSCarlos Alberto Enciso
274c28a977bSCarlos Alberto Enciso.. option:: --print=<value[,value,...]>
275c28a977bSCarlos Alberto Enciso
276c28a977bSCarlos Alberto Enciso With **value** being one of the options in the following lists.
277c28a977bSCarlos Alberto Enciso
278c28a977bSCarlos Alberto Enciso .. code-block:: text
279c28a977bSCarlos Alberto Enciso
280c28a977bSCarlos Alberto Enciso   =all: Include all the below attributes.
281c28a977bSCarlos Alberto Enciso
282c28a977bSCarlos Alberto Enciso The following options print the requested elements; in the case of any
283c28a977bSCarlos Alberto Enciso given select conditions (:option:`--select`), only those elements that
284c28a977bSCarlos Alberto Enciso match them, will be printed. The **elements** value is a convenient
285c28a977bSCarlos Alberto Enciso way to specify instructions, lines, scopes, symbols and types all at
286c28a977bSCarlos Alberto Enciso once.
287c28a977bSCarlos Alberto Enciso
288c28a977bSCarlos Alberto Enciso .. code-block:: text
289c28a977bSCarlos Alberto Enciso
290c28a977bSCarlos Alberto Enciso   =elements: Instructions, lines, scopes, symbols and types.
291c28a977bSCarlos Alberto Enciso   =instructions: Assembler instructions for code sections.
292c28a977bSCarlos Alberto Enciso   =lines: Source lines referenced in the debug information.
293c28a977bSCarlos Alberto Enciso   =scopes: Lexical blocks (function, class, namespace, etc).
294c28a977bSCarlos Alberto Enciso   =symbols: Symbols (variable, member, parameter, etc).
295c28a977bSCarlos Alberto Enciso   =types: Types (pointer, reference, type alias, etc).
296c28a977bSCarlos Alberto Enciso
297c28a977bSCarlos Alberto Enciso The following options print information, collected during the creation
298c28a977bSCarlos Alberto Enciso of the elements, such as: scope contributions to the debug information;
299c28a977bSCarlos Alberto Enciso summary of elements created, printed or matched (:option:`--select`);
300c28a977bSCarlos Alberto Enciso warnings produced during the view creation.
301c28a977bSCarlos Alberto Enciso
302c28a977bSCarlos Alberto Enciso .. code-block:: text
303c28a977bSCarlos Alberto Enciso
304c28a977bSCarlos Alberto Enciso   =sizes: Debug Information scopes contributions.
305c28a977bSCarlos Alberto Enciso   =summary: Summary of elements allocated, selected or printed.
306c28a977bSCarlos Alberto Enciso   =warnings: Warnings detected.
307c28a977bSCarlos Alberto Enciso
308c28a977bSCarlos Alberto Enciso Note: The **--print=sizes** option is ELF specific.
309c28a977bSCarlos Alberto Enciso
310c28a977bSCarlos Alberto Enciso.. _output_:
311c28a977bSCarlos Alberto Enciso
312c28a977bSCarlos Alberto EncisoOUTPUT
313c28a977bSCarlos Alberto Enciso~~~~~~
314c28a977bSCarlos Alberto EncisoThe following options describe how to control the output generated when
315c28a977bSCarlos Alberto Encisoprinting the logical elements.
316c28a977bSCarlos Alberto Enciso
317c28a977bSCarlos Alberto Enciso.. option:: --output-file=<path>
318c28a977bSCarlos Alberto Enciso
319c28a977bSCarlos Alberto Enciso Redirect the output to a file specified by <path>, where - is the
320c28a977bSCarlos Alberto Enciso standard output stream.
321c28a977bSCarlos Alberto Enciso
322c28a977bSCarlos Alberto Enciso:program:`llvm-debuginfo-analyzer` has the concept of **split view**.
323c28a977bSCarlos Alberto EncisoWhen redirecting the output from a complex binary format, it is
324c28a977bSCarlos Alberto Enciso**divided** into individual files, each one containing the logical view
325c28a977bSCarlos Alberto Encisooutput for a single compilation unit.
326c28a977bSCarlos Alberto Enciso
327c28a977bSCarlos Alberto Enciso.. option:: --output-folder=<name>
328c28a977bSCarlos Alberto Enciso
329c28a977bSCarlos Alberto Enciso The folder to write a file per compilation unit when **--output=split**
330c28a977bSCarlos Alberto Enciso is specified.
331c28a977bSCarlos Alberto Enciso
332c28a977bSCarlos Alberto Enciso.. option:: --output-level=<level>
333c28a977bSCarlos Alberto Enciso
334c28a977bSCarlos Alberto Enciso Only print elements up to the given **lexical level** value. The input
335c28a977bSCarlos Alberto Enciso file is at lexical level zero and a compilation unit is at lexical level
336c28a977bSCarlos Alberto Enciso one.
337c28a977bSCarlos Alberto Enciso
338c28a977bSCarlos Alberto Enciso.. option:: --output=<value[,value,...]>
339c28a977bSCarlos Alberto Enciso
340c28a977bSCarlos Alberto Enciso With **value** being one of the options in the following lists.
341c28a977bSCarlos Alberto Enciso
342c28a977bSCarlos Alberto Enciso .. code-block:: text
343c28a977bSCarlos Alberto Enciso
344c28a977bSCarlos Alberto Enciso   =all: Include all the below outputs.
345c28a977bSCarlos Alberto Enciso
346c28a977bSCarlos Alberto Enciso .. code-block:: text
347c28a977bSCarlos Alberto Enciso
348c28a977bSCarlos Alberto Enciso   =json: Use JSON as the output format (Not implemented).
349c28a977bSCarlos Alberto Enciso   =split: Split the output by Compile Units.
350c28a977bSCarlos Alberto Enciso   =text: Use a free form text output.
351c28a977bSCarlos Alberto Enciso
352c28a977bSCarlos Alberto Enciso.. option:: --output-sort=<key>
353c28a977bSCarlos Alberto Enciso
354c28a977bSCarlos Alberto Enciso Primary key when ordering the elements in the output (default: line).
355c28a977bSCarlos Alberto Enciso Sorting by logical element kind, requires be familiarity with the
356c28a977bSCarlos Alberto Enciso element kind selection options (:option:`--select-lines`,
357c28a977bSCarlos Alberto Enciso :option:`--select-scopes`, :option:`--select-symbols`,
358c28a977bSCarlos Alberto Enciso :option:`--select-types`), as those options describe the different
359c28a977bSCarlos Alberto Enciso logical element kinds.
360c28a977bSCarlos Alberto Enciso
361c28a977bSCarlos Alberto Enciso .. code-block:: text
362c28a977bSCarlos Alberto Enciso
363c28a977bSCarlos Alberto Enciso   =kind: Sort by element kind.
364c28a977bSCarlos Alberto Enciso   =line: Sort by element line number.
365c28a977bSCarlos Alberto Enciso   =name: Sort by element name.
366c28a977bSCarlos Alberto Enciso   =offset: Sort by element offset.
367c28a977bSCarlos Alberto Enciso
368c28a977bSCarlos Alberto Enciso.. _report_:
369c28a977bSCarlos Alberto Enciso
370c28a977bSCarlos Alberto EncisoREPORT
371c28a977bSCarlos Alberto Enciso~~~~~~
372c28a977bSCarlos Alberto EncisoDepending on the task being executed (print, compare, select), several
373c28a977bSCarlos Alberto Encisolayouts are supported to display the elements in a more suitable way,
374c28a977bSCarlos Alberto Encisoto make the output easier to understand.
375c28a977bSCarlos Alberto Enciso
376c28a977bSCarlos Alberto Enciso.. option:: --report=<value[,value,...]>
377c28a977bSCarlos Alberto Enciso
378c28a977bSCarlos Alberto Enciso With **value** being one of the options in the following list.
379c28a977bSCarlos Alberto Enciso
380c28a977bSCarlos Alberto Enciso .. code-block:: text
381c28a977bSCarlos Alberto Enciso
382c28a977bSCarlos Alberto Enciso   =all: Include all the below reports.
383c28a977bSCarlos Alberto Enciso
384c28a977bSCarlos Alberto Enciso .. code-block:: text
385c28a977bSCarlos Alberto Enciso
386c28a977bSCarlos Alberto Enciso   =children: Elements and children are displayed in a tree format.
387c28a977bSCarlos Alberto Enciso   =list: Elements are displayed in a tabular format.
388c28a977bSCarlos Alberto Enciso   =parents: Elements and parents are displayed in a tree format.
389c28a977bSCarlos Alberto Enciso   =view: Elements, parents and children are displayed in a tree format.
390c28a977bSCarlos Alberto Enciso
391c28a977bSCarlos Alberto EncisoThe **list** layout presents the logical elements in a tabular form
392c28a977bSCarlos Alberto Encisowithout any parent-child relationship. This may be the preferred way to
393c28a977bSCarlos Alberto Encisodisplay elements that match specific conditions when comparing logical
394c28a977bSCarlos Alberto Encisoviews, making it easier to find differences.
395c28a977bSCarlos Alberto Enciso
396c28a977bSCarlos Alberto EncisoThe **children**, **parents** and **view** layout displays the elements
397c28a977bSCarlos Alberto Encisoin a tree format, with the scopes representing their nodes, and types,
398c28a977bSCarlos Alberto Encisosymbols, lines and other scopes representing the children. The layout
399c28a977bSCarlos Alberto Encisoshows the lexical scoping relationship between elements, with the binary
400c28a977bSCarlos Alberto Encisofile being the tree root (level 0) and each compilation unit being a
401c28a977bSCarlos Alberto Encisochild (level 1).
402c28a977bSCarlos Alberto Enciso
403c28a977bSCarlos Alberto EncisoThe **children** layout includes the elements that match any given
404c28a977bSCarlos Alberto Encisocriteria (:option:`--select`) or (:option:`--compare`) and its children.
405c28a977bSCarlos Alberto Enciso
406c28a977bSCarlos Alberto EncisoThe **parents** layout includes the elements that match any given
407c28a977bSCarlos Alberto Encisocriteria (:option:`--select`) or (:option:`--compare`) and its parents.
408c28a977bSCarlos Alberto Enciso
409c28a977bSCarlos Alberto EncisoThe combined **view** layout includes the elements that match any given
410c28a977bSCarlos Alberto Encisocriteria (:option:`--select`) or (:option:`--compare`), its parents
411c28a977bSCarlos Alberto Encisoand children.
412c28a977bSCarlos Alberto Enciso
413c28a977bSCarlos Alberto Enciso**Notes**:
414c28a977bSCarlos Alberto Enciso
415c28a977bSCarlos Alberto Enciso1. When a selection criteria (:option:`--select`) is specified with no
416c28a977bSCarlos Alberto Enciso   report option, the **list** layout is selected.
417c28a977bSCarlos Alberto Enciso2. The comparison mode always uses the **view** layout.
418c28a977bSCarlos Alberto Enciso
419c28a977bSCarlos Alberto Enciso.. _select_:
420c28a977bSCarlos Alberto Enciso
421c28a977bSCarlos Alberto EncisoSELECTION
422c28a977bSCarlos Alberto Enciso~~~~~~~~~
423c28a977bSCarlos Alberto EncisoWhen printing an element, different data can be included and it varies
424c28a977bSCarlos Alberto Enciso(:option:`--attribute`) from data directly associated with the binary
425c28a977bSCarlos Alberto Encisofile (offset) to high level details such as coverage, lexical scope
426c28a977bSCarlos Alberto Encisolevel, location. As the printed output can reach a considerable size,
427c28a977bSCarlos Alberto Encisoseveral selection options, enable printing of specific elements.
428c28a977bSCarlos Alberto Enciso
429c28a977bSCarlos Alberto EncisoThe pattern matching can ignore the case (:option:`--select-nocase`)
430c28a977bSCarlos Alberto Encisoand be extended to use regular expressions (:option:`--select-regex`).
431c28a977bSCarlos Alberto Enciso
432c28a977bSCarlos Alberto EncisoELEMENTS
433c28a977bSCarlos Alberto Enciso^^^^^^^^
434c28a977bSCarlos Alberto EncisoThe following options allow printing of elements that match the given
435c28a977bSCarlos Alberto Enciso<pattern>, offset <value> or an element <condition>.
436c28a977bSCarlos Alberto Enciso
437c28a977bSCarlos Alberto Enciso.. option:: --select=<pattern>
438c28a977bSCarlos Alberto Enciso
439c28a977bSCarlos Alberto Enciso Print all elements whose name or line number matches the given <pattern>.
440c28a977bSCarlos Alberto Enciso
441c28a977bSCarlos Alberto Enciso.. option:: --select-offsets=<value[,value,...]>
442c28a977bSCarlos Alberto Enciso
443c28a977bSCarlos Alberto Enciso Print all elements whose offset matches the given values. See
444c28a977bSCarlos Alberto Enciso :option:`--attribute` option.
445c28a977bSCarlos Alberto Enciso
446c28a977bSCarlos Alberto Enciso.. option:: --select-elements=<condition[,condition,...]>
447c28a977bSCarlos Alberto Enciso
448c28a977bSCarlos Alberto Enciso Print all elements that satisfy the given <condition>. With **condition**
449c28a977bSCarlos Alberto Enciso being one of the options in the following list.
450c28a977bSCarlos Alberto Enciso
451c28a977bSCarlos Alberto Enciso .. code-block:: text
452c28a977bSCarlos Alberto Enciso
453c28a977bSCarlos Alberto Enciso   =discarded: Discarded elements by the linker.
454c28a977bSCarlos Alberto Enciso   =global: Element referenced across Compile Units.
455c28a977bSCarlos Alberto Enciso   =optimized: Optimized inlined abstract references.
456c28a977bSCarlos Alberto Enciso
457c28a977bSCarlos Alberto Enciso.. option:: --select-nocase
458c28a977bSCarlos Alberto Enciso
459c28a977bSCarlos Alberto Enciso Pattern matching is case-insensitive when using :option:`--select`.
460c28a977bSCarlos Alberto Enciso
461c28a977bSCarlos Alberto Enciso.. option:: --select-regex
462c28a977bSCarlos Alberto Enciso
463c28a977bSCarlos Alberto Enciso Treat any <pattern> strings as regular expressions when selecting with
464c28a977bSCarlos Alberto Enciso :option:`--select` option. If :option:`--select-nocase` is specified,
465c28a977bSCarlos Alberto Enciso the regular expression becomes case-insensitive.
466c28a977bSCarlos Alberto Enciso
467c28a977bSCarlos Alberto EncisoIf the <pattern> criteria is too general, a more selective option can
468c28a977bSCarlos Alberto Encisobe specified to target a particular category of elements:
469c28a977bSCarlos Alberto Encisolines (:option:`--select-lines`), scopes (:option:`--select-scopes`),
470c28a977bSCarlos Alberto Encisosymbols (:option:`--select-symbols`) and types (:option:`--select-types`).
471b19cfb91SCarlos Alberto Enciso
472c28a977bSCarlos Alberto EncisoThese options require knowledge of the debug information format (DWARF,
473b19cfb91SCarlos Alberto EncisoCodeView), as the given **kind** describes a very specific type
474c28a977bSCarlos Alberto Encisoof element.
475c28a977bSCarlos Alberto Enciso
476c28a977bSCarlos Alberto EncisoLINES
477c28a977bSCarlos Alberto Enciso^^^^^
478c28a977bSCarlos Alberto EncisoThe following options allow printing of lines that match the given <kind>.
479c28a977bSCarlos Alberto EncisoThe given criteria describes the debug line state machine registers.
480c28a977bSCarlos Alberto Enciso
481c28a977bSCarlos Alberto Enciso.. option:: --select-lines=<kind[,kind,...]>
482c28a977bSCarlos Alberto Enciso
483c28a977bSCarlos Alberto Enciso With **kind** being one of the options in the following list.
484c28a977bSCarlos Alberto Enciso
485c28a977bSCarlos Alberto Enciso .. code-block:: text
486c28a977bSCarlos Alberto Enciso
487c28a977bSCarlos Alberto Enciso   =AlwaysStepInto: marks an always step into.
488c28a977bSCarlos Alberto Enciso   =BasicBlock: Marks a new basic block.
489c28a977bSCarlos Alberto Enciso   =Discriminator: Line that has a discriminator.
490c28a977bSCarlos Alberto Enciso   =EndSequence: Marks the end in the sequence of lines.
491c28a977bSCarlos Alberto Enciso   =EpilogueBegin: Marks the start of a function epilogue.
492c28a977bSCarlos Alberto Enciso   =LineDebug: Lines that correspond to debug lines.
493c28a977bSCarlos Alberto Enciso   =LineAssembler: Lines that correspond to disassembly text.
494c28a977bSCarlos Alberto Enciso   =NeverStepInto: marks a never step into.
495c28a977bSCarlos Alberto Enciso   =NewStatement: Marks a new statement.
496c28a977bSCarlos Alberto Enciso   =PrologueEnd: Marks the end of a function prologue.
497c28a977bSCarlos Alberto Enciso
498c28a977bSCarlos Alberto EncisoSCOPES
499c28a977bSCarlos Alberto Enciso^^^^^^
500c28a977bSCarlos Alberto EncisoThe following options allow printing of scopes that match the given <kind>.
501c28a977bSCarlos Alberto Enciso
502c28a977bSCarlos Alberto Enciso.. option:: --select-scopes=<kind[,kind,...]>
503c28a977bSCarlos Alberto Enciso
504c28a977bSCarlos Alberto Enciso With **kind** being one of the options in the following list.
505c28a977bSCarlos Alberto Enciso
506c28a977bSCarlos Alberto Enciso .. code-block:: text
507c28a977bSCarlos Alberto Enciso
508c28a977bSCarlos Alberto Enciso    =Aggregate: A class, structure or union.
509c28a977bSCarlos Alberto Enciso    =Array: An array.
510c28a977bSCarlos Alberto Enciso    =Block: A generic block (lexical block or exception block).
511c28a977bSCarlos Alberto Enciso    =CallSite: A call site.
512c28a977bSCarlos Alberto Enciso    =CatchBlock: An exception block.
513c28a977bSCarlos Alberto Enciso    =Class: A class.
514c28a977bSCarlos Alberto Enciso    =CompileUnit: A compile unit.
515c28a977bSCarlos Alberto Enciso    =EntryPoint: A subroutine entry point.
516c28a977bSCarlos Alberto Enciso    =Enumeration: An enumeration.
517c28a977bSCarlos Alberto Enciso    =Function: A function.
518c28a977bSCarlos Alberto Enciso    =FunctionType: A function pointer.
519c28a977bSCarlos Alberto Enciso    =InlinedFunction: An inlined function.
520c28a977bSCarlos Alberto Enciso    =Label: A label.
521c28a977bSCarlos Alberto Enciso    =LexicalBlock: A lexical block.
522c28a977bSCarlos Alberto Enciso    =Namespace: A namespace.
523c28a977bSCarlos Alberto Enciso    =Root: The element representing the main scope.
524c28a977bSCarlos Alberto Enciso    =Structure: A structure.
525c28a977bSCarlos Alberto Enciso    =Subprogram: A subprogram.
526c28a977bSCarlos Alberto Enciso    =Template: A template definition.
527c28a977bSCarlos Alberto Enciso    =TemplateAlias: A template alias.
528c28a977bSCarlos Alberto Enciso    =TemplatePack: A template pack.
529c28a977bSCarlos Alberto Enciso    =TryBlock: An exception try block.
530c28a977bSCarlos Alberto Enciso    =Union: A union.
531c28a977bSCarlos Alberto Enciso
532c28a977bSCarlos Alberto EncisoSYMBOLS
533c28a977bSCarlos Alberto Enciso^^^^^^^
534c28a977bSCarlos Alberto EncisoThe following options allow printing of symbols that match the given <kind>.
535c28a977bSCarlos Alberto Enciso
536c28a977bSCarlos Alberto Enciso.. option:: --select-symbols=<kind[,kind,...]>
537c28a977bSCarlos Alberto Enciso
538c28a977bSCarlos Alberto Enciso With **kind** being one of the options in the following list.
539c28a977bSCarlos Alberto Enciso
540c28a977bSCarlos Alberto Enciso .. code-block:: text
541c28a977bSCarlos Alberto Enciso
542c28a977bSCarlos Alberto Enciso    =CallSiteParameter: A call site parameter.
543c28a977bSCarlos Alberto Enciso    =Constant: A constant symbol.
544c28a977bSCarlos Alberto Enciso    =Inheritance: A base class.
545c28a977bSCarlos Alberto Enciso    =Member: A member class.
546c28a977bSCarlos Alberto Enciso    =Parameter: A parameter to function.
547c28a977bSCarlos Alberto Enciso    =Unspecified: Unspecified parameters to function.
548c28a977bSCarlos Alberto Enciso    =Variable: A variable.
549c28a977bSCarlos Alberto Enciso
550c28a977bSCarlos Alberto EncisoTYPES
551c28a977bSCarlos Alberto Enciso^^^^^
552c28a977bSCarlos Alberto EncisoThe following options allow printing of types that match the given <kind>.
553c28a977bSCarlos Alberto Enciso
554c28a977bSCarlos Alberto Enciso.. option:: --select-types=<kind[,kind,...]>
555c28a977bSCarlos Alberto Enciso
556c28a977bSCarlos Alberto Enciso With **kind** being one of the options in the following list.
557c28a977bSCarlos Alberto Enciso
558c28a977bSCarlos Alberto Enciso .. code-block:: text
559c28a977bSCarlos Alberto Enciso
560c28a977bSCarlos Alberto Enciso    =Base: Base type (integer, boolean, etc).
561c28a977bSCarlos Alberto Enciso    =Const: Constant specifier.
562c28a977bSCarlos Alberto Enciso    =Enumerator: Enumerator.
563c28a977bSCarlos Alberto Enciso    =Import: Import declaration.
564c28a977bSCarlos Alberto Enciso    =ImportDeclaration: Import declaration.
565c28a977bSCarlos Alberto Enciso    =ImportModule: Import module.
566c28a977bSCarlos Alberto Enciso    =Pointer: Pointer type.
567c28a977bSCarlos Alberto Enciso    =PointerMember: Pointer to member function.
568c28a977bSCarlos Alberto Enciso    =Reference: Reference type.
569c28a977bSCarlos Alberto Enciso    =Restrict: Restrict specifier.
570c28a977bSCarlos Alberto Enciso    =RvalueReference: R-value reference.
571c28a977bSCarlos Alberto Enciso    =Subrange: Array subrange.
572c28a977bSCarlos Alberto Enciso    =TemplateParam: Template parameter.
573c28a977bSCarlos Alberto Enciso    =TemplateTemplateParam: Template template parameter.
574c28a977bSCarlos Alberto Enciso    =TemplateTypeParam: Template type parameter.
575c28a977bSCarlos Alberto Enciso    =TemplateValueParam: Template value parameter.
576c28a977bSCarlos Alberto Enciso    =Typedef: Type definition.
577c28a977bSCarlos Alberto Enciso    =Unspecified: Unspecified type.
578c28a977bSCarlos Alberto Enciso    =Volatile: Volatile specifier.
579c28a977bSCarlos Alberto Enciso
580c28a977bSCarlos Alberto Enciso.. _compare_:
581c28a977bSCarlos Alberto Enciso
582c28a977bSCarlos Alberto EncisoCOMPARE
583c28a977bSCarlos Alberto Enciso~~~~~~~
584c28a977bSCarlos Alberto EncisoWhen dealing with debug information, there are situations when the
585c28a977bSCarlos Alberto Encisoprinting of the elements is not the correct approach. That is the case,
586c28a977bSCarlos Alberto Encisowhen we are interested in the effects caused by different versions of
587c28a977bSCarlos Alberto Encisothe same toolchain, or the impact of specific compiler optimizations.
588c28a977bSCarlos Alberto Enciso
589c28a977bSCarlos Alberto EncisoFor those cases, we are looking to see which elements have been added
590c28a977bSCarlos Alberto Encisoor removed. Due to the complicated debug information format, it is very
591c28a977bSCarlos Alberto Encisodifficult to use a regular diff tool to find those elements; even
592c28a977bSCarlos Alberto Encisoimpossible when dealing with different debug formats.
593c28a977bSCarlos Alberto Enciso
594c28a977bSCarlos Alberto Enciso:program:`llvm-debuginfo-analyzer` supports a logical element comparison,
595c28a977bSCarlos Alberto Encisoallowing to find semantic differences between logical views, produced by
596c28a977bSCarlos Alberto Encisodifferent toolchain versions or even debug information formats.
597c28a977bSCarlos Alberto Enciso
598c28a977bSCarlos Alberto EncisoWhen comparing logical views created from different debug formats, its
599c28a977bSCarlos Alberto Encisoaccuracy depends on how close the debug information represents the
600c28a977bSCarlos Alberto Encisouser code. For instance, a logical view created from a binary file with
601c28a977bSCarlos Alberto EncisoDWARF debug information may include more detailed data than a logical
602b19cfb91SCarlos Alberto Encisoview created from a binary file with CodeView debug information.
603c28a977bSCarlos Alberto Enciso
604c28a977bSCarlos Alberto EncisoThe following options describe the elements to compare.
605c28a977bSCarlos Alberto Enciso
606c28a977bSCarlos Alberto Enciso.. option:: --compare=<value[,value,...]>
607c28a977bSCarlos Alberto Enciso
608c28a977bSCarlos Alberto Enciso With **value** being one of the options in the following list.
609c28a977bSCarlos Alberto Enciso
610c28a977bSCarlos Alberto Enciso .. code-block:: text
611c28a977bSCarlos Alberto Enciso
612c28a977bSCarlos Alberto Enciso    =all: Include all the below elements.
613c28a977bSCarlos Alberto Enciso
614c28a977bSCarlos Alberto Enciso .. code-block:: text
615c28a977bSCarlos Alberto Enciso
616c28a977bSCarlos Alberto Enciso    =lines: Include lines.
617c28a977bSCarlos Alberto Enciso    =scopes: Include scopes.
618c28a977bSCarlos Alberto Enciso    =symbols: Include symbols.
619c28a977bSCarlos Alberto Enciso    =types: Include types.
620c28a977bSCarlos Alberto Enciso
621c28a977bSCarlos Alberto Enciso:program:`llvm-debuginfo-analyzer` takes the first binary file on the
622c28a977bSCarlos Alberto Encisocommand line as the **reference** and the second one as the **target**.
623c28a977bSCarlos Alberto EncisoTo get a more descriptive report, the comparison is done twice. The
624c28a977bSCarlos Alberto Encisoreference and target views are swapped, in order to produce those
625c28a977bSCarlos Alberto Enciso**missing** elements from the target view and those **added** elements
626c28a977bSCarlos Alberto Encisoto the reference view.
627c28a977bSCarlos Alberto Enciso
628c28a977bSCarlos Alberto EncisoSee :option:`--report` options on how to describe the comparison
629c28a977bSCarlos Alberto Encisoreports.
630c28a977bSCarlos Alberto Enciso
631c28a977bSCarlos Alberto Enciso.. _warning_:
632c28a977bSCarlos Alberto Enciso
633c28a977bSCarlos Alberto EncisoWARNING
634c28a977bSCarlos Alberto Enciso~~~~~~~
635c28a977bSCarlos Alberto EncisoWhen reading the input object files, :program:`llvm-debuginfo-analyzer`
636c28a977bSCarlos Alberto Encisocan detect issues in the raw debug information. These may not be
637c28a977bSCarlos Alberto Encisoconsidered fatal to the purpose of printing a logical view but they can
638c28a977bSCarlos Alberto Encisogive an indication about the quality and potentially expose issues with
639c28a977bSCarlos Alberto Encisothe generated debug information.
640c28a977bSCarlos Alberto Enciso
641c28a977bSCarlos Alberto EncisoThe following options describe the warnings to be recorded for later
642c28a977bSCarlos Alberto Encisoprinting, if they are requested by :option:`--print`.
643c28a977bSCarlos Alberto Enciso
644c28a977bSCarlos Alberto Enciso.. option:: --warning=<value[,value,...]>
645c28a977bSCarlos Alberto Enciso
646c28a977bSCarlos Alberto Enciso With **value** being one of the options in the following list.
647c28a977bSCarlos Alberto Enciso
648c28a977bSCarlos Alberto Enciso .. code-block:: text
649c28a977bSCarlos Alberto Enciso
650c28a977bSCarlos Alberto Enciso    =all: Include all the below warnings.
651c28a977bSCarlos Alberto Enciso
652c28a977bSCarlos Alberto Enciso The following options collect additional information during the creation
653c28a977bSCarlos Alberto Enciso of the logical view, to include invalid coverage values and locations
654c28a977bSCarlos Alberto Enciso for symbols; invalid code ranges; lines that are zero.
655c28a977bSCarlos Alberto Enciso
656c28a977bSCarlos Alberto Enciso .. code-block:: text
657c28a977bSCarlos Alberto Enciso
658c28a977bSCarlos Alberto Enciso    =coverages: Invalid symbol coverages values.
659c28a977bSCarlos Alberto Enciso    =lines: Debug lines that are zero.
660c28a977bSCarlos Alberto Enciso    =locations: Invalid symbol locations.
661c28a977bSCarlos Alberto Enciso    =ranges: Invalid code ranges.
662c28a977bSCarlos Alberto Enciso
663c28a977bSCarlos Alberto Enciso.. _internal_:
664c28a977bSCarlos Alberto Enciso
665c28a977bSCarlos Alberto EncisoINTERNAL
666c28a977bSCarlos Alberto Enciso~~~~~~~~
667c28a977bSCarlos Alberto Enciso For a better understanding of the logical view, access to more detailed
668c28a977bSCarlos Alberto Enciso internal information could be needed. Such data would help to identify
669c28a977bSCarlos Alberto Enciso debug information processed or incorrect logical element management.
670c28a977bSCarlos Alberto Enciso Typically these kind of options are available only in *debug* builds.
671c28a977bSCarlos Alberto Enciso
672c28a977bSCarlos Alberto Enciso :program:`llvm-debuginfo-analyzer` supports these advanced options in
673c28a977bSCarlos Alberto Enciso both *release* and *debug* builds, with the exception of the unique ID
674c28a977bSCarlos Alberto Enciso that is generated only in *debug* builds.
675c28a977bSCarlos Alberto Enciso
676c28a977bSCarlos Alberto Enciso.. option:: --internal=<value[,value,...]>
677c28a977bSCarlos Alberto Enciso
678c28a977bSCarlos Alberto Enciso With **value** being one of the options in the following list.
679c28a977bSCarlos Alberto Enciso
680c28a977bSCarlos Alberto Enciso .. code-block:: text
681c28a977bSCarlos Alberto Enciso
682c28a977bSCarlos Alberto Enciso    =all: Include all the below options.
683c28a977bSCarlos Alberto Enciso
684c28a977bSCarlos Alberto Enciso The following options allow to check the integrity of the logical view;
685c28a977bSCarlos Alberto Enciso collect the debug tags that are processed or not implemented; ignore the
686c28a977bSCarlos Alberto Enciso logical element line number, to facilitate the logical view comparison
687c28a977bSCarlos Alberto Enciso when using external comparison tools; print the command line options
688c28a977bSCarlos Alberto Enciso used to invoke :program:`llvm-debuginfo-analyzer`.
689c28a977bSCarlos Alberto Enciso
690c28a977bSCarlos Alberto Enciso .. code-block:: text
691c28a977bSCarlos Alberto Enciso
692c28a977bSCarlos Alberto Enciso    =id: Print unique element ID.
693c28a977bSCarlos Alberto Enciso    =cmdline: Print command line.
694c28a977bSCarlos Alberto Enciso    =integrity: Check elements integrity.
695c28a977bSCarlos Alberto Enciso    =none: Ignore element line number.
696c28a977bSCarlos Alberto Enciso    =tag: Debug information tags.
697c28a977bSCarlos Alberto Enciso
698c28a977bSCarlos Alberto Enciso **Note:** For ELF format, the collected tags represent the debug tags
699c28a977bSCarlos Alberto Enciso that are not processed. For PE/COFF format, they represent the tags
700c28a977bSCarlos Alberto Enciso that are processed.
701c28a977bSCarlos Alberto Enciso
702c28a977bSCarlos Alberto EncisoEXAMPLES
703c28a977bSCarlos Alberto Enciso--------
704c28a977bSCarlos Alberto EncisoThis section includes some real binary files to show how to use
705c28a977bSCarlos Alberto Enciso:program:`llvm-debuginfo-analyzer` to print a logical view and to
706c28a977bSCarlos Alberto Encisodiagnose possible debug information issues.
707c28a977bSCarlos Alberto Enciso
708c28a977bSCarlos Alberto EncisoTEST CASE 1 - GENERAL OPTIONS
709c28a977bSCarlos Alberto Enciso~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
710c28a977bSCarlos Alberto EncisoThe below example is used to show different output generated by
711c28a977bSCarlos Alberto Enciso:program:`llvm-debuginfo-analyzer`. We compiled the example for an X86
712c28a977bSCarlos Alberto EncisoELF target with Clang (-O0 -g):
713c28a977bSCarlos Alberto Enciso
714c28a977bSCarlos Alberto Enciso.. code-block:: c++
715c28a977bSCarlos Alberto Enciso
716c28a977bSCarlos Alberto Enciso  1  using INTPTR = const int *;
717c28a977bSCarlos Alberto Enciso  2  int foo(INTPTR ParamPtr, unsigned ParamUnsigned, bool ParamBool) {
718c28a977bSCarlos Alberto Enciso  3    if (ParamBool) {
719c28a977bSCarlos Alberto Enciso  4      typedef int INTEGER;
720c28a977bSCarlos Alberto Enciso  5      const INTEGER CONSTANT = 7;
721c28a977bSCarlos Alberto Enciso  6      return CONSTANT;
722c28a977bSCarlos Alberto Enciso  7    }
723c28a977bSCarlos Alberto Enciso  8    return ParamUnsigned;
724c28a977bSCarlos Alberto Enciso  9  }
725c28a977bSCarlos Alberto Enciso
726c28a977bSCarlos Alberto EncisoPRINTING MODE
727c28a977bSCarlos Alberto Enciso^^^^^^^^^^^^^
728c28a977bSCarlos Alberto EncisoIn this mode :program:`llvm-debuginfo-analyzer` prints the *logical view*
729c28a977bSCarlos Alberto Encisoor portions of it, based on criteria patterns (including regular
730c28a977bSCarlos Alberto Encisoexpressions) to select the kind of *logical elements* to be included in
731c28a977bSCarlos Alberto Encisothe output.
732c28a977bSCarlos Alberto Enciso
733c28a977bSCarlos Alberto EncisoBASIC DETAILS
734c28a977bSCarlos Alberto Enciso"""""""""""""
735c28a977bSCarlos Alberto EncisoThe following command prints basic details for all the logical elements
736c28a977bSCarlos Alberto Encisosorted by the debug information internal offset; it includes its lexical
737c28a977bSCarlos Alberto Encisolevel and debug info format.
738c28a977bSCarlos Alberto Enciso
739c28a977bSCarlos Alberto Enciso.. code-block:: none
740c28a977bSCarlos Alberto Enciso
741c28a977bSCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=level,format
742c28a977bSCarlos Alberto Enciso                          --output-sort=offset
743c28a977bSCarlos Alberto Enciso                          --print=scopes,symbols,types,lines,instructions
744c28a977bSCarlos Alberto Enciso                          test-dwarf-clang.o
745c28a977bSCarlos Alberto Enciso
746c28a977bSCarlos Alberto Encisoor
747c28a977bSCarlos Alberto Enciso
748c28a977bSCarlos Alberto Enciso.. code-block:: none
749c28a977bSCarlos Alberto Enciso
750c28a977bSCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=level,format
751c28a977bSCarlos Alberto Enciso                          --output-sort=offset
752c28a977bSCarlos Alberto Enciso                          --print=elements
753c28a977bSCarlos Alberto Enciso                          test-dwarf-clang.o
754c28a977bSCarlos Alberto Enciso
755c28a977bSCarlos Alberto EncisoEach row represents an element that is present within the debug
756c28a977bSCarlos Alberto Encisoinformation. The first column represents the scope level, followed by
757c28a977bSCarlos Alberto Encisothe associated line number (if any), and finally the description of
758c28a977bSCarlos Alberto Encisothe element.
759c28a977bSCarlos Alberto Enciso
760c28a977bSCarlos Alberto Enciso.. code-block:: none
761c28a977bSCarlos Alberto Enciso
762c28a977bSCarlos Alberto Enciso  Logical View:
763c28a977bSCarlos Alberto Enciso  [000]           {File} 'test-dwarf-clang.o' -> elf64-x86-64
764c28a977bSCarlos Alberto Enciso
765c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'test.cpp'
766c28a977bSCarlos Alberto Enciso  [002]     2         {Function} extern not_inlined 'foo' -> 'int'
767c28a977bSCarlos Alberto Enciso  [003]     2           {Parameter} 'ParamPtr' -> 'INTPTR'
768c28a977bSCarlos Alberto Enciso  [003]     2           {Parameter} 'ParamUnsigned' -> 'unsigned int'
769c28a977bSCarlos Alberto Enciso  [003]     2           {Parameter} 'ParamBool' -> 'bool'
770c28a977bSCarlos Alberto Enciso  [003]                 {Block}
771c28a977bSCarlos Alberto Enciso  [004]     5             {Variable} 'CONSTANT' -> 'const INTEGER'
772c28a977bSCarlos Alberto Enciso  [004]     5             {Line}
773c28a977bSCarlos Alberto Enciso  [004]                   {Code} 'movl	$0x7, -0x1c(%rbp)'
774c28a977bSCarlos Alberto Enciso  [004]     6             {Line}
775c28a977bSCarlos Alberto Enciso  [004]                   {Code} 'movl	$0x7, -0x4(%rbp)'
776c28a977bSCarlos Alberto Enciso  [004]                   {Code} 'jmp	0x6'
777c28a977bSCarlos Alberto Enciso  [004]     8             {Line}
778c28a977bSCarlos Alberto Enciso  [004]                   {Code} 'movl	-0x14(%rbp), %eax'
779c28a977bSCarlos Alberto Enciso  [003]     4           {TypeAlias} 'INTEGER' -> 'int'
780c28a977bSCarlos Alberto Enciso  [003]     2           {Line}
781c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'pushq	%rbp'
782c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'movq	%rsp, %rbp'
783c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'movb	%dl, %al'
784c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'movq	%rdi, -0x10(%rbp)'
785c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'movl	%esi, -0x14(%rbp)'
786c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'andb	$0x1, %al'
787c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'movb	%al, -0x15(%rbp)'
788c28a977bSCarlos Alberto Enciso  [003]     3           {Line}
789c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'testb	$0x1, -0x15(%rbp)'
790c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'je	0x13'
791c28a977bSCarlos Alberto Enciso  [003]     8           {Line}
792c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'movl	%eax, -0x4(%rbp)'
793c28a977bSCarlos Alberto Enciso  [003]     9           {Line}
794c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'movl	-0x4(%rbp), %eax'
795c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'popq	%rbp'
796c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'retq'
797c28a977bSCarlos Alberto Enciso  [003]     9           {Line}
798c28a977bSCarlos Alberto Enciso  [002]     1         {TypeAlias} 'INTPTR' -> '* const int'
799c28a977bSCarlos Alberto Enciso
800c28a977bSCarlos Alberto EncisoOn closer inspection, we can see what could be a potential debug issue:
801c28a977bSCarlos Alberto Enciso
802c28a977bSCarlos Alberto Enciso.. code-block:: none
803c28a977bSCarlos Alberto Enciso
804c28a977bSCarlos Alberto Enciso  [003]                 {Block}
805c28a977bSCarlos Alberto Enciso  [003]     4           {TypeAlias} 'INTEGER' -> 'int'
806c28a977bSCarlos Alberto Enciso
807c28a977bSCarlos Alberto EncisoThe **'INTEGER'** definition is at level **[003]**, the same lexical
808c28a977bSCarlos Alberto Encisoscope as the anonymous **{Block}** ('true' branch for the 'if' statement)
809c28a977bSCarlos Alberto Encisowhereas in the original source code the typedef statement is clearly
810c28a977bSCarlos Alberto Encisoinside that block, so the **'INTEGER'** definition should also be at
811c28a977bSCarlos Alberto Encisolevel **[004]** inside the block.
812c28a977bSCarlos Alberto Enciso
813c28a977bSCarlos Alberto EncisoSELECT LOGICAL ELEMENTS
814c28a977bSCarlos Alberto Enciso"""""""""""""""""""""""
815c28a977bSCarlos Alberto EncisoThe following prints all *instructions*, *symbols* and *types* that
816c28a977bSCarlos Alberto Encisocontain **'inte'** or **'movl'** in their names or types, using a tab
817c28a977bSCarlos Alberto Encisolayout and given the number of matches.
818c28a977bSCarlos Alberto Enciso
819c28a977bSCarlos Alberto Enciso.. code-block:: none
820c28a977bSCarlos Alberto Enciso
821c28a977bSCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=level
822c28a977bSCarlos Alberto Enciso                          --select-nocase --select-regex
823c28a977bSCarlos Alberto Enciso                          --select=INTe --select=movl
824c28a977bSCarlos Alberto Enciso                          --report=list
825c28a977bSCarlos Alberto Enciso                          --print=symbols,types,instructions,summary
826c28a977bSCarlos Alberto Enciso                          test-dwarf-clang.o
827c28a977bSCarlos Alberto Enciso
828c28a977bSCarlos Alberto Enciso  Logical View:
829c28a977bSCarlos Alberto Enciso  [000]           {File} 'test-dwarf-clang.o'
830c28a977bSCarlos Alberto Enciso
831c28a977bSCarlos Alberto Enciso  [001]           {CompileUnit} 'test.cpp'
832c28a977bSCarlos Alberto Enciso  [003]           {Code} 'movl	$0x7, -0x1c(%rbp)'
833c28a977bSCarlos Alberto Enciso  [003]           {Code} 'movl	$0x7, -0x4(%rbp)'
834c28a977bSCarlos Alberto Enciso  [003]           {Code} 'movl	%eax, -0x4(%rbp)'
835c28a977bSCarlos Alberto Enciso  [003]           {Code} 'movl	%esi, -0x14(%rbp)'
836c28a977bSCarlos Alberto Enciso  [003]           {Code} 'movl	-0x14(%rbp), %eax'
837c28a977bSCarlos Alberto Enciso  [003]           {Code} 'movl	-0x4(%rbp), %eax'
838c28a977bSCarlos Alberto Enciso  [003]     4     {TypeAlias} 'INTEGER' -> 'int'
839c28a977bSCarlos Alberto Enciso  [004]     5     {Variable} 'CONSTANT' -> 'const INTEGER'
840c28a977bSCarlos Alberto Enciso
841c28a977bSCarlos Alberto Enciso  -----------------------------
842c28a977bSCarlos Alberto Enciso  Element      Total      Found
843c28a977bSCarlos Alberto Enciso  -----------------------------
844c28a977bSCarlos Alberto Enciso  Scopes           3          0
845c28a977bSCarlos Alberto Enciso  Symbols          4          1
846c28a977bSCarlos Alberto Enciso  Types            2          1
847c28a977bSCarlos Alberto Enciso  Lines           17          6
848c28a977bSCarlos Alberto Enciso  -----------------------------
849c28a977bSCarlos Alberto Enciso  Total           26          8
850c28a977bSCarlos Alberto Enciso
851c28a977bSCarlos Alberto EncisoCOMPARISON MODE
852c28a977bSCarlos Alberto Enciso^^^^^^^^^^^^^^^
853c28a977bSCarlos Alberto EncisoIn this mode :program:`llvm-debuginfo-analyzer` compares logical views
854c28a977bSCarlos Alberto Encisoto produce a report with the logical elements that are missing or added.
855c28a977bSCarlos Alberto EncisoThis a very powerful aid in finding semantic differences in the debug
856c28a977bSCarlos Alberto Encisoinformation produced by different toolchain versions or even completely
857c28a977bSCarlos Alberto Encisodifferent toolchains altogether (For example a compiler producing DWARF
858c28a977bSCarlos Alberto Encisocan be directly compared against a completely different compiler that
859c28a977bSCarlos Alberto Encisoproduces CodeView).
860c28a977bSCarlos Alberto Enciso
861c28a977bSCarlos Alberto EncisoGiven the previous example we found the above debug information issue
862c28a977bSCarlos Alberto Enciso(related to the previous invalid scope location for the **'typedef int
863c28a977bSCarlos Alberto EncisoINTEGER'**) by comparing against another compiler.
864c28a977bSCarlos Alberto Enciso
865c28a977bSCarlos Alberto EncisoUsing GCC to generate test-dwarf-gcc.o, we can apply a selection pattern
866c28a977bSCarlos Alberto Encisowith the printing mode to obtain the following logical view output.
867c28a977bSCarlos Alberto Enciso
868c28a977bSCarlos Alberto Enciso.. code-block:: none
869c28a977bSCarlos Alberto Enciso
870c28a977bSCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=level
871c28a977bSCarlos Alberto Enciso                          --select-regex --select-nocase --select=INTe
872c28a977bSCarlos Alberto Enciso                          --report=list
873c28a977bSCarlos Alberto Enciso                          --print=symbols,types
874c28a977bSCarlos Alberto Enciso                          test-dwarf-clang.o test-dwarf-gcc.o
875c28a977bSCarlos Alberto Enciso
876c28a977bSCarlos Alberto Enciso  Logical View:
877c28a977bSCarlos Alberto Enciso  [000]           {File} 'test-dwarf-clang.o'
878c28a977bSCarlos Alberto Enciso
879c28a977bSCarlos Alberto Enciso  [001]           {CompileUnit} 'test.cpp'
880c28a977bSCarlos Alberto Enciso  [003]     4     {TypeAlias} 'INTEGER' -> 'int'
881c28a977bSCarlos Alberto Enciso  [004]     5     {Variable} 'CONSTANT' -> 'const INTEGER'
882c28a977bSCarlos Alberto Enciso
883c28a977bSCarlos Alberto Enciso  Logical View:
884c28a977bSCarlos Alberto Enciso  [000]           {File} 'test-dwarf-gcc.o'
885c28a977bSCarlos Alberto Enciso
886c28a977bSCarlos Alberto Enciso  [001]           {CompileUnit} 'test.cpp'
887c28a977bSCarlos Alberto Enciso  [004]     4     {TypeAlias} 'INTEGER' -> 'int'
888c28a977bSCarlos Alberto Enciso  [004]     5     {Variable} 'CONSTANT' -> 'const INTEGER'
889c28a977bSCarlos Alberto Enciso
890c28a977bSCarlos Alberto EncisoThe output shows that both objects contain the same elements. But the
891c28a977bSCarlos Alberto Enciso**'typedef INTEGER'** is located at different scope level. The GCC
892c28a977bSCarlos Alberto Encisogenerated object, shows **'4'**, which is the correct value.
893c28a977bSCarlos Alberto Enciso
894c28a977bSCarlos Alberto EncisoNote that there is no requirement that GCC must produce identical or
895c28a977bSCarlos Alberto Encisosimilar DWARF to Clang to allow the comparison. We're only comparing
896c28a977bSCarlos Alberto Encisothe semantics. The same case when comparing CodeView debug information
897c28a977bSCarlos Alberto Encisogenerated by MSVC and Clang.
898c28a977bSCarlos Alberto Enciso
899c28a977bSCarlos Alberto EncisoThere are 2 comparison methods: logical view and logical elements.
900c28a977bSCarlos Alberto Enciso
901c28a977bSCarlos Alberto EncisoLOGICAL VIEW
902c28a977bSCarlos Alberto Enciso""""""""""""
903c28a977bSCarlos Alberto EncisoIt compares the logical view as a whole unit; for a match, each compared
904c28a977bSCarlos Alberto Encisological element must have the same parents and children.
905c28a977bSCarlos Alberto Enciso
906c28a977bSCarlos Alberto EncisoUsing the :program:`llvm-debuginfo-analyzer` comparison functionality,
907c28a977bSCarlos Alberto Encisothat issue can be seen in a more global context, that can include the
908c28a977bSCarlos Alberto Encisological view.
909c28a977bSCarlos Alberto Enciso
910c28a977bSCarlos Alberto EncisoThe output shows in view form the **missing (-), added (+)** elements,
911c28a977bSCarlos Alberto Encisogiving more context by swapping the reference and target object files.
912c28a977bSCarlos Alberto Enciso
913c28a977bSCarlos Alberto Enciso.. code-block:: none
914c28a977bSCarlos Alberto Enciso
915c28a977bSCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=level
916c28a977bSCarlos Alberto Enciso                          --compare=types
917c28a977bSCarlos Alberto Enciso                          --report=view
918c28a977bSCarlos Alberto Enciso                          --print=symbols,types
919c28a977bSCarlos Alberto Enciso                          test-dwarf-clang.o test-dwarf-gcc.o
920c28a977bSCarlos Alberto Enciso
921c28a977bSCarlos Alberto Enciso  Reference: 'test-dwarf-clang.o'
922c28a977bSCarlos Alberto Enciso  Target:    'test-dwarf-gcc.o'
923c28a977bSCarlos Alberto Enciso
924c28a977bSCarlos Alberto Enciso  Logical View:
925c28a977bSCarlos Alberto Enciso   [000]           {File} 'test-dwarf-clang.o'
926c28a977bSCarlos Alberto Enciso
927c28a977bSCarlos Alberto Enciso   [001]             {CompileUnit} 'test.cpp'
928c28a977bSCarlos Alberto Enciso   [002]     1         {TypeAlias} 'INTPTR' -> '* const int'
929c28a977bSCarlos Alberto Enciso   [002]     2         {Function} extern not_inlined 'foo' -> 'int'
930c28a977bSCarlos Alberto Enciso   [003]                 {Block}
931c28a977bSCarlos Alberto Enciso   [004]     5             {Variable} 'CONSTANT' -> 'const INTEGER'
932c28a977bSCarlos Alberto Enciso  +[004]     4             {TypeAlias} 'INTEGER' -> 'int'
933c28a977bSCarlos Alberto Enciso   [003]     2           {Parameter} 'ParamBool' -> 'bool'
934c28a977bSCarlos Alberto Enciso   [003]     2           {Parameter} 'ParamPtr' -> 'INTPTR'
935c28a977bSCarlos Alberto Enciso   [003]     2           {Parameter} 'ParamUnsigned' -> 'unsigned int'
936c28a977bSCarlos Alberto Enciso  -[003]     4           {TypeAlias} 'INTEGER' -> 'int'
937c28a977bSCarlos Alberto Enciso
938c28a977bSCarlos Alberto EncisoThe output shows the merging view path (reference and target) with the
939c28a977bSCarlos Alberto Encisomissing and added elements.
940c28a977bSCarlos Alberto Enciso
941c28a977bSCarlos Alberto EncisoLOGICAL ELEMENTS
942c28a977bSCarlos Alberto Enciso""""""""""""""""
943c28a977bSCarlos Alberto EncisoIt compares individual logical elements without considering if their
944c28a977bSCarlos Alberto Encisoparents are the same. For both comparison methods, the equal criteria
945c28a977bSCarlos Alberto Encisoincludes the name, source code location, type, lexical scope level.
946c28a977bSCarlos Alberto Enciso
947c28a977bSCarlos Alberto Enciso.. code-block:: none
948c28a977bSCarlos Alberto Enciso
949c28a977bSCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=level
950c28a977bSCarlos Alberto Enciso                          --compare=types
951c28a977bSCarlos Alberto Enciso                          --report=list
952c28a977bSCarlos Alberto Enciso                          --print=symbols,types,summary
953c28a977bSCarlos Alberto Enciso                          test-dwarf-clang.o test-dwarf-gcc.o
954c28a977bSCarlos Alberto Enciso
955c28a977bSCarlos Alberto Enciso  Reference: 'test-dwarf-clang.o'
956c28a977bSCarlos Alberto Enciso  Target:    'test-dwarf-gcc.o'
957c28a977bSCarlos Alberto Enciso
958c28a977bSCarlos Alberto Enciso  (1) Missing Types:
959c28a977bSCarlos Alberto Enciso  -[003]     4     {TypeAlias} 'INTEGER' -> 'int'
960c28a977bSCarlos Alberto Enciso
961c28a977bSCarlos Alberto Enciso  (1) Added Types:
962c28a977bSCarlos Alberto Enciso  +[004]     4     {TypeAlias} 'INTEGER' -> 'int'
963c28a977bSCarlos Alberto Enciso
964c28a977bSCarlos Alberto Enciso  ----------------------------------------
965c28a977bSCarlos Alberto Enciso  Element   Expected    Missing      Added
966c28a977bSCarlos Alberto Enciso  ----------------------------------------
967c28a977bSCarlos Alberto Enciso  Scopes           4          0          0
968c28a977bSCarlos Alberto Enciso  Symbols          0          0          0
969c28a977bSCarlos Alberto Enciso  Types            2          1          1
970c28a977bSCarlos Alberto Enciso  Lines            0          0          0
971c28a977bSCarlos Alberto Enciso  ----------------------------------------
972c28a977bSCarlos Alberto Enciso  Total            6          1          1
973c28a977bSCarlos Alberto Enciso
974c28a977bSCarlos Alberto EncisoChanging the *Reference* and *Target* order:
975c28a977bSCarlos Alberto Enciso
976c28a977bSCarlos Alberto Enciso.. code-block:: none
977c28a977bSCarlos Alberto Enciso
978c28a977bSCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=level
979c28a977bSCarlos Alberto Enciso                          --compare=types
980c28a977bSCarlos Alberto Enciso                          --report=list
981c28a977bSCarlos Alberto Enciso                          --print=symbols,types,summary
982c28a977bSCarlos Alberto Enciso                          test-dwarf-gcc.o test-dwarf-clang.o
983c28a977bSCarlos Alberto Enciso
984c28a977bSCarlos Alberto Enciso  Reference: 'test-dwarf-gcc.o'
985c28a977bSCarlos Alberto Enciso  Target:    'test-dwarf-clang.o'
986c28a977bSCarlos Alberto Enciso
987c28a977bSCarlos Alberto Enciso  (1) Missing Types:
988c28a977bSCarlos Alberto Enciso  -[004]     4     {TypeAlias} 'INTEGER' -> 'int'
989c28a977bSCarlos Alberto Enciso
990c28a977bSCarlos Alberto Enciso  (1) Added Types:
991c28a977bSCarlos Alberto Enciso  +[003]     4     {TypeAlias} 'INTEGER' -> 'int'
992c28a977bSCarlos Alberto Enciso
993c28a977bSCarlos Alberto Enciso  ----------------------------------------
994c28a977bSCarlos Alberto Enciso  Element   Expected    Missing      Added
995c28a977bSCarlos Alberto Enciso  ----------------------------------------
996c28a977bSCarlos Alberto Enciso  Scopes           4          0          0
997c28a977bSCarlos Alberto Enciso  Symbols          0          0          0
998c28a977bSCarlos Alberto Enciso  Types            2          1          1
999c28a977bSCarlos Alberto Enciso  Lines            0          0          0
1000c28a977bSCarlos Alberto Enciso  ----------------------------------------
1001c28a977bSCarlos Alberto Enciso  Total            6          1          1
1002c28a977bSCarlos Alberto Enciso
1003c28a977bSCarlos Alberto EncisoAs the *Reference* and *Target* are switched, the *Added Types* from
1004c28a977bSCarlos Alberto Encisothe first case now are listed as *Missing Types*.
1005c28a977bSCarlos Alberto Enciso
1006c28a977bSCarlos Alberto EncisoTEST CASE 2 - ASSEMBLER INSTRUCTIONS
1007c28a977bSCarlos Alberto Enciso~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1008c28a977bSCarlos Alberto EncisoThe below example is used to show different output generated by
1009c28a977bSCarlos Alberto Enciso:program:`llvm-debuginfo-analyzer`. We compiled the example for an X86
1010c28a977bSCarlos Alberto EncisoCodeview and ELF targets with recent versions of Clang, GCC and MSVC
1011c28a977bSCarlos Alberto Enciso(-O0 -g) for Windows and Linux.
1012c28a977bSCarlos Alberto Enciso
1013c28a977bSCarlos Alberto Enciso.. code-block:: c++
1014c28a977bSCarlos Alberto Enciso
1015c28a977bSCarlos Alberto Enciso   1  extern int printf(const char * format, ... );
1016c28a977bSCarlos Alberto Enciso   2
1017c28a977bSCarlos Alberto Enciso   3  int main()
1018c28a977bSCarlos Alberto Enciso   4  {
1019c28a977bSCarlos Alberto Enciso   5    printf("Hello, World\n");
1020c28a977bSCarlos Alberto Enciso   6    return 0;
1021c28a977bSCarlos Alberto Enciso   7  }
1022c28a977bSCarlos Alberto Enciso
1023c28a977bSCarlos Alberto EncisoThese are the logical views that :program:`llvm-debuginfo-analyzer`
1024c28a977bSCarlos Alberto Encisogenerates for 3 different compilers (MSVC, Clang and GCC), emitting
1025c28a977bSCarlos Alberto Encisodifferent debug information formats (CodeView, DWARF) on Windows and
1026c28a977bSCarlos Alberto EncisoLinux.
1027c28a977bSCarlos Alberto Enciso
1028c28a977bSCarlos Alberto Enciso.. code-block:: none
1029c28a977bSCarlos Alberto Enciso
1030c28a977bSCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=level,format,producer
1031c28a977bSCarlos Alberto Enciso                          --print=lines,instructions
1032c28a977bSCarlos Alberto Enciso                          hello-world-codeview-clang.o
1033c28a977bSCarlos Alberto Enciso                          hello-world-codeview-msvc.o
1034c28a977bSCarlos Alberto Enciso                          hello-world-dwarf-clang.o
1035c28a977bSCarlos Alberto Enciso                          hello-world-dwarf-gcc.o
1036c28a977bSCarlos Alberto Enciso
1037c28a977bSCarlos Alberto EncisoCodeView - Clang (Windows)
1038c28a977bSCarlos Alberto Enciso^^^^^^^^^^^^^^^^^^^^^^^^^^
1039c28a977bSCarlos Alberto Enciso
1040c28a977bSCarlos Alberto Enciso.. code-block:: none
1041c28a977bSCarlos Alberto Enciso
1042c28a977bSCarlos Alberto Enciso  Logical View:
1043c28a977bSCarlos Alberto Enciso  [000]           {File} 'hello-world-codeview-clang.o' -> COFF-x86-64
1044c28a977bSCarlos Alberto Enciso
1045c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'hello-world.cpp'
1046c28a977bSCarlos Alberto Enciso  [002]               {Producer} 'clang version 14.0.0'
1047c28a977bSCarlos Alberto Enciso  [002]               {Function} extern not_inlined 'main' -> 'int'
1048c28a977bSCarlos Alberto Enciso  [003]     4           {Line}
1049c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'subq	$0x28, %rsp'
1050c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'movl	$0x0, 0x24(%rsp)'
1051c28a977bSCarlos Alberto Enciso  [003]     5           {Line}
1052c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'leaq	(%rip), %rcx'
1053c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'callq	0x0'
1054c28a977bSCarlos Alberto Enciso  [003]     6           {Line}
1055c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'xorl	%eax, %eax'
1056c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'addq	$0x28, %rsp'
1057c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'retq'
1058c28a977bSCarlos Alberto Enciso
1059c28a977bSCarlos Alberto EncisoCodeView - MSVC (Windows)
1060c28a977bSCarlos Alberto Enciso^^^^^^^^^^^^^^^^^^^^^^^^^
1061c28a977bSCarlos Alberto Enciso
1062c28a977bSCarlos Alberto Enciso.. code-block:: none
1063c28a977bSCarlos Alberto Enciso
1064c28a977bSCarlos Alberto Enciso  Logical View:
1065c28a977bSCarlos Alberto Enciso  [000]           {File} 'hello-world-codeview-msvc.o' -> COFF-i386
1066c28a977bSCarlos Alberto Enciso
1067c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'hello-world.cpp'
1068c28a977bSCarlos Alberto Enciso  [002]               {Producer} 'Microsoft (R) Optimizing Compiler'
1069c28a977bSCarlos Alberto Enciso  [002]               {Function} extern not_inlined 'main' -> 'int'
1070c28a977bSCarlos Alberto Enciso  [003]     4           {Line}
1071c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'pushl	%ebp'
1072c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'movl	%esp, %ebp'
1073c28a977bSCarlos Alberto Enciso  [003]     5           {Line}
1074c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'pushl	$0x0'
1075c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'calll	0x0'
1076c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'addl	$0x4, %esp'
1077c28a977bSCarlos Alberto Enciso  [003]     6           {Line}
1078c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'xorl	%eax, %eax'
1079c28a977bSCarlos Alberto Enciso  [003]     7           {Line}
1080c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'popl	%ebp'
1081c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'retl'
1082c28a977bSCarlos Alberto Enciso
1083c28a977bSCarlos Alberto EncisoDWARF - Clang (Linux)
1084c28a977bSCarlos Alberto Enciso^^^^^^^^^^^^^^^^^^^^^
1085c28a977bSCarlos Alberto Enciso
1086c28a977bSCarlos Alberto Enciso.. code-block:: none
1087c28a977bSCarlos Alberto Enciso
1088c28a977bSCarlos Alberto Enciso  Logical View:
1089c28a977bSCarlos Alberto Enciso  [000]           {File} 'hello-world-dwarf-clang.o' -> elf64-x86-64
1090c28a977bSCarlos Alberto Enciso
1091c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'hello-world.cpp'
1092c28a977bSCarlos Alberto Enciso  [002]               {Producer} 'clang version 14.0.0'
1093c28a977bSCarlos Alberto Enciso  [002]     3         {Function} extern not_inlined 'main' -> 'int'
1094c28a977bSCarlos Alberto Enciso  [003]     4           {Line}
1095c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'pushq	%rbp'
1096c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'movq	%rsp, %rbp'
1097c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'subq	$0x10, %rsp'
1098c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'movl	$0x0, -0x4(%rbp)'
1099c28a977bSCarlos Alberto Enciso  [003]     5           {Line}
1100c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'movabsq	$0x0, %rdi'
1101c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'movb	$0x0, %al'
1102c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'callq	0x0'
1103c28a977bSCarlos Alberto Enciso  [003]     6           {Line}
1104c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'xorl	%eax, %eax'
1105c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'addq	$0x10, %rsp'
1106c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'popq	%rbp'
1107c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'retq'
1108c28a977bSCarlos Alberto Enciso  [003]     6           {Line}
1109c28a977bSCarlos Alberto Enciso
1110c28a977bSCarlos Alberto EncisoDWARF - GCC (Linux)
1111c28a977bSCarlos Alberto Enciso^^^^^^^^^^^^^^^^^^^
1112c28a977bSCarlos Alberto Enciso
1113c28a977bSCarlos Alberto Enciso.. code-block:: none
1114c28a977bSCarlos Alberto Enciso
1115c28a977bSCarlos Alberto Enciso  Logical View:
1116c28a977bSCarlos Alberto Enciso  [000]           {File} 'hello-world-dwarf-gcc.o' -> elf64-x86-64
1117c28a977bSCarlos Alberto Enciso
1118c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'hello-world.cpp'
1119c28a977bSCarlos Alberto Enciso  [002]               {Producer} 'GNU C++14 9.3.0'
1120c28a977bSCarlos Alberto Enciso  [002]     3         {Function} extern not_inlined 'main' -> 'int'
1121c28a977bSCarlos Alberto Enciso  [003]     4           {Line}
1122c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'endbr64'
1123c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'pushq	%rbp'
1124c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'movq	%rsp, %rbp'
1125c28a977bSCarlos Alberto Enciso  [003]     5           {Line}
1126c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'leaq	(%rip), %rdi'
1127c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'movl	$0x0, %eax'
1128c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'callq	0x0'
1129c28a977bSCarlos Alberto Enciso  [003]     6           {Line}
1130c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'movl	$0x0, %eax'
1131c28a977bSCarlos Alberto Enciso  [003]     7           {Line}
1132c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'popq	%rbp'
1133c28a977bSCarlos Alberto Enciso  [003]                 {Code} 'retq'
1134c28a977bSCarlos Alberto Enciso  [003]     7           {Line}
1135c28a977bSCarlos Alberto Enciso
1136c28a977bSCarlos Alberto EncisoThe logical views shows the intermixed lines and assembler instructions,
1137c28a977bSCarlos Alberto Encisoallowing to compare the code generated by the different toolchains.
1138c28a977bSCarlos Alberto Enciso
1139c28a977bSCarlos Alberto EncisoTEST CASE 3 - INCORRECT LEXICAL SCOPE FOR TYPEDEF
1140c28a977bSCarlos Alberto Enciso~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1141c28a977bSCarlos Alberto EncisoThe below example is used to show different output generated by
1142c28a977bSCarlos Alberto Enciso:program:`llvm-debuginfo-analyzer`. We compiled the example for an X86
1143c28a977bSCarlos Alberto EncisoCodeview and ELF targets with recent versions of Clang, GCC and MSVC
1144c28a977bSCarlos Alberto Enciso(-O0 -g).
1145c28a977bSCarlos Alberto Enciso
1146c28a977bSCarlos Alberto Enciso.. code-block:: c++
1147c28a977bSCarlos Alberto Enciso
1148c28a977bSCarlos Alberto Enciso   1  int bar(float Input) { return (int)Input; }
1149c28a977bSCarlos Alberto Enciso   2
1150c28a977bSCarlos Alberto Enciso   3  unsigned foo(char Param) {
1151c28a977bSCarlos Alberto Enciso   4    typedef int INT;                // ** Definition for INT **
1152c28a977bSCarlos Alberto Enciso   5    INT Value = Param;
1153c28a977bSCarlos Alberto Enciso   6    {
1154c28a977bSCarlos Alberto Enciso   7      typedef float FLOAT;          // ** Definition for FLOAT **
1155c28a977bSCarlos Alberto Enciso   8      {
1156c28a977bSCarlos Alberto Enciso   9        FLOAT Added = Value + Param;
1157c28a977bSCarlos Alberto Enciso  10        Value = bar(Added);
1158c28a977bSCarlos Alberto Enciso  11      }
1159c28a977bSCarlos Alberto Enciso  12    }
1160c28a977bSCarlos Alberto Enciso  13    return Value + Param;
1161c28a977bSCarlos Alberto Enciso  14  }
1162c28a977bSCarlos Alberto Enciso
1163c28a977bSCarlos Alberto EncisoThe above test is used to illustrate a scope issue found in the Clang
1164c28a977bSCarlos Alberto Encisocompiler:
1165c28a977bSCarlos Alberto Enciso`PR44884 (Bugs LLVM) <https://bugs.llvm.org/show_bug.cgi?id=44884>`_ /
1166c28a977bSCarlos Alberto Enciso`PR44229 (GitHub LLVM) <https://github.com/llvm/llvm-project/issues/44229>`_
1167c28a977bSCarlos Alberto Enciso
1168c28a977bSCarlos Alberto EncisoThe lines 4 and 7 contains 2 typedefs, defined at different lexical
1169c28a977bSCarlos Alberto Encisoscopes.
1170c28a977bSCarlos Alberto Enciso
1171c28a977bSCarlos Alberto Enciso.. code-block:: c++
1172c28a977bSCarlos Alberto Enciso
1173c28a977bSCarlos Alberto Enciso  4    typedef int INT;
1174c28a977bSCarlos Alberto Enciso  7      typedef float FLOAT;
1175c28a977bSCarlos Alberto Enciso
1176c28a977bSCarlos Alberto EncisoThese are the logical views that :program:`llvm-debuginfo-analyzer`
1177c28a977bSCarlos Alberto Encisogenerates for 3 different compilers (MSVC, Clang and GCC), emitting
1178c28a977bSCarlos Alberto Encisodifferent debug information formats (CodeView, DWARF) on different
1179c28a977bSCarlos Alberto Encisoplatforms.
1180c28a977bSCarlos Alberto Enciso
1181c28a977bSCarlos Alberto Enciso.. code-block:: none
1182c28a977bSCarlos Alberto Enciso
1183c28a977bSCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=level,format,producer
1184c28a977bSCarlos Alberto Enciso                          --print=symbols,types,lines
1185c28a977bSCarlos Alberto Enciso                          --output-sort=kind
1186c28a977bSCarlos Alberto Enciso                          pr-44884-codeview-clang.o
1187c28a977bSCarlos Alberto Enciso                          pr-44884-codeview-msvc.o
1188c28a977bSCarlos Alberto Enciso                          pr-44884-dwarf-clang.o
1189c28a977bSCarlos Alberto Enciso                          pr-44884-dwarf-gcc.o
1190c28a977bSCarlos Alberto Enciso
1191c28a977bSCarlos Alberto EncisoCodeView - Clang (Windows)
1192c28a977bSCarlos Alberto Enciso^^^^^^^^^^^^^^^^^^^^^^^^^^
1193c28a977bSCarlos Alberto Enciso
1194c28a977bSCarlos Alberto Enciso.. code-block:: none
1195c28a977bSCarlos Alberto Enciso
1196c28a977bSCarlos Alberto Enciso  Logical View:
1197c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-44884-codeview-clang.o' -> COFF-x86-64
1198c28a977bSCarlos Alberto Enciso
1199c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'pr-44884.cpp'
1200c28a977bSCarlos Alberto Enciso  [002]               {Producer} 'clang version 14.0.0'
1201c28a977bSCarlos Alberto Enciso  [002]               {Function} extern not_inlined 'bar' -> 'int'
1202c28a977bSCarlos Alberto Enciso  [003]                 {Parameter} 'Input' -> 'float'
1203c28a977bSCarlos Alberto Enciso  [003]     1           {Line}
1204c28a977bSCarlos Alberto Enciso  [002]               {Function} extern not_inlined 'foo' -> 'unsigned'
1205c28a977bSCarlos Alberto Enciso  [003]                 {Block}
1206c28a977bSCarlos Alberto Enciso  [004]                   {Variable} 'Added' -> 'float'
1207c28a977bSCarlos Alberto Enciso  [004]     9             {Line}
1208c28a977bSCarlos Alberto Enciso  [004]    10             {Line}
1209c28a977bSCarlos Alberto Enciso  [003]                 {Parameter} 'Param' -> 'char'
1210c28a977bSCarlos Alberto Enciso  [003]                 {TypeAlias} 'FLOAT' -> 'float'
1211c28a977bSCarlos Alberto Enciso  [003]                 {TypeAlias} 'INT' -> 'int'
1212c28a977bSCarlos Alberto Enciso  [003]                 {Variable} 'Value' -> 'int'
1213c28a977bSCarlos Alberto Enciso  [003]     3           {Line}
1214c28a977bSCarlos Alberto Enciso  [003]     5           {Line}
1215c28a977bSCarlos Alberto Enciso  [003]    13           {Line}
1216c28a977bSCarlos Alberto Enciso
1217c28a977bSCarlos Alberto EncisoCodeView - MSVC (Windows)
1218c28a977bSCarlos Alberto Enciso^^^^^^^^^^^^^^^^^^^^^^^^^
1219c28a977bSCarlos Alberto Enciso
1220c28a977bSCarlos Alberto Enciso.. code-block:: none
1221c28a977bSCarlos Alberto Enciso
1222c28a977bSCarlos Alberto Enciso  Logical View:
1223c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-44884-codeview-msvc.o' -> COFF-i386
1224c28a977bSCarlos Alberto Enciso
1225c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'pr-44884.cpp'
1226c28a977bSCarlos Alberto Enciso  [002]               {Producer} 'Microsoft (R) Optimizing Compiler'
1227c28a977bSCarlos Alberto Enciso  [002]               {Function} extern not_inlined 'bar' -> 'int'
1228c28a977bSCarlos Alberto Enciso  [003]                 {Variable} 'Input' -> 'float'
1229c28a977bSCarlos Alberto Enciso  [003]     1           {Line}
1230c28a977bSCarlos Alberto Enciso  [002]               {Function} extern not_inlined 'foo' -> 'unsigned'
1231c28a977bSCarlos Alberto Enciso  [003]                 {Block}
1232c28a977bSCarlos Alberto Enciso  [004]                   {Block}
1233c28a977bSCarlos Alberto Enciso  [005]                     {Variable} 'Added' -> 'float'
1234c28a977bSCarlos Alberto Enciso  [004]                   {TypeAlias} 'FLOAT' -> 'float'
1235c28a977bSCarlos Alberto Enciso  [004]     9             {Line}
1236c28a977bSCarlos Alberto Enciso  [004]    10             {Line}
1237c28a977bSCarlos Alberto Enciso  [003]                 {TypeAlias} 'INT' -> 'int'
1238c28a977bSCarlos Alberto Enciso  [003]                 {Variable} 'Param' -> 'char'
1239c28a977bSCarlos Alberto Enciso  [003]                 {Variable} 'Value' -> 'int'
1240c28a977bSCarlos Alberto Enciso  [003]     3           {Line}
1241c28a977bSCarlos Alberto Enciso  [003]     5           {Line}
1242c28a977bSCarlos Alberto Enciso  [003]    13           {Line}
1243c28a977bSCarlos Alberto Enciso  [003]    14           {Line}
1244c28a977bSCarlos Alberto Enciso
1245c28a977bSCarlos Alberto EncisoDWARF - Clang (Linux)
1246c28a977bSCarlos Alberto Enciso^^^^^^^^^^^^^^^^^^^^^
1247c28a977bSCarlos Alberto Enciso
1248c28a977bSCarlos Alberto Enciso.. code-block:: none
1249c28a977bSCarlos Alberto Enciso
1250c28a977bSCarlos Alberto Enciso  Logical View:
1251c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-44884-dwarf-clang.o' -> elf64-x86-64
1252c28a977bSCarlos Alberto Enciso
1253c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'pr-44884.cpp'
1254c28a977bSCarlos Alberto Enciso  [002]               {Producer} 'clang version 14.0.0'
1255c28a977bSCarlos Alberto Enciso  [002]     1         {Function} extern not_inlined 'bar' -> 'int'
1256c28a977bSCarlos Alberto Enciso  [003]     1           {Parameter} 'Input' -> 'float'
1257c28a977bSCarlos Alberto Enciso  [003]     1           {Line}
1258c28a977bSCarlos Alberto Enciso  [003]     1           {Line}
1259c28a977bSCarlos Alberto Enciso  [003]     1           {Line}
1260c28a977bSCarlos Alberto Enciso  [002]     3         {Function} extern not_inlined 'foo' -> 'unsigned int'
1261c28a977bSCarlos Alberto Enciso  [003]                 {Block}
1262c28a977bSCarlos Alberto Enciso  [004]     9             {Variable} 'Added' -> 'FLOAT'
1263c28a977bSCarlos Alberto Enciso  [004]     9             {Line}
1264c28a977bSCarlos Alberto Enciso  [004]     9             {Line}
1265c28a977bSCarlos Alberto Enciso  [004]     9             {Line}
1266c28a977bSCarlos Alberto Enciso  [004]     9             {Line}
1267c28a977bSCarlos Alberto Enciso  [004]     9             {Line}
1268c28a977bSCarlos Alberto Enciso  [004]    10             {Line}
1269c28a977bSCarlos Alberto Enciso  [004]    10             {Line}
1270c28a977bSCarlos Alberto Enciso  [004]    10             {Line}
1271c28a977bSCarlos Alberto Enciso  [004]    13             {Line}
1272c28a977bSCarlos Alberto Enciso  [003]     3           {Parameter} 'Param' -> 'char'
1273c28a977bSCarlos Alberto Enciso  [003]     7           {TypeAlias} 'FLOAT' -> 'float'
1274c28a977bSCarlos Alberto Enciso  [003]     4           {TypeAlias} 'INT' -> 'int'
1275c28a977bSCarlos Alberto Enciso  [003]     5           {Variable} 'Value' -> 'INT'
1276c28a977bSCarlos Alberto Enciso  [003]     3           {Line}
1277c28a977bSCarlos Alberto Enciso  [003]     5           {Line}
1278c28a977bSCarlos Alberto Enciso  [003]     5           {Line}
1279c28a977bSCarlos Alberto Enciso  [003]    13           {Line}
1280c28a977bSCarlos Alberto Enciso  [003]    13           {Line}
1281c28a977bSCarlos Alberto Enciso  [003]    13           {Line}
1282c28a977bSCarlos Alberto Enciso  [003]    13           {Line}
1283c28a977bSCarlos Alberto Enciso
1284c28a977bSCarlos Alberto EncisoDWARF - GCC (Linux)
1285c28a977bSCarlos Alberto Enciso^^^^^^^^^^^^^^^^^^^
1286c28a977bSCarlos Alberto Enciso
1287c28a977bSCarlos Alberto Enciso.. code-block:: none
1288c28a977bSCarlos Alberto Enciso
1289c28a977bSCarlos Alberto Enciso  Logical View:
1290c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-44884-dwarf-gcc.o' -> elf32-littlearm
1291c28a977bSCarlos Alberto Enciso
1292c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'pr-44884.cpp'
1293c28a977bSCarlos Alberto Enciso  [002]               {Producer} 'GNU C++14 10.2.1 20201103'
1294c28a977bSCarlos Alberto Enciso  [002]     1         {Function} extern not_inlined 'bar' -> 'int'
1295c28a977bSCarlos Alberto Enciso  [003]     1           {Parameter} 'Input' -> 'float'
1296c28a977bSCarlos Alberto Enciso  [003]     1           {Line}
1297c28a977bSCarlos Alberto Enciso  [003]     1           {Line}
1298c28a977bSCarlos Alberto Enciso  [003]     1           {Line}
1299c28a977bSCarlos Alberto Enciso  [002]     3         {Function} extern not_inlined 'foo' -> 'unsigned int'
1300c28a977bSCarlos Alberto Enciso  [003]                 {Block}
1301c28a977bSCarlos Alberto Enciso  [004]                   {Block}
1302c28a977bSCarlos Alberto Enciso  [005]     9               {Variable} 'Added' -> 'FLOAT'
1303c28a977bSCarlos Alberto Enciso  [005]     9               {Line}
1304c28a977bSCarlos Alberto Enciso  [005]     9               {Line}
1305c28a977bSCarlos Alberto Enciso  [005]     9               {Line}
1306c28a977bSCarlos Alberto Enciso  [005]    10               {Line}
1307c28a977bSCarlos Alberto Enciso  [005]    13               {Line}
1308c28a977bSCarlos Alberto Enciso  [004]     7             {TypeAlias} 'FLOAT' -> 'float'
1309c28a977bSCarlos Alberto Enciso  [003]     3           {Parameter} 'Param' -> 'char'
1310c28a977bSCarlos Alberto Enciso  [003]     4           {TypeAlias} 'INT' -> 'int'
1311c28a977bSCarlos Alberto Enciso  [003]     5           {Variable} 'Value' -> 'INT'
1312c28a977bSCarlos Alberto Enciso  [003]     3           {Line}
1313c28a977bSCarlos Alberto Enciso  [003]     5           {Line}
1314c28a977bSCarlos Alberto Enciso  [003]    13           {Line}
1315c28a977bSCarlos Alberto Enciso  [003]    14           {Line}
1316c28a977bSCarlos Alberto Enciso  [003]    14           {Line}
1317c28a977bSCarlos Alberto Enciso
1318c28a977bSCarlos Alberto EncisoFrom the previous logical views, we can see that the Clang compiler
1319c28a977bSCarlos Alberto Encisoemits **both typedefs at the same lexical scope (3)**, which is wrong.
1320c28a977bSCarlos Alberto EncisoGCC and MSVC emit correct lexical scope for both typedefs.
1321c28a977bSCarlos Alberto Enciso
1322c28a977bSCarlos Alberto EncisoUsing the :program:`llvm-debuginfo-analyzer` selection facilities, we
1323c28a977bSCarlos Alberto Encisocan produce a simple tabular output showing just the logical types that
1324c28a977bSCarlos Alberto Encisoare **Typedef**.
1325c28a977bSCarlos Alberto Enciso
1326c28a977bSCarlos Alberto Enciso.. code-block:: none
1327c28a977bSCarlos Alberto Enciso
1328c28a977bSCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=level,format
1329c28a977bSCarlos Alberto Enciso                          --output-sort=name
1330c28a977bSCarlos Alberto Enciso                          --select-types=Typedef
1331c28a977bSCarlos Alberto Enciso                          --report=list
1332c28a977bSCarlos Alberto Enciso                          --print=types
1333c28a977bSCarlos Alberto Enciso                          pr-44884-*.o
1334c28a977bSCarlos Alberto Enciso
1335c28a977bSCarlos Alberto Enciso  Logical View:
1336c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-44884-codeview-clang.o' -> COFF-x86-64
1337c28a977bSCarlos Alberto Enciso
1338c28a977bSCarlos Alberto Enciso  [001]           {CompileUnit} 'pr_44884.cpp'
1339c28a977bSCarlos Alberto Enciso  [003]           {TypeAlias} 'FLOAT' -> 'float'
1340c28a977bSCarlos Alberto Enciso  [003]           {TypeAlias} 'INT' -> 'int'
1341c28a977bSCarlos Alberto Enciso
1342c28a977bSCarlos Alberto Enciso  Logical View:
1343c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-44884-codeview-msvc.o' -> COFF-i386
1344c28a977bSCarlos Alberto Enciso
1345c28a977bSCarlos Alberto Enciso  [001]           {CompileUnit} 'pr_44884.cpp'
1346c28a977bSCarlos Alberto Enciso  [004]           {TypeAlias} 'FLOAT' -> 'float'
1347c28a977bSCarlos Alberto Enciso  [003]           {TypeAlias} 'INT' -> 'int'
1348c28a977bSCarlos Alberto Enciso
1349c28a977bSCarlos Alberto Enciso  Logical View:
1350c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-44884-dwarf-clang.o' -> elf64-x86-64
1351c28a977bSCarlos Alberto Enciso
1352c28a977bSCarlos Alberto Enciso  [001]           {CompileUnit} 'pr_44884.cpp'
1353c28a977bSCarlos Alberto Enciso  [003]     7     {TypeAlias} 'FLOAT' -> 'float'
1354c28a977bSCarlos Alberto Enciso  [003]     4     {TypeAlias} 'INT' -> 'int'
1355c28a977bSCarlos Alberto Enciso
1356c28a977bSCarlos Alberto Enciso  Logical View:
1357c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-44884-dwarf-gcc.o' -> elf32-littlearm
1358c28a977bSCarlos Alberto Enciso
1359c28a977bSCarlos Alberto Enciso  [001]           {CompileUnit} 'pr_44884.cpp'
1360c28a977bSCarlos Alberto Enciso  [004]     7     {TypeAlias} 'FLOAT' -> 'float'
1361c28a977bSCarlos Alberto Enciso  [003]     4     {TypeAlias} 'INT' -> 'int'
1362c28a977bSCarlos Alberto Enciso
1363c28a977bSCarlos Alberto EncisoIt also shows, that the CodeView debug information does not generate
1364c28a977bSCarlos Alberto Encisosource code line numbers for the those logical types. The logical view
1365c28a977bSCarlos Alberto Encisois sorted by the types name.
1366c28a977bSCarlos Alberto Enciso
1367c28a977bSCarlos Alberto EncisoTEST CASE 4 - MISSING NESTED ENUMERATIONS
1368c28a977bSCarlos Alberto Enciso~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1369c28a977bSCarlos Alberto EncisoThe below example is used to show different output generated by
1370c28a977bSCarlos Alberto Enciso:program:`llvm-debuginfo-analyzer`. We compiled the example for an X86
1371c28a977bSCarlos Alberto EncisoCodeview and ELF targets with recent versions of Clang, GCC and MSVC
1372c28a977bSCarlos Alberto Enciso(-O0 -g).
1373c28a977bSCarlos Alberto Enciso
1374c28a977bSCarlos Alberto Enciso.. code-block:: c++
1375c28a977bSCarlos Alberto Enciso
1376c28a977bSCarlos Alberto Enciso   1  struct Struct {
1377c28a977bSCarlos Alberto Enciso   2    union Union {
1378c28a977bSCarlos Alberto Enciso   3      enum NestedEnum { RED, BLUE };
1379c28a977bSCarlos Alberto Enciso   4    };
1380c28a977bSCarlos Alberto Enciso   5    Union U;
1381c28a977bSCarlos Alberto Enciso   6  };
1382c28a977bSCarlos Alberto Enciso   7
1383c28a977bSCarlos Alberto Enciso   8  Struct S;
1384c28a977bSCarlos Alberto Enciso   9  int test() {
1385c28a977bSCarlos Alberto Enciso  10    return S.U.BLUE;
1386c28a977bSCarlos Alberto Enciso  11  }
1387c28a977bSCarlos Alberto Enciso
1388c28a977bSCarlos Alberto EncisoThe above test is used to illustrate a scope issue found in the Clang
1389c28a977bSCarlos Alberto Encisocompiler:
1390c28a977bSCarlos Alberto Enciso`PR46466 (Bugs LLVM) <https://bugs.llvm.org/show_bug.cgi?id=46466>`_ /
1391c28a977bSCarlos Alberto Enciso`PR45811 (GitHub LLVM) <https://github.com/llvm/llvm-project/issues/45811>`_
1392c28a977bSCarlos Alberto Enciso
1393c28a977bSCarlos Alberto EncisoThese are the logical views that :program:`llvm-debuginfo-analyzer`
1394c28a977bSCarlos Alberto Encisogenerates for 3 different compilers (MSVC, Clang and GCC), emitting
1395c28a977bSCarlos Alberto Encisodifferent debug information formats (CodeView, DWARF) on different
1396c28a977bSCarlos Alberto Encisoplatforms.
1397c28a977bSCarlos Alberto Enciso
1398c28a977bSCarlos Alberto Enciso.. code-block:: none
1399c28a977bSCarlos Alberto Enciso
1400c28a977bSCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=level,format,producer
1401c28a977bSCarlos Alberto Enciso                          --output-sort=name
1402c28a977bSCarlos Alberto Enciso                          --print=symbols,types
1403c28a977bSCarlos Alberto Enciso                          pr-46466-codeview-clang.o
1404c28a977bSCarlos Alberto Enciso                          pr-46466-codeview-msvc.o
1405c28a977bSCarlos Alberto Enciso                          pr-46466-dwarf-clang.o
1406c28a977bSCarlos Alberto Enciso                          pr-46466-dwarf-gcc.o
1407c28a977bSCarlos Alberto Enciso
1408c28a977bSCarlos Alberto EncisoCodeView - Clang (Windows)
1409c28a977bSCarlos Alberto Enciso^^^^^^^^^^^^^^^^^^^^^^^^^^
1410c28a977bSCarlos Alberto Enciso
1411c28a977bSCarlos Alberto Enciso.. code-block:: none
1412c28a977bSCarlos Alberto Enciso
1413c28a977bSCarlos Alberto Enciso  Logical View:
1414c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-46466-codeview-clang.o' -> COFF-x86-64
1415c28a977bSCarlos Alberto Enciso
1416c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'pr-46466.cpp'
1417c28a977bSCarlos Alberto Enciso  [002]               {Producer} 'clang version 14.0.0'
1418c28a977bSCarlos Alberto Enciso  [002]               {Variable} extern 'S' -> 'Struct'
1419c28a977bSCarlos Alberto Enciso  [002]     1         {Struct} 'Struct'
1420c28a977bSCarlos Alberto Enciso  [003]                 {Member} public 'U' -> 'Union'
1421c28a977bSCarlos Alberto Enciso  [003]     2           {Union} 'Union'
1422c28a977bSCarlos Alberto Enciso  [004]     3             {Enumeration} 'NestedEnum' -> 'int'
1423c28a977bSCarlos Alberto Enciso  [005]                     {Enumerator} 'BLUE' = '0x1'
1424c28a977bSCarlos Alberto Enciso  [005]                     {Enumerator} 'RED' = '0x0'
1425c28a977bSCarlos Alberto Enciso
1426c28a977bSCarlos Alberto EncisoCodeView - MSVC (Windows)
1427c28a977bSCarlos Alberto Enciso^^^^^^^^^^^^^^^^^^^^^^^^^
1428c28a977bSCarlos Alberto Enciso
1429c28a977bSCarlos Alberto Enciso.. code-block:: none
1430c28a977bSCarlos Alberto Enciso
1431c28a977bSCarlos Alberto Enciso  Logical View:
1432c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-46466-codeview-msvc.o' -> COFF-i386
1433c28a977bSCarlos Alberto Enciso
1434c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'pr-46466.cpp'
1435c28a977bSCarlos Alberto Enciso  [002]               {Producer} 'Microsoft (R) Optimizing Compiler'
1436c28a977bSCarlos Alberto Enciso  [002]               {Variable} extern 'S' -> 'Struct'
1437c28a977bSCarlos Alberto Enciso  [002]     1         {Struct} 'Struct'
1438c28a977bSCarlos Alberto Enciso  [003]                 {Member} public 'U' -> 'Union'
1439c28a977bSCarlos Alberto Enciso  [003]     2           {Union} 'Union'
1440c28a977bSCarlos Alberto Enciso  [004]     3             {Enumeration} 'NestedEnum' -> 'int'
1441c28a977bSCarlos Alberto Enciso  [005]                     {Enumerator} 'BLUE' = '0x1'
1442c28a977bSCarlos Alberto Enciso  [005]                     {Enumerator} 'RED' = '0x0'
1443c28a977bSCarlos Alberto Enciso
1444c28a977bSCarlos Alberto EncisoDWARF - Clang (Linux)
1445c28a977bSCarlos Alberto Enciso^^^^^^^^^^^^^^^^^^^^^
1446c28a977bSCarlos Alberto Enciso
1447c28a977bSCarlos Alberto Enciso.. code-block:: none
1448c28a977bSCarlos Alberto Enciso
1449c28a977bSCarlos Alberto Enciso  Logical View:
1450c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-46466-dwarf-clang.o' -> elf64-x86-64
1451c28a977bSCarlos Alberto Enciso
1452c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'pr-46466.cpp'
1453c28a977bSCarlos Alberto Enciso  [002]               {Producer} 'clang version 14.0.0'
1454c28a977bSCarlos Alberto Enciso  [002]     8         {Variable} extern 'S' -> 'Struct'
1455c28a977bSCarlos Alberto Enciso  [002]     1         {Struct} 'Struct'
1456c28a977bSCarlos Alberto Enciso  [003]     5           {Member} public 'U' -> 'Union'
1457c28a977bSCarlos Alberto Enciso
1458c28a977bSCarlos Alberto EncisoDWARF - GCC (Linux)
1459c28a977bSCarlos Alberto Enciso^^^^^^^^^^^^^^^^^^^
1460c28a977bSCarlos Alberto Enciso
1461c28a977bSCarlos Alberto Enciso.. code-block:: none
1462c28a977bSCarlos Alberto Enciso
1463c28a977bSCarlos Alberto Enciso  Logical View:
1464c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-46466-dwarf-gcc.o' -> elf64-x86-64
1465c28a977bSCarlos Alberto Enciso
1466c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'pr-46466.cpp'
1467c28a977bSCarlos Alberto Enciso  [002]               {Producer} 'GNU C++14 9.3.0'
1468c28a977bSCarlos Alberto Enciso  [002]     8         {Variable} extern 'S' -> 'Struct'
1469c28a977bSCarlos Alberto Enciso  [002]     1         {Struct} 'Struct'
1470c28a977bSCarlos Alberto Enciso  [003]     5           {Member} public 'U' -> 'Union'
1471c28a977bSCarlos Alberto Enciso  [003]     2           {Union} 'Union'
1472c28a977bSCarlos Alberto Enciso  [004]     3             {Enumeration} 'NestedEnum' -> 'unsigned int'
1473c28a977bSCarlos Alberto Enciso  [005]                     {Enumerator} 'BLUE' = '0x1'
1474c28a977bSCarlos Alberto Enciso  [005]                     {Enumerator} 'RED' = '0x0'
1475c28a977bSCarlos Alberto Enciso
1476c28a977bSCarlos Alberto EncisoFrom the previous logical views, we can see that the DWARF debug
1477c28a977bSCarlos Alberto Encisoinformation generated by the Clang compiler does not include any
1478c28a977bSCarlos Alberto Encisoreferences to the enumerators **RED** and **BLUE**. The DWARF
1479c28a977bSCarlos Alberto Encisogenerated by GCC, CodeView generated by Clang and MSVC, they do
1480c28a977bSCarlos Alberto Encisoinclude such references.
1481c28a977bSCarlos Alberto Enciso
1482c28a977bSCarlos Alberto EncisoUsing the :program:`llvm-debuginfo-analyzer` selection facilities, we
1483c28a977bSCarlos Alberto Encisocan produce a logical view showing just the logical types that are
1484c28a977bSCarlos Alberto Enciso**Enumerator** and its parents. The logical view is sorted by the types
1485c28a977bSCarlos Alberto Encisoname.
1486c28a977bSCarlos Alberto Enciso
1487c28a977bSCarlos Alberto Enciso.. code-block:: none
1488c28a977bSCarlos Alberto Enciso
1489c28a977bSCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=format,level
1490c28a977bSCarlos Alberto Enciso                          --output-sort=name
1491c28a977bSCarlos Alberto Enciso                          --select-types=Enumerator
1492c28a977bSCarlos Alberto Enciso                          --report=parents
1493c28a977bSCarlos Alberto Enciso                          --print=types
1494c28a977bSCarlos Alberto Enciso                          pr-46466-*.o
1495c28a977bSCarlos Alberto Enciso
1496c28a977bSCarlos Alberto Enciso.. code-block:: none
1497c28a977bSCarlos Alberto Enciso
1498c28a977bSCarlos Alberto Enciso  Logical View:
1499c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-46466-codeview-clang.o' -> COFF-x86-64
1500c28a977bSCarlos Alberto Enciso
1501c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'pr-46466.cpp'
1502c28a977bSCarlos Alberto Enciso  [002]     1         {Struct} 'Struct'
1503c28a977bSCarlos Alberto Enciso  [003]     2           {Union} 'Union'
1504c28a977bSCarlos Alberto Enciso  [004]     3             {Enumeration} 'NestedEnum' -> 'int'
1505c28a977bSCarlos Alberto Enciso  [005]                     {Enumerator} 'BLUE' = '0x1'
1506c28a977bSCarlos Alberto Enciso  [005]                     {Enumerator} 'RED' = '0x0'
1507c28a977bSCarlos Alberto Enciso
1508c28a977bSCarlos Alberto Enciso  Logical View:
1509c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-46466-codeview-msvc.o' -> COFF-i386
1510c28a977bSCarlos Alberto Enciso
1511c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'pr-46466.cpp'
1512c28a977bSCarlos Alberto Enciso  [002]     1         {Struct} 'Struct'
1513c28a977bSCarlos Alberto Enciso  [003]     2           {Union} 'Union'
1514c28a977bSCarlos Alberto Enciso  [004]     3             {Enumeration} 'NestedEnum' -> 'int'
1515c28a977bSCarlos Alberto Enciso  [005]                     {Enumerator} 'BLUE' = '0x1'
1516c28a977bSCarlos Alberto Enciso  [005]                     {Enumerator} 'RED' = '0x0'
1517c28a977bSCarlos Alberto Enciso
1518c28a977bSCarlos Alberto Enciso  Logical View:
1519c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-46466-dwarf-clang.o' -> elf64-x86-64
1520c28a977bSCarlos Alberto Enciso
1521c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'pr-46466.cpp'
1522c28a977bSCarlos Alberto Enciso
1523c28a977bSCarlos Alberto Enciso  Logical View:
1524c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-46466-dwarf-gcc.o' -> elf64-x86-64
1525c28a977bSCarlos Alberto Enciso
1526c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'pr-46466.cpp'
1527c28a977bSCarlos Alberto Enciso  [002]     1         {Struct} 'Struct'
1528c28a977bSCarlos Alberto Enciso  [003]     2           {Union} 'Union'
1529c28a977bSCarlos Alberto Enciso  [004]     3             {Enumeration} 'NestedEnum' -> 'unsigned int'
1530c28a977bSCarlos Alberto Enciso  [005]                     {Enumerator} 'BLUE' = '0x1'
1531c28a977bSCarlos Alberto Enciso  [005]                     {Enumerator} 'RED' = '0x0'
1532c28a977bSCarlos Alberto Enciso
1533c28a977bSCarlos Alberto EncisoUsing the :program:`llvm-debuginfo-analyzer` selection facilities, we
1534c28a977bSCarlos Alberto Encisocan produce a simple tabular output including a summary for the logical
1535c28a977bSCarlos Alberto Encisotypes that are **Enumerator**. The logical view is sorted by the types
1536c28a977bSCarlos Alberto Encisoname.
1537c28a977bSCarlos Alberto Enciso
1538c28a977bSCarlos Alberto Enciso.. code-block:: none
1539c28a977bSCarlos Alberto Enciso
1540c28a977bSCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=format,level
1541c28a977bSCarlos Alberto Enciso                          --output-sort=name
1542c28a977bSCarlos Alberto Enciso                          --select-types=Enumerator
1543c28a977bSCarlos Alberto Enciso                          --print=types,summary
1544c28a977bSCarlos Alberto Enciso                          pr-46466-*.o
1545c28a977bSCarlos Alberto Enciso
1546c28a977bSCarlos Alberto Enciso.. code-block:: none
1547c28a977bSCarlos Alberto Enciso
1548c28a977bSCarlos Alberto Enciso  Logical View:
1549c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-46466-codeview-clang.o' -> COFF-x86-64
1550c28a977bSCarlos Alberto Enciso
1551c28a977bSCarlos Alberto Enciso  [001]           {CompileUnit} 'pr-46466.cpp'
1552c28a977bSCarlos Alberto Enciso  [005]           {Enumerator} 'BLUE' = '0x1'
1553c28a977bSCarlos Alberto Enciso  [005]           {Enumerator} 'RED' = '0x0'
1554c28a977bSCarlos Alberto Enciso
1555c28a977bSCarlos Alberto Enciso  -----------------------------
1556c28a977bSCarlos Alberto Enciso  Element      Total      Found
1557c28a977bSCarlos Alberto Enciso  -----------------------------
1558c28a977bSCarlos Alberto Enciso  Scopes           5          0
1559c28a977bSCarlos Alberto Enciso  Symbols          2          0
1560c28a977bSCarlos Alberto Enciso  Types            6          2
1561c28a977bSCarlos Alberto Enciso  Lines            0          0
1562c28a977bSCarlos Alberto Enciso  -----------------------------
1563c28a977bSCarlos Alberto Enciso  Total           13          2
1564c28a977bSCarlos Alberto Enciso
1565c28a977bSCarlos Alberto Enciso  Logical View:
1566c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-46466-codeview-msvc.o' -> COFF-i386
1567c28a977bSCarlos Alberto Enciso
1568c28a977bSCarlos Alberto Enciso  [001]           {CompileUnit} 'pr-46466.cpp'
1569c28a977bSCarlos Alberto Enciso  [005]           {Enumerator} 'BLUE' = '0x1'
1570c28a977bSCarlos Alberto Enciso  [005]           {Enumerator} 'RED' = '0x0'
1571c28a977bSCarlos Alberto Enciso
1572c28a977bSCarlos Alberto Enciso  -----------------------------
1573c28a977bSCarlos Alberto Enciso  Element      Total      Found
1574c28a977bSCarlos Alberto Enciso  -----------------------------
1575c28a977bSCarlos Alberto Enciso  Scopes           5          0
1576c28a977bSCarlos Alberto Enciso  Symbols          2          0
1577c28a977bSCarlos Alberto Enciso  Types            7          2
1578c28a977bSCarlos Alberto Enciso  Lines            0          0
1579c28a977bSCarlos Alberto Enciso  -----------------------------
1580c28a977bSCarlos Alberto Enciso  Total           14          2
1581c28a977bSCarlos Alberto Enciso
1582c28a977bSCarlos Alberto Enciso  Logical View:
1583c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-46466-dwarf-clang.o' -> elf64-x86-64
1584c28a977bSCarlos Alberto Enciso
1585c28a977bSCarlos Alberto Enciso  [001]           {CompileUnit} 'pr-46466.cpp'
1586c28a977bSCarlos Alberto Enciso
1587c28a977bSCarlos Alberto Enciso  -----------------------------
1588c28a977bSCarlos Alberto Enciso  Element      Total      Found
1589c28a977bSCarlos Alberto Enciso  -----------------------------
1590c28a977bSCarlos Alberto Enciso  Scopes           4          0
1591c28a977bSCarlos Alberto Enciso  Symbols          0          0
1592c28a977bSCarlos Alberto Enciso  Types            0          0
1593c28a977bSCarlos Alberto Enciso  Lines            0          0
1594c28a977bSCarlos Alberto Enciso  -----------------------------
1595c28a977bSCarlos Alberto Enciso  Total            4          0
1596c28a977bSCarlos Alberto Enciso
1597c28a977bSCarlos Alberto Enciso  Logical View:
1598c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-46466-dwarf-gcc.o' -> elf64-x86-64
1599c28a977bSCarlos Alberto Enciso
1600c28a977bSCarlos Alberto Enciso  [001]           {CompileUnit} 'pr-46466.cpp'
1601c28a977bSCarlos Alberto Enciso  [005]           {Enumerator} 'BLUE' = '0x1'
1602c28a977bSCarlos Alberto Enciso  [005]           {Enumerator} 'RED' = '0x0'
1603c28a977bSCarlos Alberto Enciso
1604c28a977bSCarlos Alberto Enciso  -----------------------------
1605c28a977bSCarlos Alberto Enciso  Element      Total      Found
1606c28a977bSCarlos Alberto Enciso  -----------------------------
1607c28a977bSCarlos Alberto Enciso  Scopes           5          0
1608c28a977bSCarlos Alberto Enciso  Symbols          0          0
1609c28a977bSCarlos Alberto Enciso  Types            2          2
1610c28a977bSCarlos Alberto Enciso  Lines            0          0
1611c28a977bSCarlos Alberto Enciso  -----------------------------
1612c28a977bSCarlos Alberto Enciso  Total            7          2
1613c28a977bSCarlos Alberto Enciso
1614c28a977bSCarlos Alberto EncisoFrom the values printed under the **Found** column, we can see that no
1615c28a977bSCarlos Alberto Enciso**Types** were found in the DWARF debug information generated by Clang.
1616c28a977bSCarlos Alberto Enciso
1617c28a977bSCarlos Alberto EncisoTEST CASE 5 - INCORRECT LEXICAL SCOPE FOR VARIABLE
1618c28a977bSCarlos Alberto Enciso~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1619c28a977bSCarlos Alberto EncisoThe below example is used to show different output generated by
1620c28a977bSCarlos Alberto Enciso:program:`llvm-debuginfo-analyzer`. We compiled the example for an X86
1621c28a977bSCarlos Alberto EncisoCodeview and ELF targets with recent versions of Clang, GCC and MSVC
1622c28a977bSCarlos Alberto Enciso(-O0 -g).
1623c28a977bSCarlos Alberto Enciso
1624c28a977bSCarlos Alberto Enciso.. code-block:: c++
1625c28a977bSCarlos Alberto Enciso
1626c28a977bSCarlos Alberto Enciso  // definitions.h
1627c28a977bSCarlos Alberto Enciso  #ifdef _MSC_VER
1628c28a977bSCarlos Alberto Enciso    #define forceinline __forceinline
1629c28a977bSCarlos Alberto Enciso  #elif defined(__clang__)
1630c28a977bSCarlos Alberto Enciso    #if __has_attribute(__always_inline__)
1631c28a977bSCarlos Alberto Enciso      #define forceinline inline __attribute__((__always_inline__))
1632c28a977bSCarlos Alberto Enciso    #else
1633c28a977bSCarlos Alberto Enciso      #define forceinline inline
1634c28a977bSCarlos Alberto Enciso    #endif
1635c28a977bSCarlos Alberto Enciso  #elif defined(__GNUC__)
1636c28a977bSCarlos Alberto Enciso    #define forceinline inline __attribute__((__always_inline__))
1637c28a977bSCarlos Alberto Enciso  #else
1638c28a977bSCarlos Alberto Enciso    #define forceinline inline
1639c28a977bSCarlos Alberto Enciso    #error
1640c28a977bSCarlos Alberto Enciso  #endif
1641c28a977bSCarlos Alberto Enciso
1642c28a977bSCarlos Alberto EncisoAs the test is dependent on inline compiler options, the above header
1643c28a977bSCarlos Alberto Encisofile defines *forceinline*.
1644c28a977bSCarlos Alberto Enciso
1645c28a977bSCarlos Alberto Enciso.. code-block:: c++
1646c28a977bSCarlos Alberto Enciso
1647c28a977bSCarlos Alberto Enciso   #include "definitions.h"
1648c28a977bSCarlos Alberto Enciso
1649c28a977bSCarlos Alberto Enciso.. code-block:: c++
1650c28a977bSCarlos Alberto Enciso
1651c28a977bSCarlos Alberto Enciso   1  #include "definitions.h"
1652c28a977bSCarlos Alberto Enciso   2  forceinline int InlineFunction(int Param) {
1653c28a977bSCarlos Alberto Enciso   3    int Var_1 = Param;
1654c28a977bSCarlos Alberto Enciso   4    {
1655c28a977bSCarlos Alberto Enciso   5      int Var_2 = Param + Var_1;
1656c28a977bSCarlos Alberto Enciso   6      Var_1 = Var_2;
1657c28a977bSCarlos Alberto Enciso   7    }
1658c28a977bSCarlos Alberto Enciso   8    return Var_1;
1659c28a977bSCarlos Alberto Enciso   9  }
1660c28a977bSCarlos Alberto Enciso  10
1661c28a977bSCarlos Alberto Enciso  11  int test(int Param_1, int Param_2) {
1662c28a977bSCarlos Alberto Enciso  12    int A = Param_1;
1663c28a977bSCarlos Alberto Enciso  13    A += InlineFunction(Param_2);
1664c28a977bSCarlos Alberto Enciso  14    return A;
1665c28a977bSCarlos Alberto Enciso  15  }
1666c28a977bSCarlos Alberto Enciso
1667c28a977bSCarlos Alberto EncisoThe above test is used to illustrate a variable issue found in the Clang
1668c28a977bSCarlos Alberto Encisocompiler:
1669c28a977bSCarlos Alberto Enciso`PR43860 (Bugs LLVM) <https://bugs.llvm.org/show_bug.cgi?id=43860>`_ /
1670c28a977bSCarlos Alberto Enciso`PR43205 (GitHub) <https://github.com/llvm/llvm-project/issues/43205>`_
1671c28a977bSCarlos Alberto Enciso
1672c28a977bSCarlos Alberto EncisoThese are the logical views that :program:`llvm-debuginfo-analyzer`
1673c28a977bSCarlos Alberto Encisogenerates for 3 different compilers (MSVC, Clang and GCC), emitting
1674c28a977bSCarlos Alberto Encisodifferent debug information formats (CodeView, DWARF) on different
1675c28a977bSCarlos Alberto Encisoplatforms.
1676c28a977bSCarlos Alberto Enciso
1677c28a977bSCarlos Alberto Enciso.. code-block:: none
1678c28a977bSCarlos Alberto Enciso
1679c28a977bSCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=level,format,producer
1680c28a977bSCarlos Alberto Enciso                          --output-sort=name
1681c28a977bSCarlos Alberto Enciso                          --print=symbols
1682c28a977bSCarlos Alberto Enciso                          pr-43860-codeview-clang.o
1683c28a977bSCarlos Alberto Enciso                          pr-43860-codeview-msvc.o
1684c28a977bSCarlos Alberto Enciso                          pr-43860-dwarf-clang.o
1685c28a977bSCarlos Alberto Enciso                          pr-43860-dwarf-gcc.o
1686c28a977bSCarlos Alberto Enciso
1687c28a977bSCarlos Alberto EncisoCODEVIEW - Clang (Windows)
1688c28a977bSCarlos Alberto Enciso^^^^^^^^^^^^^^^^^^^^^^^^^^
1689c28a977bSCarlos Alberto Enciso
1690c28a977bSCarlos Alberto Enciso.. code-block:: none
1691c28a977bSCarlos Alberto Enciso
1692c28a977bSCarlos Alberto Enciso  Logical View:
1693c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-43860-codeview-clang.o' -> COFF-x86-64
1694c28a977bSCarlos Alberto Enciso
1695c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'pr-43860.cpp'
1696c28a977bSCarlos Alberto Enciso  [002]               {Producer} 'clang version 14.0.0'
1697c28a977bSCarlos Alberto Enciso  [002]     2         {Function} inlined 'InlineFunction' -> 'int'
1698c28a977bSCarlos Alberto Enciso  [003]                 {Parameter} '' -> 'int'
1699c28a977bSCarlos Alberto Enciso  [002]               {Function} extern not_inlined 'test' -> 'int'
1700c28a977bSCarlos Alberto Enciso  [003]                 {Variable} 'A' -> 'int'
1701c28a977bSCarlos Alberto Enciso  [003]                 {InlinedFunction} inlined 'InlineFunction' -> 'int'
1702c28a977bSCarlos Alberto Enciso  [004]                   {Parameter} 'Param' -> 'int'
1703c28a977bSCarlos Alberto Enciso  [004]                   {Variable} 'Var_1' -> 'int'
1704c28a977bSCarlos Alberto Enciso  [004]                   {Variable} 'Var_2' -> 'int'
1705c28a977bSCarlos Alberto Enciso  [003]                 {Parameter} 'Param_1' -> 'int'
1706c28a977bSCarlos Alberto Enciso  [003]                 {Parameter} 'Param_2' -> 'int'
1707c28a977bSCarlos Alberto Enciso
1708c28a977bSCarlos Alberto EncisoCODEVIEW - MSVC (Windows)
1709c28a977bSCarlos Alberto Enciso^^^^^^^^^^^^^^^^^^^^^^^^^
1710c28a977bSCarlos Alberto Enciso
1711c28a977bSCarlos Alberto Enciso.. code-block:: none
1712c28a977bSCarlos Alberto Enciso
1713c28a977bSCarlos Alberto Enciso  Logical View:
1714c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-43860-codeview-msvc.o' -> COFF-i386
1715c28a977bSCarlos Alberto Enciso
1716c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'pr-43860.cpp'
1717c28a977bSCarlos Alberto Enciso  [002]               {Producer} 'Microsoft (R) Optimizing Compiler'
1718c28a977bSCarlos Alberto Enciso  [002]               {Function} extern not_inlined 'InlineFunction' -> 'int'
1719c28a977bSCarlos Alberto Enciso  [003]                 {Block}
1720c28a977bSCarlos Alberto Enciso  [004]                   {Variable} 'Var_2' -> 'int'
1721c28a977bSCarlos Alberto Enciso  [003]                 {Variable} 'Param' -> 'int'
1722c28a977bSCarlos Alberto Enciso  [003]                 {Variable} 'Var_1' -> 'int'
1723c28a977bSCarlos Alberto Enciso  [002]               {Function} extern not_inlined 'test' -> 'int'
1724c28a977bSCarlos Alberto Enciso  [003]                 {Variable} 'A' -> 'int'
1725c28a977bSCarlos Alberto Enciso  [003]                 {Variable} 'Param_1' -> 'int'
1726c28a977bSCarlos Alberto Enciso  [003]                 {Variable} 'Param_2' -> 'int'
1727c28a977bSCarlos Alberto Enciso
1728c28a977bSCarlos Alberto EncisoDWARF - Clang (Linux)
1729c28a977bSCarlos Alberto Enciso^^^^^^^^^^^^^^^^^^^^^
1730c28a977bSCarlos Alberto Enciso
1731c28a977bSCarlos Alberto Enciso.. code-block:: none
1732c28a977bSCarlos Alberto Enciso
1733c28a977bSCarlos Alberto Enciso  Logical View:
1734c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-43860-dwarf-clang.o' -> elf64-x86-64
1735c28a977bSCarlos Alberto Enciso
1736c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'pr-43860.cpp'
1737c28a977bSCarlos Alberto Enciso  [002]               {Producer} 'clang version 14.0.0'
1738c28a977bSCarlos Alberto Enciso  [002]     2         {Function} extern inlined 'InlineFunction' -> 'int'
1739c28a977bSCarlos Alberto Enciso  [003]                 {Block}
1740c28a977bSCarlos Alberto Enciso  [004]     5             {Variable} 'Var_2' -> 'int'
1741c28a977bSCarlos Alberto Enciso  [003]     2           {Parameter} 'Param' -> 'int'
1742c28a977bSCarlos Alberto Enciso  [003]     3           {Variable} 'Var_1' -> 'int'
1743c28a977bSCarlos Alberto Enciso  [002]    11         {Function} extern not_inlined 'test' -> 'int'
1744c28a977bSCarlos Alberto Enciso  [003]    12           {Variable} 'A' -> 'int'
1745*5e7662efSCarlos Alberto Enciso  [003]    13           {InlinedFunction} inlined 'InlineFunction' -> 'int'
1746c28a977bSCarlos Alberto Enciso  [004]                   {Block}
1747c28a977bSCarlos Alberto Enciso  [005]                     {Variable} 'Var_2' -> 'int'
1748c28a977bSCarlos Alberto Enciso  [004]                   {Parameter} 'Param' -> 'int'
1749c28a977bSCarlos Alberto Enciso  [004]                   {Variable} 'Var_1' -> 'int'
1750c28a977bSCarlos Alberto Enciso  [003]    11           {Parameter} 'Param_1' -> 'int'
1751c28a977bSCarlos Alberto Enciso  [003]    11           {Parameter} 'Param_2' -> 'int'
1752c28a977bSCarlos Alberto Enciso
1753c28a977bSCarlos Alberto EncisoDWARF - GCC (Linux)
1754c28a977bSCarlos Alberto Enciso^^^^^^^^^^^^^^^^^^^
1755c28a977bSCarlos Alberto Enciso
1756c28a977bSCarlos Alberto Enciso.. code-block:: none
1757c28a977bSCarlos Alberto Enciso
1758c28a977bSCarlos Alberto Enciso  Logical View:
1759c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-43860-dwarf-gcc.o' -> elf64-x86-64
1760c28a977bSCarlos Alberto Enciso
1761c28a977bSCarlos Alberto Enciso  [001]             {CompileUnit} 'pr-43860.cpp'
1762c28a977bSCarlos Alberto Enciso  [002]               {Producer} 'GNU C++14 9.3.0'
1763c28a977bSCarlos Alberto Enciso  [002]     2         {Function} extern declared_inlined 'InlineFunction' -> 'int'
1764c28a977bSCarlos Alberto Enciso  [003]                 {Block}
1765c28a977bSCarlos Alberto Enciso  [004]     5             {Variable} 'Var_2' -> 'int'
1766c28a977bSCarlos Alberto Enciso  [003]     2           {Parameter} 'Param' -> 'int'
1767c28a977bSCarlos Alberto Enciso  [003]     3           {Variable} 'Var_1' -> 'int'
1768c28a977bSCarlos Alberto Enciso  [002]    11         {Function} extern not_inlined 'test' -> 'int'
1769c28a977bSCarlos Alberto Enciso  [003]    12           {Variable} 'A' -> 'int'
1770c28a977bSCarlos Alberto Enciso  [003]    13           {InlinedFunction} declared_inlined 'InlineFunction' -> 'int'
1771c28a977bSCarlos Alberto Enciso  [004]                   {Block}
1772c28a977bSCarlos Alberto Enciso  [005]                     {Variable} 'Var_2' -> 'int'
1773c28a977bSCarlos Alberto Enciso  [004]                   {Parameter} 'Param' -> 'int'
1774c28a977bSCarlos Alberto Enciso  [004]                   {Variable} 'Var_1' -> 'int'
1775c28a977bSCarlos Alberto Enciso  [003]    11           {Parameter} 'Param_1' -> 'int'
1776c28a977bSCarlos Alberto Enciso  [003]    11           {Parameter} 'Param_2' -> 'int'
1777c28a977bSCarlos Alberto Enciso
1778c28a977bSCarlos Alberto EncisoFrom the previous logical views, we can see that the CodeView debug
1779c28a977bSCarlos Alberto Encisoinformation generated by the Clang compiler shows the variables **Var_1**
1780c28a977bSCarlos Alberto Encisoand **Var_2** are at the same lexical scope (**4**) in the function
1781c28a977bSCarlos Alberto Enciso**InlineFuction**. The DWARF generated by GCC/Clang and CodeView
1782c28a977bSCarlos Alberto Encisogenerated by MSVC, show those variables at the correct lexical scope:
1783c28a977bSCarlos Alberto Enciso**3** and **4** respectively.
1784c28a977bSCarlos Alberto Enciso
1785c28a977bSCarlos Alberto EncisoUsing the :program:`llvm-debuginfo-analyzer` selection facilities, we
1786c28a977bSCarlos Alberto Encisocan produce a simple tabular output showing just the logical elements
1787c28a977bSCarlos Alberto Encisothat have in their name the *var* pattern. The logical view is sorted
1788c28a977bSCarlos Alberto Encisoby the variables name.
1789c28a977bSCarlos Alberto Enciso
1790c28a977bSCarlos Alberto Enciso.. code-block:: none
1791c28a977bSCarlos Alberto Enciso
1792c28a977bSCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=level,format
1793c28a977bSCarlos Alberto Enciso                          --output-sort=name
1794c28a977bSCarlos Alberto Enciso                          --select-regex --select-nocase --select=Var
1795c28a977bSCarlos Alberto Enciso                          --report=list
1796c28a977bSCarlos Alberto Enciso                          --print=symbols
1797c28a977bSCarlos Alberto Enciso                          pr-43860-*.o
1798c28a977bSCarlos Alberto Enciso
1799c28a977bSCarlos Alberto Enciso.. code-block:: none
1800c28a977bSCarlos Alberto Enciso
1801c28a977bSCarlos Alberto Enciso  Logical View:
1802c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-43860-codeview-clang.o' -> COFF-x86-64
1803c28a977bSCarlos Alberto Enciso
1804c28a977bSCarlos Alberto Enciso  [001]           {CompileUnit} 'pr-43860.cpp'
1805c28a977bSCarlos Alberto Enciso  [004]           {Variable} 'Var_1' -> 'int'
1806c28a977bSCarlos Alberto Enciso  [004]           {Variable} 'Var_2' -> 'int'
1807c28a977bSCarlos Alberto Enciso
1808c28a977bSCarlos Alberto Enciso  Logical View:
1809c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-43860-codeview-msvc.o' -> COFF-i386
1810c28a977bSCarlos Alberto Enciso
1811c28a977bSCarlos Alberto Enciso  [001]           {CompileUnit} 'pr-43860.cpp'
1812c28a977bSCarlos Alberto Enciso  [003]           {Variable} 'Var_1' -> 'int'
1813c28a977bSCarlos Alberto Enciso  [004]           {Variable} 'Var_2' -> 'int'
1814c28a977bSCarlos Alberto Enciso
1815c28a977bSCarlos Alberto Enciso  Logical View:
1816c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-43860-dwarf-clang.o' -> elf64-x86-64
1817c28a977bSCarlos Alberto Enciso
1818c28a977bSCarlos Alberto Enciso  [001]           {CompileUnit} 'pr-43860.cpp'
1819c28a977bSCarlos Alberto Enciso  [004]           {Variable} 'Var_1' -> 'int'
1820c28a977bSCarlos Alberto Enciso  [003]     3     {Variable} 'Var_1' -> 'int'
1821c28a977bSCarlos Alberto Enciso  [005]           {Variable} 'Var_2' -> 'int'
1822c28a977bSCarlos Alberto Enciso  [004]     5     {Variable} 'Var_2' -> 'int'
1823c28a977bSCarlos Alberto Enciso
1824c28a977bSCarlos Alberto Enciso  Logical View:
1825c28a977bSCarlos Alberto Enciso  [000]           {File} 'pr-43860-dwarf-gcc.o' -> elf64-x86-64
1826c28a977bSCarlos Alberto Enciso
1827c28a977bSCarlos Alberto Enciso  [001]           {CompileUnit} 'pr-43860.cpp'
1828c28a977bSCarlos Alberto Enciso  [004]           {Variable} 'Var_1' -> 'int'
1829c28a977bSCarlos Alberto Enciso  [003]     3     {Variable} 'Var_1' -> 'int'
1830c28a977bSCarlos Alberto Enciso  [005]           {Variable} 'Var_2' -> 'int'
1831c28a977bSCarlos Alberto Enciso  [004]     5     {Variable} 'Var_2' -> 'int'
1832c28a977bSCarlos Alberto Enciso
1833c28a977bSCarlos Alberto EncisoIt also shows, that the CodeView debug information does not generate
1834c28a977bSCarlos Alberto Encisosource code line numbers for the those logical symbols. The logical
1835c28a977bSCarlos Alberto Encisoview is sorted by the types name.
1836c28a977bSCarlos Alberto Enciso
1837c28a977bSCarlos Alberto EncisoTEST CASE 6 - FULL LOGICAL VIEW
1838c28a977bSCarlos Alberto Enciso~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1839c28a977bSCarlos Alberto EncisoFor advanced users, :program:`llvm-debuginfo-analyzer` can display low
1840c28a977bSCarlos Alberto Encisolevel information that includes offsets within the debug information
1841c28a977bSCarlos Alberto Encisosection, debug location operands, linkage names, etc.
1842c28a977bSCarlos Alberto Enciso
1843c28a977bSCarlos Alberto Enciso.. code-block:: none
1844c28a977bSCarlos Alberto Enciso
1845c28a977bSCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=all
1846c28a977bSCarlos Alberto Enciso                          --print=all
1847c28a977bSCarlos Alberto Enciso                          test-dwarf-clang.o
1848c28a977bSCarlos Alberto Enciso
1849c28a977bSCarlos Alberto Enciso  Logical View:
1850c28a977bSCarlos Alberto Enciso  [0x0000000000][000]            {File} 'test-dwarf-clang.o' -> elf64-x86-64
1851c28a977bSCarlos Alberto Enciso
1852c28a977bSCarlos Alberto Enciso  [0x000000000b][001]              {CompileUnit} 'test.cpp'
1853c28a977bSCarlos Alberto Enciso  [0x000000000b][002]                {Producer} 'clang version 12.0.0'
1854c28a977bSCarlos Alberto Enciso                                     {Directory} ''
1855c28a977bSCarlos Alberto Enciso                                     {File} 'test.cpp'
1856c28a977bSCarlos Alberto Enciso                                     {Public} 'foo' [0x0000000000:0x000000003a]
1857c28a977bSCarlos Alberto Enciso  [0x000000000b][002]                {Range} Lines 2:9 [0x0000000000:0x000000003a]
1858c28a977bSCarlos Alberto Enciso  [0x00000000bc][002]                {BaseType} 'bool'
1859c28a977bSCarlos Alberto Enciso  [0x0000000099][002]                {BaseType} 'int'
1860c28a977bSCarlos Alberto Enciso  [0x00000000b5][002]                {BaseType} 'unsigned int'
1861c28a977bSCarlos Alberto Enciso
1862c28a977bSCarlos Alberto Enciso  [0x00000000a0][002]   {Source} '/test.cpp'
1863c28a977bSCarlos Alberto Enciso  [0x00000000a0][002]      1         {TypeAlias} 'INTPTR' -> [0x00000000ab]'* const int'
1864c28a977bSCarlos Alberto Enciso  [0x000000002a][002]      2         {Function} extern not_inlined 'foo' -> [0x0000000099]'int'
1865c28a977bSCarlos Alberto Enciso  [0x000000002a][003]                  {Range} Lines 2:9 [0x0000000000:0x000000003a]
1866c28a977bSCarlos Alberto Enciso  [0x000000002a][003]                  {Linkage}  0x2 '_Z3fooPKijb'
1867c28a977bSCarlos Alberto Enciso  [0x0000000071][003]                  {Block}
1868c28a977bSCarlos Alberto Enciso  [0x0000000071][004]                    {Range} Lines 5:8 [0x000000001c:0x000000002f]
1869c28a977bSCarlos Alberto Enciso  [0x000000007e][004]      5             {Variable} 'CONSTANT' -> [0x00000000c3]'const INTEGER'
1870c28a977bSCarlos Alberto Enciso  [0x000000007e][005]                      {Coverage} 100.00%
1871c28a977bSCarlos Alberto Enciso  [0x000000007f][005]                      {Location}
1872c28a977bSCarlos Alberto Enciso  [0x000000007f][006]                        {Entry} Stack Offset: -28 (0xffffffffffffffe4) [DW_OP_fbreg]
1873c28a977bSCarlos Alberto Enciso  [0x000000001c][004]      5             {Line} {NewStatement} '/test.cpp'
1874c28a977bSCarlos Alberto Enciso  [0x000000001c][004]                    {Code} 'movl	$0x7, -0x1c(%rbp)'
1875c28a977bSCarlos Alberto Enciso  [0x0000000023][004]      6             {Line} {NewStatement} '/test.cpp'
1876c28a977bSCarlos Alberto Enciso  [0x0000000023][004]                    {Code} 'movl	$0x7, -0x4(%rbp)'
1877c28a977bSCarlos Alberto Enciso  [0x000000002a][004]                    {Code} 'jmp	0x6'
1878c28a977bSCarlos Alberto Enciso  [0x000000002f][004]      8             {Line} {NewStatement} '/test.cpp'
1879c28a977bSCarlos Alberto Enciso  [0x000000002f][004]                    {Code} 'movl	-0x14(%rbp), %eax'
1880c28a977bSCarlos Alberto Enciso  [0x0000000063][003]      2           {Parameter} 'ParamBool' -> [0x00000000bc]'bool'
1881c28a977bSCarlos Alberto Enciso  [0x0000000063][004]                    {Coverage} 100.00%
1882c28a977bSCarlos Alberto Enciso  [0x0000000064][004]                    {Location}
1883c28a977bSCarlos Alberto Enciso  [0x0000000064][005]                      {Entry} Stack Offset: -21 (0xffffffffffffffeb) [DW_OP_fbreg]
1884c28a977bSCarlos Alberto Enciso  [0x0000000047][003]      2           {Parameter} 'ParamPtr' -> [0x00000000a0]'INTPTR'
1885c28a977bSCarlos Alberto Enciso  [0x0000000047][004]                    {Coverage} 100.00%
1886c28a977bSCarlos Alberto Enciso  [0x0000000048][004]                    {Location}
1887c28a977bSCarlos Alberto Enciso  [0x0000000048][005]                      {Entry} Stack Offset: -16 (0xfffffffffffffff0) [DW_OP_fbreg]
1888c28a977bSCarlos Alberto Enciso  [0x0000000055][003]      2           {Parameter} 'ParamUnsigned' -> [0x00000000b5]'unsigned int'
1889c28a977bSCarlos Alberto Enciso  [0x0000000055][004]                    {Coverage} 100.00%
1890c28a977bSCarlos Alberto Enciso  [0x0000000056][004]                    {Location}
1891c28a977bSCarlos Alberto Enciso  [0x0000000056][005]                      {Entry} Stack Offset: -20 (0xffffffffffffffec) [DW_OP_fbreg]
1892c28a977bSCarlos Alberto Enciso  [0x000000008d][003]      4           {TypeAlias} 'INTEGER' -> [0x0000000099]'int'
1893c28a977bSCarlos Alberto Enciso  [0x0000000000][003]      2           {Line} {NewStatement} '/test.cpp'
1894c28a977bSCarlos Alberto Enciso  [0x0000000000][003]                  {Code} 'pushq	%rbp'
1895c28a977bSCarlos Alberto Enciso  [0x0000000001][003]                  {Code} 'movq	%rsp, %rbp'
1896c28a977bSCarlos Alberto Enciso  [0x0000000004][003]                  {Code} 'movb	%dl, %al'
1897c28a977bSCarlos Alberto Enciso  [0x0000000006][003]                  {Code} 'movq	%rdi, -0x10(%rbp)'
1898c28a977bSCarlos Alberto Enciso  [0x000000000a][003]                  {Code} 'movl	%esi, -0x14(%rbp)'
1899c28a977bSCarlos Alberto Enciso  [0x000000000d][003]                  {Code} 'andb	$0x1, %al'
1900c28a977bSCarlos Alberto Enciso  [0x000000000f][003]                  {Code} 'movb	%al, -0x15(%rbp)'
1901c28a977bSCarlos Alberto Enciso  [0x0000000012][003]      3           {Line} {NewStatement} {PrologueEnd} '/test.cpp'
1902c28a977bSCarlos Alberto Enciso  [0x0000000012][003]                  {Code} 'testb	$0x1, -0x15(%rbp)'
1903c28a977bSCarlos Alberto Enciso  [0x0000000016][003]                  {Code} 'je	0x13'
1904c28a977bSCarlos Alberto Enciso  [0x0000000032][003]      8           {Line} '/test.cpp'
1905c28a977bSCarlos Alberto Enciso  [0x0000000032][003]                  {Code} 'movl	%eax, -0x4(%rbp)'
1906c28a977bSCarlos Alberto Enciso  [0x0000000035][003]      9           {Line} {NewStatement} '/test.cpp'
1907c28a977bSCarlos Alberto Enciso  [0x0000000035][003]                  {Code} 'movl	-0x4(%rbp), %eax'
1908c28a977bSCarlos Alberto Enciso  [0x0000000038][003]                  {Code} 'popq	%rbp'
1909c28a977bSCarlos Alberto Enciso  [0x0000000039][003]                  {Code} 'retq'
1910c28a977bSCarlos Alberto Enciso  [0x000000003a][003]      9           {Line} {NewStatement} {EndSequence} '/test.cpp'
1911c28a977bSCarlos Alberto Enciso
1912c28a977bSCarlos Alberto Enciso  -----------------------------
1913c28a977bSCarlos Alberto Enciso  Element      Total    Printed
1914c28a977bSCarlos Alberto Enciso  -----------------------------
1915c28a977bSCarlos Alberto Enciso  Scopes           3          3
1916c28a977bSCarlos Alberto Enciso  Symbols          4          4
1917c28a977bSCarlos Alberto Enciso  Types            5          5
1918c28a977bSCarlos Alberto Enciso  Lines           25         25
1919c28a977bSCarlos Alberto Enciso  -----------------------------
1920c28a977bSCarlos Alberto Enciso  Total           37         37
1921c28a977bSCarlos Alberto Enciso
1922c28a977bSCarlos Alberto Enciso  Scope Sizes:
1923c28a977bSCarlos Alberto Enciso         189 (100.00%) : [0x000000000b][001]              {CompileUnit} 'test.cpp'
1924c28a977bSCarlos Alberto Enciso         110 ( 58.20%) : [0x000000002a][002]      2         {Function} extern not_inlined 'foo' -> [0x0000000099]'int'
1925c28a977bSCarlos Alberto Enciso          27 ( 14.29%) : [0x0000000071][003]                  {Block}
1926c28a977bSCarlos Alberto Enciso
1927c28a977bSCarlos Alberto Enciso  Totals by lexical level:
1928c28a977bSCarlos Alberto Enciso  [001]:        189 (100.00%)
1929c28a977bSCarlos Alberto Enciso  [002]:        110 ( 58.20%)
1930c28a977bSCarlos Alberto Enciso  [003]:         27 ( 14.29%)
1931c28a977bSCarlos Alberto Enciso
1932c28a977bSCarlos Alberto EncisoThe **Scope Sizes** table shows the contribution in bytes to the debug
1933c28a977bSCarlos Alberto Encisoinformation by each scope, which can be used to determine unexpected
1934c28a977bSCarlos Alberto Encisosize changes in the DWARF sections between different versions of the
1935c28a977bSCarlos Alberto Encisosame toolchain.
1936c28a977bSCarlos Alberto Enciso
1937c28a977bSCarlos Alberto Enciso.. code-block:: none
1938c28a977bSCarlos Alberto Enciso
1939c28a977bSCarlos Alberto Enciso  [0x000000002a][002]      2         {Function} extern not_inlined 'foo' -> [0x0000000099]'int'
1940c28a977bSCarlos Alberto Enciso  [0x000000002a][003]                  {Range} Lines 2:9 [0x0000000000:0x000000003a]
1941c28a977bSCarlos Alberto Enciso  [0x000000002a][003]                  {Linkage}  0x2 '_Z3fooPKijb'
1942c28a977bSCarlos Alberto Enciso  [0x0000000071][003]                  {Block}
1943c28a977bSCarlos Alberto Enciso  [0x0000000071][004]                    {Range} Lines 5:8 [0x000000001c:0x000000002f]
1944c28a977bSCarlos Alberto Enciso  [0x000000007e][004]      5             {Variable} 'CONSTANT' -> [0x00000000c3]'const INTEGER'
1945c28a977bSCarlos Alberto Enciso  [0x000000007e][005]                      {Coverage} 100.00%
1946c28a977bSCarlos Alberto Enciso  [0x000000007f][005]                      {Location}
1947c28a977bSCarlos Alberto Enciso  [0x000000007f][006]                        {Entry} Stack Offset: -28 (0xffffffffffffffe4) [DW_OP_fbreg]
1948c28a977bSCarlos Alberto Enciso
1949c28a977bSCarlos Alberto EncisoThe **{Range}** attribute describe the line ranges for a logical scope.
1950c28a977bSCarlos Alberto EncisoFor this case, the function **foo** is within the lines **2** and **9**.
1951c28a977bSCarlos Alberto Enciso
1952c28a977bSCarlos Alberto EncisoThe **{Coverage}** and **{Location}** attributes describe the debug
1953c28a977bSCarlos Alberto Encisolocation and coverage for logical symbols. For optimized code, the
1954c28a977bSCarlos Alberto Encisocoverage value decreases and it affects the program debuggability.
1955c28a977bSCarlos Alberto Enciso
1956b19cfb91SCarlos Alberto EncisoWEBASSEMBLY SUPPORT
1957b19cfb91SCarlos Alberto Enciso~~~~~~~~~~~~~~~~~~~
1958b19cfb91SCarlos Alberto EncisoThe below example is used to show the WebAssembly output generated by
1959b19cfb91SCarlos Alberto Enciso:program:`llvm-debuginfo-analyzer`. We compiled the example for a
1960b19cfb91SCarlos Alberto EncisoWebAssembly 32-bit target with Clang (-O0 -g --target=wasm32):
1961b19cfb91SCarlos Alberto Enciso
1962b19cfb91SCarlos Alberto Enciso.. code-block:: c++
1963b19cfb91SCarlos Alberto Enciso
1964b19cfb91SCarlos Alberto Enciso  1  using INTPTR = const int *;
1965b19cfb91SCarlos Alberto Enciso  2  int foo(INTPTR ParamPtr, unsigned ParamUnsigned, bool ParamBool) {
1966b19cfb91SCarlos Alberto Enciso  3    if (ParamBool) {
1967b19cfb91SCarlos Alberto Enciso  4      typedef int INTEGER;
1968b19cfb91SCarlos Alberto Enciso  5      const INTEGER CONSTANT = 7;
1969b19cfb91SCarlos Alberto Enciso  6      return CONSTANT;
1970b19cfb91SCarlos Alberto Enciso  7    }
1971b19cfb91SCarlos Alberto Enciso  8    return ParamUnsigned;
1972b19cfb91SCarlos Alberto Enciso  9  }
1973b19cfb91SCarlos Alberto Enciso
1974b19cfb91SCarlos Alberto EncisoPRINT BASIC DETAILS
1975b19cfb91SCarlos Alberto Enciso^^^^^^^^^^^^^^^^^^^
1976b19cfb91SCarlos Alberto EncisoThe following command prints basic details for all the logical elements
1977b19cfb91SCarlos Alberto Encisosorted by the debug information internal offset; it includes its lexical
1978b19cfb91SCarlos Alberto Encisolevel and debug info format.
1979b19cfb91SCarlos Alberto Enciso
1980b19cfb91SCarlos Alberto Enciso.. code-block:: none
1981b19cfb91SCarlos Alberto Enciso
1982b19cfb91SCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=level,format
1983b19cfb91SCarlos Alberto Enciso                          --output-sort=offset
1984b19cfb91SCarlos Alberto Enciso                          --print=scopes,symbols,types,lines,instructions
1985c8da9995SCarlos Alberto Enciso                          test-clang.o
1986b19cfb91SCarlos Alberto Enciso
1987b19cfb91SCarlos Alberto Encisoor
1988b19cfb91SCarlos Alberto Enciso
1989b19cfb91SCarlos Alberto Enciso.. code-block:: none
1990b19cfb91SCarlos Alberto Enciso
1991b19cfb91SCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=level,format
1992b19cfb91SCarlos Alberto Enciso                          --output-sort=offset
1993b19cfb91SCarlos Alberto Enciso                          --print=elements
1994c8da9995SCarlos Alberto Enciso                          test-clang.o
1995b19cfb91SCarlos Alberto Enciso
1996b19cfb91SCarlos Alberto EncisoEach row represents an element that is present within the debug
1997b19cfb91SCarlos Alberto Encisoinformation. The first column represents the scope level, followed by
1998b19cfb91SCarlos Alberto Encisothe associated line number (if any), and finally the description of
1999b19cfb91SCarlos Alberto Encisothe element.
2000b19cfb91SCarlos Alberto Enciso
2001b19cfb91SCarlos Alberto Enciso.. code-block:: none
2002b19cfb91SCarlos Alberto Enciso
2003b19cfb91SCarlos Alberto Enciso  Logical View:
2004c8da9995SCarlos Alberto Enciso  [000]           {File} 'test-clang.o' -> WASM
2005b19cfb91SCarlos Alberto Enciso
2006b19cfb91SCarlos Alberto Enciso  [001]             {CompileUnit} 'test.cpp'
2007b19cfb91SCarlos Alberto Enciso  [002]     2         {Function} extern not_inlined 'foo' -> 'int'
2008b19cfb91SCarlos Alberto Enciso  [003]     2           {Parameter} 'ParamPtr' -> 'INTPTR'
2009b19cfb91SCarlos Alberto Enciso  [003]     2           {Parameter} 'ParamUnsigned' -> 'unsigned int'
2010b19cfb91SCarlos Alberto Enciso  [003]     2           {Parameter} 'ParamBool' -> 'bool'
2011b19cfb91SCarlos Alberto Enciso  [003]                 {Block}
2012b19cfb91SCarlos Alberto Enciso  [004]     5             {Variable} 'CONSTANT' -> 'const INTEGER'
2013b19cfb91SCarlos Alberto Enciso  [004]     5             {Line}
2014b19cfb91SCarlos Alberto Enciso  [004]                   {Code} 'i32.const	7'
2015b19cfb91SCarlos Alberto Enciso  [004]                   {Code} 'local.set	10'
2016b19cfb91SCarlos Alberto Enciso  [004]                   {Code} 'local.get	5'
2017b19cfb91SCarlos Alberto Enciso  [004]                   {Code} 'local.get	10'
2018b19cfb91SCarlos Alberto Enciso  [004]                   {Code} 'i32.store	12'
2019b19cfb91SCarlos Alberto Enciso  [004]     6             {Line}
2020b19cfb91SCarlos Alberto Enciso  [004]                   {Code} 'i32.const	7'
2021b19cfb91SCarlos Alberto Enciso  [004]                   {Code} 'local.set	11'
2022b19cfb91SCarlos Alberto Enciso  [004]                   {Code} 'local.get	5'
2023b19cfb91SCarlos Alberto Enciso  [004]                   {Code} 'local.get	11'
2024b19cfb91SCarlos Alberto Enciso  [004]                   {Code} 'i32.store	28'
2025b19cfb91SCarlos Alberto Enciso  [004]                   {Code} 'br      	1'
2026b19cfb91SCarlos Alberto Enciso  [004]     -             {Line}
2027b19cfb91SCarlos Alberto Enciso  [004]                   {Code} 'end'
2028b19cfb91SCarlos Alberto Enciso  [003]     4           {TypeAlias} 'INTEGER' -> 'int'
2029b19cfb91SCarlos Alberto Enciso  [003]     2           {Line}
2030b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'nop'
2031b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'end'
2032b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'i64.div_s'
2033b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'global.get	0'
2034b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.set	3'
2035b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'i32.const	32'
2036b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.set	4'
2037b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.get	3'
2038b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.get	4'
2039b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'i32.sub'
2040b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.set	5'
2041b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.get	5'
2042b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.get	0'
2043b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'i32.store	24'
2044b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.get	5'
2045b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.get	1'
2046b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'i32.store	20'
2047b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.get	2'
2048b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.set	6'
2049b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.get	5'
2050b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.get	6'
2051b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'i32.store8	19'
2052b19cfb91SCarlos Alberto Enciso  [003]     3           {Line}
2053b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.get	5'
2054b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'i32.load8_u	19'
2055b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.set	7'
2056b19cfb91SCarlos Alberto Enciso  [003]     3           {Line}
2057b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'i32.const	1'
2058b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.set	8'
2059b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.get	7'
2060b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.get	8'
2061b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'i32.and'
2062b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.set	9'
2063b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'block'
2064b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'block'
2065b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.get	9'
2066b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'i32.eqz'
2067b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'br_if   	0'
2068b19cfb91SCarlos Alberto Enciso  [003]     8           {Line}
2069b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.get	5'
2070b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'i32.load	20'
2071b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.set	12'
2072b19cfb91SCarlos Alberto Enciso  [003]     8           {Line}
2073b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.get	5'
2074b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.get	12'
2075b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'i32.store	28'
2076b19cfb91SCarlos Alberto Enciso  [003]     -           {Line}
2077b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'end'
2078b19cfb91SCarlos Alberto Enciso  [003]     9           {Line}
2079b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.get	5'
2080b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'i32.load	28'
2081b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.set	13'
2082b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'local.get	13'
2083b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'return'
2084b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'end'
2085b19cfb91SCarlos Alberto Enciso  [003]     9           {Line}
2086b19cfb91SCarlos Alberto Enciso  [003]                 {Code} 'unreachable'
2087b19cfb91SCarlos Alberto Enciso  [002]     1         {TypeAlias} 'INTPTR' -> '* const int'
2088b19cfb91SCarlos Alberto Enciso
2089b19cfb91SCarlos Alberto EncisoSELECT LOGICAL ELEMENTS
2090b19cfb91SCarlos Alberto Enciso^^^^^^^^^^^^^^^^^^^^^^^
2091b19cfb91SCarlos Alberto EncisoThe following prints all *instructions*, *symbols* and *types* that
2092b19cfb91SCarlos Alberto Encisocontain **'block'** or **'.store'** in their names or types, using a tab
2093b19cfb91SCarlos Alberto Encisolayout and given the number of matches.
2094b19cfb91SCarlos Alberto Enciso
2095b19cfb91SCarlos Alberto Enciso.. code-block:: none
2096b19cfb91SCarlos Alberto Enciso
2097b19cfb91SCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=level
2098b19cfb91SCarlos Alberto Enciso                          --select-nocase --select-regex
2099b19cfb91SCarlos Alberto Enciso                          --select=BLOCK --select=.store
2100b19cfb91SCarlos Alberto Enciso                          --report=list
2101b19cfb91SCarlos Alberto Enciso                          --print=symbols,types,instructions,summary
2102c8da9995SCarlos Alberto Enciso                          test-clang.o
2103b19cfb91SCarlos Alberto Enciso
2104b19cfb91SCarlos Alberto Enciso  Logical View:
2105c8da9995SCarlos Alberto Enciso  [000]           {File} 'test-clang.o'
2106b19cfb91SCarlos Alberto Enciso
2107b19cfb91SCarlos Alberto Enciso  [001]           {CompileUnit} 'test.cpp'
2108b19cfb91SCarlos Alberto Enciso  [003]           {Code} 'block'
2109b19cfb91SCarlos Alberto Enciso  [003]           {Code} 'block'
2110b19cfb91SCarlos Alberto Enciso  [004]           {Code} 'i32.store	12'
2111b19cfb91SCarlos Alberto Enciso  [003]           {Code} 'i32.store	20'
2112b19cfb91SCarlos Alberto Enciso  [003]           {Code} 'i32.store	24'
2113b19cfb91SCarlos Alberto Enciso  [004]           {Code} 'i32.store	28'
2114b19cfb91SCarlos Alberto Enciso  [003]           {Code} 'i32.store	28'
2115b19cfb91SCarlos Alberto Enciso  [003]           {Code} 'i32.store8	19'
2116b19cfb91SCarlos Alberto Enciso
2117b19cfb91SCarlos Alberto Enciso  -----------------------------
2118b19cfb91SCarlos Alberto Enciso  Element      Total    Printed
2119b19cfb91SCarlos Alberto Enciso  -----------------------------
2120b19cfb91SCarlos Alberto Enciso  Scopes           3          0
2121b19cfb91SCarlos Alberto Enciso  Symbols          4          0
2122b19cfb91SCarlos Alberto Enciso  Types            2          0
2123b19cfb91SCarlos Alberto Enciso  Lines           62          8
2124b19cfb91SCarlos Alberto Enciso  -----------------------------
2125b19cfb91SCarlos Alberto Enciso  Total           71          8
2126b19cfb91SCarlos Alberto Enciso
2127b19cfb91SCarlos Alberto EncisoCOMPARISON MODE
2128b19cfb91SCarlos Alberto Enciso^^^^^^^^^^^^^^^
2129b19cfb91SCarlos Alberto EncisoGiven the previous example we found the above debug information issue
2130b19cfb91SCarlos Alberto Enciso(related to the previous invalid scope location for the **'typedef int
2131b19cfb91SCarlos Alberto EncisoINTEGER'**) by comparing against another compiler.
2132b19cfb91SCarlos Alberto Enciso
2133b19cfb91SCarlos Alberto EncisoUsing GCC to generate test-dwarf-gcc.o, we can apply a selection pattern
2134b19cfb91SCarlos Alberto Encisowith the printing mode to obtain the following logical view output.
2135b19cfb91SCarlos Alberto Enciso
2136b19cfb91SCarlos Alberto Enciso.. code-block:: none
2137b19cfb91SCarlos Alberto Enciso
2138b19cfb91SCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=level
2139b19cfb91SCarlos Alberto Enciso                          --select-regex --select-nocase --select=INTe
2140b19cfb91SCarlos Alberto Enciso                          --report=list
2141b19cfb91SCarlos Alberto Enciso                          --print=symbols,types
2142c8da9995SCarlos Alberto Enciso                          test-clang.o test-dwarf-gcc.o
2143b19cfb91SCarlos Alberto Enciso
2144b19cfb91SCarlos Alberto Enciso  Logical View:
2145c8da9995SCarlos Alberto Enciso  [000]           {File} 'test-clang.o'
2146b19cfb91SCarlos Alberto Enciso
2147b19cfb91SCarlos Alberto Enciso  [001]           {CompileUnit} 'test.cpp'
2148b19cfb91SCarlos Alberto Enciso  [003]     4     {TypeAlias} 'INTEGER' -> 'int'
2149b19cfb91SCarlos Alberto Enciso  [004]     5     {Variable} 'CONSTANT' -> 'const INTEGER'
2150b19cfb91SCarlos Alberto Enciso
2151b19cfb91SCarlos Alberto Enciso  Logical View:
2152b19cfb91SCarlos Alberto Enciso  [000]           {File} 'test-dwarf-gcc.o'
2153b19cfb91SCarlos Alberto Enciso
2154b19cfb91SCarlos Alberto Enciso  [001]           {CompileUnit} 'test.cpp'
2155b19cfb91SCarlos Alberto Enciso  [004]     4     {TypeAlias} 'INTEGER' -> 'int'
2156b19cfb91SCarlos Alberto Enciso  [004]     5     {Variable} 'CONSTANT' -> 'const INTEGER'
2157b19cfb91SCarlos Alberto Enciso
2158b19cfb91SCarlos Alberto EncisoThe output shows that both objects contain the same elements. But the
2159b19cfb91SCarlos Alberto Enciso**'typedef INTEGER'** is located at different scope level. The GCC
2160b19cfb91SCarlos Alberto Encisogenerated object, shows **'4'**, which is the correct value.
2161b19cfb91SCarlos Alberto Enciso
2162b19cfb91SCarlos Alberto EncisoThere are 2 comparison methods: logical view and logical elements.
2163b19cfb91SCarlos Alberto Enciso
2164b19cfb91SCarlos Alberto EncisoLOGICAL VIEW
2165b19cfb91SCarlos Alberto Enciso""""""""""""
2166b19cfb91SCarlos Alberto EncisoIt compares the logical view as a whole unit; for a match, each compared
2167b19cfb91SCarlos Alberto Encisological element must have the same parents and children.
2168b19cfb91SCarlos Alberto Enciso
2169b19cfb91SCarlos Alberto EncisoThe output shows in view form the **missing (-), added (+)** elements,
2170b19cfb91SCarlos Alberto Encisogiving more context by swapping the reference and target object files.
2171b19cfb91SCarlos Alberto Enciso
2172b19cfb91SCarlos Alberto Enciso.. code-block:: none
2173b19cfb91SCarlos Alberto Enciso
2174b19cfb91SCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=level
2175b19cfb91SCarlos Alberto Enciso                          --compare=types
2176b19cfb91SCarlos Alberto Enciso                          --report=view
2177b19cfb91SCarlos Alberto Enciso                          --print=symbols,types
2178c8da9995SCarlos Alberto Enciso                          test-clang.o test-dwarf-gcc.o
2179b19cfb91SCarlos Alberto Enciso
2180c8da9995SCarlos Alberto Enciso  Reference: 'test-clang.o'
2181b19cfb91SCarlos Alberto Enciso  Target:    'test-dwarf-gcc.o'
2182b19cfb91SCarlos Alberto Enciso
2183b19cfb91SCarlos Alberto Enciso  Logical View:
2184c8da9995SCarlos Alberto Enciso   [000]           {File} 'test-clang.o'
2185b19cfb91SCarlos Alberto Enciso
2186b19cfb91SCarlos Alberto Enciso   [001]             {CompileUnit} 'test.cpp'
2187b19cfb91SCarlos Alberto Enciso   [002]     1         {TypeAlias} 'INTPTR' -> '* const int'
2188b19cfb91SCarlos Alberto Enciso   [002]     2         {Function} extern not_inlined 'foo' -> 'int'
2189b19cfb91SCarlos Alberto Enciso   [003]                 {Block}
2190b19cfb91SCarlos Alberto Enciso   [004]     5             {Variable} 'CONSTANT' -> 'const INTEGER'
2191b19cfb91SCarlos Alberto Enciso  +[004]     4             {TypeAlias} 'INTEGER' -> 'int'
2192b19cfb91SCarlos Alberto Enciso   [003]     2           {Parameter} 'ParamBool' -> 'bool'
2193b19cfb91SCarlos Alberto Enciso   [003]     2           {Parameter} 'ParamPtr' -> 'INTPTR'
2194b19cfb91SCarlos Alberto Enciso   [003]     2           {Parameter} 'ParamUnsigned' -> 'unsigned int'
2195b19cfb91SCarlos Alberto Enciso  -[003]     4           {TypeAlias} 'INTEGER' -> 'int'
2196b19cfb91SCarlos Alberto Enciso
2197b19cfb91SCarlos Alberto EncisoThe output shows the merging view path (reference and target) with the
2198b19cfb91SCarlos Alberto Encisomissing and added elements.
2199b19cfb91SCarlos Alberto Enciso
2200b19cfb91SCarlos Alberto EncisoLOGICAL ELEMENTS
2201b19cfb91SCarlos Alberto Enciso""""""""""""""""
2202b19cfb91SCarlos Alberto EncisoIt compares individual logical elements without considering if their
2203b19cfb91SCarlos Alberto Encisoparents are the same. For both comparison methods, the equal criteria
2204b19cfb91SCarlos Alberto Encisoincludes the name, source code location, type, lexical scope level.
2205b19cfb91SCarlos Alberto Enciso
2206b19cfb91SCarlos Alberto Enciso.. code-block:: none
2207b19cfb91SCarlos Alberto Enciso
2208b19cfb91SCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=level
2209b19cfb91SCarlos Alberto Enciso                          --compare=types
2210b19cfb91SCarlos Alberto Enciso                          --report=list
2211b19cfb91SCarlos Alberto Enciso                          --print=symbols,types,summary
2212c8da9995SCarlos Alberto Enciso                          test-clang.o test-dwarf-gcc.o
2213b19cfb91SCarlos Alberto Enciso
2214c8da9995SCarlos Alberto Enciso  Reference: 'test-clang.o'
2215b19cfb91SCarlos Alberto Enciso  Target:    'test-dwarf-gcc.o'
2216b19cfb91SCarlos Alberto Enciso
2217b19cfb91SCarlos Alberto Enciso  (1) Missing Types:
2218b19cfb91SCarlos Alberto Enciso  -[003]     4     {TypeAlias} 'INTEGER' -> 'int'
2219b19cfb91SCarlos Alberto Enciso
2220b19cfb91SCarlos Alberto Enciso  (1) Added Types:
2221b19cfb91SCarlos Alberto Enciso  +[004]     4     {TypeAlias} 'INTEGER' -> 'int'
2222b19cfb91SCarlos Alberto Enciso
2223b19cfb91SCarlos Alberto Enciso  ----------------------------------------
2224b19cfb91SCarlos Alberto Enciso  Element   Expected    Missing      Added
2225b19cfb91SCarlos Alberto Enciso  ----------------------------------------
2226b19cfb91SCarlos Alberto Enciso  Scopes           4          0          0
2227b19cfb91SCarlos Alberto Enciso  Symbols          0          0          0
2228b19cfb91SCarlos Alberto Enciso  Types            2          1          1
2229b19cfb91SCarlos Alberto Enciso  Lines            0          0          0
2230b19cfb91SCarlos Alberto Enciso  ----------------------------------------
2231b19cfb91SCarlos Alberto Enciso  Total            6          1          1
2232b19cfb91SCarlos Alberto Enciso
2233b19cfb91SCarlos Alberto EncisoChanging the *Reference* and *Target* order:
2234b19cfb91SCarlos Alberto Enciso
2235b19cfb91SCarlos Alberto Enciso.. code-block:: none
2236b19cfb91SCarlos Alberto Enciso
2237b19cfb91SCarlos Alberto Enciso  llvm-debuginfo-analyzer --attribute=level
2238b19cfb91SCarlos Alberto Enciso                          --compare=types
2239b19cfb91SCarlos Alberto Enciso                          --report=list
2240b19cfb91SCarlos Alberto Enciso                          --print=symbols,types,summary
2241c8da9995SCarlos Alberto Enciso                          test-dwarf-gcc.o test-clang.o
2242b19cfb91SCarlos Alberto Enciso
2243b19cfb91SCarlos Alberto Enciso  Reference: 'test-dwarf-gcc.o'
2244c8da9995SCarlos Alberto Enciso  Target:    'test-clang.o'
2245b19cfb91SCarlos Alberto Enciso
2246b19cfb91SCarlos Alberto Enciso  (1) Missing Types:
2247b19cfb91SCarlos Alberto Enciso  -[004]     4     {TypeAlias} 'INTEGER' -> 'int'
2248b19cfb91SCarlos Alberto Enciso
2249b19cfb91SCarlos Alberto Enciso  (1) Added Types:
2250b19cfb91SCarlos Alberto Enciso  +[003]     4     {TypeAlias} 'INTEGER' -> 'int'
2251b19cfb91SCarlos Alberto Enciso
2252b19cfb91SCarlos Alberto Enciso  ----------------------------------------
2253b19cfb91SCarlos Alberto Enciso  Element   Expected    Missing      Added
2254b19cfb91SCarlos Alberto Enciso  ----------------------------------------
2255b19cfb91SCarlos Alberto Enciso  Scopes           4          0          0
2256b19cfb91SCarlos Alberto Enciso  Symbols          0          0          0
2257b19cfb91SCarlos Alberto Enciso  Types            2          1          1
2258b19cfb91SCarlos Alberto Enciso  Lines            0          0          0
2259b19cfb91SCarlos Alberto Enciso  ----------------------------------------
2260b19cfb91SCarlos Alberto Enciso  Total            6          1          1
2261b19cfb91SCarlos Alberto Enciso
2262b19cfb91SCarlos Alberto EncisoAs the *Reference* and *Target* are switched, the *Added Types* from
2263b19cfb91SCarlos Alberto Encisothe first case now are listed as *Missing Types*.
2264b19cfb91SCarlos Alberto Enciso
2265c28a977bSCarlos Alberto EncisoEXIT STATUS
2266c28a977bSCarlos Alberto Enciso-----------
2267c28a977bSCarlos Alberto Enciso:program:`llvm-debuginfo-analyzer` returns 0 if the input files were
2268c28a977bSCarlos Alberto Encisoparsed and printed successfully. Otherwise, it returns 1.
2269c28a977bSCarlos Alberto Enciso
22709c0c98edSCarlos Alberto EncisoLIMITATIONS AND KNOWN ISSUES
22719c0c98edSCarlos Alberto Enciso----------------------------
22729c0c98edSCarlos Alberto EncisoSee :download:`Limitations <../../tools/llvm-debuginfo-analyzer/README.md>`.
22739c0c98edSCarlos Alberto Enciso
2274c28a977bSCarlos Alberto EncisoSEE ALSO
2275c28a977bSCarlos Alberto Enciso--------
2276c28a977bSCarlos Alberto Enciso:manpage:`llvm-dwarfdump`
2277