forked from OSchip/llvm-project
[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:
parent
bfc20343a3
commit
4f5c8c29ac
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
Loading…
Reference in New Issue