Skip to content

Commit 8f1218a

Browse files
thomasfaingnaertKristofferC
authored andcommitted
Add AddrSpacePtr type
(cherry picked from commit 8cb8f0c)
1 parent e54a0de commit 8f1218a

File tree

8 files changed

+51
-2
lines changed

8 files changed

+51
-2
lines changed

base/refpointer.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,3 +132,11 @@ getindex(b::RefArray) = b.x[b.i]
132132
setindex!(b::RefArray, x) = (b.x[b.i] = x; b)
133133

134134
###
135+
136+
"""
137+
AddrSpacePtr{T, AS}
138+
139+
When passed as a `ccall` argument with the `llvmcall` calling convention, an `AddrSpacePtr` will be converted to an LLVM pointer type with the correct address space.
140+
This type is mainly used to ensure Julia's codegen uses the correct address space when calling LLVM intrinsics.
141+
"""
142+
Core.AddrSpacePtr

src/builtins.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1373,6 +1373,7 @@ void jl_init_primitives(void) JL_GC_DISABLED
13731373
add_builtin("CodeInfo", (jl_value_t*)jl_code_info_type);
13741374
add_builtin("Ref", (jl_value_t*)jl_ref_type);
13751375
add_builtin("Ptr", (jl_value_t*)jl_pointer_type);
1376+
add_builtin("AddrSpacePtr", (jl_value_t*)jl_addrspace_pointer_type);
13761377
add_builtin("Task", (jl_value_t*)jl_task_type);
13771378

13781379
add_builtin("AbstractArray", (jl_value_t*)jl_abstractarray_type);

src/ccall.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1145,6 +1145,11 @@ std::string generate_func_sig(const char *fname)
11451145
t = T_pint8;
11461146
isboxed = false;
11471147
}
1148+
else if (llvmcall && jl_is_addrspace_ptr_type(tti)) {
1149+
t = bitstype_to_llvm(tti, true);
1150+
tti = (jl_value_t*)jl_voidpointer_type;
1151+
isboxed = false;
1152+
}
11481153
else {
11491154
if (jl_is_primitivetype(tti)) {
11501155
// see pull req #978. need to annotate signext/zeroext for

src/cgutils.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,19 @@ static Type *bitstype_to_llvm(jl_value_t *bt, bool llvmcall = false)
571571
return T_float32;
572572
if (bt == (jl_value_t*)jl_float64_type)
573573
return T_float64;
574+
if (jl_is_addrspace_ptr_type(bt)) {
575+
int as = 0;
576+
577+
jl_datatype_t *typ = (jl_datatype_t*)bt;
578+
jl_value_t *as_param = jl_svecref(typ->parameters, 1);
579+
580+
if (jl_is_int32(as_param))
581+
as = jl_unbox_int32(as_param);
582+
else if (jl_is_int64(as_param))
583+
as = jl_unbox_int64(as_param);
584+
585+
return PointerType::get(T_int8, as);
586+
}
574587
int nb = jl_datatype_size(bt);
575588
return Type::getIntNTy(jl_LLVMContext, nb * 8);
576589
}

src/jltypes.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ jl_datatype_t *jl_lineinfonode_type;
115115
jl_unionall_t *jl_ref_type;
116116
jl_unionall_t *jl_pointer_type;
117117
jl_typename_t *jl_pointer_typename;
118+
jl_unionall_t *jl_addrspace_pointer_type;
119+
jl_typename_t *jl_addrspace_pointer_typename;
118120
jl_datatype_t *jl_void_type;
119121
jl_datatype_t *jl_voidpointer_type;
120122
jl_typename_t *jl_namedtuple_typename;
@@ -2234,6 +2236,15 @@ void jl_init_types(void) JL_GC_DISABLED
22342236
sizeof(void*)*8)->name->wrapper;
22352237
jl_pointer_typename = ((jl_datatype_t*)jl_unwrap_unionall((jl_value_t*)jl_pointer_type))->name;
22362238

2239+
// AddrSpacePtr{T, AS} where {T, AS}
2240+
tv = jl_svec2(tvar("T"), tvar("AS"));
2241+
jl_svec_t *tv_base = jl_svec1(tvar("T"));
2242+
jl_addrspace_pointer_type = (jl_unionall_t*)
2243+
jl_new_primitivetype((jl_value_t*)jl_symbol("AddrSpacePtr"), core,
2244+
(jl_datatype_t*)jl_apply_type((jl_value_t*)jl_ref_type, jl_svec_data(tv_base), 1), tv,
2245+
sizeof(void*)*8)->name->wrapper;
2246+
jl_addrspace_pointer_typename = ((jl_datatype_t*)jl_unwrap_unionall((jl_value_t*)jl_addrspace_pointer_type))->name;
2247+
22372248
// Type{T} where T<:Tuple
22382249
tttvar = jl_new_typevar(jl_symbol("T"),
22392250
(jl_value_t*)jl_bottom_type,

src/julia.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,8 +644,10 @@ extern JL_DLLEXPORT jl_datatype_t *jl_void_type JL_GLOBALLY_ROOTED;
644644
extern JL_DLLEXPORT jl_datatype_t *jl_signed_type JL_GLOBALLY_ROOTED;
645645
extern JL_DLLEXPORT jl_datatype_t *jl_voidpointer_type JL_GLOBALLY_ROOTED;
646646
extern JL_DLLEXPORT jl_unionall_t *jl_pointer_type JL_GLOBALLY_ROOTED;
647+
extern JL_DLLEXPORT jl_unionall_t *jl_addrspace_pointer_type JL_GLOBALLY_ROOTED;
647648
extern JL_DLLEXPORT jl_unionall_t *jl_ref_type JL_GLOBALLY_ROOTED;
648649
extern JL_DLLEXPORT jl_typename_t *jl_pointer_typename JL_GLOBALLY_ROOTED;
650+
extern JL_DLLEXPORT jl_typename_t *jl_addrspace_pointer_typename JL_GLOBALLY_ROOTED;
649651
extern JL_DLLEXPORT jl_typename_t *jl_namedtuple_typename JL_GLOBALLY_ROOTED;
650652
extern JL_DLLEXPORT jl_unionall_t *jl_namedtuple_type JL_GLOBALLY_ROOTED;
651653
extern JL_DLLEXPORT jl_datatype_t *jl_task_type JL_GLOBALLY_ROOTED;
@@ -1159,6 +1161,12 @@ STATIC_INLINE int jl_is_cpointer_type(jl_value_t *t) JL_NOTSAFEPOINT
11591161
((jl_datatype_t*)(t))->name == ((jl_datatype_t*)jl_pointer_type->body)->name);
11601162
}
11611163

1164+
STATIC_INLINE int jl_is_addrspace_ptr_type(jl_value_t *t) JL_NOTSAFEPOINT
1165+
{
1166+
return (jl_is_datatype(t) &&
1167+
((jl_datatype_t*)(t))->name == jl_addrspace_pointer_typename);
1168+
}
1169+
11621170
STATIC_INLINE int jl_is_abstract_ref_type(jl_value_t *t) JL_NOTSAFEPOINT
11631171
{
11641172
return (jl_is_datatype(t) &&

src/staticdata.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ static void *const _tags[] = {
4141
&jl_linenumbernode_type, &jl_lineinfonode_type,
4242
&jl_gotonode_type, &jl_quotenode_type,
4343
&jl_pinode_type, &jl_phinode_type, &jl_phicnode_type, &jl_upsilonnode_type,
44-
&jl_type_type, &jl_bottom_type, &jl_ref_type, &jl_pointer_type,
44+
&jl_type_type, &jl_bottom_type, &jl_ref_type, &jl_pointer_type, &jl_addrspace_pointer_type,
4545
&jl_vararg_type, &jl_abstractarray_type,
4646
&jl_densearray_type, &jl_void_type, &jl_function_type, &jl_typeofbottom_type,
4747
&jl_unionall_type, &jl_typename_type, &jl_builtin_type, &jl_code_info_type,
@@ -57,7 +57,7 @@ static void *const _tags[] = {
5757
&jl_float16_type, &jl_float32_type, &jl_float64_type, &jl_floatingpoint_type,
5858
&jl_number_type, &jl_signed_type,
5959
// special typenames
60-
&jl_tuple_typename, &jl_pointer_typename, &jl_array_typename, &jl_type_typename,
60+
&jl_tuple_typename, &jl_pointer_typename, &jl_addrspace_pointer_typename, &jl_array_typename, &jl_type_typename,
6161
&jl_vararg_typename, &jl_namedtuple_typename,
6262
&jl_vecelement_typename,
6363
// special exceptions

test/llvmpasses/llvmcall.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,8 @@ emit(foo, NTuple{2, Float16})
1717
# CHECK: call <2 x half> @foo(<2 x half> %{{[0-9]+}})
1818
emit(foo, NTuple{2, VecElement{Float16}})
1919

20+
# CHECK: call i8 addrspace(3)* @foo(i8 addrspace(3)* %{{[0-9]+}})
21+
emit(foo, Core.AddrSpacePtr{Float32, 3})
22+
2023
# CHECK: define <2 x i16> @julia_bar_{{[0-9]+}}([2 x i16]
2124
emit(bar, NTuple{2, Float16})

0 commit comments

Comments
 (0)