-
Notifications
You must be signed in to change notification settings - Fork 11k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[LLD] Remove global state in lld/COFF
This patch removes globals from the lldCOFF library, by moving globals into a context class (COFFLinkingContext) and passing it around wherever it's needed. See https://lists.llvm.org/pipermail/llvm-dev/2021-June/151184.html for context about removing globals from LLD. I also haven't moved the `driver` or `config` variables yet. Differential Revision: https://reviews.llvm.org/D109634
- Loading branch information
Showing
37 changed files
with
692 additions
and
607 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
//===- COFFContext.cpp ----------------------------------------------------===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// Description | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "COFFLinkerContext.h" | ||
#include "lld/Common/Memory.h" | ||
#include "llvm/DebugInfo/CodeView/TypeHashing.h" | ||
|
||
namespace lld { | ||
namespace coff { | ||
|
||
COFFLinkerContext::COFFLinkerContext() | ||
: symtab(*this), rootTimer("Total Linking Time"), | ||
inputFileTimer("Input File Reading", rootTimer), | ||
ltoTimer("LTO", rootTimer), gcTimer("GC", rootTimer), | ||
icfTimer("ICF", rootTimer), codeLayoutTimer("Code Layout", rootTimer), | ||
outputCommitTimer("Commit Output File", rootTimer), | ||
totalMapTimer("MAP Emission (Cumulative)", rootTimer), | ||
symbolGatherTimer("Gather Symbols", totalMapTimer), | ||
symbolStringsTimer("Build Symbol strings", totalMapTimer), | ||
writeTimer("Write to File", totalMapTimer), | ||
totalPdbLinkTimer("PDB Emission (Cumulative)", rootTimer), | ||
addObjectsTimer("Add Objects", totalPdbLinkTimer), | ||
symbolMergingTimer("Symbol Merging", addObjectsTimer), | ||
typeMergingTimer("Type Merging", addObjectsTimer), | ||
tpiStreamLayoutTimer("TPI Stream Layout", totalPdbLinkTimer), | ||
publicsLayoutTimer("Publics Stream Layout", totalPdbLinkTimer), | ||
diskCommitTimer("Commit to Disk", totalPdbLinkTimer), | ||
loadGHashTimer("Global Type Hashing", addObjectsTimer), | ||
mergeGHashTimer("GHash Type Merging", addObjectsTimer) {} | ||
|
||
COFFLinkerContext::~COFFLinkerContext() { clearGHashes(); } | ||
|
||
void COFFLinkerContext::clearGHashes() { | ||
for (TpiSource *src : tpiSourceList) { | ||
if (src->ownedGHashes) | ||
delete[] src->ghashes.data(); | ||
src->ghashes = {}; | ||
src->isItemIndex.clear(); | ||
src->uniqueTypes.clear(); | ||
} | ||
} | ||
|
||
} // namespace coff | ||
} // namespace lld |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
//===- COFFLinkerContext.h --------------------------------------*- C++ -*-===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLD_COFF_COFFLinkerContext_H | ||
#define LLD_COFF_COFFLinkerContext_H | ||
|
||
#include "Chunks.h" | ||
#include "Config.h" | ||
#include "DebugTypes.h" | ||
#include "InputFiles.h" | ||
#include "SymbolTable.h" | ||
#include "Writer.h" | ||
#include "lld/Common/Timer.h" | ||
|
||
namespace lld { | ||
namespace coff { | ||
|
||
class COFFLinkerContext { | ||
public: | ||
COFFLinkerContext(); | ||
COFFLinkerContext(const COFFLinkerContext &) = delete; | ||
COFFLinkerContext &operator=(const COFFLinkerContext &) = delete; | ||
~COFFLinkerContext(); | ||
|
||
void addTpiSource(TpiSource *tpi) { tpiSourceList.push_back(tpi); } | ||
|
||
/// Free heap allocated ghashes. | ||
void clearGHashes(); | ||
|
||
SymbolTable symtab; | ||
|
||
std::vector<ObjFile *> objFileInstances; | ||
std::map<std::string, PDBInputFile *> pdbInputFileInstances; | ||
std::vector<ImportFile *> importFileInstances; | ||
std::vector<BitcodeFile *> bitcodeFileInstances; | ||
|
||
MergeChunk *mergeChunkInstances[Log2MaxSectionAlignment + 1] = {}; | ||
|
||
/// All sources of type information in the program. | ||
std::vector<TpiSource *> tpiSourceList; | ||
|
||
std::map<llvm::codeview::GUID, TpiSource *> typeServerSourceMappings; | ||
std::map<uint32_t, TpiSource *> precompSourceMappings; | ||
|
||
/// List of all output sections. After output sections are finalized, this | ||
/// can be indexed by getOutputSection. | ||
std::vector<OutputSection *> outputSections; | ||
|
||
OutputSection *getOutputSection(const Chunk *c) const { | ||
return c->osidx == 0 ? nullptr : outputSections[c->osidx - 1]; | ||
} | ||
|
||
// All timers used in the COFF linker. | ||
Timer rootTimer; | ||
Timer inputFileTimer; | ||
Timer ltoTimer; | ||
Timer gcTimer; | ||
Timer icfTimer; | ||
|
||
// Writer timers. | ||
Timer codeLayoutTimer; | ||
Timer outputCommitTimer; | ||
Timer totalMapTimer; | ||
Timer symbolGatherTimer; | ||
Timer symbolStringsTimer; | ||
Timer writeTimer; | ||
|
||
// PDB timers. | ||
Timer totalPdbLinkTimer; | ||
Timer addObjectsTimer; | ||
Timer symbolMergingTimer; | ||
Timer typeMergingTimer; | ||
Timer tpiStreamLayoutTimer; | ||
Timer publicsLayoutTimer; | ||
Timer diskCommitTimer; | ||
Timer loadGHashTimer; | ||
Timer mergeGHashTimer; | ||
}; | ||
|
||
} // namespace coff | ||
} // namespace lld | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.