(Looks like the comma in the Subject stopped this getting through;
resending with suitably edited Subject)

Committed to branch dmalcolm/jit:

gcc/jit/
        * libgccjit.c (IS_ASCII_ALPHA): New macro.
        (IS_ASCII_DIGIT): New macro.
        (IS_ASCII_ALNUM): New macro.
        (gcc_jit_context_new_function): Require that function names be valid
        C identifiers for now, to avoid later problems in the assembler.
---
 gcc/jit/libgccjit.c | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/gcc/jit/libgccjit.c b/gcc/jit/libgccjit.c
index 3c2d962..bca60bd 100644
--- a/gcc/jit/libgccjit.c
+++ b/gcc/jit/libgccjit.c
@@ -8,6 +8,19 @@
 #include "libgccjit.h"
 #include "internal-api.h"
 
+#define IS_ASCII_ALPHA(CHAR) \
+  (                                    \
+    ((CHAR) >= 'a' && (CHAR) <='z')    \
+    ||                                 \
+    ((CHAR) >= 'A' && (CHAR) <= 'Z')   \
+  )
+
+#define IS_ASCII_DIGIT(CHAR) \
+  ((CHAR) >= '0' && (CHAR) <='9')
+
+#define IS_ASCII_ALNUM(CHAR) \
+  (IS_ASCII_ALPHA (CHAR) || IS_ASCII_DIGIT (CHAR))
+
 struct gcc_jit_context : public gcc::jit::recording::context
 {
   gcc_jit_context (gcc_jit_context *parent_ctxt) :
@@ -395,6 +408,27 @@ gcc_jit_context_new_function (gcc_jit_context *ctxt,
   RETURN_NULL_IF_FAIL (ctxt, NULL, "NULL context");
   RETURN_NULL_IF_FAIL (return_type, ctxt, "NULL return_type");
   RETURN_NULL_IF_FAIL (name, ctxt, "NULL name");
+  /* The assembler can only handle certain names, so for now, enforce
+     C's rules for identiers upon the name.
+     Eventually we'll need some way to interact with e.g. C++ name mangling.  
*/
+  {
+    /* Leading char: */
+    char ch = *name;
+    RETURN_NULL_IF_FAIL_PRINTF2 (
+       IS_ASCII_ALPHA (ch) || ch == '_',
+       ctxt,
+       "name \"%s\" contains invalid character: '%c'",
+       name, ch);
+    /* Subsequent chars: */
+    for (const char *ptr = name + 1; (ch = *ptr); ptr++)
+      {
+       RETURN_NULL_IF_FAIL_PRINTF2 (
+         IS_ASCII_ALNUM (ch) || ch == '_',
+         ctxt,
+         "name \"%s\" contains invalid character: '%c'",
+         name, ch);
+      }
+  }
   RETURN_NULL_IF_FAIL ((num_params == 0) || params, ctxt, "NULL params");
   for (int i = 0; i < num_params; i++)
     if (!params[i])
-- 
1.7.11.7

Reply via email to