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 "Driver.h"
16 #include "InputFiles.h"
17 #include "SymbolTable.h"
18 #include "Writer.h"
19 #include "lld/Common/CommonLinkerContext.h"
20 #include "lld/Common/Timer.h"
21 
22 namespace lld::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   LinkerDriver driver;
32   SymbolTable symtab;
33   COFFOptTable optTable;
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 
addTpiSource(TpiSource * tpi)45   void addTpiSource(TpiSource *tpi) { tpiSourceList.push_back(tpi); }
46 
47   std::map<llvm::codeview::GUID, TpiSource *> typeServerSourceMappings;
48   std::map<uint32_t, TpiSource *> precompSourceMappings;
49 
50   /// List of all output sections. After output sections are finalized, this
51   /// can be indexed by getOutputSection.
52   std::vector<OutputSection *> outputSections;
53 
getOutputSection(const Chunk * c)54   OutputSection *getOutputSection(const Chunk *c) const {
55     return c->osidx == 0 ? nullptr : outputSections[c->osidx - 1];
56   }
57 
58   // Fake sections for parsing bitcode files.
59   FakeSection ltoTextSection;
60   FakeSection ltoDataSection;
61   FakeSectionChunk ltoTextSectionChunk;
62   FakeSectionChunk ltoDataSectionChunk;
63 
64   // All timers used in the COFF linker.
65   Timer rootTimer;
66   Timer inputFileTimer;
67   Timer ltoTimer;
68   Timer gcTimer;
69   Timer icfTimer;
70 
71   // Writer timers.
72   Timer codeLayoutTimer;
73   Timer outputCommitTimer;
74   Timer totalMapTimer;
75   Timer symbolGatherTimer;
76   Timer symbolStringsTimer;
77   Timer writeTimer;
78 
79   // PDB timers.
80   Timer totalPdbLinkTimer;
81   Timer addObjectsTimer;
82   Timer typeMergingTimer;
83   Timer loadGHashTimer;
84   Timer mergeGHashTimer;
85   Timer symbolMergingTimer;
86   Timer publicsLayoutTimer;
87   Timer tpiStreamLayoutTimer;
88   Timer diskCommitTimer;
89 
90   Configuration config;
91 };
92 
93 } // namespace lld::coff
94 
95 #endif
96