@@ -1243,17 +1243,54 @@ static jl_cgval_t emit_ccall(jl_value_t **args, size_t nargs, jl_codectx_t *ctx)
1243
1243
assert (!isVa);
1244
1244
assert (nargt == 0 );
1245
1245
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 ();
1251
1247
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);
1257
1294
return ghostValue (jl_void_type);
1258
1295
}
1259
1296
if (fptr == (void (*)(void ))&jl_is_leaf_type ||
0 commit comments