Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/lldb/source/Plugins/SymbolFile/NativePDB/CompileUnitIndex.h
39642 views
1
//===-- CompileUnitIndex.h --------------------------------------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
9
#ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_COMPILEUNITINDEX_H
10
#define LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_COMPILEUNITINDEX_H
11
12
#include "lldb/Utility/RangeMap.h"
13
#include "llvm/ADT/DenseMap.h"
14
#include "llvm/ADT/DenseSet.h"
15
#include "llvm/ADT/IntervalMap.h"
16
#include "llvm/ADT/SmallString.h"
17
#include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h"
18
#include "llvm/DebugInfo/CodeView/StringsAndChecksums.h"
19
#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
20
#include "llvm/DebugInfo/CodeView/TypeIndex.h"
21
#include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h"
22
#include "llvm/DebugInfo/PDB/Native/ModuleDebugStream.h"
23
#include "llvm/DebugInfo/PDB/PDBTypes.h"
24
25
#include "PdbSymUid.h"
26
27
#include <map>
28
#include <memory>
29
#include <optional>
30
31
namespace lldb_private {
32
33
namespace npdb {
34
class PdbIndex;
35
36
/// Represents a single compile unit. This class is useful for collecting the
37
/// important accessors and information about a compile unit from disparate
38
/// parts of the PDB into a single place, simplifying acess to compile unit
39
/// information for the callers.
40
struct CompilandIndexItem {
41
CompilandIndexItem(PdbCompilandId m_id,
42
llvm::pdb::ModuleDebugStreamRef debug_stream,
43
llvm::pdb::DbiModuleDescriptor descriptor);
44
45
// index of this compile unit.
46
PdbCompilandId m_id;
47
48
// debug stream.
49
llvm::pdb::ModuleDebugStreamRef m_debug_stream;
50
51
// dbi module descriptor.
52
llvm::pdb::DbiModuleDescriptor m_module_descriptor;
53
54
llvm::codeview::StringsAndChecksumsRef m_strings;
55
56
// List of files which contribute to this compiland.
57
std::vector<llvm::StringRef> m_file_list;
58
59
// Maps virtual address to global symbol id, which can then be used to
60
// locate the exact compile unit and offset of the symbol. Note that this
61
// is intentionally an ordered map so that we can find all symbols up to a
62
// given starting address.
63
std::map<lldb::addr_t, PdbSymUid> m_symbols_by_va;
64
65
// S_COMPILE3 sym describing compilation settings for the module.
66
std::optional<llvm::codeview::Compile3Sym> m_compile_opts;
67
68
// S_OBJNAME sym describing object name.
69
std::optional<llvm::codeview::ObjNameSym> m_obj_name;
70
71
// LF_BUILDINFO sym describing source file name, working directory,
72
// command line, etc. This usually contains exactly 5 items which
73
// are references to other strings.
74
llvm::SmallVector<llvm::codeview::TypeIndex, 5> m_build_info;
75
76
// Inlinee lines table in this compile unit.
77
std::map<llvm::codeview::TypeIndex, llvm::codeview::InlineeSourceLine>
78
m_inline_map;
79
80
// It's the line table parsed from DEBUG_S_LINES sections, mapping the file
81
// address range to file index and source line number.
82
using GlobalLineTable =
83
lldb_private::RangeDataVector<lldb::addr_t, uint32_t,
84
std::pair<uint32_t, uint32_t>>;
85
GlobalLineTable m_global_line_table;
86
};
87
88
/// Indexes information about all compile units. This is really just a map of
89
/// global compile unit index to |CompilandIndexItem| structures.
90
class CompileUnitIndex {
91
PdbIndex &m_index;
92
llvm::DenseMap<uint16_t, std::unique_ptr<CompilandIndexItem>> m_comp_units;
93
94
public:
95
explicit CompileUnitIndex(PdbIndex &index) : m_index(index) {}
96
97
CompilandIndexItem &GetOrCreateCompiland(uint16_t modi);
98
99
const CompilandIndexItem *GetCompiland(uint16_t modi) const;
100
101
CompilandIndexItem *GetCompiland(uint16_t modi);
102
103
llvm::SmallString<64> GetMainSourceFile(const CompilandIndexItem &item) const;
104
};
105
} // namespace npdb
106
} // namespace lldb_private
107
108
#endif
109
110