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