PR jit/66783: prevent use of opaque structs

gcc/jit/ChangeLog:
	PR jit/66783
	* jit-recording.h: Within namespace gcc:jit::recording...
	(type::has_known_size): New virtual function.
	(struct_has_known_size): New function.
	* libgccjit.c (gcc_jit_context_new_field): Verify that the type
	has a known size.
	(gcc_jit_context_new_global): Likewise.
	(gcc_jit_function_new_local): Likewise.

gcc/testsuite/ChangeLog:
	PR jit/66783
	* jit.dg/test-error-gcc_jit_context_new_field-opaque-struct.c: New
	test case.
	* jit.dg/test-error-gcc_jit_context_new_global-opaque-struct.c:
	New test case.
	* jit.dg/test-error-gcc_jit_function_new_local-opaque-struct.c:
	New test case.
	* jit.dg/test-error-mismatching-types-in-call.c (create_code):
	Avoid using an opaque struct for local "f".

From-SVN: r225523
This commit is contained in:
David Malcolm 2015-07-07 19:29:58 +00:00 committed by David Malcolm
parent bada4bed71
commit 3457d39ea5
8 changed files with 147 additions and 1 deletions

View File

@ -1,3 +1,14 @@
2015-07-07 David Malcolm <dmalcolm@redhat.com>
PR jit/66783
* jit-recording.h: Within namespace gcc:jit::recording...
(type::has_known_size): New virtual function.
(struct_has_known_size): New function.
* libgccjit.c (gcc_jit_context_new_field): Verify that the type
has a known size.
(gcc_jit_context_new_global): Likewise.
(gcc_jit_function_new_local): Likewise.
2015-07-07 David Malcolm <dmalcolm@redhat.com>
PR jit/66779

View File

@ -497,6 +497,7 @@ public:
virtual type *is_pointer () = 0;
virtual type *is_array () = 0;
virtual bool is_void () const { return false; }
virtual bool has_known_size () const { return true; }
bool is_numeric () const
{
@ -795,6 +796,8 @@ public:
type *is_pointer () { return NULL; }
type *is_array () { return NULL; }
bool has_known_size () const { return m_fields != NULL; }
playback::compound_type *
playback_compound_type ()
{

View File

@ -543,6 +543,11 @@ gcc_jit_context_new_field (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->has_known_size (),
ctxt, loc,
"type has unknown size (type: %s)",
type->get_debug_string ());
return (gcc_jit_field *)ctxt->new_field (loc, type, name);
}
@ -1033,6 +1038,11 @@ gcc_jit_context_new_global (gcc_jit_context *ctxt,
kind);
RETURN_NULL_IF_FAIL (type, ctxt, loc, "NULL type");
RETURN_NULL_IF_FAIL (name, ctxt, loc, "NULL name");
RETURN_NULL_IF_FAIL_PRINTF1 (
type->has_known_size (),
ctxt, loc,
"type has unknown size (type: %s)",
type->get_debug_string ());
return (gcc_jit_lvalue *)ctxt->new_global (loc, kind, type, name);
}
@ -1829,6 +1839,11 @@ gcc_jit_function_new_local (gcc_jit_function *func,
"Cannot add locals to an imported function");
RETURN_NULL_IF_FAIL (type, ctxt, loc, "NULL type");
RETURN_NULL_IF_FAIL (name, ctxt, loc, "NULL name");
RETURN_NULL_IF_FAIL_PRINTF1 (
type->has_known_size (),
ctxt, loc,
"type has unknown size (type: %s)",
type->get_debug_string ());
return (gcc_jit_lvalue *)func->new_local (loc, type, name);
}

View File

@ -1,3 +1,15 @@
2015-07-07 David Malcolm <dmalcolm@redhat.com>
PR jit/66783
* jit.dg/test-error-gcc_jit_context_new_field-opaque-struct.c: New
test case.
* jit.dg/test-error-gcc_jit_context_new_global-opaque-struct.c:
New test case.
* jit.dg/test-error-gcc_jit_function_new_local-opaque-struct.c:
New test case.
* jit.dg/test-error-mismatching-types-in-call.c (create_code):
Avoid using an opaque struct for local "f".
2015-07-07 David Malcolm <dmalcolm@redhat.com>
PR jit/66779

View File

@ -0,0 +1,31 @@
#include <stdlib.h>
#include <stdio.h>
#include "libgccjit.h"
#include "harness.h"
/* Try to put an opaque struct inside another struct
(or union); the API ought to complain. */
void
create_code (gcc_jit_context *ctxt, void *user_data)
{
gcc_jit_struct *t_opaque =
gcc_jit_context_new_opaque_struct (ctxt, NULL, "opaque");
(void)gcc_jit_context_new_field (ctxt, NULL,
gcc_jit_struct_as_type (t_opaque),
"f_opaque");
}
void
verify_code (gcc_jit_context *ctxt, gcc_jit_result *result)
{
CHECK_VALUE (result, NULL);
/* Verify that the correct error message was emitted. */
CHECK_STRING_VALUE (gcc_jit_context_get_first_error (ctxt),
"gcc_jit_context_new_field:"
" type has unknown size (type: struct opaque)");
}

View File

@ -0,0 +1,32 @@
#include <stdlib.h>
#include <stdio.h>
#include "libgccjit.h"
#include "harness.h"
/* Try to create a global of an opaque struct;
the API ought to complain. */
void
create_code (gcc_jit_context *ctxt, void *user_data)
{
gcc_jit_struct *t_opaque =
gcc_jit_context_new_opaque_struct (ctxt, NULL, "opaque");
(void)gcc_jit_context_new_global (ctxt, NULL,
GCC_JIT_GLOBAL_EXPORTED,
gcc_jit_struct_as_type (t_opaque),
"instance_of_opaque");
}
void
verify_code (gcc_jit_context *ctxt, gcc_jit_result *result)
{
CHECK_VALUE (result, NULL);
/* Verify that the correct error message was emitted. */
CHECK_STRING_VALUE (gcc_jit_context_get_first_error (ctxt),
"gcc_jit_context_new_global:"
" type has unknown size (type: struct opaque)");
}

View File

@ -0,0 +1,42 @@
#include <stdlib.h>
#include <stdio.h>
#include "libgccjit.h"
#include "harness.h"
/* Try to create a local of an opaque struct;
the API ought to complain. */
void
create_code (gcc_jit_context *ctxt, void *user_data)
{
gcc_jit_type *t_void =
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_VOID);
gcc_jit_struct *t_opaque =
gcc_jit_context_new_opaque_struct (ctxt, NULL, "opaque");
gcc_jit_function *func =
gcc_jit_context_new_function (ctxt, NULL,
GCC_JIT_FUNCTION_EXPORTED,
t_void,
"test_fn",
0, NULL,
0);
(void)gcc_jit_function_new_local (func, NULL,
gcc_jit_struct_as_type (t_opaque),
"i");
}
void
verify_code (gcc_jit_context *ctxt, gcc_jit_result *result)
{
CHECK_VALUE (result, NULL);
/* Verify that the correct error message was emitted. */
CHECK_STRING_VALUE (gcc_jit_context_get_first_error (ctxt),
"gcc_jit_function_new_local:"
" type has unknown size (type: struct opaque)");
}

View File

@ -26,7 +26,7 @@ create_code (gcc_jit_context *ctxt, void *user_data)
gcc_jit_type *void_type =
gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_VOID);
gcc_jit_struct *struct_foo =
gcc_jit_context_new_opaque_struct (ctxt, NULL, "foo");
gcc_jit_context_new_struct_type (ctxt, NULL, "foo", 0, NULL);
gcc_jit_type *foo_ptr =
gcc_jit_type_get_pointer (gcc_jit_struct_as_type (struct_foo));
gcc_jit_param *param =