Skip to content

Commit

Permalink
libgccjit: Add option to allow special characters in function names
Browse files Browse the repository at this point in the history
gcc/jit/ChangeLog:

	* docs/topics/contexts.rst: Add documentation for new option.
	* jit-recording.cc (recording::context::get_bool_option): New
	method.
	* jit-recording.h (get_bool_option): New method.
	* libgccjit.cc (gcc_jit_context_new_function): Allow special
	characters in function names.
	* libgccjit.h (enum gcc_jit_bool_option): New option.

gcc/testsuite/ChangeLog:

	* jit.dg/test-special-chars.c: New test.
  • Loading branch information
antoyo committed Feb 16, 2024
1 parent 755c724 commit 7e92827
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 3 deletions.
4 changes: 4 additions & 0 deletions gcc/jit/docs/topics/contexts.rst
Original file line number Diff line number Diff line change
Expand Up @@ -453,6 +453,10 @@ Boolean options
If true, the :type:`gcc_jit_context` will not clean up intermediate files
written to the filesystem, and will display their location on stderr.

.. macro:: GCC_JIT_BOOL_OPTION_SPECIAL_CHARS_IN_FUNC_NAMES

If true, allow special characters like . and $ in function names.

.. function:: void \
gcc_jit_context_set_bool_allow_unreachable_blocks (gcc_jit_context *ctxt, \
int bool_value)
Expand Down
15 changes: 14 additions & 1 deletion gcc/jit/jit-recording.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1511,6 +1511,18 @@ recording::context::set_bool_option (enum gcc_jit_bool_option opt,
log_bool_option (opt);
}

int
recording::context::get_bool_option (enum gcc_jit_bool_option opt)
{
if (opt < 0 || opt >= GCC_JIT_NUM_BOOL_OPTIONS)
{
add_error (NULL,
"unrecognized (enum gcc_jit_bool_option) value: %i", opt);
return 0;
}
return m_bool_options[opt];
}

void
recording::context::set_inner_bool_option (enum inner_bool_option inner_opt,
int value)
Expand Down Expand Up @@ -1863,7 +1875,8 @@ 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",
"GCC_JIT_BOOL_OPTION_SPECIAL_CHARS_IN_FUNC_NAMES",
};

static const char * const
Expand Down
3 changes: 3 additions & 0 deletions gcc/jit/jit-recording.h
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,9 @@ class context : public log_user
set_bool_option (enum gcc_jit_bool_option opt,
int value);

int
get_bool_option (enum gcc_jit_bool_option opt);

void
set_inner_bool_option (enum inner_bool_option inner_opt,
int value);
Expand Down
8 changes: 6 additions & 2 deletions gcc/jit/libgccjit.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1222,18 +1222,22 @@ gcc_jit_context_new_function (gcc_jit_context *ctxt,
Eventually we'll need some way to interact with e.g. C++ name
mangling. */
{
int special_chars_allowed
= ctxt->get_bool_option (GCC_JIT_BOOL_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
&& (ch == '.' || ch == '$' || ch == '*')),
ctxt, loc,
"name \"%s\" contains invalid character: '%c'",
name, ch);
/* Subsequent chars: */
for (const char *ptr = name + 1; (ch = *ptr); ptr++)
{
RETURN_NULL_IF_FAIL_PRINTF2 (
ISALNUM (ch) || ch == '_',
ISALNUM (ch) || ch == '_' || (special_chars_allowed
&& (ch == '.' || ch == '$' || ch == '*')),
ctxt, loc,
"name \"%s\" contains invalid character: '%c'",
name, ch);
Expand Down
3 changes: 3 additions & 0 deletions gcc/jit/libgccjit.h
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,9 @@ enum gcc_jit_bool_option
their location on stderr. */
GCC_JIT_BOOL_OPTION_KEEP_INTERMEDIATES,

/* If true, allow special characters like . and $ in function names. */
GCC_JIT_BOOL_OPTION_SPECIAL_CHARS_IN_FUNC_NAMES,

GCC_JIT_NUM_BOOL_OPTIONS
};

Expand Down
41 changes: 41 additions & 0 deletions gcc/testsuite/jit.dg/test-special-chars.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#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_bool_option (ctxt,
GCC_JIT_BOOL_OPTION_SPECIAL_CHARS_IN_FUNC_NAMES, 1);

/* 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);
}

0 comments on commit 7e92827

Please sign in to comment.