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 "PDB.h"
18#include "SymbolTable.h"
19#include "Writer.h"
20#include "lld/Common/CommonLinkerContext.h"
21#include "lld/Common/Timer.h"
22
23namespace lld::coff {
24
25class COFFLinkerContext : public CommonLinkerContext {
26public:
27 COFFLinkerContext();
28 COFFLinkerContext(const COFFLinkerContext &) = delete;
29 COFFLinkerContext &operator=(const COFFLinkerContext &) = delete;
30 ~COFFLinkerContext() = default;
31
32 LinkerDriver driver;
33 SymbolTable symtab;
34 COFFOptTable optTable;
35
36 // A native ARM64 symbol table on ARM64X target.
37 std::optional<SymbolTable> hybridSymtab;
38
39 // Returns the appropriate symbol table for the specified machine type.
40 SymbolTable &getSymtab(llvm::COFF::MachineTypes machine) {
41 if (hybridSymtab && machine == ARM64)
42 return *hybridSymtab;
43 return symtab;
44 }
45
46 // Invoke the specified callback for each symbol table.
47 void forEachSymtab(std::function<void(SymbolTable &symtab)> f) {
48 // If present, process the native symbol table first.
49 if (hybridSymtab)
50 f(*hybridSymtab);
51 f(symtab);
52 }
53
54 // Invoke the specified callback for each active symbol table,
55 // skipping the native symbol table on pure ARM64EC targets.
56 void forEachActiveSymtab(std::function<void(SymbolTable &symtab)> f) {
57 if (symtab.ctx.config.machine == ARM64X)
58 f(*hybridSymtab);
59 f(symtab);
60 }
61
62 std::vector<ObjFile *> objFileInstances;
63 std::map<std::string, PDBInputFile *> pdbInputFileInstances;
64 std::vector<ImportFile *> importFileInstances;
65 std::int64_t consumedInputsSize = 0;
66
67 MergeChunk *mergeChunkInstances[Log2MaxSectionAlignment + 1] = {};
68
69 /// All sources of type information in the program.
70 std::vector<TpiSource *> tpiSourceList;
71
72 void addTpiSource(TpiSource *tpi) { tpiSourceList.push_back(x: tpi); }
73
74 std::map<llvm::codeview::GUID, TpiSource *> typeServerSourceMappings;
75 std::map<uint32_t, TpiSource *> precompSourceMappings;
76
77 /// List of all output sections. After output sections are finalized, this
78 /// can be indexed by getOutputSection.
79 std::vector<OutputSection *> outputSections;
80
81 OutputSection *getOutputSection(const Chunk *c) const {
82 return c->osidx == 0 ? nullptr : outputSections[c->osidx - 1];
83 }
84
85 // Fake sections for parsing bitcode files.
86 FakeSection ltoTextSection;
87 FakeSection ltoDataSection;
88 FakeSectionChunk ltoTextSectionChunk;
89 FakeSectionChunk ltoDataSectionChunk;
90
91 // All timers used in the COFF linker.
92 Timer rootTimer;
93 Timer inputFileTimer;
94 Timer ltoTimer;
95 Timer gcTimer;
96 Timer icfTimer;
97
98 // Writer timers.
99 Timer codeLayoutTimer;
100 Timer outputCommitTimer;
101 Timer totalMapTimer;
102 Timer symbolGatherTimer;
103 Timer symbolStringsTimer;
104 Timer writeTimer;
105
106 // PDB timers.
107 Timer totalPdbLinkTimer;
108 Timer addObjectsTimer;
109 Timer typeMergingTimer;
110 Timer loadGHashTimer;
111 Timer mergeGHashTimer;
112 Timer symbolMergingTimer;
113 Timer publicsLayoutTimer;
114 Timer tpiStreamLayoutTimer;
115 Timer diskCommitTimer;
116
117 std::optional<PDBStats> pdbStats;
118
119 Configuration config;
120
121 DynamicRelocsChunk *dynamicRelocs = nullptr;
122};
123
124} // namespace lld::coff
125
126#endif
127