109 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_COMPILEUNITINDEX_H10#define LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_COMPILEUNITINDEX_H11 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 31namespace lldb_private {32 33namespace npdb {34class PdbIndex;35 36/// Represents a single compile unit. This class is useful for collecting the37/// important accessors and information about a compile unit from disparate38/// parts of the PDB into a single place, simplifying acess to compile unit39/// information for the callers.40struct 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 to60 // locate the exact compile unit and offset of the symbol. Note that this61 // is intentionally an ordered map so that we can find all symbols up to a62 // 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 which73 // 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 file81 // 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 of89/// global compile unit index to |CompilandIndexItem| structures.90class CompileUnitIndex {91 PdbIndex &m_index;92 llvm::DenseMap<uint16_t, std::unique_ptr<CompilandIndexItem>> m_comp_units;93 94public: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 npdb106} // namespace lldb_private107 108#endif109