Skip to content

Commit 2b83127

Browse files
Add AddrSpacePtr type
1 parent 3058112 commit 2b83127

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
@@ -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
@@ -1139,6 +1139,11 @@ std::string generate_func_sig(const char *fname)
11391139
t = T_pint8;
11401140
isboxed = false;
11411141
}
1142+
else if (llvmcall && jl_is_addrspace_ptr_type(tti)) {
1143+
t = bitstype_to_llvm(tti, true);
1144+
tti = (jl_value_t*)jl_voidpointer_type;
1145+
isboxed = false;
1146+
}
11421147
else {
11431148
if (jl_is_primitivetype(tti)) {
11441149
// 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
@@ -561,6 +561,19 @@ static Type *bitstype_to_llvm(jl_value_t *bt, bool llvmcall = false)
561561
return T_float32;
562562
if (bt == (jl_value_t*)jl_float64_type)
563563
return T_float64;
564+
if (jl_is_addrspace_ptr_type(bt)) {
565+
int as = 0;
566+
567+
jl_datatype_t *typ = (jl_datatype_t*)bt;
568+
jl_value_t *as_param = jl_svecref(typ->parameters, 1);
569+
570+
if (jl_is_int32(as_param))
571+
as = jl_unbox_int32(as_param);
572+
else if (jl_is_int64(as_param))
573+
as = jl_unbox_int64(as_param);
574+
575+
return PointerType::get(T_int8, as);
576+
}
564577
int nb = jl_datatype_size(bt);
565578
return Type::getIntNTy(jl_LLVMContext, nb * 8);
566579
}

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;
@@ -2236,6 +2238,15 @@ void jl_init_types(void) JL_GC_DISABLED
22362238
sizeof(void*)*8)->name->wrapper;
22372239
jl_pointer_typename = ((jl_datatype_t*)jl_unwrap_unionall((jl_value_t*)jl_pointer_type))->name;
22382240

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