xref: /freebsd-src/contrib/llvm-project/lld/COFF/COFFLinkerContext.h (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
1349cc55cSDimitry Andric //===- COFFLinkerContext.h --------------------------------------*- C++ -*-===//
2349cc55cSDimitry Andric //
3349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6349cc55cSDimitry Andric //
7349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
8349cc55cSDimitry Andric 
9*bdd1243dSDimitry Andric #ifndef LLD_COFF_COFFLINKERCONTEXT_H
10*bdd1243dSDimitry Andric #define LLD_COFF_COFFLINKERCONTEXT_H
11349cc55cSDimitry Andric 
12349cc55cSDimitry Andric #include "Chunks.h"
13349cc55cSDimitry Andric #include "Config.h"
14349cc55cSDimitry Andric #include "DebugTypes.h"
15*bdd1243dSDimitry Andric #include "Driver.h"
16349cc55cSDimitry Andric #include "InputFiles.h"
17349cc55cSDimitry Andric #include "SymbolTable.h"
18349cc55cSDimitry Andric #include "Writer.h"
1904eeddc0SDimitry Andric #include "lld/Common/CommonLinkerContext.h"
20349cc55cSDimitry Andric #include "lld/Common/Timer.h"
21349cc55cSDimitry Andric 
22*bdd1243dSDimitry Andric namespace lld::coff {
23349cc55cSDimitry Andric 
2404eeddc0SDimitry Andric class COFFLinkerContext : public CommonLinkerContext {
25349cc55cSDimitry Andric public:
26349cc55cSDimitry Andric   COFFLinkerContext();
27349cc55cSDimitry Andric   COFFLinkerContext(const COFFLinkerContext &) = delete;
28349cc55cSDimitry Andric   COFFLinkerContext &operator=(const COFFLinkerContext &) = delete;
29349cc55cSDimitry Andric   ~COFFLinkerContext() = default;
30349cc55cSDimitry Andric 
31*bdd1243dSDimitry Andric   LinkerDriver driver;
32349cc55cSDimitry Andric   SymbolTable symtab;
33*bdd1243dSDimitry Andric   COFFOptTable optTable;
34349cc55cSDimitry Andric 
35349cc55cSDimitry Andric   std::vector<ObjFile *> objFileInstances;
36349cc55cSDimitry Andric   std::map<std::string, PDBInputFile *> pdbInputFileInstances;
37349cc55cSDimitry Andric   std::vector<ImportFile *> importFileInstances;
38349cc55cSDimitry Andric   std::vector<BitcodeFile *> bitcodeFileInstances;
39349cc55cSDimitry Andric 
40349cc55cSDimitry Andric   MergeChunk *mergeChunkInstances[Log2MaxSectionAlignment + 1] = {};
41349cc55cSDimitry Andric 
42349cc55cSDimitry Andric   /// All sources of type information in the program.
43349cc55cSDimitry Andric   std::vector<TpiSource *> tpiSourceList;
44349cc55cSDimitry Andric 
addTpiSource(TpiSource * tpi)45*bdd1243dSDimitry Andric   void addTpiSource(TpiSource *tpi) { tpiSourceList.push_back(tpi); }
46*bdd1243dSDimitry Andric 
47349cc55cSDimitry Andric   std::map<llvm::codeview::GUID, TpiSource *> typeServerSourceMappings;
48349cc55cSDimitry Andric   std::map<uint32_t, TpiSource *> precompSourceMappings;
49349cc55cSDimitry Andric 
50349cc55cSDimitry Andric   /// List of all output sections. After output sections are finalized, this
51349cc55cSDimitry Andric   /// can be indexed by getOutputSection.
52349cc55cSDimitry Andric   std::vector<OutputSection *> outputSections;
53349cc55cSDimitry Andric 
getOutputSection(const Chunk * c)54349cc55cSDimitry Andric   OutputSection *getOutputSection(const Chunk *c) const {
55349cc55cSDimitry Andric     return c->osidx == 0 ? nullptr : outputSections[c->osidx - 1];
56349cc55cSDimitry Andric   }
57349cc55cSDimitry Andric 
58*bdd1243dSDimitry Andric   // Fake sections for parsing bitcode files.
59*bdd1243dSDimitry Andric   FakeSection ltoTextSection;
60*bdd1243dSDimitry Andric   FakeSection ltoDataSection;
61*bdd1243dSDimitry Andric   FakeSectionChunk ltoTextSectionChunk;
62*bdd1243dSDimitry Andric   FakeSectionChunk ltoDataSectionChunk;
63*bdd1243dSDimitry Andric 
64349cc55cSDimitry Andric   // All timers used in the COFF linker.
65349cc55cSDimitry Andric   Timer rootTimer;
66349cc55cSDimitry Andric   Timer inputFileTimer;
67349cc55cSDimitry Andric   Timer ltoTimer;
68349cc55cSDimitry Andric   Timer gcTimer;
69349cc55cSDimitry Andric   Timer icfTimer;
70349cc55cSDimitry Andric 
71349cc55cSDimitry Andric   // Writer timers.
72349cc55cSDimitry Andric   Timer codeLayoutTimer;
73349cc55cSDimitry Andric   Timer outputCommitTimer;
74349cc55cSDimitry Andric   Timer totalMapTimer;
75349cc55cSDimitry Andric   Timer symbolGatherTimer;
76349cc55cSDimitry Andric   Timer symbolStringsTimer;
77349cc55cSDimitry Andric   Timer writeTimer;
78349cc55cSDimitry Andric 
79349cc55cSDimitry Andric   // PDB timers.
80349cc55cSDimitry Andric   Timer totalPdbLinkTimer;
81349cc55cSDimitry Andric   Timer addObjectsTimer;
82349cc55cSDimitry Andric   Timer typeMergingTimer;
83349cc55cSDimitry Andric   Timer loadGHashTimer;
84349cc55cSDimitry Andric   Timer mergeGHashTimer;
85349cc55cSDimitry Andric   Timer symbolMergingTimer;
86349cc55cSDimitry Andric   Timer publicsLayoutTimer;
87349cc55cSDimitry Andric   Timer tpiStreamLayoutTimer;
88349cc55cSDimitry Andric   Timer diskCommitTimer;
89*bdd1243dSDimitry Andric 
90*bdd1243dSDimitry Andric   Configuration config;
91349cc55cSDimitry Andric };
92349cc55cSDimitry Andric 
93*bdd1243dSDimitry Andric } // namespace lld::coff
94349cc55cSDimitry Andric 
95349cc55cSDimitry Andric #endif
96