public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/marxin/heads/vect_cond_expr-rework-v3)] libgccjit: handle long literals in playback::context::new_string_literal
@ 2020-03-25 15:11 Martin Liska
  0 siblings, 0 replies; only message in thread
From: Martin Liska @ 2020-03-25 15:11 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:0cd55f9d3afdc8d9220ef0cb20db61a3b86b4c8a

commit 0cd55f9d3afdc8d9220ef0cb20db61a3b86b4c8a
Author: AndreaCorallo <andrea.corallo@arm.com>
Date:   Sat Mar 7 17:39:30 2020 +0000

    libgccjit: handle long literals in playback::context::new_string_literal
    
    gcc/jit/ChangeLog
    2020-03-23  Andrea Corallo  <andrea.corallo@arm.com>
    
            * 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  <andrea.corallo@arm.com>
    
            * jit.dg/all-non-failing-tests.h: Add test-long-string-literal.c.
            * jit.dg/test-long-string-literal.c: New testcase.

Diff:
---
 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 +++++
 gcc/testsuite/jit.dg/test-long-string-literal.c | 54 +++++++++++++++++++++++++
 6 files changed, 88 insertions(+), 9 deletions(-)

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  <andrea.corallo@arm.com>
+
+	* 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  <jakub@redhat.com>
 
 	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<function *> m_functions;
   auto_vec<tree> 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  <andrea.corallo@arm.com>
+
+	* 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  <andre.simoesdiasvieira@arm.com>
 
 	* 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 <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+#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);
+}


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-03-25 15:11 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-25 15:11 [gcc(refs/users/marxin/heads/vect_cond_expr-rework-v3)] libgccjit: handle long literals in playback::context::new_string_literal Martin Liska

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).