From: Antoni Boucher <[email protected]>
gcc/jit/ChangeLog:
* libgccjit.cc: Allow cast between integers and pointers in
is_valid_cast.
gcc/testsuite/ChangeLog:
* jit.dg/test-cast.c: Add test case for pointer to int cast.
---
gcc/jit/libgccjit.cc | 4 +--
gcc/testsuite/jit.dg/test-cast.c | 43 +++++++++++++++++++++++++++++++-
2 files changed, 44 insertions(+), 3 deletions(-)
diff --git a/gcc/jit/libgccjit.cc b/gcc/jit/libgccjit.cc
index 33369447074..f35fe9e0b4b 100644
--- a/gcc/jit/libgccjit.cc
+++ b/gcc/jit/libgccjit.cc
@@ -2503,10 +2503,10 @@ is_valid_cast (gcc::jit::recording::type *src_type,
if (dst_is_int || dst_is_bool)
return true;
- /* Permit casts between pointer types. */
+ /* Permit casts between pointer types and integers and pointers. */
gcc::jit::recording::type *deref_src_type = src_type->is_pointer ();
gcc::jit::recording::type *deref_dst_type = dst_type->is_pointer ();
- if (deref_src_type && deref_dst_type)
+ if ((deref_src_type || src_is_int) && (deref_dst_type || dst_is_int))
return true;
return false;
diff --git a/gcc/testsuite/jit.dg/test-cast.c b/gcc/testsuite/jit.dg/test-cast.c
index 2b1e385ae40..9492d147a6d 100644
--- a/gcc/testsuite/jit.dg/test-cast.c
+++ b/gcc/testsuite/jit.dg/test-cast.c
@@ -15,9 +15,17 @@ my_casts (int x)
{
return (char)(long) x;
}
+
+int
+ptrtoint (int *y)
+{
+ return (int) y;
+}
*/
gcc_jit_type *int_type =
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT);
+ gcc_jit_type *int_ptr_type =
+ gcc_jit_type_get_pointer (int_type);
gcc_jit_type *long_type =
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_LONG);
gcc_jit_type *return_type =
@@ -50,17 +58,50 @@ my_casts (int x)
),
return_type
));
+
+ gcc_jit_param *y =
+ gcc_jit_context_new_param (
+ ctxt,
+ NULL,
+ int_ptr_type, "y");
+ gcc_jit_param *params2[1] = {y};
+ gcc_jit_function *ptrtoint_func =
+ gcc_jit_context_new_function (ctxt,
+ NULL,
+ GCC_JIT_FUNCTION_EXPORTED,
+ int_type,
+ "ptrtoint",
+ 1, params2, 0);
+
+ gcc_jit_block *start_block =
+ gcc_jit_function_new_block (ptrtoint_func, "start_block");
+
+ gcc_jit_block_end_with_return (start_block, NULL,
+ gcc_jit_context_new_cast (ctxt,
+ NULL,
+ gcc_jit_param_as_rvalue (y),
+ int_type
+ ));
}
void
verify_code (gcc_jit_context *ctxt, gcc_jit_result *result)
{
- typedef int (*my_casts_fn_type) (int);
CHECK_NON_NULL (result);
+
+ typedef int (*my_casts_fn_type) (int);
my_casts_fn_type my_casts =
(my_casts_fn_type)gcc_jit_result_get_code (result, "my_casts");
CHECK_NON_NULL (my_casts);
char val = my_casts (10);
note ("my_casts returned: %d", val);
CHECK_VALUE (val, 10);
+
+ typedef int (*ptrtoint_fn_type) (int*);
+ ptrtoint_fn_type ptrtoint =
+ (ptrtoint_fn_type)gcc_jit_result_get_code (result, "ptrtoint");
+ CHECK_NON_NULL (ptrtoint);
+ int int_val = ptrtoint (NULL);
+ note ("ptrtoint returned: %d", int_val);
+ CHECK_VALUE (int_val, 0);
}