225 lines
10 KiB
Text
225 lines
10 KiB
Text
|
//===- llvm/tools/llvm-debuginfo-analyzer/README.txt ----------------------===//
|
||
|
//
|
||
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||
|
// See https://llvm.org/LICENSE.txt for license information.
|
||
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
//
|
||
|
// This file contains notes collected during the development, review and test.
|
||
|
// It describes limitations, know issues and future work.
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
// Remove the use of macros in 'LVReader.h' that describe the bumpallocators.
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
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.
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
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/ELFReaderTest.cpp
|
||
|
|
||
|
into LIT tests:
|
||
|
llvm-project/llvm/test/DebugInfo/LogicalView/CodeViewReader.test
|
||
|
llvm-project/llvm/test/DebugInfo/LogicalView/ELFReader.test
|
||
|
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
// Eliminate calls to 'getInputFileDirectory()' in the unit tests.
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
https://reviews.llvm.org/D125783#inline-1324359
|
||
|
|
||
|
Rewrite the unittests 'LFReaderTest' and 'CodeViewReaderTest'to eliminate
|
||
|
the call:
|
||
|
|
||
|
getInputFileDirectory()
|
||
|
|
||
|
as use of that call is discouraged.
|
||
|
|
||
|
See: Use a lit test instead of a unit test for the logical readers.
|
||
|
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
// Fix mismatch between %d/%x format strings and uint64_t type.
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
https://reviews.llvm.org/D137400
|
||
|
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.
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
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.
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
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.
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
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).
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
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.
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
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 String Map.
|
||
|
One specific case is the LVSymbolNames definitions.
|
||
|
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
// Calculate unique offset for CodeView elements.
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
In order to have the same logical functionality as the ELF 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 COFF 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 COFF
|
||
|
library.
|
||
|
|
||
|
We had a similar case with code shared with llvm-pdbutil that was moved
|
||
|
to the PDB library: https://reviews.llvm.org/D122226
|
||
|
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
// Move 'getSymbolKindName'/'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.
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
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.
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
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'.
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
https://reviews.llvm.org/D125783#inline-1246155
|
||
|
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'.
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
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.
|
||
|
// Add support for CodeView public symbols stream.
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
https://reviews.llvm.org/D125783#inline-1294142
|
||
|
|
||
|
The ELF 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 collects 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.
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
- WebAssembly (Wasm).
|
||
|
https://github.com/llvm/llvm-project/issues/57040#issuecomment-1211336680
|
||
|
|
||
|
- 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.
|
||
|
|
||
|
//===----------------------------------------------------------------------===//
|