Skip to content

Commit 8cb8f0c

Browse files
Add AddrSpacePtr type
1 parent 3631d91 commit 8cb8f0c

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
@@ -142,3 +142,11 @@ getindex(b::RefArray) = b.x[b.i]
142142
setindex!(b::RefArray, x) = (b.x[b.i] = x; b)
143143

144144
###
145+
146+
"""
147+
AddrSpacePtr{T, AS}
148+
149+
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.
150+
This type is mainly used to ensure Julia's codegen uses the correct address space when calling LLVM intrinsics.
151+
"""
152+
Core.AddrSpacePtr

src/builtins.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1371,6 +1371,7 @@ void jl_init_primitives(void) JL_GC_DISABLED
13711371
add_builtin("CodeInfo", (jl_value_t*)jl_code_info_type);
13721372
add_builtin("Ref", (jl_value_t*)jl_ref_type);
13731373
add_builtin("Ptr", (jl_value_t*)jl_pointer_type);
1374+
add_builtin("AddrSpacePtr", (jl_value_t*)jl_addrspace_pointer_type);
13741375
add_builtin("Task", (jl_value_t*)jl_task_type);
13751376

13761377
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
@@ -1141,6 +1141,11 @@ std::string generate_func_sig(const char *fname)
11411141
t = T_pint8;
11421142
isboxed = false;
11431143
}
1144+
else if (llvmcall && jl_is_addrspace_ptr_type(tti)) {
1145+
t = bitstype_to_llvm(tti, true);
1146+
tti = (jl_value_t*)jl_voidpointer_type;
1147+
isboxed = false;
1148+
}
11441149
else {
11451150
if (jl_is_primitivetype(tti)) {
11461151
// 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; // deprecated
119121
jl_datatype_t *jl_nothing_type;
120122
jl_datatype_t *jl_voidpointer_type;
@@ -2237,6 +2239,15 @@ void jl_init_types(void) JL_GC_DISABLED
22372239
sizeof(void*)*8)->name->wrapper;
22382240
jl_pointer_typename = ((jl_datatype_t*)jl_unwrap_unionall((jl_value_t*)jl_pointer_type))->name;
22392241

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

src/julia.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -645,8 +645,10 @@ extern JL_DLLEXPORT jl_datatype_t *jl_nothing_type JL_GLOBALLY_ROOTED;
645645
extern JL_DLLEXPORT jl_datatype_t *jl_signed_type JL_GLOBALLY_ROOTED;
646646
extern JL_DLLEXPORT jl_datatype_t *jl_voidpointer_type JL_GLOBALLY_ROOTED;
647647
extern JL_DLLEXPORT jl_unionall_t *jl_pointer_type JL_GLOBALLY_ROOTED;
648+
extern JL_DLLEXPORT jl_unionall_t *jl_addrspace_pointer_type JL_GLOBALLY_ROOTED;
648649
extern JL_DLLEXPORT jl_unionall_t *jl_ref_type JL_GLOBALLY_ROOTED;
649650
extern JL_DLLEXPORT jl_typename_t *jl_pointer_typename JL_GLOBALLY_ROOTED;
651+
extern JL_DLLEXPORT jl_typename_t *jl_addrspace_pointer_typename JL_GLOBALLY_ROOTED;
650652
extern JL_DLLEXPORT jl_typename_t *jl_namedtuple_typename JL_GLOBALLY_ROOTED;
651653
extern JL_DLLEXPORT jl_unionall_t *jl_namedtuple_type JL_GLOBALLY_ROOTED;
652654
extern JL_DLLEXPORT jl_datatype_t *jl_task_type JL_GLOBALLY_ROOTED;
@@ -1160,6 +1162,12 @@ STATIC_INLINE int jl_is_cpointer_type(jl_value_t *t) JL_NOTSAFEPOINT
11601162
((jl_datatype_t*)(t))->name == ((jl_datatype_t*)jl_pointer_type->body)->name);
11611163
}
11621164

1165+
STATIC_INLINE int jl_is_addrspace_ptr_type(jl_value_t *t) JL_NOTSAFEPOINT
1166+
{
1167+
return (jl_is_datatype(t) &&
1168+
((jl_datatype_t*)(t))->name == jl_addrspace_pointer_typename);
1169+
}
1170+
11631171
STATIC_INLINE int jl_is_abstract_ref_type(jl_value_t *t) JL_NOTSAFEPOINT
11641172
{
11651173
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_nothing_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)