[K/N][codegen][runtime] Removed remnants of main thread init logic
This commit is contained in:
+2
-3
@@ -387,7 +387,6 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
|||||||
val parameterScope = ParameterScope(fileInitFunction, functionGenerationContext)
|
val parameterScope = ParameterScope(fileInitFunction, functionGenerationContext)
|
||||||
using(parameterScope) usingParameterScope@{
|
using(parameterScope) usingParameterScope@{
|
||||||
using(VariableScope()) usingVariableScope@{
|
using(VariableScope()) usingVariableScope@{
|
||||||
// TODO: remove unused parameter.
|
|
||||||
context.llvm.initializersGenerationState.topLevelFields
|
context.llvm.initializersGenerationState.topLevelFields
|
||||||
.filter { it.storageKind == FieldStorageKind.THREAD_LOCAL }
|
.filter { it.storageKind == FieldStorageKind.THREAD_LOCAL }
|
||||||
.filterNot { it.shouldBeInitializedEagerly }
|
.filterNot { it.shouldBeInitializedEagerly }
|
||||||
@@ -789,7 +788,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
|||||||
if (declaration.origin == DECLARATION_ORIGIN_FILE_GLOBAL_INITIALIZER) {
|
if (declaration.origin == DECLARATION_ORIGIN_FILE_GLOBAL_INITIALIZER) {
|
||||||
require(context.llvm.initializersGenerationState.globalInitFunction == null) { "There can only be at most one global file initializer" }
|
require(context.llvm.initializersGenerationState.globalInitFunction == null) { "There can only be at most one global file initializer" }
|
||||||
require(body == null) { "The body of file initializer should be null" }
|
require(body == null) { "The body of file initializer should be null" }
|
||||||
require(declaration.valueParameters.singleOrNull()?.type == context.irBuiltIns.booleanType) { "File initializer must take a single boolean parameter" }
|
require(declaration.valueParameters.isEmpty()) { "File initializer must be parameterless" }
|
||||||
require(declaration.returnsUnit()) { "File initializer must return Unit" }
|
require(declaration.returnsUnit()) { "File initializer must return Unit" }
|
||||||
context.llvm.initializersGenerationState.globalInitFunction = declaration
|
context.llvm.initializersGenerationState.globalInitFunction = declaration
|
||||||
context.llvm.initializersGenerationState.globalInitState = getGlobalInitStateFor(declaration.parent as IrFile)
|
context.llvm.initializersGenerationState.globalInitState = getGlobalInitStateFor(declaration.parent as IrFile)
|
||||||
@@ -798,7 +797,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
|||||||
|| declaration.origin == DECLARATION_ORIGIN_FILE_STANDALONE_THREAD_LOCAL_INITIALIZER) {
|
|| declaration.origin == DECLARATION_ORIGIN_FILE_STANDALONE_THREAD_LOCAL_INITIALIZER) {
|
||||||
require(context.llvm.initializersGenerationState.threadLocalInitFunction == null) { "There can only be at most one thread local file initializer" }
|
require(context.llvm.initializersGenerationState.threadLocalInitFunction == null) { "There can only be at most one thread local file initializer" }
|
||||||
require(body == null) { "The body of file initializer should be null" }
|
require(body == null) { "The body of file initializer should be null" }
|
||||||
require(declaration.valueParameters.singleOrNull()?.type == context.irBuiltIns.booleanType) { "File initializer must take a single boolean parameter" }
|
require(declaration.valueParameters.isEmpty()) { "File initializer must be parameterless" }
|
||||||
require(declaration.returnsUnit()) { "File initializer must return Unit" }
|
require(declaration.returnsUnit()) { "File initializer must return Unit" }
|
||||||
context.llvm.initializersGenerationState.threadLocalInitFunction = declaration
|
context.llvm.initializersGenerationState.threadLocalInitFunction = declaration
|
||||||
context.llvm.initializersGenerationState.threadLocalInitState = getThreadLocalInitStateFor(declaration.parent as IrFile)
|
context.llvm.initializersGenerationState.threadLocalInitState = getThreadLocalInitStateFor(declaration.parent as IrFile)
|
||||||
|
|||||||
+1
-2
@@ -41,7 +41,7 @@ internal val IrFunction.isFileInitializer: Boolean
|
|||||||
|| origin == DECLARATION_ORIGIN_FILE_STANDALONE_THREAD_LOCAL_INITIALIZER
|
|| origin == DECLARATION_ORIGIN_FILE_STANDALONE_THREAD_LOCAL_INITIALIZER
|
||||||
|
|
||||||
internal fun IrBuilderWithScope.irCallFileInitializer(initializer: IrFunctionSymbol) =
|
internal fun IrBuilderWithScope.irCallFileInitializer(initializer: IrFunctionSymbol) =
|
||||||
irCall(initializer).apply { putValueArgument(0, irFalse()) }
|
irCall(initializer)
|
||||||
|
|
||||||
internal val IrField.shouldBeInitializedEagerly: Boolean
|
internal val IrField.shouldBeInitializedEagerly: Boolean
|
||||||
get() {
|
get() {
|
||||||
@@ -106,7 +106,6 @@ internal class FileInitializersLowering(val context: Context) : FileLoweringPass
|
|||||||
returnType = context.irBuiltIns.unitType
|
returnType = context.irBuiltIns.unitType
|
||||||
}.apply {
|
}.apply {
|
||||||
parent = irFile
|
parent = irFile
|
||||||
addValueParameter("isMainThread", context.irBuiltIns.booleanType)
|
|
||||||
irFile.declarations.add(0, this)
|
irFile.declarations.add(0, this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -73,8 +73,6 @@ constexpr RuntimeState* kInvalidRuntime = nullptr;
|
|||||||
|
|
||||||
THREAD_LOCAL_VARIABLE RuntimeState* runtimeState = kInvalidRuntime;
|
THREAD_LOCAL_VARIABLE RuntimeState* runtimeState = kInvalidRuntime;
|
||||||
|
|
||||||
volatile int mainThreadId = 0;
|
|
||||||
|
|
||||||
inline bool isValidRuntime() {
|
inline bool isValidRuntime() {
|
||||||
return ::runtimeState != kInvalidRuntime;
|
return ::runtimeState != kInvalidRuntime;
|
||||||
}
|
}
|
||||||
@@ -137,7 +135,6 @@ RuntimeState* initRuntime() {
|
|||||||
CommitTLSStorage(result->memoryState);
|
CommitTLSStorage(result->memoryState);
|
||||||
// Keep global variables in state as well.
|
// Keep global variables in state as well.
|
||||||
if (firstRuntime) {
|
if (firstRuntime) {
|
||||||
mainThreadId = konan::currentThreadId();
|
|
||||||
konan::consoleInit();
|
konan::consoleInit();
|
||||||
#if KONAN_OBJC_INTEROP
|
#if KONAN_OBJC_INTEROP
|
||||||
Kotlin_ObjCExport_initialize();
|
Kotlin_ObjCExport_initialize();
|
||||||
@@ -418,7 +415,7 @@ static constexpr int FILE_BEING_INITIALIZED = 1;
|
|||||||
static constexpr int FILE_INITIALIZED = 2;
|
static constexpr int FILE_INITIALIZED = 2;
|
||||||
static constexpr int FILE_FAILED_TO_INITIALIZE = 3;
|
static constexpr int FILE_FAILED_TO_INITIALIZE = 3;
|
||||||
|
|
||||||
void CallInitGlobalPossiblyLock(int volatile* state, void (*init)(bool)) {
|
void CallInitGlobalPossiblyLock(int volatile* state, void (*init)()) {
|
||||||
int localState = *state;
|
int localState = *state;
|
||||||
if (localState == FILE_INITIALIZED) return;
|
if (localState == FILE_INITIALIZED) return;
|
||||||
if (localState == FILE_FAILED_TO_INITIALIZE)
|
if (localState == FILE_FAILED_TO_INITIALIZE)
|
||||||
@@ -437,10 +434,10 @@ void CallInitGlobalPossiblyLock(int volatile* state, void (*init)(bool)) {
|
|||||||
if (compareAndSwap(state, FILE_NOT_INITIALIZED, FILE_BEING_INITIALIZED | (threadId << 2)) == FILE_NOT_INITIALIZED) {
|
if (compareAndSwap(state, FILE_NOT_INITIALIZED, FILE_BEING_INITIALIZED | (threadId << 2)) == FILE_NOT_INITIALIZED) {
|
||||||
// actual initialization
|
// actual initialization
|
||||||
#if KONAN_NO_EXCEPTIONS
|
#if KONAN_NO_EXCEPTIONS
|
||||||
init(threadId == mainThreadId);
|
init();
|
||||||
#else
|
#else
|
||||||
try {
|
try {
|
||||||
init(threadId == mainThreadId);
|
init();
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
*state = FILE_FAILED_TO_INITIALIZE;
|
*state = FILE_FAILED_TO_INITIALIZE;
|
||||||
throw;
|
throw;
|
||||||
@@ -456,15 +453,15 @@ void CallInitGlobalPossiblyLock(int volatile* state, void (*init)(bool)) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CallInitThreadLocal(int volatile* globalState, int* localState, void (*init)(bool)) {
|
void CallInitThreadLocal(int volatile* globalState, int* localState, void (*init)()) {
|
||||||
if (*localState == FILE_FAILED_TO_INITIALIZE || (globalState != nullptr && *globalState == FILE_FAILED_TO_INITIALIZE))
|
if (*localState == FILE_FAILED_TO_INITIALIZE || (globalState != nullptr && *globalState == FILE_FAILED_TO_INITIALIZE))
|
||||||
ThrowFileFailedToInitializeException();
|
ThrowFileFailedToInitializeException();
|
||||||
*localState = FILE_INITIALIZED;
|
*localState = FILE_INITIALIZED;
|
||||||
#if KONAN_NO_EXCEPTIONS
|
#if KONAN_NO_EXCEPTIONS
|
||||||
init(konan::currentThreadId() == mainThreadId);
|
init();
|
||||||
#else
|
#else
|
||||||
try {
|
try {
|
||||||
init(konan::currentThreadId() == mainThreadId);
|
init();
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
*localState = FILE_FAILED_TO_INITIALIZE;
|
*localState = FILE_FAILED_TO_INITIALIZE;
|
||||||
throw;
|
throw;
|
||||||
|
|||||||
@@ -38,8 +38,8 @@ void Kotlin_shutdownRuntime();
|
|||||||
// Appends given node to an initializer list.
|
// Appends given node to an initializer list.
|
||||||
void AppendToInitializersTail(struct InitNode*);
|
void AppendToInitializersTail(struct InitNode*);
|
||||||
|
|
||||||
void CallInitGlobalPossiblyLock(int volatile* state, void (*init)(bool));
|
void CallInitGlobalPossiblyLock(int volatile* state, void (*init)());
|
||||||
void CallInitThreadLocal(int volatile* globalState, int* localState, void (*init)(bool));
|
void CallInitThreadLocal(int volatile* globalState, int* localState, void (*init)());
|
||||||
|
|
||||||
bool Kotlin_memoryLeakCheckerEnabled();
|
bool Kotlin_memoryLeakCheckerEnabled();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user