1 //===- COFFLinkerContext.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_COFFLinkerContext_H
10 #define LLD_COFF_COFFLinkerContext_H
11 
12 #include "Chunks.h"
13 #include "Config.h"
14 #include "DebugTypes.h"
15 #include "InputFiles.h"
16 #include "SymbolTable.h"
17 #include "Writer.h"
18 #include "lld/Common/CommonLinkerContext.h"
19 #include "lld/Common/Timer.h"
20 
21 namespace lld {
22 namespace coff {
23 
24 class COFFLinkerContext : public CommonLinkerContext {
25 public:
26   COFFLinkerContext();
27   COFFLinkerContext(const COFFLinkerContext &) = delete;
28   COFFLinkerContext &operator=(const COFFLinkerContext &) = delete;
29   ~COFFLinkerContext() = default;
30 
31   void addTpiSource(TpiSource *tpi) { tpiSourceList.push_back(tpi); }
32 
33   SymbolTable symtab;
34 
35   std::vector<ObjFile *> objFileInstances;
36   std::map<std::string, PDBInputFile *> pdbInputFileInstances;
37   std::vector<ImportFile *> importFileInstances;
38   std::vector<BitcodeFile *> bitcodeFileInstances;
39 
40   MergeChunk *mergeChunkInstances[Log2MaxSectionAlignment + 1] = {};
41 
42   /// All sources of type information in the program.
43   std::vector<TpiSource *> tpiSourceList;
44 
45   std::map<llvm::codeview::GUID, TpiSource *> typeServerSourceMappings;
46   std::map<uint32_t, TpiSource *> precompSourceMappings;
47 
48   /// List of all output sections. After output sections are finalized, this
49   /// can be indexed by getOutputSection.
50   std::vector<OutputSection *> outputSections;
51 
52   OutputSection *getOutputSection(const Chunk *c) const {
53     return c->osidx == 0 ? nullptr : outputSections[c->osidx - 1];
54   }
55 
56   // All timers used in the COFF linker.
57   Timer rootTimer;
58   Timer inputFileTimer;
59   Timer ltoTimer;
60   Timer gcTimer;
61   Timer icfTimer;
62 
63   // Writer timers.
64   Timer codeLayoutTimer;
65   Timer outputCommitTimer;
66   Timer totalMapTimer;
67   Timer symbolGatherTimer;
68   Timer symbolStringsTimer;
69   Timer writeTimer;
70 
71   // PDB timers.
72   Timer totalPdbLinkTimer;
73   Timer addObjectsTimer;
74   Timer typeMergingTimer;
75   Timer loadGHashTimer;
76   Timer mergeGHashTimer;
77   Timer symbolMergingTimer;
78   Timer publicsLayoutTimer;
79   Timer tpiStreamLayoutTimer;
80   Timer diskCommitTimer;
81 };
82 
83 } // namespace coff
84 } // namespace lld
85 
86 #endif
87