aboutsummaryrefslogtreecommitdiff
path: root/gcc/jit/libgccjit.c
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2020-05-24 18:36:36 -0400
committerDavid Malcolm <dmalcolm@redhat.com>2020-05-26 10:47:46 -0400
commit6f7585deedc140667fd496b48c9fc4f7d625605c (patch)
treec95d7f29482b6cb3ca5575d40475f4262ffa8fea /gcc/jit/libgccjit.c
parent6232d02b4fce4c67d39815aa8fb956e4b10a4e1b (diff)
downloadgcc-6f7585deedc140667fd496b48c9fc4f7d625605c.zip
gcc-6f7585deedc140667fd496b48c9fc4f7d625605c.tar.gz
gcc-6f7585deedc140667fd496b48c9fc4f7d625605c.tar.bz2
jit: check for void types [PR 95296]
PR jit/95296 reports an ICE when using libgccjit to create a local of void type. This patch adds checking to various API entrypoints in libgccjit.c so that they fail gracefully with an error if the client code attempts to create various kinds of rvalues or types involving void types. The patch documents these and various pre-existing restrictions on types in the API. gcc/jit/ChangeLog: PR jit/95296 * docs/topics/expressions.rst (Unary Operations): Document that result_type of gcc_jit_context_new_unary_op must be a numeric type. (Binary Operations): Likewise for gcc_jit_context_new_binary_op. (Global variables): Document that "type" of gcc_jit_context_new_global must be non-`void`. * docs/topics/function-pointers.rst (gcc_jit_context_new_function_ptr_type): Document that the param_types must be non-void, but that return_type may be. * docs/topics/functions.rst (Params): Document that gcc_jit_context_new_param's type must be non-void. (Functions): Likewise for gcc_jit_function_new_local. * docs/topics/types.rst (gcc_jit_context_new_array_type): Document that the type must be non-void. (gcc_jit_context_new_field): Likewise. * docs/_build/texinfo/Makefile: Regenerate. * docs/_build/texinfo/libgccjit.texi: Regenerate. * libgccjit.c (gcc_jit_context_new_array_type): Fail if element_type is void. (gcc_jit_context_new_field): Likewise for "type". (gcc_jit_context_new_function_ptr_type): Likewise for each element of param_types. (gcc_jit_context_new_param): Likewise for "type". (gcc_jit_context_new_global): Likewise. (gcc_jit_function_new_local): Likewise. (gcc_jit_type_get_aligned): Likewise. gcc/testsuite/ChangeLog: PR jit/95296 * jit.dg/test-error-gcc_jit_context_new_global-void-type.c: New test. * jit.dg/test-error-gcc_jit_function_new_local-void-type.c: New test. * jit.dg/test-fuzzer.c (fuzzer_init): Allow for make_random_type to return NULL. (get_random_type): Allow for elements in f->types to be NULL.
Diffstat (limited to 'gcc/jit/libgccjit.c')
-rw-r--r--gcc/jit/libgccjit.c34
1 files changed, 30 insertions, 4 deletions
diff --git a/gcc/jit/libgccjit.c b/gcc/jit/libgccjit.c
index a29e988..3d04f6d 100644
--- a/gcc/jit/libgccjit.c
+++ b/gcc/jit/libgccjit.c
@@ -527,6 +527,8 @@ gcc_jit_context_new_array_type (gcc_jit_context *ctxt,
/* LOC can be NULL. */
RETURN_NULL_IF_FAIL (element_type, ctxt, loc, "NULL type");
RETURN_NULL_IF_FAIL (num_elements >= 0, ctxt, NULL, "negative size");
+ RETURN_NULL_IF_FAIL (!element_type->is_void (), ctxt, loc,
+ "void type for elements");
return (gcc_jit_type *)ctxt->new_array_type (loc,
element_type,
@@ -556,6 +558,11 @@ gcc_jit_context_new_field (gcc_jit_context *ctxt,
"unknown size for field \"%s\" (type: %s)",
name,
type->get_debug_string ());
+ RETURN_NULL_IF_FAIL_PRINTF1 (
+ !type->is_void (),
+ ctxt, loc,
+ "void type for field \"%s\"",
+ name);
return (gcc_jit_field *)ctxt->new_field (loc, type, name);
}
@@ -786,10 +793,15 @@ gcc_jit_context_new_function_ptr_type (gcc_jit_context *ctxt,
ctxt, loc,
"NULL param_types creating function pointer type");
for (int i = 0; i < num_params; i++)
- RETURN_NULL_IF_FAIL_PRINTF1 (
- param_types[i],
- ctxt, loc,
- "NULL parameter type %i creating function pointer type", i);
+ {
+ RETURN_NULL_IF_FAIL_PRINTF1 (param_types[i],
+ ctxt, loc,
+ "NULL parameter type %i"
+ " creating function pointer type", i);
+ RETURN_NULL_IF_FAIL_PRINTF1 (!param_types[i]->is_void (),
+ ctxt, loc,
+ "void type for param %i", i);
+ }
return (gcc_jit_type*)
ctxt->new_function_ptr_type (loc, return_type,
@@ -816,6 +828,9 @@ gcc_jit_context_new_param (gcc_jit_context *ctxt,
/* LOC can be NULL. */
RETURN_NULL_IF_FAIL (type, ctxt, loc, "NULL type");
RETURN_NULL_IF_FAIL (name, ctxt, loc, "NULL name");
+ RETURN_NULL_IF_FAIL_PRINTF1 (!type->is_void (),
+ ctxt, loc,
+ "void type for param \"%s\"", name);
return (gcc_jit_param *)ctxt->new_param (loc, type, name);
}
@@ -1093,6 +1108,11 @@ gcc_jit_context_new_global (gcc_jit_context *ctxt,
"unknown size for global \"%s\" (type: %s)",
name,
type->get_debug_string ());
+ RETURN_NULL_IF_FAIL_PRINTF1 (
+ !type->is_void (),
+ ctxt, loc,
+ "void type for global \"%s\"",
+ name);
return (gcc_jit_lvalue *)ctxt->new_global (loc, kind, type, name);
}
@@ -1911,6 +1931,11 @@ gcc_jit_function_new_local (gcc_jit_function *func,
"unknown size for local \"%s\" (type: %s)",
name,
type->get_debug_string ());
+ RETURN_NULL_IF_FAIL_PRINTF1 (
+ !type->is_void (),
+ ctxt, loc,
+ "void type for local \"%s\"",
+ name);
return (gcc_jit_lvalue *)func->new_local (loc, type, name);
}
@@ -3068,6 +3093,7 @@ gcc_jit_type_get_aligned (gcc_jit_type *type,
(pow2_or_zerop (alignment_in_bytes), ctxt, NULL,
"alignment not a power of two: %zi",
alignment_in_bytes);
+ RETURN_NULL_IF_FAIL (!type->is_void (), ctxt, NULL, "void type");
return (gcc_jit_type *)type->get_aligned (alignment_in_bytes);
}