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