[lld] Move Threads to Common

Summary:
This will allow using the functionality from other linkers. It is also
a prerequisite for sharing the error logging code.

Reviewers: ruiu

Reviewed By: ruiu

Subscribers: emaste, mgorny, llvm-commits

Differential Revision: https://reviews.llvm.org/D38822

llvm-svn: 315725
This commit is contained in:
Bob Haarman 2017-10-13 18:22:55 +00:00
parent bfc20343a3
commit 4f5c8c29ac
14 changed files with 27 additions and 26 deletions

View File

@ -5,6 +5,7 @@ endif()
add_lld_library(lldCommon add_lld_library(lldCommon
Reproduce.cpp Reproduce.cpp
TargetOptionsCommandFlags.cpp TargetOptionsCommandFlags.cpp
Threads.cpp
Version.cpp Version.cpp
ADDITIONAL_HEADER_DIRS ADDITIONAL_HEADER_DIRS

View File

@ -7,13 +7,15 @@
// //
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
#include "Threads.h" #include "lld/Common/Threads.h"
#include <thread> #include <thread>
static std::vector<std::thread> Threads; static std::vector<std::thread> Threads;
bool lld::ThreadsEnabled = true;
// Runs a given function in a new thread. // Runs a given function in a new thread.
void lld::elf::runBackground(std::function<void()> Fn) { void lld::runBackground(std::function<void()> Fn) {
Threads.emplace_back(Fn); Threads.emplace_back(Fn);
} }
@ -22,7 +24,7 @@ void lld::elf::runBackground(std::function<void()> Fn) {
// You need to call this function from the main thread before exiting // You need to call this function from the main thread before exiting
// because it is not defined what will happen to non-main threads when // because it is not defined what will happen to non-main threads when
// the main thread exits. // the main thread exits.
void lld::elf::waitForBackgroundThreads() { void lld::waitForBackgroundThreads() {
for (std::thread &T : Threads) for (std::thread &T : Threads)
if (T.joinable()) if (T.joinable())
T.join(); T.join();

View File

@ -40,7 +40,6 @@ add_lld_library(lldELF
Symbols.cpp Symbols.cpp
SyntheticSections.cpp SyntheticSections.cpp
Target.cpp Target.cpp
Threads.cpp
Thunks.cpp Thunks.cpp
Writer.cpp Writer.cpp

View File

@ -139,7 +139,6 @@ struct Configuration {
bool Static = false; bool Static = false;
bool SysvHash = false; bool SysvHash = false;
bool Target1Rel; bool Target1Rel;
bool Threads;
bool Trace; bool Trace;
bool Verbose; bool Verbose;
bool WarnCommon; bool WarnCommon;

View File

@ -38,9 +38,9 @@
#include "SymbolTable.h" #include "SymbolTable.h"
#include "SyntheticSections.h" #include "SyntheticSections.h"
#include "Target.h" #include "Target.h"
#include "Threads.h"
#include "Writer.h" #include "Writer.h"
#include "lld/Common/Driver.h" #include "lld/Common/Driver.h"
#include "lld/Common/Threads.h"
#include "lld/Common/Version.h" #include "lld/Common/Version.h"
#include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringSwitch.h" #include "llvm/ADT/StringSwitch.h"
@ -684,7 +684,7 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) {
parseCachePruningPolicy(Args.getLastArgValue(OPT_thinlto_cache_policy)), parseCachePruningPolicy(Args.getLastArgValue(OPT_thinlto_cache_policy)),
"--thinlto-cache-policy: invalid cache policy"); "--thinlto-cache-policy: invalid cache policy");
Config->ThinLTOJobs = getInteger(Args, OPT_thinlto_jobs, -1u); Config->ThinLTOJobs = getInteger(Args, OPT_thinlto_jobs, -1u);
Config->Threads = getArg(Args, OPT_threads, OPT_no_threads, true); ThreadsEnabled = getArg(Args, OPT_threads, OPT_no_threads, true);
Config->Trace = Args.hasArg(OPT_trace); Config->Trace = Args.hasArg(OPT_trace);
Config->Undefined = getArgs(Args, OPT_undefined); Config->Undefined = getArgs(Args, OPT_undefined);
Config->UnresolvedSymbols = getUnresolvedSymbolPolicy(Args); Config->UnresolvedSymbols = getUnresolvedSymbolPolicy(Args);

View File

@ -9,7 +9,8 @@
#include "Error.h" #include "Error.h"
#include "Config.h" #include "Config.h"
#include "Threads.h"
#include "lld/Common/Threads.h"
#include "llvm/ADT/Twine.h" #include "llvm/ADT/Twine.h"
#include "llvm/Support/Error.h" #include "llvm/Support/Error.h"

View File

@ -13,7 +13,7 @@
#include "Filesystem.h" #include "Filesystem.h"
#include "Config.h" #include "Config.h"
#include "Threads.h" #include "lld/Common/Threads.h"
#include "llvm/Support/FileOutputBuffer.h" #include "llvm/Support/FileOutputBuffer.h"
#include "llvm/Support/FileSystem.h" #include "llvm/Support/FileSystem.h"
@ -38,7 +38,7 @@ using namespace lld::elf;
// This function spawns a background thread to call unlink. // This function spawns a background thread to call unlink.
// The calling thread returns almost immediately. // The calling thread returns almost immediately.
void elf::unlinkAsync(StringRef Path) { void elf::unlinkAsync(StringRef Path) {
if (!Config->Threads || !sys::fs::exists(Config->OutputFile) || if (!ThreadsEnabled || !sys::fs::exists(Config->OutputFile) ||
!sys::fs::is_regular_file(Config->OutputFile)) !sys::fs::is_regular_file(Config->OutputFile))
return; return;

View File

@ -76,7 +76,7 @@
#include "ICF.h" #include "ICF.h"
#include "Config.h" #include "Config.h"
#include "SymbolTable.h" #include "SymbolTable.h"
#include "Threads.h" #include "lld/Common/Threads.h"
#include "llvm/ADT/Hashing.h" #include "llvm/ADT/Hashing.h"
#include "llvm/BinaryFormat/ELF.h" #include "llvm/BinaryFormat/ELF.h"
#include "llvm/Object/ELF.h" #include "llvm/Object/ELF.h"
@ -366,7 +366,7 @@ template <class ELFT>
void ICF<ELFT>::forEachClass(std::function<void(size_t, size_t)> Fn) { void ICF<ELFT>::forEachClass(std::function<void(size_t, size_t)> Fn) {
// If threading is disabled or the number of sections are // If threading is disabled or the number of sections are
// too small to use threading, call Fn sequentially. // too small to use threading, call Fn sequentially.
if (!Config->Threads || Sections.size() < 1024) { if (!ThreadsEnabled || Sections.size() < 1024) {
forEachClassRange(0, Sections.size(), Fn); forEachClassRange(0, Sections.size(), Fn);
++Cnt; ++Cnt;
return; return;

View File

@ -21,8 +21,8 @@
#include "Symbols.h" #include "Symbols.h"
#include "SyntheticSections.h" #include "SyntheticSections.h"
#include "Target.h" #include "Target.h"
#include "Threads.h"
#include "Writer.h" #include "Writer.h"
#include "lld/Common/Threads.h"
#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringRef.h"
#include "llvm/BinaryFormat/ELF.h" #include "llvm/BinaryFormat/ELF.h"

View File

@ -26,7 +26,8 @@
#include "Strings.h" #include "Strings.h"
#include "SymbolTable.h" #include "SymbolTable.h"
#include "SyntheticSections.h" #include "SyntheticSections.h"
#include "Threads.h"
#include "lld/Common/Threads.h"
#include "llvm/Support/raw_ostream.h" #include "llvm/Support/raw_ostream.h"

View File

@ -15,7 +15,7 @@
#include "SymbolTable.h" #include "SymbolTable.h"
#include "SyntheticSections.h" #include "SyntheticSections.h"
#include "Target.h" #include "Target.h"
#include "Threads.h" #include "lld/Common/Threads.h"
#include "llvm/BinaryFormat/Dwarf.h" #include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/Support/Compression.h" #include "llvm/Support/Compression.h"
#include "llvm/Support/MD5.h" #include "llvm/Support/MD5.h"

View File

@ -24,8 +24,8 @@
#include "Strings.h" #include "Strings.h"
#include "SymbolTable.h" #include "SymbolTable.h"
#include "Target.h" #include "Target.h"
#include "Threads.h"
#include "Writer.h" #include "Writer.h"
#include "lld/Common/Threads.h"
#include "lld/Common/Version.h" #include "lld/Common/Version.h"
#include "llvm/BinaryFormat/Dwarf.h" #include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/DebugInfo/DWARF/DWARFDebugPubTable.h" #include "llvm/DebugInfo/DWARF/DWARFDebugPubTable.h"
@ -2258,7 +2258,7 @@ void MergeNoTailSection::finalizeContents() {
// Concurrency level. Must be a power of 2 to avoid expensive modulo // Concurrency level. Must be a power of 2 to avoid expensive modulo
// operations in the following tight loop. // operations in the following tight loop.
size_t Concurrency = 1; size_t Concurrency = 1;
if (Config->Threads) if (ThreadsEnabled)
Concurrency = Concurrency =
std::min<size_t>(PowerOf2Floor(hardware_concurrency()), NumShards); std::min<size_t>(PowerOf2Floor(hardware_concurrency()), NumShards);

View File

@ -19,7 +19,7 @@
#include "SymbolTable.h" #include "SymbolTable.h"
#include "SyntheticSections.h" #include "SyntheticSections.h"
#include "Target.h" #include "Target.h"
#include "Threads.h" #include "lld/Common/Threads.h"
#include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringSwitch.h" #include "llvm/ADT/StringSwitch.h"
#include "llvm/Support/FileOutputBuffer.h" #include "llvm/Support/FileOutputBuffer.h"

View File

@ -56,19 +56,18 @@
// //
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
#ifndef LLD_ELF_THREADS_H #ifndef LLD_COMMON_THREADS_H
#define LLD_ELF_THREADS_H #define LLD_COMMON_THREADS_H
#include "Config.h"
#include "llvm/Support/Parallel.h" #include "llvm/Support/Parallel.h"
#include <functional> #include <functional>
namespace lld { namespace lld {
namespace elf {
extern bool ThreadsEnabled;
template <typename R, class FuncTy> void parallelForEach(R &&Range, FuncTy Fn) { template <typename R, class FuncTy> void parallelForEach(R &&Range, FuncTy Fn) {
if (Config->Threads) if (ThreadsEnabled)
for_each(llvm::parallel::par, std::begin(Range), std::end(Range), Fn); for_each(llvm::parallel::par, std::begin(Range), std::end(Range), Fn);
else else
for_each(llvm::parallel::seq, std::begin(Range), std::end(Range), Fn); for_each(llvm::parallel::seq, std::begin(Range), std::end(Range), Fn);
@ -76,7 +75,7 @@ template <typename R, class FuncTy> void parallelForEach(R &&Range, FuncTy Fn) {
inline void parallelForEachN(size_t Begin, size_t End, inline void parallelForEachN(size_t Begin, size_t End,
std::function<void(size_t)> Fn) { std::function<void(size_t)> Fn) {
if (Config->Threads) if (ThreadsEnabled)
for_each_n(llvm::parallel::par, Begin, End, Fn); for_each_n(llvm::parallel::par, Begin, End, Fn);
else else
for_each_n(llvm::parallel::seq, Begin, End, Fn); for_each_n(llvm::parallel::seq, Begin, End, Fn);
@ -85,7 +84,6 @@ inline void parallelForEachN(size_t Begin, size_t End,
void runBackground(std::function<void()> Fn); void runBackground(std::function<void()> Fn);
void waitForBackgroundThreads(); void waitForBackgroundThreads();
} // namespace elf
} // namespace lld } // namespace lld
#endif #endif