InitializeThreading.cpp [plain text]
#include "config.h"
#include "InitializeThreading.h"
#include "ExecutableAllocator.h"
#include "JITOperationList.h"
#include "JSCConfig.h"
#include "JSCPtrTag.h"
#include "LLIntData.h"
#include "Options.h"
#include "SigillCrashAnalyzer.h"
#include "SuperSampler.h"
#include "VMTraps.h"
#include "WasmCalleeRegistry.h"
#include "WasmCapabilities.h"
#include "WasmFaultSignalHandler.h"
#include "WasmThunks.h"
#include <mutex>
#include <wtf/Threading.h>
#include <wtf/threads/Signals.h>
namespace JSC {
static_assert(sizeof(bool) == 1, "LLInt and JIT assume sizeof(bool) is always 1 when touching it directly from assembly code.");
void initialize()
{
static std::once_flag onceFlag;
std::call_once(onceFlag, [] {
WTF::initialize();
Options::initialize();
initializePtrTagLookup();
#if ENABLE(WRITE_BARRIER_PROFILING)
WriteBarrierCounters::initialize();
#endif
{
Options::AllowUnfinalizedAccessScope scope;
JITOperationList::initialize();
ExecutableAllocator::initialize();
VM::computeCanUseJIT();
if (!g_jscConfig.vm.canUseJIT) {
Options::useJIT() = false;
Options::recomputeDependentOptions();
}
}
Options::finalize();
JITOperationList::populatePointersInJavaScriptCore();
if (Options::useSigillCrashAnalyzer())
enableSigillCrashAnalyzer();
LLInt::initialize();
DisallowGC::initialize();
initializeSuperSampler();
Thread& thread = Thread::current();
thread.setSavedLastStackTop(thread.stack().origin());
#if ENABLE(WEBASSEMBLY)
if (Wasm::isSupported()) {
Wasm::Thunks::initialize();
Wasm::CalleeRegistry::initialize();
}
#endif
if (VM::isInMiniMode())
WTF::fastEnableMiniMode();
#if HAVE(MACH_EXCEPTIONS)
WTF::startMachExceptionHandlerThread();
#endif
VMTraps::initializeSignals();
#if ENABLE(WEBASSEMBLY)
Wasm::prepareFastMemory();
#endif
WTF::compilerFence();
RELEASE_ASSERT(!g_jscConfig.initializeHasBeenCalled);
g_jscConfig.initializeHasBeenCalled = true;
});
}
}