xref: /llvm-project/llvm/tools/llvm-debuginfo-analyzer/README.md (revision 9c0c98ed376f8705d0856f29a7ec659120187612)
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