Sv: Global register variables
Petter Tomner
tomner@kth.se
Thu Sep 2 16:05:48 GMT 2021
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.
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