In the future, targets may avoid using HELPER_CFLAGS when they are no
longer using the global CPUState register variable, env a.k.a. AREG0.

Signed-off-by: Blue Swirl <blauwir...@gmail.com>
---
 Makefile.target        |    4 +++-
 configure              |    6 ++++++
 dyngen-exec.h          |    2 ++
 tcg/arm/tcg-target.h   |    4 ++++
 tcg/hppa/tcg-target.h  |    4 ++++
 tcg/i386/tcg-target.h  |    4 ++++
 tcg/ia64/tcg-target.h  |    4 ++++
 tcg/mips/tcg-target.h  |    4 ++++
 tcg/ppc/tcg-target.h   |    4 ++++
 tcg/ppc64/tcg-target.h |    4 ++++
 tcg/s390/tcg-target.h  |    4 ++++
 tcg/sparc/tcg-target.h |    4 ++++
 12 files changed, 47 insertions(+), 1 deletions(-)

diff --git a/Makefile.target b/Makefile.target
index 602d50d..52db0c3 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -92,13 +92,15 @@ translate-all.o: translate-all.c cpu.h

 tcg/tcg.o: cpu.h

-# HELPER_CFLAGS is used for all the code compiled with static register
+ifeq ($(CONFIG_TARGET_NEEDS_AREG0), y)
+# HELPER_CFLAGS is used for all the legacy code compiled with static register
 # variables
 %_helper.o cpu-exec.o user-exec.o: QEMU_CFLAGS += $(HELPER_CFLAGS)

 # Note: this is a workaround. The real fix is to avoid compiling
 # cpu_signal_handler() in user-exec.c.
 signal.o: QEMU_CFLAGS += $(HELPER_CFLAGS)
+endif

 #########################################################
 # Linux user emulator target
diff --git a/configure b/configure
index 3ba6401..1215da2 100755
--- a/configure
+++ b/configure
@@ -3374,6 +3374,12 @@ if test "$target_bsd_user" = "yes" ; then
   echo "CONFIG_BSD_USER=y" >> $config_target_mak
 fi

+case "$ARCH" in
+  *)
+  echo "CONFIG_TARGET_NEEDS_AREG0=y" >> $config_target_mak
+  ;;
+esac
+
 # generate QEMU_CFLAGS/LDFLAGS for targets

 cflags=""
diff --git a/dyngen-exec.h b/dyngen-exec.h
index db00fba..96f85bb 100644
--- a/dyngen-exec.h
+++ b/dyngen-exec.h
@@ -28,6 +28,7 @@
 /* XXX: This may be wrong for 64-bit ILP32 hosts.  */
 typedef void * host_reg_t;

+#ifdef CONFIG_TARGET_NEEDS_AREG0
 #if defined(__i386__)
 #define AREG0 "ebp"
 #elif defined(__x86_64__)
@@ -63,6 +64,7 @@ typedef void * host_reg_t;
 #else
 #error unsupported CPU
 #endif
+#endif

 #define xglue(x, y) x ## y
 #define glue(x, y) xglue(x, y)
diff --git a/tcg/arm/tcg-target.h b/tcg/arm/tcg-target.h
index d8d7d94..30d4f40 100644
--- a/tcg/arm/tcg-target.h
+++ b/tcg/arm/tcg-target.h
@@ -75,10 +75,14 @@ enum {

 #define TCG_TARGET_HAS_GUEST_BASE

+#ifdef CONFIG_TARGET_NEEDS_AREG0
 enum {
     /* Note: must be synced with dyngen-exec.h */
     TCG_AREG0 = TCG_REG_R7,
 };
+#else
+#error AREG0 free ops not implemented
+#endif

 static inline void flush_icache_range(unsigned long start, unsigned long stop)
 {
diff --git a/tcg/hppa/tcg-target.h b/tcg/hppa/tcg-target.h
index a5cc440..5a32fc8 100644
--- a/tcg/hppa/tcg-target.h
+++ b/tcg/hppa/tcg-target.h
@@ -102,8 +102,12 @@ enum {

 #define TCG_TARGET_HAS_GUEST_BASE

+#ifdef CONFIG_TARGET_NEEDS_AREG0
 /* Note: must be synced with dyngen-exec.h */
 #define TCG_AREG0 TCG_REG_R17
+#else
+#error AREG0 free ops not implemented
+#endif

 static inline void flush_icache_range(unsigned long start, unsigned long stop)
 {
diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h
index bfafbfc..2579686 100644
--- a/tcg/i386/tcg-target.h
+++ b/tcg/i386/tcg-target.h
@@ -114,12 +114,16 @@ enum {

 #define TCG_TARGET_HAS_GUEST_BASE

+#ifdef CONFIG_TARGET_NEEDS_AREG0
 /* Note: must be synced with dyngen-exec.h */
 #if TCG_TARGET_REG_BITS == 64
 # define TCG_AREG0 TCG_REG_R14
 #else
 # define TCG_AREG0 TCG_REG_EBP
 #endif
+#else
+#error AREG0 free ops not implemented
+#endif

 static inline void flush_icache_range(unsigned long start, unsigned long stop)
 {
diff --git a/tcg/ia64/tcg-target.h b/tcg/ia64/tcg-target.h
index e56e88f..8b46d96 100644
--- a/tcg/ia64/tcg-target.h
+++ b/tcg/ia64/tcg-target.h
@@ -138,8 +138,12 @@ enum {
 #undef TCG_TARGET_HAS_not_i32   /* xor r1, -1, r3 */
 #undef TCG_TARGET_HAS_not_i64   /* xor r1, -1, r3 */

+#ifdef CONFIG_TARGET_NEEDS_AREG0
 /* Note: must be synced with dyngen-exec.h */
 #define TCG_AREG0 TCG_REG_R7
+#else
+#error AREG0 free ops not implemented
+#endif

 /* Guest base is supported */
 #define TCG_TARGET_HAS_GUEST_BASE
diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h
index 0028bfa..d9507a4 100644
--- a/tcg/mips/tcg-target.h
+++ b/tcg/mips/tcg-target.h
@@ -96,8 +96,12 @@ enum {
 #undef TCG_TARGET_HAS_ext8u_i32    /* andi rt, rs, 0xff   */
 #undef TCG_TARGET_HAS_ext16u_i32   /* andi rt, rs, 0xffff */

+#ifdef CONFIG_TARGET_NEEDS_AREG0
 /* Note: must be synced with dyngen-exec.h */
 #define TCG_AREG0 TCG_REG_S0
+#else
+#error AREG0 free ops not implemented
+#endif

 /* guest base is supported */
 #define TCG_TARGET_HAS_GUEST_BASE
diff --git a/tcg/ppc/tcg-target.h b/tcg/ppc/tcg-target.h
index a1f8599..037935c 100644
--- a/tcg/ppc/tcg-target.h
+++ b/tcg/ppc/tcg-target.h
@@ -93,6 +93,10 @@ enum {
 #define TCG_TARGET_HAS_nand_i32
 #define TCG_TARGET_HAS_nor_i32

+#ifdef CONFIG_TARGET_NEEDS_AREG0
 #define TCG_AREG0 TCG_REG_R27
+#else
+#error AREG0 free ops not implemented
+#endif

 #define TCG_TARGET_HAS_GUEST_BASE
diff --git a/tcg/ppc64/tcg-target.h b/tcg/ppc64/tcg-target.h
index 8a6db11..0158c5b 100644
--- a/tcg/ppc64/tcg-target.h
+++ b/tcg/ppc64/tcg-target.h
@@ -103,7 +103,11 @@ enum {
 /* #define TCG_TARGET_HAS_nand_i64 */
 /* #define TCG_TARGET_HAS_nor_i64 */

+#ifdef CONFIG_TARGET_NEEDS_AREG0
 #define TCG_AREG0 TCG_REG_R27
+#else
+#error AREG0 free ops not implemented
+#endif

 #define TCG_TARGET_HAS_GUEST_BASE
 #define TCG_TARGET_EXTEND_ARGS 1
diff --git a/tcg/s390/tcg-target.h b/tcg/s390/tcg-target.h
index 4e45cf3..cbc3283 100644
--- a/tcg/s390/tcg-target.h
+++ b/tcg/s390/tcg-target.h
@@ -99,10 +99,14 @@ typedef enum TCGReg {

 #define TCG_TARGET_EXTEND_ARGS 1

+#ifdef CONFIG_TARGET_NEEDS_AREG0
 enum {
     /* Note: must be synced with dyngen-exec.h */
     TCG_AREG0 = TCG_REG_R10,
 };
+#else
+#error AREG0 free ops not implemented
+#endif

 static inline void flush_icache_range(unsigned long start, unsigned long stop)
 {
diff --git a/tcg/sparc/tcg-target.h b/tcg/sparc/tcg-target.h
index df0785e..ea718e0 100644
--- a/tcg/sparc/tcg-target.h
+++ b/tcg/sparc/tcg-target.h
@@ -129,6 +129,7 @@ enum {
 // #define TCG_TARGET_HAS_nor_i64
 #endif

+#ifdef CONFIG_TARGET_NEEDS_AREG0
 /* Note: must be synced with dyngen-exec.h */
 #ifdef CONFIG_SOLARIS
 #define TCG_AREG0 TCG_REG_G2
@@ -137,6 +138,9 @@ enum {
 #else
 #define TCG_AREG0 TCG_REG_G6
 #endif
+#else
+#error AREG0 free ops not implemented
+#endif

 static inline void flush_icache_range(unsigned long start, unsigned long stop)
 {
-- 
1.6.2.4
From 0d7764b3fe5f13c79b8ee6b81871a2ecfab2adcf Mon Sep 17 00:00:00 2001
Message-Id: <0d7764b3fe5f13c79b8ee6b81871a2ecfab2adcf.1305401750.git.blauwir...@gmail.com>
In-Reply-To: <6e21df8e369388a3152dcc7da30431c672e1ee37.1305401750.git.blauwir...@gmail.com>
References: <6e21df8e369388a3152dcc7da30431c672e1ee37.1305401750.git.blauwir...@gmail.com>
From: Blue Swirl <blauwir...@gmail.com>
Date: Sun, 8 May 2011 16:54:36 +0000
Subject: [PATCH 08/11] Add CONFIG_TARGET_NEEDS_AREG0

In the future, targets may avoid using HELPER_CFLAGS when they are no
longer using the global CPUState register variable, env a.k.a. AREG0.

Signed-off-by: Blue Swirl <blauwir...@gmail.com>
---
 Makefile.target        |    4 +++-
 configure              |    6 ++++++
 dyngen-exec.h          |    2 ++
 tcg/arm/tcg-target.h   |    4 ++++
 tcg/hppa/tcg-target.h  |    4 ++++
 tcg/i386/tcg-target.h  |    4 ++++
 tcg/ia64/tcg-target.h  |    4 ++++
 tcg/mips/tcg-target.h  |    4 ++++
 tcg/ppc/tcg-target.h   |    4 ++++
 tcg/ppc64/tcg-target.h |    4 ++++
 tcg/s390/tcg-target.h  |    4 ++++
 tcg/sparc/tcg-target.h |    4 ++++
 12 files changed, 47 insertions(+), 1 deletions(-)

diff --git a/Makefile.target b/Makefile.target
index 602d50d..52db0c3 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -92,13 +92,15 @@ translate-all.o: translate-all.c cpu.h
 
 tcg/tcg.o: cpu.h
 
-# HELPER_CFLAGS is used for all the code compiled with static register
+ifeq ($(CONFIG_TARGET_NEEDS_AREG0), y)
+# HELPER_CFLAGS is used for all the legacy code compiled with static register
 # variables
 %_helper.o cpu-exec.o user-exec.o: QEMU_CFLAGS += $(HELPER_CFLAGS)
 
 # Note: this is a workaround. The real fix is to avoid compiling
 # cpu_signal_handler() in user-exec.c.
 signal.o: QEMU_CFLAGS += $(HELPER_CFLAGS)
+endif
 
 #########################################################
 # Linux user emulator target
diff --git a/configure b/configure
index 3ba6401..1215da2 100755
--- a/configure
+++ b/configure
@@ -3374,6 +3374,12 @@ if test "$target_bsd_user" = "yes" ; then
   echo "CONFIG_BSD_USER=y" >> $config_target_mak
 fi
 
+case "$ARCH" in
+  *)
+  echo "CONFIG_TARGET_NEEDS_AREG0=y" >> $config_target_mak
+  ;;
+esac
+
 # generate QEMU_CFLAGS/LDFLAGS for targets
 
 cflags=""
diff --git a/dyngen-exec.h b/dyngen-exec.h
index db00fba..96f85bb 100644
--- a/dyngen-exec.h
+++ b/dyngen-exec.h
@@ -28,6 +28,7 @@
 /* XXX: This may be wrong for 64-bit ILP32 hosts.  */
 typedef void * host_reg_t;
 
+#ifdef CONFIG_TARGET_NEEDS_AREG0
 #if defined(__i386__)
 #define AREG0 "ebp"
 #elif defined(__x86_64__)
@@ -63,6 +64,7 @@ typedef void * host_reg_t;
 #else
 #error unsupported CPU
 #endif
+#endif
 
 #define xglue(x, y) x ## y
 #define glue(x, y) xglue(x, y)
diff --git a/tcg/arm/tcg-target.h b/tcg/arm/tcg-target.h
index d8d7d94..30d4f40 100644
--- a/tcg/arm/tcg-target.h
+++ b/tcg/arm/tcg-target.h
@@ -75,10 +75,14 @@ enum {
 
 #define TCG_TARGET_HAS_GUEST_BASE
 
+#ifdef CONFIG_TARGET_NEEDS_AREG0
 enum {
     /* Note: must be synced with dyngen-exec.h */
     TCG_AREG0 = TCG_REG_R7,
 };
+#else
+#error AREG0 free ops not implemented
+#endif
 
 static inline void flush_icache_range(unsigned long start, unsigned long stop)
 {
diff --git a/tcg/hppa/tcg-target.h b/tcg/hppa/tcg-target.h
index a5cc440..5a32fc8 100644
--- a/tcg/hppa/tcg-target.h
+++ b/tcg/hppa/tcg-target.h
@@ -102,8 +102,12 @@ enum {
 
 #define TCG_TARGET_HAS_GUEST_BASE
 
+#ifdef CONFIG_TARGET_NEEDS_AREG0
 /* Note: must be synced with dyngen-exec.h */
 #define TCG_AREG0 TCG_REG_R17
+#else
+#error AREG0 free ops not implemented
+#endif
 
 static inline void flush_icache_range(unsigned long start, unsigned long stop)
 {
diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h
index bfafbfc..2579686 100644
--- a/tcg/i386/tcg-target.h
+++ b/tcg/i386/tcg-target.h
@@ -114,12 +114,16 @@ enum {
 
 #define TCG_TARGET_HAS_GUEST_BASE
 
+#ifdef CONFIG_TARGET_NEEDS_AREG0
 /* Note: must be synced with dyngen-exec.h */
 #if TCG_TARGET_REG_BITS == 64
 # define TCG_AREG0 TCG_REG_R14
 #else
 # define TCG_AREG0 TCG_REG_EBP
 #endif
+#else
+#error AREG0 free ops not implemented
+#endif
 
 static inline void flush_icache_range(unsigned long start, unsigned long stop)
 {
diff --git a/tcg/ia64/tcg-target.h b/tcg/ia64/tcg-target.h
index e56e88f..8b46d96 100644
--- a/tcg/ia64/tcg-target.h
+++ b/tcg/ia64/tcg-target.h
@@ -138,8 +138,12 @@ enum {
 #undef TCG_TARGET_HAS_not_i32   /* xor r1, -1, r3 */
 #undef TCG_TARGET_HAS_not_i64   /* xor r1, -1, r3 */
 
+#ifdef CONFIG_TARGET_NEEDS_AREG0
 /* Note: must be synced with dyngen-exec.h */
 #define TCG_AREG0 TCG_REG_R7
+#else
+#error AREG0 free ops not implemented
+#endif
 
 /* Guest base is supported */
 #define TCG_TARGET_HAS_GUEST_BASE
diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h
index 0028bfa..d9507a4 100644
--- a/tcg/mips/tcg-target.h
+++ b/tcg/mips/tcg-target.h
@@ -96,8 +96,12 @@ enum {
 #undef TCG_TARGET_HAS_ext8u_i32    /* andi rt, rs, 0xff   */
 #undef TCG_TARGET_HAS_ext16u_i32   /* andi rt, rs, 0xffff */
 
+#ifdef CONFIG_TARGET_NEEDS_AREG0
 /* Note: must be synced with dyngen-exec.h */
 #define TCG_AREG0 TCG_REG_S0
+#else
+#error AREG0 free ops not implemented
+#endif
 
 /* guest base is supported */
 #define TCG_TARGET_HAS_GUEST_BASE
diff --git a/tcg/ppc/tcg-target.h b/tcg/ppc/tcg-target.h
index a1f8599..037935c 100644
--- a/tcg/ppc/tcg-target.h
+++ b/tcg/ppc/tcg-target.h
@@ -93,6 +93,10 @@ enum {
 #define TCG_TARGET_HAS_nand_i32
 #define TCG_TARGET_HAS_nor_i32
 
+#ifdef CONFIG_TARGET_NEEDS_AREG0
 #define TCG_AREG0 TCG_REG_R27
+#else
+#error AREG0 free ops not implemented
+#endif
 
 #define TCG_TARGET_HAS_GUEST_BASE
diff --git a/tcg/ppc64/tcg-target.h b/tcg/ppc64/tcg-target.h
index 8a6db11..0158c5b 100644
--- a/tcg/ppc64/tcg-target.h
+++ b/tcg/ppc64/tcg-target.h
@@ -103,7 +103,11 @@ enum {
 /* #define TCG_TARGET_HAS_nand_i64 */
 /* #define TCG_TARGET_HAS_nor_i64 */
 
+#ifdef CONFIG_TARGET_NEEDS_AREG0
 #define TCG_AREG0 TCG_REG_R27
+#else
+#error AREG0 free ops not implemented
+#endif
 
 #define TCG_TARGET_HAS_GUEST_BASE
 #define TCG_TARGET_EXTEND_ARGS 1
diff --git a/tcg/s390/tcg-target.h b/tcg/s390/tcg-target.h
index 4e45cf3..cbc3283 100644
--- a/tcg/s390/tcg-target.h
+++ b/tcg/s390/tcg-target.h
@@ -99,10 +99,14 @@ typedef enum TCGReg {
 
 #define TCG_TARGET_EXTEND_ARGS 1
 
+#ifdef CONFIG_TARGET_NEEDS_AREG0
 enum {
     /* Note: must be synced with dyngen-exec.h */
     TCG_AREG0 = TCG_REG_R10,
 };
+#else
+#error AREG0 free ops not implemented
+#endif
 
 static inline void flush_icache_range(unsigned long start, unsigned long stop)
 {
diff --git a/tcg/sparc/tcg-target.h b/tcg/sparc/tcg-target.h
index df0785e..ea718e0 100644
--- a/tcg/sparc/tcg-target.h
+++ b/tcg/sparc/tcg-target.h
@@ -129,6 +129,7 @@ enum {
 // #define TCG_TARGET_HAS_nor_i64
 #endif
 
+#ifdef CONFIG_TARGET_NEEDS_AREG0
 /* Note: must be synced with dyngen-exec.h */
 #ifdef CONFIG_SOLARIS
 #define TCG_AREG0 TCG_REG_G2
@@ -137,6 +138,9 @@ enum {
 #else
 #define TCG_AREG0 TCG_REG_G6
 #endif
+#else
+#error AREG0 free ops not implemented
+#endif
 
 static inline void flush_icache_range(unsigned long start, unsigned long stop)
 {
-- 
1.7.2.5

Reply via email to