@@ -1368,8 +1368,8 @@ static const auto jlgetabiconverter_func = new JuliaFunction<TypeFnContextAndSiz
13681368 XSTR (jl_get_abi_converter),
13691369 [](LLVMContext &C, Type *T_size) {
13701370 Type *T_ptr = getPointerTy (C);
1371- return FunctionType::get (T_ptr,
1372- {T_ptr, T_ptr, T_ptr, T_ptr}, false ); },
1371+ return FunctionType::get (T_ptr, {T_ptr, T_ptr}, false );
1372+ },
13731373 nullptr ,
13741374};
13751375static const auto diff_gc_total_bytes_func = new JuliaFunction<>{
@@ -7167,26 +7167,23 @@ static jl_cgval_t emit_abi_call(jl_codectx_t &ctx, jl_value_t *declrt, jl_value_
71677167 Type *T_size = ctx.types ().T_size ;
71687168 Constant *Vnull = ConstantPointerNull::get (T_ptr);
71697169 Module *M = jl_Module;
7170- GlobalVariable *theFptr = new GlobalVariable (*M, T_ptr, false ,
7171- GlobalVariable::PrivateLinkage,
7172- Vnull);
7173- GlobalVariable *last_world_p = new GlobalVariable (*M, T_size, false ,
7174- GlobalVariable::PrivateLinkage,
7175- ConstantInt::get (T_size, 0 ));
7176- ArrayType *T_cfuncdata = ArrayType::get (T_ptr, 6 );
7170+ ArrayType *T_cfuncdata = ArrayType::get (T_ptr, 8 );
71777171 size_t flags = specsig;
71787172 GlobalVariable *cfuncdata = new GlobalVariable (*M, T_cfuncdata, false ,
71797173 GlobalVariable::PrivateLinkage,
71807174 ConstantArray::get (T_cfuncdata, {
7175+ Vnull,
7176+ Vnull,
71817177 Vnull,
71827178 Vnull,
71837179 Vnull,
71847180 literal_pointer_val_slot (ctx.emission_context , M, declrt),
71857181 literal_pointer_val_slot (ctx.emission_context , M, sigt),
71867182 literal_static_pointer_val ((void *)flags, T_ptr)}));
7183+ Value *last_world_p = ctx.builder .CreateConstInBoundsGEP1_32 (ctx.types ().T_size , cfuncdata, 1 );
71877184 LoadInst *last_world_v = ctx.builder .CreateAlignedLoad (T_size, last_world_p, ctx.types ().alignof_ptr );
71887185 last_world_v->setOrdering (AtomicOrdering::Acquire);
7189- LoadInst *callee = ctx.builder .CreateAlignedLoad (T_ptr, theFptr , ctx.types ().alignof_ptr );
7186+ LoadInst *callee = ctx.builder .CreateAlignedLoad (T_ptr, cfuncdata , ctx.types ().alignof_ptr );
71907187 callee->setOrdering (AtomicOrdering::Monotonic);
71917188 LoadInst *world_v = ctx.builder .CreateAlignedLoad (ctx.types ().T_size ,
71927189 prepare_global_in (M, jlgetworld_global), ctx.types ().alignof_ptr );
@@ -7195,15 +7192,11 @@ static jl_cgval_t emit_abi_call(jl_codectx_t &ctx, jl_value_t *declrt, jl_value_
71957192 Value *age_not_ok = ctx.builder .CreateICmpNE (last_world_v, world_v);
71967193 Value *target = emit_guarded_test (ctx, age_not_ok, callee, [&] {
71977194 Function *getcaller = prepare_call (jlgetabiconverter_func);
7198- CallInst *cw = ctx.builder .CreateCall (getcaller, {
7199- get_current_task (ctx),
7200- theFptr,
7201- last_world_p,
7202- cfuncdata});
7195+ CallInst *cw = ctx.builder .CreateCall (getcaller, {get_current_task (ctx), cfuncdata});
72037196 cw->setAttributes (getcaller->getAttributes ());
72047197 return cw;
72057198 });
7206- ctx.emission_context .cfuncs .push_back ({declrt, sigt, nargs, specsig, theFptr, cfuncdata});
7199+ ctx.emission_context .cfuncs .push_back ({declrt, sigt, nargs, specsig, cfuncdata});
72077200 if (specsig) {
72087201 // TODO: could we force this to guarantee passing a box for `f` here (since we
72097202 // know we had it here) and on the receiver end (emit_abi_converter /
0 commit comments