From 0cd55f9d3afdc8d9220ef0cb20db61a3b86b4c8a Mon Sep 17 00:00:00 2001 From: AndreaCorallo Date: Sat, 7 Mar 2020 17:39:30 +0000 Subject: [PATCH] libgccjit: handle long literals in playback::context::new_string_literal gcc/jit/ChangeLog 2020-03-23 Andrea Corallo * jit-playback.h (gcc::jit::playback::context m_recording_ctxt): Remove m_char_array_type_node field. * jit-playback.c (playback::context::context) Remove m_char_array_type_node from member initializer list. (playback::context::new_string_literal) Fix logic to handle string length > 200. gcc/testsuite/ChangeLog 2020-03-23 Andrea Corallo * jit.dg/all-non-failing-tests.h: Add test-long-string-literal.c. * jit.dg/test-long-string-literal.c: New testcase. --- gcc/jit/ChangeLog | 11 ++++ gcc/jit/jit-playback.c | 16 +++--- gcc/jit/jit-playback.h | 1 - gcc/testsuite/ChangeLog | 5 ++ gcc/testsuite/jit.dg/all-non-failing-tests.h | 10 ++++ .../jit.dg/test-long-string-literal.c | 54 +++++++++++++++++++ 6 files changed, 88 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/jit.dg/test-long-string-literal.c diff --git a/gcc/jit/ChangeLog b/gcc/jit/ChangeLog index b6f888f12bb..5d39b7bebc2 100644 --- a/gcc/jit/ChangeLog +++ b/gcc/jit/ChangeLog @@ -1,3 +1,14 @@ +2020-03-23 Andrea Corallo + + * jit-playback.h + (gcc::jit::playback::context m_recording_ctxt): Remove + m_char_array_type_node field. + * jit-playback.c + (playback::context::context) Remove m_char_array_type_node from member + initializer list. + (playback::context::new_string_literal) Fix logic to handle string + length > 200. + 2020-01-01 Jakub Jelinek Update copyright years. diff --git a/gcc/jit/jit-playback.c b/gcc/jit/jit-playback.c index da687002a72..d2c8bb4c154 100644 --- a/gcc/jit/jit-playback.c +++ b/gcc/jit/jit-playback.c @@ -88,7 +88,6 @@ playback::context::context (recording::context *ctxt) : log_user (ctxt->get_logger ()), m_recording_ctxt (ctxt), m_tempdir (NULL), - m_char_array_type_node (NULL), m_const_char_ptr (NULL) { JIT_LOG_SCOPE (get_logger ()); @@ -670,9 +669,14 @@ playback::rvalue * playback::context:: new_string_literal (const char *value) { - tree t_str = build_string (strlen (value), value); - gcc_assert (m_char_array_type_node); - TREE_TYPE (t_str) = m_char_array_type_node; + /* Compare with c-family/c-common.c: fix_string_type. */ + size_t len = strlen (value); + tree i_type = build_index_type (size_int (len)); + tree a_type = build_array_type (char_type_node, i_type); + /* build_string len parameter must include NUL terminator when + building C strings. */ + tree t_str = build_string (len + 1, value); + TREE_TYPE (t_str) = a_type; /* Convert to (const char*), loosely based on c/c-typeck.c: array_to_pointer_conversion, @@ -2701,10 +2705,6 @@ playback::context:: replay () { JIT_LOG_SCOPE (get_logger ()); - /* Adapted from c-common.c:c_common_nodes_and_builtins. */ - tree array_domain_type = build_index_type (size_int (200)); - m_char_array_type_node - = build_array_type (char_type_node, array_domain_type); m_const_char_ptr = build_pointer_type (build_qualified_type (char_type_node, diff --git a/gcc/jit/jit-playback.h b/gcc/jit/jit-playback.h index 904cc167a0c..074434a9f6b 100644 --- a/gcc/jit/jit-playback.h +++ b/gcc/jit/jit-playback.h @@ -322,7 +322,6 @@ private: auto_vec m_functions; auto_vec m_globals; - tree m_char_array_type_node; tree m_const_char_ptr; /* Source location handling. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b6fbdc1df55..6b4c0e24ba5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-03-23 Andrea Corallo + + * jit.dg/all-non-failing-tests.h: Add test-long-string-literal.c. + * jit.dg/test-long-string-literal.c: New testcase. + 2020-03-23 Andre Vieira * gcc.target/arm/mve/intrinsics/mve_fp_fpu1.c: Remove dg-do. diff --git a/gcc/testsuite/jit.dg/all-non-failing-tests.h b/gcc/testsuite/jit.dg/all-non-failing-tests.h index 0272e6f846f..b2acc74ae95 100644 --- a/gcc/testsuite/jit.dg/all-non-failing-tests.h +++ b/gcc/testsuite/jit.dg/all-non-failing-tests.h @@ -178,6 +178,13 @@ #undef create_code #undef verify_code +/* test-long-string-literal.c */ +#define create_code create_code_long_string_literal +#define verify_code verify_code_long_string_literal +#include "test-long-string-literal.c" +#undef create_code +#undef verify_code + /* test-quadratic.c */ #define create_code create_code_quadratic #define verify_code verify_code_quadratic @@ -342,6 +349,9 @@ const struct testcase testcases[] = { {"long_names", create_code_long_names, verify_code_long_names}, + {"long_string_literal", + create_code_long_string_literal, + verify_code_long_string_literal}, {"quadratic", create_code_quadratic, verify_code_quadratic}, diff --git a/gcc/testsuite/jit.dg/test-long-string-literal.c b/gcc/testsuite/jit.dg/test-long-string-literal.c new file mode 100644 index 00000000000..6caaa781c0b --- /dev/null +++ b/gcc/testsuite/jit.dg/test-long-string-literal.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include + +#include "libgccjit.h" + +#include "harness.h" + +const char very_long_string[] = + "abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc" + "abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc" + "abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc" + "abcabcabcabcabcabcabcabcabcabca"; + +void +create_code (gcc_jit_context *ctxt, void *user_data) +{ + /* Build the test_fn. */ + gcc_jit_function *f = + gcc_jit_context_new_function ( + ctxt, NULL, + GCC_JIT_FUNCTION_EXPORTED, + gcc_jit_context_get_type(ctxt, + GCC_JIT_TYPE_CONST_CHAR_PTR), + "test_long_string_literal", + 0, NULL, 0); + gcc_jit_block *blk = + gcc_jit_function_new_block (f, "init_block"); + + /* very_long_string is longer than 200 characters to specifically + check that the previous limitation no longer apply. */ + + assert (sizeof (very_long_string) > 200); + gcc_jit_rvalue *res = + gcc_jit_context_new_string_literal (ctxt, very_long_string); + + gcc_jit_block_end_with_return (blk, NULL, res); +} + +void +verify_code (gcc_jit_context *ctxt, gcc_jit_result *result) +{ + typedef const char *(*fn_type) (void); + CHECK_NON_NULL (result); + fn_type test_long_string_literal = + (fn_type)gcc_jit_result_get_code (result, "test_long_string_literal"); + CHECK_NON_NULL (test_long_string_literal); + + /* Call the JIT-generated function. */ + const char *str = test_long_string_literal (); + CHECK_NON_NULL (str); + CHECK_VALUE (strcmp (str, very_long_string), 0); +} -- 2.30.2