brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.8 KiB · 3e6766a Raw
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