On Fri, 2023-11-17 at 17:48 -0500, Antoni Boucher wrote: > Hi. > This adds functions to set the personality function (bug 112603). > > I'm not sure I can make a test for this: it seems the personality > function will not be set if there are no try/catch inside the > functions. > Do you know a way to keep the personality function that is set in > this > case? > > Or should we wait until I send the patch for try/catch?
Thanks for the patch > diff --git a/gcc/expr.cc b/gcc/expr.cc > index 556bcf7ef59..25d50289b24 100644 > --- a/gcc/expr.cc > +++ b/gcc/expr.cc > @@ -13559,6 +13559,14 @@ build_personality_function (const char *lang) > > name = ACONCAT (("__", lang, "_personality", unwind_and_version, NULL)); > > + return build_personality_function_with_name (name); > +} > + > +tree > +build_personality_function_with_name (const char *name) > +{ > + tree decl, type; > + > type = build_function_type_list (unsigned_type_node, > integer_type_node, integer_type_node, > long_long_unsigned_type_node, I confess I'm not very familiar with personalities, sorry; hopefully a reviewer who is can take a look at the non-jit parts of the patch, though FWIW they look fairly trivial. > diff --git a/gcc/jit/docs/topics/compatibility.rst b/gcc/jit/docs/topics/compatibility.rst > index ebede440ee4..31c3ef6401a 100644 > --- a/gcc/jit/docs/topics/compatibility.rst > +++ b/gcc/jit/docs/topics/compatibility.rst > @@ -378,3 +378,13 @@ alignment of a variable: > -------------------- > ``LIBGCCJIT_ABI_25`` covers the addition of > :func:`gcc_jit_type_get_restrict` > + > +.. _LIBGCCJIT_ABI_26: > + > +``LIBGCCJIT_ABI_26`` > +-------------------- > +``LIBGCCJIT_ABI_26`` covers the addition of functions to set the personality > +function: > + > + * :func:`gcc_jit_function_set_personality_function` > + * :func:`gcc_jit_set_global_personality_function_name` Obviously you're going to need to update the number if the other patch goes in first. > diff --git a/gcc/jit/docs/topics/functions.rst > b/gcc/jit/docs/topics/functions.rst > index cf5cb716daf..e59885c3549 100644 > --- a/gcc/jit/docs/topics/functions.rst > +++ b/gcc/jit/docs/topics/functions.rst > @@ -197,6 +197,34 @@ Functions > > .. type:: gcc_jit_case > > +.. function:: void > + gcc_jit_function_set_personality_function (gcc_jit_function > *fn, > + gcc_jit_function > *personality_func) > + > + Set the personality function of ``fn`` to ``personality_func``. > + > + were added in :ref:`LIBGCCJIT_ABI_26`; you can test for their presence > + using Likewise here. Is there a URL in the main GCC docs we can link to that describes what this is for? Are there restrictions on what a personality_func is? Sorry for my ignorance here. > + > + .. code-block:: c > + > + #ifdef LIBGCCJIT_HAVE_PERSONALITY_FUNCTION > + > +.. function:: void > + gcc_jit_set_global_personality_function_name (char* name) > + > + Set the global personality function. > + > + This is mainly useful to prevent the optimizer from unsetting the > personality > + function set on other functions. > + > + were added in :ref:`LIBGCCJIT_ABI_26`; you can test for their presence > + using Likewise here: ABI numbering, and a URL for more info on what this is. > + > + .. code-block:: c > + > + #ifdef LIBGCCJIT_HAVE_PERSONALITY_FUNCTION > + > Blocks > ------ > .. type:: gcc_jit_block > diff --git a/gcc/jit/dummy-frontend.cc b/gcc/jit/dummy-frontend.cc > index a729086bafb..c9dedd59b24 100644 > --- a/gcc/jit/dummy-frontend.cc > +++ b/gcc/jit/dummy-frontend.cc > @@ -146,6 +146,20 @@ const struct attribute_spec jit_format_attribute_table[] > = > { NULL, 0, 0, false, false, false, false, NULL, NULL } > }; > > +char* jit_personality_func_name = NULL; > +static tree personality_decl; > + > +/* FIXME: This is a hack to preserve trees that we create from the > + garbage collector. */ > + > +static GTY (()) tree jit_gc_root; > + > +void > +jit_preserve_from_gc (tree t) > +{ > + jit_gc_root = tree_cons (NULL_TREE, t, jit_gc_root); > +} If I'm reading the patch correctly, this is only used by jit_langhook_eh_personality, to preserve personality_decl. Can't you just add a GTY (()) marker to personality_decl's decl instead, as: static GTY (()) tree personality_decl; [...] > diff --git a/gcc/jit/libgccjit.cc b/gcc/jit/libgccjit.cc > index 0451b4df7f9..67d9036249e 100644 > --- a/gcc/jit/libgccjit.cc > +++ b/gcc/jit/libgccjit.cc > @@ -3590,6 +3590,28 @@ gcc_jit_context_add_command_line_option > (gcc_jit_context *ctxt, > ctxt->add_command_line_option (optname); > } > > +/* Public entrypoint. See description in libgccjit.h. > + After error-checking, the real work is done by the > + gcc::jit::recording::function::set_personality_function method, in > + jit-recording.c. */ > + > +void > +gcc_jit_function_set_personality_function (gcc_jit_function *fn, > + gcc_jit_function *personality_func) > +{ > + RETURN_IF_FAIL (fn, NULL, NULL, "NULL function"); I see various unconditional dereferences of m_personality_function, so am I right in assuming that personality_function must be non-NULL? If so we should document that, and reject NULL here. > + > + fn->set_personality_function (personality_func); > +} > + > +extern char* jit_personality_func_name; > + > +void > +gcc_jit_set_global_personality_function_name (char* name) > +{ > + jit_personality_func_name = name; This probably should be per-context state, rather than a global variable. So I think this needs a gcc_jit_context * param, which must be non-null, and we'd have a new field m_personality_func_name of the recording::context, rather than the global. Also everywhere else in the API we take a copy of the string, rather than via a pointer. Is there a reason for doing this here? Otherwise, this param should be a const char *, and we should xstrdup it (and free any existing value). [...] > diff --git a/gcc/jit/libgccjit.map b/gcc/jit/libgccjit.map > index 8b90a0e2ff3..2a0eb819a52 100644 > --- a/gcc/jit/libgccjit.map > +++ b/gcc/jit/libgccjit.map > @@ -276,3 +276,9 @@ LIBGCCJIT_ABI_25 { > global: > gcc_jit_type_get_restrict; > } LIBGCCJIT_ABI_24; > + > +LIBGCCJIT_ABI_26 { > + global: > + gcc_jit_set_global_personality_function_name; > + gcc_jit_function_set_personality_function; > +} LIBGCCJIT_ABI_25; Same note as above about ABI numbering. > diff --git a/gcc/testsuite/jit.dg/all-non-failing-tests.h > b/gcc/testsuite/jit.dg/all-non-failing-tests.h > index e762563f9bd..3785a788ffa 100644 > --- a/gcc/testsuite/jit.dg/all-non-failing-tests.h > +++ b/gcc/testsuite/jit.dg/all-non-failing-tests.h > @@ -322,6 +322,9 @@ > /* test-setting-alignment.c: This can't be in the testcases array as it > is target-specific. */ > > +/* test-personality-function.c: This can't be in the testcases array as it > + is target-specific. */ ...and because it modifies per-context state. [...] Hope the above makes sense; sorry again about my ignorance of the underlying personality stuff. Dave