Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions base/compiler/tfuncs.jl
Original file line number Diff line number Diff line change
Expand Up @@ -184,8 +184,6 @@ add_tfunc(sdiv_int, 2, 2, math_tfunc, 30)
add_tfunc(udiv_int, 2, 2, math_tfunc, 30)
add_tfunc(srem_int, 2, 2, math_tfunc, 30)
add_tfunc(urem_int, 2, 2, math_tfunc, 30)
add_tfunc(add_ptr, 2, 2, math_tfunc, 1)
add_tfunc(sub_ptr, 2, 2, math_tfunc, 1)
add_tfunc(neg_float, 1, 1, math_tfunc, 1)
add_tfunc(add_float, 2, 2, math_tfunc, 1)
add_tfunc(sub_float, 2, 2, math_tfunc, 1)
Expand Down Expand Up @@ -664,6 +662,9 @@ function pointer_eltype(@nospecialize(ptr))
return Any
end

@nospecs function pointerarith_tfunc(𝕃::AbstractLattice, ptr, offset)
return ptr
end
@nospecs function pointerref_tfunc(𝕃::AbstractLattice, a, i, align)
return pointer_eltype(a)
end
Expand Down Expand Up @@ -707,6 +708,8 @@ end
end
return ccall(:jl_apply_cmpswap_type, Any, (Any,), T) where T
end
add_tfunc(add_ptr, 2, 2, pointerarith_tfunc, 1)
add_tfunc(sub_ptr, 2, 2, pointerarith_tfunc, 1)
add_tfunc(pointerref, 3, 3, pointerref_tfunc, 4)
add_tfunc(pointerset, 4, 4, pointerset_tfunc, 5)
add_tfunc(atomic_fence, 1, 1, atomic_fence_tfunc, 4)
Expand Down
18 changes: 16 additions & 2 deletions src/runtime_intrinsics.c
Original file line number Diff line number Diff line change
Expand Up @@ -1158,10 +1158,8 @@ JL_DLLEXPORT jl_value_t *jl_##name(jl_value_t *a, jl_value_t *b, jl_value_t *c)
un_iintrinsic_fast(LLVMNeg, neg, neg_int, u)
#define add(a,b) a + b
bi_iintrinsic_fast(LLVMAdd, add, add_int, u)
bi_iintrinsic_fast(LLVMAdd, add, add_ptr, u)
#define sub(a,b) a - b
bi_iintrinsic_fast(LLVMSub, sub, sub_int, u)
bi_iintrinsic_fast(LLVMSub, sub, sub_ptr, u)
#define mul(a,b) a * b
bi_iintrinsic_fast(LLVMMul, mul, mul_int, u)
#define div(a,b) a / b
Expand Down Expand Up @@ -1472,3 +1470,19 @@ JL_DLLEXPORT jl_value_t *jl_have_fma(jl_value_t *typ)
else
return jl_false;
}

JL_DLLEXPORT jl_value_t *jl_add_ptr(jl_value_t *ptr, jl_value_t *offset)
{
JL_TYPECHK(add_ptr, pointer, ptr);
JL_TYPECHK(add_ptr, ulong, offset);
char *ptrval = (char*)jl_unbox_long(ptr) + jl_unbox_ulong(offset);
return jl_new_bits(jl_typeof(ptr), &ptrval);
}

JL_DLLEXPORT jl_value_t *jl_sub_ptr(jl_value_t *ptr, jl_value_t *offset)
{
JL_TYPECHK(sub_ptr, pointer, ptr);
JL_TYPECHK(sub_ptr, ulong, offset);
char *ptrval = (char*)jl_unbox_long(ptr) - jl_unbox_ulong(offset);
return jl_new_bits(jl_typeof(ptr), &ptrval);
}
8 changes: 8 additions & 0 deletions test/intrinsics.jl
Original file line number Diff line number Diff line change
Expand Up @@ -361,3 +361,11 @@ Base.show(io::IO, a::IntWrap) = print(io, "IntWrap(", a.x, ")")
@test r2 isa IntWrap && r2.x === 103 === r[].x && r2 !== r[]
end
end)()

@testset "Pointer Arithmatic" begin
@test_intrinsic Core.Intrinsics.add_ptr Ptr{Int}(1) UInt(1) Ptr{Int}(2)
@test_throws TypeError Core.Intrinsics.add_ptr(Ptr{Int}(1), 1)
@test_intrinsic Core.Intrinsics.sub_ptr Ptr{Int}(1) UInt(1) Ptr{Int}(0)
@test_throws TypeError Core.Intrinsics.sub_ptr(Ptr{Int}(1), 1)
end