[PATCH] libgccjit: Add support for setting the link section of global variables [PR100688]
David Malcolm
dmalcolm@redhat.com
Sat Nov 20 16:20:54 GMT 2021
On Sat, 2021-11-20 at 00:58 -0500, Antoni Boucher wrote:
> Thanks for your reviews!
>
> Here's the updated patch, ready for another review.
> See comments/questions below.
Thanks for the updated patch...
>
> I'll update the other patches over the weekend.
>
> Le jeudi 20 mai 2021 à 15:29 -0400, David Malcolm a écrit :
> > On Wed, 2021-05-19 at 20:32 -0400, Antoni Boucher via Jit wrote:
> > > Hello.
> > > This patch adds support to set the link section of global
> > > variables.
> > > I used the ABI 18 because I submitted other patches up to 17.
> > > Thanks for the review.
> >
> > I didn't see this email until now, and put the review in bugzilla
> > instead; sorry.
> >
> > Here's a copy-and-paste of what I put in bugzilla:
> >
> >
> > Thanks for the patch; I like the idea; various nits below:
> >
[...snip...]
> >
> > > Global variables
> > > ****************
> > >
> > > diff --git a/gcc/jit/jit-playback.h b/gcc/jit/jit-playback.h
> > > index 825a3e172e9..8b0f65e87e8 100644
> > > --- a/gcc/jit/jit-playback.h
> > > +++ b/gcc/jit/jit-playback.h
> > > @@ -650,6 +650,8 @@ public:
> > >
> > > private:
> > > context *m_ctxt;
> > > +
> > > +protected:
> > > tree m_inner;
> > > };
> >
> > I think you only use this...
> >
> > >
> > > @@ -670,6 +672,12 @@ public:
> > > rvalue *
> > > get_address (location *loc);
> > >
> > > + void
> > > + set_link_section (const char* name)
> > > + {
> > > + set_decl_section_name (m_inner, name);
> > > + }
> >
> > ...here, and you can get at rvalue::m_inner using as_tree (), so I
> > don't think we need to make m_inner protected.
Thanks for dropping the "protected" in the updated patch; you need to
update the ChangeLog entry.
> >
> >
> > > + set_playback_obj (global);
> > > }
> > >
> >
> > [...snip....]
> >
> > > diff --git a/gcc/jit/jit-recording.h b/gcc/jit/jit-recording.h
> > > index 03fa1160cf0..0691fac579d 100644
> > > --- a/gcc/jit/jit-recording.h
> > > +++ b/gcc/jit/jit-recording.h
> > > @@ -1105,7 +1105,8 @@ public:
> > > lvalue (context *ctxt,
> > > location *loc,
> > > type *type_)
> > > - : rvalue (ctxt, loc, type_)
> > > + : rvalue (ctxt, loc, type_),
> > > + m_link_section(NULL)
> > > {}
> > >
> > > playback::lvalue *
> > > @@ -1127,6 +1128,10 @@ public:
> > > const char *access_as_rvalue (reproducer &r) OVERRIDE;
> > > virtual const char *access_as_lvalue (reproducer &r);
> > > virtual bool is_global () const { return false; }
> > > + void set_link_section (const char *name);
> > > +
> > > +protected:
> > > + string *m_link_section;
> > > };
> >
> > Can it be private, rather than protected?
>
> m_link_section can't be private because it's used in
> recording::global::replay_into.
Fair enough; thanks.
> >
> > > diff --git a/gcc/jit/libgccjit.c b/gcc/jit/libgccjit.c
> > > index 7fa948007ad..8cfa48aae24 100644
> > > --- a/gcc/jit/libgccjit.c
> > > +++ b/gcc/jit/libgccjit.c
> > > @@ -1953,6 +1953,18 @@ gcc_jit_lvalue_get_address (gcc_jit_lvalue
> > *lvalue,
> > > return (gcc_jit_rvalue *)lvalue->get_address (loc);
> > > }
> > >
> > > +/* Public entrypoint. See description in libgccjit.h.
> > > +
> > > + After error-checking, the real work is done by the
> > > + gcc::jit::recording::lvalue::set_section method in jit-
> > recording.c. */
> > ^^^^^^^^^^^
> > set_link_section
> >
> > Also, a newline here please for consistency with the other
> > entrypoints.
>
> Where should I add a newline?
Between the closing of the comment and the "void" of the fndecl (all
the other entrypoints have a blank line separating them). Thanks for
fixing my other nitpicks.
[...snip...]
> > > diff --git a/gcc/testsuite/jit.dg/all-non-failing-tests.h
> > b/gcc/testsuite/jit.dg/all-non-failing-tests.h
> > > index 4202eb7798b..7e3b59dee0d 100644
> > > --- a/gcc/testsuite/jit.dg/all-non-failing-tests.h
> > > +++ b/gcc/testsuite/jit.dg/all-non-failing-tests.h
> > > @@ -181,6 +181,13 @@
> > > #undef create_code
> > > #undef verify_code
> > >
> > > +/* test-link-section.c */
> > > +#define create_code create_code_link_section
> > > +#define verify_code verify_code_link_section
> > > +#include "test-link-section.c"
> > > +#undef create_code
> > > +#undef verify_code
The updated version of the testcase doesn't have a verify_code, so it
can't be in the "testcases" array.
Please replace this with something like:
/* test-link-section.c: This can't be in the testcases array as it
doesn't have a verify_code implementation. */
(I'm trying to have all-nonfailing-tests.h refer to each non-failing
test, either adding it to the testcases array, or documenting why it
isn't in the array; listing them in alphabetical order)
[...snip...]
> > >
> > > +
> > > +extern void
> > > +verify_code (gcc_jit_context *ctxt, gcc_jit_result *result)
> > > +{
> > > +}
> >
> > This is OK, but ideally it would test that the section name made it
> > into the generated assembler. test-compile-to-assembler.c has a
> > testcase for this which does something similar, with a DejaGnu
> > directive looking for a substring in the generated asm if you want to
> > attempt it.
Thanks for implementing the .exp directive.
> >
> > One other thing: the docs should make it clear about the leading ".".
> >
> > If I want to create the equivalent of:
> >
> > __attribute__((section(".section")))
> >
> > do I call it with:
> >
> > gcc_jit_lvalue_set_link_section(foo, "section");
> >
> > or with:
> >
> > gcc_jit_lvalue_set_link_section(foo, ".section");
> >
> > It's a bit unclear to me from just reading the patch. The example
> > suggests it's the former. In either case, the documentation should
> > be
> > clearer about this.
Thanks for clarifying this in the docs.
>
Notes on the updated patch follow:
> From a454cb9ce14aa6903f7be9f2a56c35ab8251e678 Mon Sep 17 00:00:00 2001
> From: Antoni Boucher <bouanto@zoho.com>
> Date: Wed, 12 May 2021 07:57:54 -0400
> Subject: [PATCH] libgccjit: Add support for setting the link section of global
> variables [PR100688]
>
> 2021-11-20 Antoni Boucher <bouanto@zoho.com>
>
> gcc/jit/
> PR target/100688
> * docs/topics/compatibility.rst (LIBGCCJIT_ABI_18): New ABI
> tag.
> * docs/topics/expressions.rst: Add documentation for the
> function gcc_jit_lvalue_set_link_section.
> * jit-playback.h: New function (set_link_section) and
> rvalue::m_inner protected.
As noted above, this part of the ChangeLog at least needs updating.
> * jit-recording.c: New function (set_link_section) and
> support for setting the link section.
> * jit-recording.h: New function (set_link_section) and new
> field m_link_section.
> * libgccjit.c: New function (gcc_jit_lvalue_set_link_section).
> * libgccjit.h: New function (gcc_jit_lvalue_set_link_section).
> * libgccjit.map (LIBGCCJIT_ABI_18): New ABI tag.
>
> gcc/testsuite/
> PR target/100688
> * jit.dg/all-non-failing-tests.h: Add test-link-section.c.
> * jit.dg/test-link_section.c: New test.
> * jit.dg/jit.exp: New helper function to test that the
> assembly contains a pattern.
[...snip...]
> diff --git a/gcc/jit/docs/topics/compatibility.rst b/gcc/jit/docs/topics/compatibility.rst
> index 52ee3f860a7..b852f205fd7 100644
> --- a/gcc/jit/docs/topics/compatibility.rst
> +++ b/gcc/jit/docs/topics/compatibility.rst
> @@ -284,3 +284,12 @@ entrypoints:
> * :func:`gcc_jit_struct_get_field`
>
> * :func:`gcc_jit_struct_get_field_count`
> +
> +.. _LIBGCCJIT_ABI_18:
> +
> +``LIBGCCJIT_ABI_18``
> +-----------------------
> +``LIBGCCJIT_ABI_18`` covers the addition of an API entrypoint to set the link
> +section of a variable:
> +
> + * :func:`gcc_jit_lvalue_set_link_section`
As noted in earlier review, presumably there's a different patch that
adds ABI_17?
I can potentially approve this link section patch now, but that other
patch would need to be pushed first.
[...snip...]
> @@ -4547,20 +4552,30 @@ recording::block::dump_edges_to_dot (pretty_printer *pp)
> void
> recording::global::replay_into (replayer *r)
> {
> - set_playback_obj (
> - m_initializer
> - ? r->new_global_initialized (playback_location (r, m_loc),
> + playback::lvalue *global;
> + if (m_initializer)
> + {
> + global = r->new_global_initialized (playback_location (r, m_loc),
> m_kind,
> m_type->playback_type (),
> m_type->dereference ()->get_size (),
> m_initializer_num_bytes
> / m_type->dereference ()->get_size (),
> m_initializer,
> - playback_string (m_name))
> - : r->new_global (playback_location (r, m_loc),
> + playback_string (m_name));
> + }
> + else
> + {
> + global = r->new_global (playback_location (r, m_loc),
> m_kind,
> m_type->playback_type (),
> - playback_string (m_name)));
> + playback_string (m_name));
> + }
> +
> + if (m_link_section != NULL)
> + global->set_link_section (m_link_section->c_str ());
> +
> + set_playback_obj (global);
> }
Looks like the patch as posted has some interaction with the
initializers patch, presumably that's the ABI_17?
But presumably the intent here is this hunk:
+ if (m_link_section != NULL)
+ global->set_link_section (m_link_section->c_str ());
and that indeed looks good.
> diff --git a/gcc/jit/libgccjit.c b/gcc/jit/libgccjit.c
> index c744b634f4b..5b413d41e2c 100644
> --- a/gcc/jit/libgccjit.c
> +++ b/gcc/jit/libgccjit.c
> @@ -2217,6 +2217,18 @@ gcc_jit_lvalue_get_address (gcc_jit_lvalue *lvalue,
> return (gcc_jit_rvalue *)lvalue->get_address (loc);
> }
>
> +/* Public entrypoint. See description in libgccjit.h.
> +
> + After error-checking, the real work is done by the
> + gcc::jit::recording::lvalue::set_link_section method in jit-recording.c. */
> +void
> +gcc_jit_lvalue_set_link_section (gcc_jit_lvalue *lvalue,
> + const char *section_name)
> +{
> + RETURN_IF_FAIL (name, NULL, NULL, "NULL section_name");
> + lvalue->set_link_section (name);
> +}
Thanks for renaming the param from "name" to "section_name", but it
looks like you didn't rename the uses of it within the function - I'm
guessing this code as-is doesn't compile.
[...snip...]
> diff --git a/gcc/jit/libgccjit.map b/gcc/jit/libgccjit.map
> index 64e790949e8..e5bdafd0156 100644
> --- a/gcc/jit/libgccjit.map
> +++ b/gcc/jit/libgccjit.map
> @@ -226,3 +226,11 @@ LIBGCCJIT_ABI_16 {
> gcc_jit_type_is_struct;
> gcc_jit_struct_get_field_count;
> } LIBGCCJIT_ABI_15;
> +
> +LIBGCCJIT_ABI_17 {
> +} LIBGCCJIT_ABI_16;
> +
Same notes here as above.
[...snip...]
Overall the patch looks good, my comments are all just nit-picks at
this point, except that obviously you need to finish updating the
symbol name to "section_name" in gcc_jit_lvalue_set_link_section so
that it compiles. Please check it compiles and that the testsuite
passes before pushing - though I think this is waiting on another
patch, right? This is OK for trunk, once those fixes and prerequisites
are taken care of.
Thanks again
Dave
More information about the Gcc-patches
mailing list