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