1*9c0c98edSCarlos Alberto Enciso# `llvm-debuginfo-analyzer` 2*9c0c98edSCarlos Alberto Enciso 3*9c0c98edSCarlos Alberto EncisoThese are the notes collected during the development, review and test. 4*9c0c98edSCarlos Alberto EncisoThey describe limitations, known issues and future work. 5*9c0c98edSCarlos Alberto Enciso 6*9c0c98edSCarlos Alberto Enciso### Remove the use of macros in ``LVReader.h`` that describe the ``bumpallocators``. 7*9c0c98edSCarlos Alberto Enciso**[D137933](https://reviews.llvm.org/D137933#inline-1389904)** 8*9c0c98edSCarlos Alberto Enciso 9*9c0c98edSCarlos Alberto EncisoUse a standard (or LLVM) ``map`` with ``typeinfo`` (would need a specialization 10*9c0c98edSCarlos Alberto Encisoto expose equality and hasher) for the allocators and the creation 11*9c0c98edSCarlos Alberto Encisofunctions could be a function template. 12*9c0c98edSCarlos Alberto Enciso 13*9c0c98edSCarlos Alberto Enciso### Use a **lit test** instead of a **unit test** for the **logical readers**. 14*9c0c98edSCarlos Alberto Enciso**[D125783](https://reviews.llvm.org/D125783#inline-1324376)** 15*9c0c98edSCarlos Alberto Enciso 16*9c0c98edSCarlos Alberto EncisoAs the ``DebugInfoLogicalView`` library is sufficiently exposed via the 17*9c0c98edSCarlos Alberto Enciso``llvm-debuginfo-analyzer`` tool, follow the LLVM general approach and 18*9c0c98edSCarlos Alberto Encisouse ``lit`` tests to validate the **logical readers**. 19*9c0c98edSCarlos Alberto Enciso 20*9c0c98edSCarlos Alberto EncisoConvert the ``unitests``: 21*9c0c98edSCarlos Alberto Enciso``` 22*9c0c98edSCarlos Alberto Encisollvm-project/llvm/unittests/DebugInfo/LogicalView/CodeViewReaderTest.cpp 23*9c0c98edSCarlos Alberto Encisollvm-project/llvm/unittests/DebugInfo/LogicalView/DWARFReaderTest.cpp 24*9c0c98edSCarlos Alberto Enciso``` 25*9c0c98edSCarlos Alberto Encisointo ``lit`` tests: 26*9c0c98edSCarlos Alberto Enciso``` 27*9c0c98edSCarlos Alberto Encisollvm-project/llvm/test/DebugInfo/LogicalView/CodeViewReader.test 28*9c0c98edSCarlos Alberto Encisollvm-project/llvm/test/DebugInfo/LogicalView/DWARFReader.test 29*9c0c98edSCarlos Alberto Enciso``` 30*9c0c98edSCarlos Alberto Enciso 31*9c0c98edSCarlos Alberto Enciso### Eliminate calls to ``getInputFileDirectory()`` in the ``unittests``. 32*9c0c98edSCarlos Alberto Enciso**[D125783](https://reviews.llvm.org/D125783#inline-1324359)** 33*9c0c98edSCarlos Alberto Enciso 34*9c0c98edSCarlos Alberto EncisoRewrite the unittests ``ReaderTest`` and ``CodeViewReaderTest`` to eliminate 35*9c0c98edSCarlos Alberto Encisothe call: 36*9c0c98edSCarlos Alberto Enciso``` 37*9c0c98edSCarlos Alberto Enciso getInputFileDirectory() 38*9c0c98edSCarlos Alberto Enciso``` 39*9c0c98edSCarlos Alberto Encisoas use of that call is discouraged. 40*9c0c98edSCarlos Alberto Enciso 41*9c0c98edSCarlos Alberto Enciso### Fix mismatch between ``%d/%x`` format strings and ``uint64_t`` type. 42*9c0c98edSCarlos Alberto Enciso**[D137400](https://reviews.llvm.org/D137400) / [58758](https://github.com/llvm/llvm-project/issues/58758)** 43*9c0c98edSCarlos Alberto Enciso 44*9c0c98edSCarlos Alberto EncisoIncorrect printing of ``uint64_t`` on ``32-bit`` platforms. 45*9c0c98edSCarlos Alberto EncisoAdd the ``PRIx64`` specifier to the printing code (``format()``). 46*9c0c98edSCarlos Alberto Enciso 47*9c0c98edSCarlos Alberto Enciso### Remove ``LVScope::Children`` container. 48*9c0c98edSCarlos Alberto Enciso**[D137933](https://reviews.llvm.org/D137933#inline-1373902)** 49*9c0c98edSCarlos Alberto Enciso 50*9c0c98edSCarlos Alberto EncisoUse a **chaining iterator** over the other containers rather than keep a 51*9c0c98edSCarlos Alberto Encisoseparate container ``Children`` that mirrors their contents. 52*9c0c98edSCarlos Alberto Enciso 53*9c0c98edSCarlos Alberto Enciso### Use ``TableGen`` for command line options. 54*9c0c98edSCarlos Alberto Enciso**[D125777](https://reviews.llvm.org/D125777#inline-1291801)** 55*9c0c98edSCarlos Alberto Enciso 56*9c0c98edSCarlos Alberto EncisoThe current trend is to use ``TableGen`` for command-line options in tools. 57*9c0c98edSCarlos Alberto EncisoChange command line options to use ``tablegen`` as many other LLVM tools. 58*9c0c98edSCarlos Alberto Enciso 59*9c0c98edSCarlos Alberto Enciso### ``LVDoubleMap`` to return ``optional<ValueType>`` instead of ``null pointer``. 60*9c0c98edSCarlos Alberto Enciso**[D125783](https://reviews.llvm.org/D125783#inline-1294164)** 61*9c0c98edSCarlos Alberto Enciso 62*9c0c98edSCarlos Alberto EncisoThe more idiomatic LLVM way to handle this would be to have ``find`` 63*9c0c98edSCarlos Alberto Encisoreturn ``Optional<ValueType>``. 64*9c0c98edSCarlos Alberto Enciso 65*9c0c98edSCarlos Alberto Enciso### Pass references instead of pointers (**Comparison functions**). 66*9c0c98edSCarlos Alberto Enciso**[D125782](https://reviews.llvm.org/D125782#inline-1293920)** 67*9c0c98edSCarlos Alberto Enciso 68*9c0c98edSCarlos Alberto EncisoIn the **comparison functions**, pass references instead of pointers (when 69*9c0c98edSCarlos Alberto Encisopointers cannot be null). 70*9c0c98edSCarlos Alberto Enciso 71*9c0c98edSCarlos Alberto Enciso### Use ``StringMap`` where possible. 72*9c0c98edSCarlos Alberto Enciso**[D125783](https://reviews.llvm.org/D125783#inline-1294211)** 73*9c0c98edSCarlos Alberto Enciso 74*9c0c98edSCarlos Alberto EncisoLLVM has a ``StringMap`` class that is advertised as more efficient than 75*9c0c98edSCarlos Alberto Enciso``std::map<std::string, ValueType>``. Mainly it does fewer allocations 76*9c0c98edSCarlos Alberto Encisobecause the key is not a ``std::string``. 77*9c0c98edSCarlos Alberto Enciso 78*9c0c98edSCarlos Alberto EncisoReplace the use of ``std::map<std::string, ValueType>`` with ``StringMap``. 79*9c0c98edSCarlos Alberto EncisoOne specific case is the ``LVSymbolNames`` definitions. 80*9c0c98edSCarlos Alberto Enciso 81*9c0c98edSCarlos Alberto Enciso### Calculate unique offset for CodeView elements. 82*9c0c98edSCarlos Alberto EncisoIn order to have the same logical functionality as the DWARF reader, such 83*9c0c98edSCarlos Alberto Encisoas: 84*9c0c98edSCarlos Alberto Enciso 85*9c0c98edSCarlos Alberto Enciso* find scopes contribution to debug info 86*9c0c98edSCarlos Alberto Enciso* sort by its physical location 87*9c0c98edSCarlos Alberto Enciso 88*9c0c98edSCarlos Alberto EncisoThe logical elements must have an unique offset (similar like the DWARF 89*9c0c98edSCarlos Alberto Enciso``DIE`` offset). 90*9c0c98edSCarlos Alberto Enciso 91*9c0c98edSCarlos Alberto Enciso### Move ``initializeFileAndStringTables`` to the CodeView Library. 92*9c0c98edSCarlos Alberto EncisoThere is some code in the CodeView reader that was extracted/adapted 93*9c0c98edSCarlos Alberto Encisofrom ``tools/llvm-readobj/COFFDumper.cpp`` that can be moved to the CodeView 94*9c0c98edSCarlos Alberto Encisolibrary. 95*9c0c98edSCarlos Alberto Enciso 96*9c0c98edSCarlos Alberto EncisoWe had a similar case with code shared with ``llvm-pdbutil`` that was moved 97*9c0c98edSCarlos Alberto Encisoto the PDB library: **[D122226](https://reviews.llvm.org/D122226)** 98*9c0c98edSCarlos Alberto Enciso 99*9c0c98edSCarlos Alberto Enciso### Move ``getSymbolKindName`` and ``formatRegisterId`` to the CodeView Library. 100*9c0c98edSCarlos Alberto EncisoThere is some code in the CodeView reader that was extracted/adapted 101*9c0c98edSCarlos Alberto Encisofrom ``lib/DebugInfo/CodeView/SymbolDumper.cpp`` that can be used. 102*9c0c98edSCarlos Alberto Enciso 103*9c0c98edSCarlos Alberto Enciso### Use of ``std::unordered_set`` instead of ``std::set``. 104*9c0c98edSCarlos Alberto Enciso**[D125784](https://reviews.llvm.org/D125784#inline-1221421)** 105*9c0c98edSCarlos Alberto Enciso 106*9c0c98edSCarlos Alberto EncisoReplace the ``std::set`` usage for ``DeducedScopes``, ``UnresolvedScopes`` and 107*9c0c98edSCarlos Alberto Enciso``IdentifiedNamespaces`` with ``std::unordered_set`` and get the benefit 108*9c0c98edSCarlos Alberto Encisoof the O(1) while inserting/searching, as the order is not important. 109*9c0c98edSCarlos Alberto Enciso 110*9c0c98edSCarlos Alberto Enciso### Optimize ``LVNamespaceDeduction::find`` funtion. 111*9c0c98edSCarlos Alberto Enciso**[D125784](https://reviews.llvm.org/D125784#inline-1296195)** 112*9c0c98edSCarlos Alberto Enciso 113*9c0c98edSCarlos Alberto EncisoOptimize the ``find`` method to use the proposed code: 114*9c0c98edSCarlos Alberto Enciso 115*9c0c98edSCarlos Alberto Enciso``` 116*9c0c98edSCarlos Alberto Enciso LVStringRefs::iterator Iter = std::find_if(Components.begin(), Components.end(), 117*9c0c98edSCarlos Alberto Enciso [](StringRef Name) { 118*9c0c98edSCarlos Alberto Enciso return IdentifiedNamespaces.find(Name) == IdentifiedNamespaces.end(); 119*9c0c98edSCarlos Alberto Enciso }); 120*9c0c98edSCarlos Alberto Enciso LVStringRefs::size_type FirstNonNamespace = std::distance(Components.begin(), Iter); 121*9c0c98edSCarlos Alberto Enciso``` 122*9c0c98edSCarlos Alberto Enciso 123*9c0c98edSCarlos Alberto Enciso### Move all the printing support to a common module. 124*9c0c98edSCarlos Alberto EncisoFactor out printing functionality from the logical elements into a 125*9c0c98edSCarlos Alberto Encisocommon module. 126*9c0c98edSCarlos Alberto Enciso 127*9c0c98edSCarlos Alberto Enciso### Refactor ``LVBinaryReader::processLines``. 128*9c0c98edSCarlos Alberto Enciso**[D125783](https://reviews.llvm.org/D125783#inline-1246155) / 129*9c0c98edSCarlos Alberto Enciso[D137156](https://reviews.llvm.org/D137156)** 130*9c0c98edSCarlos Alberto Enciso 131*9c0c98edSCarlos Alberto EncisoDuring the traversal of the debug information sections, we created the 132*9c0c98edSCarlos Alberto Encisological lines representing the **disassembled instructions** from the **text 133*9c0c98edSCarlos Alberto Encisosection** and the logical lines representing the **line records** from the 134*9c0c98edSCarlos Alberto Enciso**debug line** section. Using the ranges associated with the logical scopes, 135*9c0c98edSCarlos Alberto Encisowe will allocate those logical lines to their logical scopes. 136*9c0c98edSCarlos Alberto Enciso 137*9c0c98edSCarlos Alberto EncisoConsider the case when any of those lines become orphans, causing 138*9c0c98edSCarlos Alberto Encisoincorrect scope parent for disassembly or line records. 139*9c0c98edSCarlos Alberto Enciso 140*9c0c98edSCarlos Alberto Enciso### Add support for ``-ffunction-sections``. 141*9c0c98edSCarlos Alberto Enciso**[D125783](https://reviews.llvm.org/D125783#inline-1295012)** 142*9c0c98edSCarlos Alberto Enciso 143*9c0c98edSCarlos Alberto EncisoOnly linked executables are handled. It does not support relocatable 144*9c0c98edSCarlos Alberto Encisofiles compiled with ``-ffunction-sections``. 145*9c0c98edSCarlos Alberto Enciso 146*9c0c98edSCarlos Alberto Enciso### Add support for DWARF v5 `.debug_names` section / CodeView public symbols stream. 147*9c0c98edSCarlos Alberto Enciso**[D125783](https://reviews.llvm.org/D125783#inline-1294142)** 148*9c0c98edSCarlos Alberto Enciso 149*9c0c98edSCarlos Alberto EncisoThe DWARF and CodeView readers use the public names information to create 150*9c0c98edSCarlos Alberto Encisothe instructions (``LVLineAssembler``). Instead of relying on DWARF section 151*9c0c98edSCarlos Alberto Encisonames (``.debug_pubnames``, ``.debug_names``) and CodeView public symbol stream 152*9c0c98edSCarlos Alberto Enciso(``S_PUB32``), the readers should collect the needed information while processing 153*9c0c98edSCarlos Alberto Encisothe debug information. 154*9c0c98edSCarlos Alberto Enciso 155*9c0c98edSCarlos Alberto EncisoIf the object file supports the above section names and stream, use them 156*9c0c98edSCarlos Alberto Encisoto create the public names. 157*9c0c98edSCarlos Alberto Enciso 158*9c0c98edSCarlos Alberto Enciso### Add support for some extra DWARF locations. 159*9c0c98edSCarlos Alberto EncisoThe following DWARF debug location operands are not supported: 160*9c0c98edSCarlos Alberto Enciso 161*9c0c98edSCarlos Alberto Enciso* `DW_OP_const_type` 162*9c0c98edSCarlos Alberto Enciso* `DW_OP_entry_value` 163*9c0c98edSCarlos Alberto Enciso* `DW_OP_implicit_value` 164*9c0c98edSCarlos Alberto Enciso 165*9c0c98edSCarlos Alberto Enciso### Add support for additional binary formats. 166*9c0c98edSCarlos Alberto Enciso* Extended COFF (`XCOFF`) 167*9c0c98edSCarlos Alberto Enciso 168*9c0c98edSCarlos Alberto Enciso### Add support for ``JSON`` or ``YAML`` 169*9c0c98edSCarlos Alberto EncisoThe logical view uses its own and non-standard free form text when 170*9c0c98edSCarlos Alberto Encisodisplaying information on logical elements. 171