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
22namespace lld::coff {
23
24class COFFLinkerContext : public CommonLinkerContext {
25public:
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
45 void addTpiSource(TpiSource *tpi) { tpiSourceList.push_back(x: 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
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