Skip to content

Commit 28764be

Browse files
committed
Inline jl_sigatomic_begin and jl_sigatomic_end
1 parent f1b9092 commit 28764be

File tree

3 files changed

+66
-10
lines changed

3 files changed

+66
-10
lines changed

src/ccall.cpp

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1243,17 +1243,54 @@ static jl_cgval_t emit_ccall(jl_value_t **args, size_t nargs, jl_codectx_t *ctx)
12431243
assert(!isVa);
12441244
assert(nargt == 0);
12451245
JL_GC_POP();
1246-
#ifdef LLVM39
1247-
builder.CreateFence(AtomicOrdering::SequentiallyConsistent, SingleThread);
1248-
#else
1249-
builder.CreateFence(SequentiallyConsistent, SingleThread);
1250-
#endif
1246+
emit_signal_fence();
12511247
builder.CreateLoad(ctx->signalPage, true);
1252-
#ifdef LLVM39
1253-
builder.CreateFence(AtomicOrdering::SequentiallyConsistent, SingleThread);
1254-
#else
1255-
builder.CreateFence(SequentiallyConsistent, SingleThread);
1256-
#endif
1248+
emit_signal_fence();
1249+
return ghostValue(jl_void_type);
1250+
}
1251+
if (fptr == &jl_sigatomic_begin ||
1252+
((!f_lib || (intptr_t)f_lib == 2) && f_name &&
1253+
strcmp(f_name, "jl_sigatomic_begin") == 0)) {
1254+
assert(lrt == T_void);
1255+
assert(!isVa);
1256+
assert(nargt == 0);
1257+
JL_GC_POP();
1258+
Value *pdefer_sig = emit_defer_signal(ctx);
1259+
Value *defer_sig = builder.CreateLoad(pdefer_sig);
1260+
defer_sig = builder.CreateAdd(defer_sig,
1261+
ConstantInt::get(T_sigatomic, 1));
1262+
builder.CreateStore(defer_sig, pdefer_sig);
1263+
emit_signal_fence();
1264+
return ghostValue(jl_void_type);
1265+
}
1266+
if (fptr == &jl_sigatomic_end ||
1267+
((!f_lib || (intptr_t)f_lib == 2) && f_name &&
1268+
strcmp(f_name, "jl_sigatomic_end") == 0)) {
1269+
assert(lrt == T_void);
1270+
assert(!isVa);
1271+
assert(nargt == 0);
1272+
JL_GC_POP();
1273+
Value *pdefer_sig = emit_defer_signal(ctx);
1274+
Value *defer_sig = builder.CreateLoad(pdefer_sig);
1275+
emit_signal_fence();
1276+
error_unless(builder.CreateICmpNE(defer_sig,
1277+
ConstantInt::get(T_sigatomic, 0)),
1278+
"sigatomic_end called in non-sigatomic region", ctx);
1279+
defer_sig = builder.CreateSub(defer_sig,
1280+
ConstantInt::get(T_sigatomic, 1));
1281+
builder.CreateStore(defer_sig, pdefer_sig);
1282+
BasicBlock *checkBB = BasicBlock::Create(jl_LLVMContext, "check",
1283+
ctx->f);
1284+
BasicBlock *contBB = BasicBlock::Create(jl_LLVMContext, "cont");
1285+
builder.CreateCondBr(
1286+
builder.CreateICmpEQ(defer_sig, ConstantInt::get(T_sigatomic, 0)),
1287+
checkBB, contBB);
1288+
builder.SetInsertPoint(checkBB);
1289+
builder.CreateLoad(builder.CreateConstGEP1_32(ctx->signalPage, -1),
1290+
true);
1291+
builder.CreateBr(contBB);
1292+
ctx->f->getBasicBlockList().push_back(contBB);
1293+
builder.SetInsertPoint(contBB);
12571294
return ghostValue(jl_void_type);
12581295
}
12591296
if (fptr == (void(*)(void))&jl_is_leaf_type ||

src/cgutils.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1717,3 +1717,20 @@ static Value *emit_exc_in_transit(jl_codectx_t *ctx)
17171717
Constant *offset = ConstantInt::getSigned(T_int32, offsetof(jl_tls_states_t, exception_in_transit) / sizeof(void*));
17181718
return builder.CreateGEP(pexc_in_transit, ArrayRef<Value*>(offset), "jl_exception_in_transit");
17191719
}
1720+
1721+
static void emit_signal_fence(void)
1722+
{
1723+
#ifdef LLVM39
1724+
builder.CreateFence(AtomicOrdering::SequentiallyConsistent, SingleThread);
1725+
#else
1726+
builder.CreateFence(SequentiallyConsistent, SingleThread);
1727+
#endif
1728+
}
1729+
1730+
static Value *emit_defer_signal(jl_codectx_t *ctx)
1731+
{
1732+
Value *ptls = builder.CreateBitCast(ctx->ptlsStates,
1733+
PointerType::get(T_sigatomic, 0));
1734+
Constant *offset = ConstantInt::getSigned(T_int32, offsetof(jl_tls_states_t, defer_signal) / sizeof(sig_atomic_t));
1735+
return builder.CreateGEP(ptls, ArrayRef<Value*>(offset), "jl_defer_signal");
1736+
}

src/codegen.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ static IntegerType *T_uint64;
246246

247247
static IntegerType *T_char;
248248
static IntegerType *T_size;
249+
static IntegerType *T_sigatomic;
249250

250251
static Type *T_float16;
251252
static Type *T_float32;
@@ -4970,6 +4971,7 @@ static void init_julia_llvm_env(Module *m)
49704971
T_size = T_uint64;
49714972
else
49724973
T_size = T_uint32;
4974+
T_sigatomic = Type::getIntNTy(jl_LLVMContext, sizeof(sig_atomic_t) * 8);
49734975
T_psize = PointerType::get(T_size, 0);
49744976
T_float16 = Type::getHalfTy(jl_LLVMContext);
49754977
T_float32 = Type::getFloatTy(jl_LLVMContext);

0 commit comments

Comments
 (0)