mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-27 13:30:05 +00:00
Remove support for runtime multi-threading.
This patch removes the functions llvm_start_multithreaded() and llvm_stop_multithreaded(), and changes llvm_is_multithreaded() to return a constant value based on the value of the compile-time definition LLVM_ENABLE_THREADS. Previously, it was possible to have compile-time support for threads on, and runtime support for threads off, in which case certain mutexes were not allocated or ever acquired. Now, if the build is created with threads enabled, mutexes are always acquired. A test before/after patch of compiling a very large TU showed no noticeable performance impact of this change. Reviewers: rnk Differential Revision: http://reviews.llvm.org/D4076 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210600 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
159e408563
commit
529e9d307e
@ -2848,16 +2848,13 @@ void LLVMDisposePassManager(LLVMPassManagerRef PM);
|
|||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** Allocate and initialize structures needed to make LLVM safe for
|
/** Deprecated: Multi-threading can only be enabled/disabled with the compile
|
||||||
multithreading. The return value indicates whether multithreaded
|
time define LLVM_ENABLE_THREADS. This function always returns
|
||||||
initialization succeeded. Must be executed in isolation from all
|
LLVMIsMultithreaded(). */
|
||||||
other LLVM api calls.
|
|
||||||
@see llvm::llvm_start_multithreaded */
|
|
||||||
LLVMBool LLVMStartMultithreaded(void);
|
LLVMBool LLVMStartMultithreaded(void);
|
||||||
|
|
||||||
/** Deallocate structures necessary to make LLVM safe for multithreading.
|
/** Deprecated: Multi-threading can only be enabled/disabled with the compile
|
||||||
Must be executed in isolation from all other LLVM api calls.
|
time define LLVM_ENABLE_THREADS. */
|
||||||
@see llvm::llvm_stop_multithreaded */
|
|
||||||
void LLVMStopMultithreaded(void);
|
void LLVMStopMultithreaded(void);
|
||||||
|
|
||||||
/** Check whether LLVM is executing in thread-safe mode or not.
|
/** Check whether LLVM is executing in thread-safe mode or not.
|
||||||
|
@ -103,9 +103,6 @@ void llvm_shutdown();
|
|||||||
/// llvm_shutdown() when it is destroyed.
|
/// llvm_shutdown() when it is destroyed.
|
||||||
struct llvm_shutdown_obj {
|
struct llvm_shutdown_obj {
|
||||||
llvm_shutdown_obj() { }
|
llvm_shutdown_obj() { }
|
||||||
explicit llvm_shutdown_obj(bool multithreaded) {
|
|
||||||
if (multithreaded) llvm_start_multithreaded();
|
|
||||||
}
|
|
||||||
~llvm_shutdown_obj() { llvm_shutdown(); }
|
~llvm_shutdown_obj() { llvm_shutdown(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -14,33 +14,33 @@
|
|||||||
#ifndef LLVM_SUPPORT_THREADING_H
|
#ifndef LLVM_SUPPORT_THREADING_H
|
||||||
#define LLVM_SUPPORT_THREADING_H
|
#define LLVM_SUPPORT_THREADING_H
|
||||||
|
|
||||||
|
#include "llvm/Config/llvm-config.h"
|
||||||
|
#include "llvm/Support/Compiler.h"
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
/// llvm_start_multithreaded - Allocate and initialize structures needed to
|
|
||||||
/// make LLVM safe for multithreading. The return value indicates whether
|
|
||||||
/// multithreaded initialization succeeded. LLVM will still be operational
|
|
||||||
/// on "failed" return, and will still be safe for hosting threading
|
|
||||||
/// applications in the JIT, but will not be safe for concurrent calls to the
|
|
||||||
/// LLVM APIs.
|
|
||||||
/// THIS MUST EXECUTE IN ISOLATION FROM ALL OTHER LLVM API CALLS.
|
|
||||||
bool llvm_start_multithreaded();
|
|
||||||
|
|
||||||
/// llvm_stop_multithreaded - Deallocate structures necessary to make LLVM
|
#if LLVM_ENABLE_THREADS != 0
|
||||||
/// safe for multithreading.
|
typedef std::mutex mutex;
|
||||||
/// THIS MUST EXECUTE IN ISOLATION FROM ALL OTHER LLVM API CALLS.
|
typedef std::recursive_mutex recursive_mutex;
|
||||||
void llvm_stop_multithreaded();
|
#else
|
||||||
|
class null_mutex {
|
||||||
|
public:
|
||||||
|
void lock() { }
|
||||||
|
void unlock() { }
|
||||||
|
bool try_lock() { return true; }
|
||||||
|
};
|
||||||
|
typedef null_mutex mutex;
|
||||||
|
typedef null_mutex recursive_mutex;
|
||||||
|
#endif
|
||||||
|
|
||||||
/// llvm_is_multithreaded - Check whether LLVM is executing in thread-safe
|
/// llvm_get_global_lock() - returns the llvm global lock object.
|
||||||
/// mode or not.
|
llvm::recursive_mutex &llvm_get_global_lock();
|
||||||
|
|
||||||
|
/// llvm_is_multithreaded() - returns true if LLVM is compiled with support
|
||||||
|
/// for multiple threads, and false otherwise.
|
||||||
bool llvm_is_multithreaded();
|
bool llvm_is_multithreaded();
|
||||||
|
|
||||||
/// acquire_global_lock - Acquire the global lock. This is a no-op if called
|
|
||||||
/// before llvm_start_multithreaded().
|
|
||||||
void llvm_acquire_global_lock();
|
|
||||||
|
|
||||||
/// release_global_lock - Release the global lock. This is a no-op if called
|
|
||||||
/// before llvm_start_multithreaded().
|
|
||||||
void llvm_release_global_lock();
|
|
||||||
|
|
||||||
/// llvm_execute_on_thread - Execute the given \p UserFn on a separate
|
/// llvm_execute_on_thread - Execute the given \p UserFn on a separate
|
||||||
/// thread, passing it the provided \p UserData.
|
/// thread, passing it the provided \p UserData.
|
||||||
///
|
///
|
||||||
|
@ -2702,11 +2702,10 @@ void LLVMDisposePassManager(LLVMPassManagerRef PM) {
|
|||||||
/*===-- Threading ------------------------------------------------------===*/
|
/*===-- Threading ------------------------------------------------------===*/
|
||||||
|
|
||||||
LLVMBool LLVMStartMultithreaded() {
|
LLVMBool LLVMStartMultithreaded() {
|
||||||
return llvm_start_multithreaded();
|
return LLVMIsMultithreaded();
|
||||||
}
|
}
|
||||||
|
|
||||||
void LLVMStopMultithreaded() {
|
void LLVMStopMultithreaded() {
|
||||||
llvm_stop_multithreaded();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LLVMBool LLVMIsMultithreaded() {
|
LLVMBool LLVMIsMultithreaded() {
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "llvm/Support/raw_ostream.h"
|
#include "llvm/Support/raw_ostream.h"
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
#if defined(HAVE_UNISTD_H)
|
#if defined(HAVE_UNISTD_H)
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
@ -37,16 +38,18 @@ using namespace llvm;
|
|||||||
static fatal_error_handler_t ErrorHandler = nullptr;
|
static fatal_error_handler_t ErrorHandler = nullptr;
|
||||||
static void *ErrorHandlerUserData = nullptr;
|
static void *ErrorHandlerUserData = nullptr;
|
||||||
|
|
||||||
|
static llvm::recursive_mutex ErrorHandlerMutex;
|
||||||
|
|
||||||
void llvm::install_fatal_error_handler(fatal_error_handler_t handler,
|
void llvm::install_fatal_error_handler(fatal_error_handler_t handler,
|
||||||
void *user_data) {
|
void *user_data) {
|
||||||
assert(!llvm_is_multithreaded() &&
|
std::lock_guard<llvm::recursive_mutex> Lock(ErrorHandlerMutex);
|
||||||
"Cannot register error handlers after starting multithreaded mode!\n");
|
|
||||||
assert(!ErrorHandler && "Error handler already registered!\n");
|
assert(!ErrorHandler && "Error handler already registered!\n");
|
||||||
ErrorHandler = handler;
|
ErrorHandler = handler;
|
||||||
ErrorHandlerUserData = user_data;
|
ErrorHandlerUserData = user_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void llvm::remove_fatal_error_handler() {
|
void llvm::remove_fatal_error_handler() {
|
||||||
|
std::lock_guard<llvm::recursive_mutex> Lock(ErrorHandlerMutex);
|
||||||
ErrorHandler = nullptr;
|
ErrorHandler = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,6 +66,7 @@ void llvm::report_fatal_error(StringRef Reason, bool GenCrashDiag) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void llvm::report_fatal_error(const Twine &Reason, bool GenCrashDiag) {
|
void llvm::report_fatal_error(const Twine &Reason, bool GenCrashDiag) {
|
||||||
|
std::lock_guard<llvm::recursive_mutex> Lock(ErrorHandlerMutex);
|
||||||
if (ErrorHandler) {
|
if (ErrorHandler) {
|
||||||
ErrorHandler(ErrorHandlerUserData, Reason.str(), GenCrashDiag);
|
ErrorHandler(ErrorHandlerUserData, Reason.str(), GenCrashDiag);
|
||||||
} else {
|
} else {
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include "llvm/Config/config.h"
|
#include "llvm/Config/config.h"
|
||||||
#include "llvm/Support/Atomic.h"
|
#include "llvm/Support/Atomic.h"
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
#include <mutex>
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
static const ManagedStaticBase *StaticList = nullptr;
|
static const ManagedStaticBase *StaticList = nullptr;
|
||||||
@ -23,7 +24,7 @@ void ManagedStaticBase::RegisterManagedStatic(void *(*Creator)(),
|
|||||||
void (*Deleter)(void*)) const {
|
void (*Deleter)(void*)) const {
|
||||||
assert(Creator);
|
assert(Creator);
|
||||||
if (llvm_is_multithreaded()) {
|
if (llvm_is_multithreaded()) {
|
||||||
llvm_acquire_global_lock();
|
std::lock_guard<llvm::recursive_mutex> Lock(llvm_get_global_lock());
|
||||||
|
|
||||||
if (!Ptr) {
|
if (!Ptr) {
|
||||||
void* tmp = Creator();
|
void* tmp = Creator();
|
||||||
@ -44,7 +45,6 @@ void ManagedStaticBase::RegisterManagedStatic(void *(*Creator)(),
|
|||||||
StaticList = this;
|
StaticList = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
llvm_release_global_lock();
|
|
||||||
} else {
|
} else {
|
||||||
assert(!Ptr && !DeleterFn && !Next &&
|
assert(!Ptr && !DeleterFn && !Next &&
|
||||||
"Partially initialized ManagedStatic!?");
|
"Partially initialized ManagedStatic!?");
|
||||||
@ -77,6 +77,4 @@ void ManagedStaticBase::destroy() const {
|
|||||||
void llvm::llvm_shutdown() {
|
void llvm::llvm_shutdown() {
|
||||||
while (StaticList)
|
while (StaticList)
|
||||||
StaticList->destroy();
|
StaticList->destroy();
|
||||||
|
|
||||||
if (llvm_is_multithreaded()) llvm_stop_multithreaded();
|
|
||||||
}
|
}
|
||||||
|
@ -19,50 +19,19 @@
|
|||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
static bool multithreaded_mode = false;
|
llvm::recursive_mutex& llvm::llvm_get_global_lock() {
|
||||||
|
static llvm::recursive_mutex global_lock;
|
||||||
|
return global_lock;
|
||||||
|
}
|
||||||
|
|
||||||
static sys::Mutex* global_lock = nullptr;
|
bool llvm::llvm_is_multithreaded() {
|
||||||
|
|
||||||
bool llvm::llvm_start_multithreaded() {
|
|
||||||
#if LLVM_ENABLE_THREADS != 0
|
#if LLVM_ENABLE_THREADS != 0
|
||||||
assert(!multithreaded_mode && "Already multithreaded!");
|
|
||||||
multithreaded_mode = true;
|
|
||||||
global_lock = new sys::Mutex(true);
|
|
||||||
|
|
||||||
// We fence here to ensure that all initialization is complete BEFORE we
|
|
||||||
// return from llvm_start_multithreaded().
|
|
||||||
sys::MemoryFence();
|
|
||||||
return true;
|
return true;
|
||||||
#else
|
#else
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void llvm::llvm_stop_multithreaded() {
|
|
||||||
#if LLVM_ENABLE_THREADS != 0
|
|
||||||
assert(multithreaded_mode && "Not currently multithreaded!");
|
|
||||||
|
|
||||||
// We fence here to insure that all threaded operations are complete BEFORE we
|
|
||||||
// return from llvm_stop_multithreaded().
|
|
||||||
sys::MemoryFence();
|
|
||||||
|
|
||||||
multithreaded_mode = false;
|
|
||||||
delete global_lock;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
bool llvm::llvm_is_multithreaded() {
|
|
||||||
return multithreaded_mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
void llvm::llvm_acquire_global_lock() {
|
|
||||||
if (multithreaded_mode) global_lock->acquire();
|
|
||||||
}
|
|
||||||
|
|
||||||
void llvm::llvm_release_global_lock() {
|
|
||||||
if (multithreaded_mode) global_lock->release();
|
|
||||||
}
|
|
||||||
|
|
||||||
#if LLVM_ENABLE_THREADS != 0 && defined(HAVE_PTHREAD_H)
|
#if LLVM_ENABLE_THREADS != 0 && defined(HAVE_PTHREAD_H)
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
|
||||||
|
@ -84,14 +84,13 @@ static TimerGroup *getDefaultTimerGroup() {
|
|||||||
sys::MemoryFence();
|
sys::MemoryFence();
|
||||||
if (tmp) return tmp;
|
if (tmp) return tmp;
|
||||||
|
|
||||||
llvm_acquire_global_lock();
|
std::lock_guard<llvm::recursive_mutex> Lock(llvm::llvm_get_global_lock());
|
||||||
tmp = DefaultTimerGroup;
|
tmp = DefaultTimerGroup;
|
||||||
if (!tmp) {
|
if (!tmp) {
|
||||||
tmp = new TimerGroup("Miscellaneous Ungrouped Timers");
|
tmp = new TimerGroup("Miscellaneous Ungrouped Timers");
|
||||||
sys::MemoryFence();
|
sys::MemoryFence();
|
||||||
DefaultTimerGroup = tmp;
|
DefaultTimerGroup = tmp;
|
||||||
}
|
}
|
||||||
llvm_release_global_lock();
|
|
||||||
|
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user