emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/native-comp ce3c1ea 2/3: * Optimize 'emit_static_object' for loa


From: Andrea Corallo
Subject: feature/native-comp ce3c1ea 2/3: * Optimize 'emit_static_object' for load-time
Date: Sun, 31 May 2020 17:52:15 -0400 (EDT)

branch: feature/native-comp
commit ce3c1ea83e18e6b8a02013bbdae4b4c183e39997
Author: Andrea Corallo <akrl@sdf.org>
Commit: Andrea Corallo <akrl@sdf.org>

    * Optimize 'emit_static_object' for load-time
    
        * src/comp.c (emit_static_object): Use a chunck size of 200 bytes
        on bugged GCCs and a longer one (1024) in sane ones. Rename
        str in buff to disambiguate and prefer xmalloc to a VLA given
        the buffer is not that small.
---
 src/comp.c | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)

diff --git a/src/comp.c b/src/comp.c
index c9d3fd0..2d904c9 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -2441,27 +2441,30 @@ emit_static_object (const char *name, Lisp_Object obj)
         gcc_jit_context_new_rvalue_from_int (comp.ctxt, comp.int_type, 0)),
       NULL));
 
+  /* We can't use always string literals longer that 200 bytes because
+     they cause a crash in pre GCC 10 libgccjit.
+     <https://gcc.gnu.org/ml/jit/2019-q3/msg00013.html>.
+
+     Adjust if possible to reduce the number of function calls.  */
+  size_t chunck_size = NILP (Fcomp_libgccjit_version ()) ? 200 : 1024;
+  char *buff = xmalloc (chunck_size);
   for (ptrdiff_t i = 0; i < len;)
     {
-      /* We can't use string literals longer that 200 bytes because
-         they cause a crash in older versions of gccjit.
-         https://gcc.gnu.org/ml/jit/2019-q3/msg00013.html.  */
-      char str[200];
-      strncpy (str, p, 200);
-      str[199] = 0;
-      uintptr_t l = strlen (str);
+      strncpy (buff, p, chunck_size);
+      buff[chunck_size - 1] = 0;
+      uintptr_t l = strlen (buff);
 
       if (l != 0)
         {
           p += l;
           i += l;
 
-          gcc_jit_rvalue *args[3]
-            = {gcc_jit_lvalue_as_rvalue (ptrvar),
-               gcc_jit_context_new_string_literal (comp.ctxt, str),
-               gcc_jit_context_new_rvalue_from_int (comp.ctxt,
-                 comp.size_t_type,
-                 l)};
+          gcc_jit_rvalue *args[] =
+           { gcc_jit_lvalue_as_rvalue (ptrvar),
+             gcc_jit_context_new_string_literal (comp.ctxt, buff),
+             gcc_jit_context_new_rvalue_from_int (comp.ctxt,
+                                                  comp.size_t_type,
+                                                  l) };
 
           gcc_jit_block_add_eval (block, NULL,
                                   gcc_jit_context_new_call (comp.ctxt, NULL,
@@ -2496,6 +2499,7 @@ emit_static_object (const char *name, Lisp_Object obj)
               NULL));
         }
     }
+  xfree (buff);
 
   gcc_jit_block_add_assignment (
        block,



reply via email to

[Prev in Thread] Current Thread [Next in Thread]