Global register variables
Marc Nieper-Wißkirchen
marc.nieper+gnu@gmail.com
Thu Sep 2 16:33:50 GMT 2021
Thank you very much for this proof of concept!
Am Do., 2. Sept. 2021 um 18:05 Uhr schrieb Petter Tomner <tomner@kth.se>:
> Hi! Conceptually is seems quite straight forward if you want to try it on
> some code you have.
> See the attached code that hack any identifier starting with reg_* to a
> "global register" named *.
>
> It seems to work with e.g "reg_r14" and "reg_r15" on my machine with some
> silly getter and
> setter functions for those registers but there is an array "global_regs"
> in reginfo.c that is not
> reset after each run so only run it once. And as EXPORTED global type.
>
> I guess error handling and eg. having not to specify register explicitly
> for portability
> would be the interesting and little bit harder part.
>
I think specifying a register explicitly is not that bad. This is what
would be done in C code as well. Depending on the target system, the
consumer of the libgccjit API would choose such registers. I don't see a
good way to have the registers chosen automatically. For example, on a
target with a lot of registers, I may want to pin a lot; while on a target
with only a few, I may want to pin just one for the most important global.
Or would you see libgccjit to do such heuristics?
Marc
> Regards
>
> From f45d0e328b21b2a4b23021c099f1f3b0ad6e6002 Mon Sep 17 00:00:00 2001
> From: Petter Tomner <tomner@kth.se>
> Date: Thu, 2 Sep 2021 17:23:24 +0200
> Subject: [PATCH] Hack reg_* identifiers to global register
>
> ---
> gcc/jit/jit-playback.c | 15 ++++++++++++++-
> 1 file changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/gcc/jit/jit-playback.c b/gcc/jit/jit-playback.c
> index 79ac525e5df..fa011ed4c0c 100644
> --- a/gcc/jit/jit-playback.c
> +++ b/gcc/jit/jit-playback.c
> @@ -40,7 +40,7 @@ along with GCC; see the file COPYING3. If not see
> #include "gcc.h"
> #include "diagnostic.h"
> #include "stmt.h"
> -
> +#include "varasm.h"
> #include <pthread.h>
>
> #include "jit-playback.h"
> @@ -567,6 +567,19 @@ global_new_decl (location *loc,
> break;
> }
>
> + { /* Filescope register variables on identifiers reg_REGNUM */
> + const char *key = "reg_";
> +
> + for (int i = 0; i < 4; i++)
> + if (name[i] != key[i]) goto bail;
> + if (!name[4]) goto bail;
> +
> + DECL_REGISTER (inner) = 1;
> + set_user_assembler_name (inner, name + 4);
> + DECL_HARD_REGISTER (inner) = 1;
> + }
> +bail:
> +
> if (loc)
> set_tree_location (inner, loc);
>
> --
> 2.20.1
>
> -----Ursprungligt meddelande-----
> Från: Jit <jit-bounces+tomner=kth.se@gcc.gnu.org> För David Malcolm via
> Jit
> Skickat: den 2 september 2021 16:34
> Till: Marc Nieper-Wißkirchen <marc.nieper+gnu@gmail.com>; jit@gcc.gnu.org
> Ämne: Re: Global register variables
>
> On Tue, 2021-08-31 at 08:39 +0200, Marc Nieper-Wißkirchen via Jit
> wrote:
> > Does libgccjit support GCC's global register variables ([1])?
>
> Not currently.
>
> >
> > If not, could we expect them to be included?
>
> > One major use case of
> > libgccjit seems to be JIT compilation of some virtual machine bytecode
> > and virtual machines usually need a number of global variables (like
> > some virtual stack pointer or heap pointer, etc.). It makes a lot of
> > sense to hold them in global (callee-saved) registers.
>
> Sounds like a useful feature; if someone wants to cook up a patch I can
> review it.
>
> Dave
>
>
More information about the Jit
mailing list