copy of the underlying string, so it is valid to pass in a pointer to
an on-stack buffer.
- There is just one string option specified this way:
-
.. macro:: GCC_JIT_STR_OPTION_PROGNAME
The name of the program, for use as a prefix when printing error
messages to stderr. If `NULL`, or default, "libgccjit.so" is used.
+ .. macro:: GCC_JIT_STR_OPTION_SPECIAL_CHARS_IN_FUNC_NAMES
+
+ Alphabetic ASCII characters and underscores are always valid. Numeric
+ ASCII characters are always valid after the initial character of the
+ string. Use this entrypoint to specify additional ASCII characters that
+ are valid throughout function names (ex.: ".$").
+
Boolean options
***************
log_str_option (opt);
}
+const char*
+recording::context::get_str_option (enum gcc_jit_str_option opt)
+{
+ if (opt < 0 || opt >= GCC_JIT_NUM_STR_OPTIONS)
+ {
+ add_error (NULL,
+ "unrecognized (enum gcc_jit_str_option) value: %i", opt);
+ return NULL;
+ }
+ return m_str_options[opt];
+}
+
/* Set the given integer option for this context, or add an error if
it's not recognized.
static const char * const
str_option_reproducer_strings[GCC_JIT_NUM_STR_OPTIONS] = {
- "GCC_JIT_STR_OPTION_PROGNAME"
+ "GCC_JIT_STR_OPTION_PROGNAME",
+ "GCC_JIT_STR_OPTION_SPECIAL_CHARS_IN_FUNC_NAMES",
};
static const char * const
"GCC_JIT_BOOL_OPTION_DUMP_SUMMARY",
"GCC_JIT_BOOL_OPTION_DUMP_EVERYTHING",
"GCC_JIT_BOOL_OPTION_SELFCHECK_GC",
- "GCC_JIT_BOOL_OPTION_KEEP_INTERMEDIATES"
+ "GCC_JIT_BOOL_OPTION_KEEP_INTERMEDIATES",
};
static const char * const
set_str_option (enum gcc_jit_str_option opt,
const char *value);
+ const char*
+ get_str_option (enum gcc_jit_str_option opt);
+
void
set_int_option (enum gcc_jit_int_option opt,
int value);
Eventually we'll need some way to interact with e.g. C++ name
mangling. */
{
+ const char* special_chars_allowed
+ = ctxt->get_str_option (GCC_JIT_STR_OPTION_SPECIAL_CHARS_IN_FUNC_NAMES);
/* Leading char: */
char ch = *name;
RETURN_NULL_IF_FAIL_PRINTF2 (
- ISALPHA (ch) || ch == '_',
+ ISALPHA (ch) || ch == '_' || (special_chars_allowed
+ && strchr (special_chars_allowed, ch)),
ctxt, loc,
"name \"%s\" contains invalid character: '%c'",
name, ch);
for (const char *ptr = name + 1; (ch = *ptr); ptr++)
{
RETURN_NULL_IF_FAIL_PRINTF2 (
- ISALNUM (ch) || ch == '_',
+ ISALNUM (ch) || ch == '_' || (special_chars_allowed
+ && strchr (special_chars_allowed, ch)),
ctxt, loc,
"name \"%s\" contains invalid character: '%c'",
name, ch);
messages to stderr. If NULL, or default, "libgccjit.so" is used. */
GCC_JIT_STR_OPTION_PROGNAME,
+ /* Special characters to allow in function names. */
+ GCC_JIT_STR_OPTION_SPECIAL_CHARS_IN_FUNC_NAMES,
+
GCC_JIT_NUM_STR_OPTIONS
};
--- /dev/null
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "libgccjit.h"
+
+#include "harness.h"
+
+void
+create_code (gcc_jit_context *ctxt, void *user_data)
+{
+ gcc_jit_context_set_str_option (ctxt,
+ GCC_JIT_STR_OPTION_SPECIAL_CHARS_IN_FUNC_NAMES, "$.");
+
+ /* Let's try to inject the equivalent of:
+ void
+ name$with.special_chars (void)
+ {
+ }
+ */
+ gcc_jit_type *void_type =
+ gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_VOID);
+
+ /* Build the test_fn. */
+ gcc_jit_function *test_fn =
+ gcc_jit_context_new_function (ctxt, NULL,
+ GCC_JIT_FUNCTION_EXPORTED,
+ void_type,
+ "name$with.special_chars",
+ 0, NULL,
+ 0);
+
+ gcc_jit_block *block = gcc_jit_function_new_block (test_fn, NULL);
+ gcc_jit_block_end_with_void_return (
+ block, NULL);
+}
+
+void
+verify_code (gcc_jit_context *ctxt, gcc_jit_result *result)
+{
+ CHECK_NON_NULL (result);
+}