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