| # `llvm-debuginfo-analyzer` |
| |
| These are the notes collected during the development, review and test. |
| They describe limitations, known issues and future work. |
| |
| ### Remove the use of macros in ``LVReader.h`` that describe the ``bumpallocators``. |
| **[D137933](https://reviews.llvm.org/D137933#inline-1389904)** |
| |
| Use a standard (or LLVM) ``map`` with ``typeinfo`` (would need a specialization |
| to expose equality and hasher) for the allocators and the creation |
| functions could be a function template. |
| |
| ### Use a **lit test** instead of a **unit test** for the **logical readers**. |
| **[D125783](https://reviews.llvm.org/D125783#inline-1324376)** |
| |
| As the ``DebugInfoLogicalView`` library is sufficiently exposed via the |
| ``llvm-debuginfo-analyzer`` tool, follow the LLVM general approach and |
| use ``lit`` tests to validate the **logical readers**. |
| |
| Convert the ``unitests``: |
| ``` |
| llvm-project/llvm/unittests/DebugInfo/LogicalView/CodeViewReaderTest.cpp |
| llvm-project/llvm/unittests/DebugInfo/LogicalView/DWARFReaderTest.cpp |
| ``` |
| into ``lit`` tests: |
| ``` |
| llvm-project/llvm/test/DebugInfo/LogicalView/CodeViewReader.test |
| llvm-project/llvm/test/DebugInfo/LogicalView/DWARFReader.test |
| ``` |
| |
| ### Eliminate calls to ``getInputFileDirectory()`` in the ``unittests``. |
| **[D125783](https://reviews.llvm.org/D125783#inline-1324359)** |
| |
| Rewrite the unittests ``ReaderTest`` and ``CodeViewReaderTest`` to eliminate |
| the call: |
| ``` |
| getInputFileDirectory() |
| ``` |
| as use of that call is discouraged. |
| |
| ### Fix mismatch between ``%d/%x`` format strings and ``uint64_t`` type. |
| **[D137400](https://reviews.llvm.org/D137400) / [58758](https://github.com/llvm/llvm-project/issues/58758)** |
| |
| Incorrect printing of ``uint64_t`` on ``32-bit`` platforms. |
| Add the ``PRIx64`` specifier to the printing code (``format()``). |
| |
| ### Remove ``LVScope::Children`` container. |
| **[D137933](https://reviews.llvm.org/D137933#inline-1373902)** |
| |
| Use a **chaining iterator** over the other containers rather than keep a |
| separate container ``Children`` that mirrors their contents. |
| |
| ### Use ``TableGen`` for command line options. |
| **[D125777](https://reviews.llvm.org/D125777#inline-1291801)** |
| |
| The current trend is to use ``TableGen`` for command-line options in tools. |
| Change command line options to use ``tablegen`` as many other LLVM tools. |
| |
| ### ``LVDoubleMap`` to return ``optional<ValueType>`` instead of ``null pointer``. |
| **[D125783](https://reviews.llvm.org/D125783#inline-1294164)** |
| |
| The more idiomatic LLVM way to handle this would be to have ``find`` |
| return ``Optional<ValueType>``. |
| |
| ### Pass references instead of pointers (**Comparison functions**). |
| **[D125782](https://reviews.llvm.org/D125782#inline-1293920)** |
| |
| In the **comparison functions**, pass references instead of pointers (when |
| pointers cannot be null). |
| |
| ### Use ``StringMap`` where possible. |
| **[D125783](https://reviews.llvm.org/D125783#inline-1294211)** |
| |
| LLVM has a ``StringMap`` class that is advertised as more efficient than |
| ``std::map<std::string, ValueType>``. Mainly it does fewer allocations |
| because the key is not a ``std::string``. |
| |
| Replace the use of ``std::map<std::string, ValueType>`` with ``StringMap``. |
| One specific case is the ``LVSymbolNames`` definitions. |
| |
| ### Calculate unique offset for CodeView elements. |
| In order to have the same logical functionality as the DWARF reader, such |
| as: |
| |
| * find scopes contribution to debug info |
| * sort by its physical location |
| |
| The logical elements must have an unique offset (similar like the DWARF |
| ``DIE`` offset). |
| |
| ### Move ``initializeFileAndStringTables`` to the CodeView Library. |
| There is some code in the CodeView reader that was extracted/adapted |
| from ``tools/llvm-readobj/COFFDumper.cpp`` that can be moved to the CodeView |
| library. |
| |
| We had a similar case with code shared with ``llvm-pdbutil`` that was moved |
| to the PDB library: **[D122226](https://reviews.llvm.org/D122226)** |
| |
| ### Move ``getSymbolKindName`` and ``formatRegisterId`` to the CodeView Library. |
| There is some code in the CodeView reader that was extracted/adapted |
| from ``lib/DebugInfo/CodeView/SymbolDumper.cpp`` that can be used. |
| |
| ### Use of ``std::unordered_set`` instead of ``std::set``. |
| **[D125784](https://reviews.llvm.org/D125784#inline-1221421)** |
| |
| Replace the ``std::set`` usage for ``DeducedScopes``, ``UnresolvedScopes`` and |
| ``IdentifiedNamespaces`` with ``std::unordered_set`` and get the benefit |
| of the O(1) while inserting/searching, as the order is not important. |
| |
| ### Optimize ``LVNamespaceDeduction::find`` funtion. |
| **[D125784](https://reviews.llvm.org/D125784#inline-1296195)** |
| |
| Optimize the ``find`` method to use the proposed code: |
| |
| ``` |
| LVStringRefs::iterator Iter = std::find_if(Components.begin(), Components.end(), |
| [](StringRef Name) { |
| return IdentifiedNamespaces.find(Name) == IdentifiedNamespaces.end(); |
| }); |
| LVStringRefs::size_type FirstNonNamespace = std::distance(Components.begin(), Iter); |
| ``` |
| |
| ### Move all the printing support to a common module. |
| Factor out printing functionality from the logical elements into a |
| common module. |
| |
| ### Refactor ``LVBinaryReader::processLines``. |
| **[D125783](https://reviews.llvm.org/D125783#inline-1246155) / |
| [D137156](https://reviews.llvm.org/D137156)** |
| |
| During the traversal of the debug information sections, we created the |
| logical lines representing the **disassembled instructions** from the **text |
| section** and the logical lines representing the **line records** from the |
| **debug line** section. Using the ranges associated with the logical scopes, |
| we will allocate those logical lines to their logical scopes. |
| |
| Consider the case when any of those lines become orphans, causing |
| incorrect scope parent for disassembly or line records. |
| |
| ### Add support for ``-ffunction-sections``. |
| **[D125783](https://reviews.llvm.org/D125783#inline-1295012)** |
| |
| Only linked executables are handled. It does not support relocatable |
| files compiled with ``-ffunction-sections``. |
| |
| ### Add support for DWARF v5 `.debug_names` section / CodeView public symbols stream. |
| **[D125783](https://reviews.llvm.org/D125783#inline-1294142)** |
| |
| The DWARF and CodeView readers use the public names information to create |
| the instructions (``LVLineAssembler``). Instead of relying on DWARF section |
| names (``.debug_pubnames``, ``.debug_names``) and CodeView public symbol stream |
| (``S_PUB32``), the readers should collect the needed information while processing |
| the debug information. |
| |
| If the object file supports the above section names and stream, use them |
| to create the public names. |
| |
| ### Add support for some extra DWARF locations. |
| The following DWARF debug location operands are not supported: |
| |
| * `DW_OP_const_type` |
| * `DW_OP_entry_value` |
| * `DW_OP_implicit_value` |
| |
| ### Add support for additional binary formats. |
| * Extended COFF (`XCOFF`) |
| |
| ### Add support for ``JSON`` or ``YAML`` |
| The logical view uses its own and non-standard free form text when |
| displaying information on logical elements. |