Committed to branch dmalcolm/jit: gcc/testsuite/ChangeLog.jit: * jit.dg/test-long-names.c: New test case. * jit.dg/all-non-failing-tests.h: Add test-long-names.c * jit.dg/test-combination.c (create_code): Likewise. (verify_code): Likewise. * jit.dg/test-threads.c (testcases): Likewise. --- gcc/testsuite/jit.dg/all-non-failing-tests.h | 7 ++ gcc/testsuite/jit.dg/test-combination.c | 2 + gcc/testsuite/jit.dg/test-long-names.c | 112 +++++++++++++++++++++++++++ gcc/testsuite/jit.dg/test-threads.c | 3 + 4 files changed, 124 insertions(+) create mode 100644 gcc/testsuite/jit.dg/test-long-names.c
diff --git a/gcc/testsuite/jit.dg/all-non-failing-tests.h b/gcc/testsuite/jit.dg/all-non-failing-tests.h index 5f7b2ec..10d7199 100644 --- a/gcc/testsuite/jit.dg/all-non-failing-tests.h +++ b/gcc/testsuite/jit.dg/all-non-failing-tests.h @@ -102,6 +102,13 @@ #undef create_code #undef verify_code +/* test-long-names.c */ +#define create_code create_code_long_names +#define verify_code verify_code_long_names +#include "test-long-names.c" +#undef create_code +#undef verify_code + /* test-quadratic.c */ #define create_code create_code_quadratic #define verify_code verify_code_quadratic diff --git a/gcc/testsuite/jit.dg/test-combination.c b/gcc/testsuite/jit.dg/test-combination.c index 9d3a535..06ba902 100644 --- a/gcc/testsuite/jit.dg/test-combination.c +++ b/gcc/testsuite/jit.dg/test-combination.c @@ -28,6 +28,7 @@ create_code (gcc_jit_context *ctxt, void * user_data) create_code_functions (ctxt, user_data); create_code_hello_world (ctxt, user_data); create_code_linked_list (ctxt, user_data); + create_code_long_names (ctxt, user_data); create_code_quadratic (ctxt, user_data); create_code_nested_loop (ctxt, user_data); create_code_reading_struct (ctxt, user_data); @@ -54,6 +55,7 @@ verify_code (gcc_jit_context *ctxt, gcc_jit_result *result) verify_code_functions (ctxt, result); verify_code_hello_world (ctxt, result); verify_code_linked_list (ctxt, result); + verify_code_long_names (ctxt, result); verify_code_quadratic (ctxt, result); verify_code_nested_loop (ctxt, result); verify_code_reading_struct (ctxt, result); diff --git a/gcc/testsuite/jit.dg/test-long-names.c b/gcc/testsuite/jit.dg/test-long-names.c new file mode 100644 index 0000000..0fc7e67 --- /dev/null +++ b/gcc/testsuite/jit.dg/test-long-names.c @@ -0,0 +1,112 @@ +/* Test of using the API with very long names. */ + +#include <stdlib.h> +#include <stdio.h> + +#include "libgccjit.h" + +#include "harness.h" + +/* 65KB */ +#define NAME_LENGTH (65 * 1024) + +static struct long_names +{ + char struct_name[NAME_LENGTH]; + char fn_name[NAME_LENGTH]; + char local_name[NAME_LENGTH]; + char block_name[NAME_LENGTH]; +} long_names; + +static void +populate_name (const char *prefix, char *buffer) +{ + int i; + + /* Begin with the given prefix: */ + sprintf (buffer, prefix); + + /* Populate the rest of the buffer with 0123456789 repeatedly: */ + for (i = strlen (prefix); i < NAME_LENGTH - 1; i++) + buffer[i] = '0' + (i % 10); + + /* NIL-terminate the buffer: */ + buffer[NAME_LENGTH - 1] = '\0'; +} + +static void +populate_names (void) +{ + populate_name ("struct_", long_names.struct_name); + populate_name ("test_fn_", long_names.fn_name); + populate_name ("local_", long_names.local_name); + populate_name ("block_", long_names.block_name); +} + +void +create_code (gcc_jit_context *ctxt, void *user_data) +{ + /* Where "ETC" is a very long suffix, let's try to inject the + equivalent of: + + struct struct_ETC; + + int + test_fn_ETC () + { + int local_ETC; + local_ETC = 42; + return local_ETC; + } + + to verify that the API copes with such long names. */ + + populate_names (); + + gcc_jit_type *int_type = + gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT); + + /* We don't yet use this struct. */ + (void)gcc_jit_context_new_opaque_struct (ctxt, NULL, + long_names.struct_name); + + gcc_jit_function *test_fn = + gcc_jit_context_new_function (ctxt, NULL, + GCC_JIT_FUNCTION_EXPORTED, + int_type, + long_names.fn_name, + 0, NULL, + 0); + gcc_jit_lvalue *local = + gcc_jit_function_new_local (test_fn, + NULL, + int_type, + long_names.local_name); + + gcc_jit_block *block = + gcc_jit_function_new_block (test_fn, long_names.block_name); + + gcc_jit_block_add_assignment ( + block, + NULL, + local, + gcc_jit_context_new_rvalue_from_int (ctxt, int_type, 42)); + + gcc_jit_block_end_with_return ( + block, NULL, + gcc_jit_lvalue_as_rvalue (local)); +} + +void +verify_code (gcc_jit_context *ctxt, gcc_jit_result *result) +{ + CHECK_NON_NULL (result); + + typedef int (*my_fn_type) (void); + CHECK_NON_NULL (result); + my_fn_type my_fn = + (my_fn_type)gcc_jit_result_get_code (result, long_names.fn_name); + CHECK_NON_NULL (my_fn); + int val = my_fn (); + CHECK_VALUE (val, 42); +} diff --git a/gcc/testsuite/jit.dg/test-threads.c b/gcc/testsuite/jit.dg/test-threads.c index e3dd69f..efa146d 100644 --- a/gcc/testsuite/jit.dg/test-threads.c +++ b/gcc/testsuite/jit.dg/test-threads.c @@ -124,6 +124,9 @@ const struct testcase testcases[] = { {"linked_list", create_code_linked_list, verify_code_linked_list}, + {"long_names", + create_code_long_names, + verify_code_long_names}, {"quadratic", create_code_quadratic, verify_code_quadratic}, -- 1.7.11.7