[PDB] Split TypeServerSource and extend type index map lifetime
[lldb.git] / lld / COFF / DebugTypes.h
1 //===- DebugTypes.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 LLD_COFF_DEBUGTYPES_H
10 #define LLD_COFF_DEBUGTYPES_H
11
12 #include "lld/Common/LLVM.h"
13 #include "llvm/DebugInfo/CodeView/TypeIndex.h"
14 #include "llvm/Support/Error.h"
15 #include "llvm/Support/MemoryBuffer.h"
16
17 namespace llvm {
18 namespace codeview {
19 class PrecompRecord;
20 class TypeServer2Record;
21 } // namespace codeview
22 namespace pdb {
23 class NativeSession;
24 }
25 } // namespace llvm
26
27 namespace lld {
28 namespace coff {
29
30 using llvm::codeview::TypeIndex;
31
32 class ObjFile;
33 class PDBInputFile;
34 class TypeMerger;
35
36 class TpiSource {
37 public:
38   enum TpiKind { Regular, PCH, UsingPCH, PDB, PDBIpi, UsingPDB };
39
40   TpiSource(TpiKind k, ObjFile *f);
41   virtual ~TpiSource();
42
43   /// Produce a mapping from the type and item indices used in the object
44   /// file to those in the destination PDB.
45   ///
46   /// If the object file uses a type server PDB (compiled with /Zi), merge TPI
47   /// and IPI from the type server PDB and return a map for it. Each unique type
48   /// server PDB is merged at most once, so this may return an existing index
49   /// mapping.
50   ///
51   /// If the object does not use a type server PDB (compiled with /Z7), we merge
52   /// all the type and item records from the .debug$S stream and fill in the
53   /// caller-provided ObjectIndexMap.
54   virtual Error mergeDebugT(TypeMerger *m);
55
56   /// Is this a dependent file that needs to be processed first, before other
57   /// OBJs?
58   virtual bool isDependency() const { return false; }
59
60   static void forEachSource(llvm::function_ref<void(TpiSource *)> fn);
61
62   static uint32_t countTypeServerPDBs();
63   static uint32_t countPrecompObjs();
64
65   /// Clear global data structures for TpiSources.
66   static void clear();
67
68   const TpiKind kind;
69   ObjFile *file;
70
71   // Storage for tpiMap or ipiMap, depending on the kind of source.
72   llvm::SmallVector<TypeIndex, 0> indexMapStorage;
73
74   // Source type index to PDB type index mapping for type and item records.
75   // These mappings will be the same for /Z7 objects, and distinct for /Zi
76   // objects.
77   llvm::ArrayRef<TypeIndex> tpiMap;
78   llvm::ArrayRef<TypeIndex> ipiMap;
79 };
80
81 TpiSource *makeTpiSource(ObjFile *file);
82 TpiSource *makeTypeServerSource(PDBInputFile *pdbInputFile);
83 TpiSource *makeUseTypeServerSource(ObjFile *file,
84                                    llvm::codeview::TypeServer2Record ts);
85 TpiSource *makePrecompSource(ObjFile *file);
86 TpiSource *makeUsePrecompSource(ObjFile *file,
87                                 llvm::codeview::PrecompRecord ts);
88
89 } // namespace coff
90 } // namespace lld
91
92 #endif