[PATCH] arm: simplify handling of Thumb related options

Thomas Petazzoni thomas.petazzoni at free-electrons.com
Sun Mar 20 16:58:35 UTC 2016


Currently, the Thumb support on ARM has three related Config.in
options, which are not trivial for users to understand, and are in
fact not needed:

 - The USE_BX option is not needed: knowing whether BX is available or
   not is easy. If you have an ARM > v4 or ARMv4T, then BX is
   available, otherwise it's not. This is the logic used in glibc.

 - The USE_LDREXSTREX option is not needed: whenever Thumb2 is
   available, ldrex/strex are available, so we can simply rely on
   __thumb2__ to determine whether ldrex/strex should be used, without
   requiring a Config.in option.

 - Once USE_BX and USE_LDREXSTREX are removed, the only thing left
   that COMPILE_IN_THUMB does is to set -mthumb. This makes the option
   unnecessary, as on ARM at least, the user is already supposed to
   pass -march=<foo> or other compiler options tuning the library for
   a specific ARM variant. There is no reason to do otherwise for
   Thumb, which allows to get rid of the COMPILE_IN_THUMB option.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
---
 Rules.mak                                          |  1 -
 extra/Configs/Config.arm                           | 22 ----------------------
 libc/sysdeps/linux/arm/bits/arm_bx.h               | 10 ++++------
 libc/sysdeps/linux/arm/clone.S                     |  2 +-
 .../linuxthreads.old/sysdeps/arm/pt-machine.h      |  7 +++----
 5 files changed, 8 insertions(+), 34 deletions(-)

diff --git a/Rules.mak b/Rules.mak
index b1cecec..0ae3bb1 100644
--- a/Rules.mak
+++ b/Rules.mak
@@ -392,7 +392,6 @@ endif
 ifeq ($(TARGET_ARCH),arm)
 	CPU_CFLAGS-$(ARCH_LITTLE_ENDIAN)+=-mlittle-endian
 	CPU_CFLAGS-$(ARCH_BIG_ENDIAN)+=-mbig-endian
-	CPU_CFLAGS-$(COMPILE_IN_THUMB_MODE)+=-mthumb
 endif
 
 ifeq ($(TARGET_ARCH),metag)
diff --git a/extra/Configs/Config.arm b/extra/Configs/Config.arm
index 00cf982..0d02e3f 100644
--- a/extra/Configs/Config.arm
+++ b/extra/Configs/Config.arm
@@ -24,25 +24,3 @@ config CONFIG_ARM_EABI
 
 	  If you say 'n' here, then the library will be built for the
 	  old Linux ABI.
-
-config COMPILE_IN_THUMB_MODE
-	bool "Build using Thumb mode"
-	select USE_BX
-	select USE_LDREXSTREX
-	help
-	  Say 'y' here to force building uClibc in thumb mode.
-	  Say 'n' to use your compiler's default mode.
-
-config USE_BX
-	bool "Use BX in function return"
-	help
-	  Say 'y' to use BX to return from functions on your thumb-aware
-	  processor. Say 'y' if you need to use interworking. Say 'n' if not.
-	  It is safe to say 'y' even if you're not doing interworking.
-
-config USE_LDREXSTREX
-	bool "Use load-store exclusive ASM ops (not supported in SmartFusion)"
-	depends on COMPILE_IN_THUMB_MODE
-	default n
-	help
-	  Say 'y' to use LDREX/STREX ASM ops.
diff --git a/libc/sysdeps/linux/arm/bits/arm_bx.h b/libc/sysdeps/linux/arm/bits/arm_bx.h
index 2c29089..1c775b6 100644
--- a/libc/sysdeps/linux/arm/bits/arm_bx.h
+++ b/libc/sysdeps/linux/arm/bits/arm_bx.h
@@ -23,13 +23,11 @@
 #error Please include features.h first
 #endif /* features.h not yet included */
 
-#if defined(__USE_BX__)
-# if (__ARM_ARCH <= 4 && !defined __ARM_ARCH_4T__)
-#  error Use of BX was requested, but is not available on the target processor.
-# endif /* ARCH level */
-#endif /* __USE_BX__ */
+#if __ARM_ARCH > 4 || defined (__ARM_ARCH_4T__)
+# define ARCH_HAS_BX
+#endif
 
-#if defined(__USE_BX__) && (__ARM_ARCH > 4 || (__ARM_ARCH == 4 && defined __ARM_ARCH_4T__))
+#if defined(ARCH_HAS_BX)
 # define BX(reg)	bx reg
 # define BXC(cond, reg)	bx##cond reg
 #else
diff --git a/libc/sysdeps/linux/arm/clone.S b/libc/sysdeps/linux/arm/clone.S
index b4c7d8a..fd7590d 100644
--- a/libc/sysdeps/linux/arm/clone.S
+++ b/libc/sysdeps/linux/arm/clone.S
@@ -69,7 +69,7 @@ __clone:
 
 	@ pick the function arg and call address off the stack and execute
 	ldr	r0, [sp, #4]
-#if defined(__USE_BX__)
+#if defined(ARCH_HAS_BX)
 	ldr	r1, [sp]
 	bl	2f	@ blx r1
 #else
diff --git a/libpthread/linuxthreads.old/sysdeps/arm/pt-machine.h b/libpthread/linuxthreads.old/sysdeps/arm/pt-machine.h
index 2b877f9..fc17e9b 100644
--- a/libpthread/linuxthreads.old/sysdeps/arm/pt-machine.h
+++ b/libpthread/linuxthreads.old/sysdeps/arm/pt-machine.h
@@ -28,8 +28,7 @@
 # define PT_EI __extern_always_inline
 #endif
 
-#if defined(__thumb__)
-#if defined(__USE_LDREXSTREX__)
+#if defined(__thumb2__)
 PT_EI long int ldrex(int *spinlock)
 {
 	long int ret;
@@ -63,7 +62,7 @@ testandset (int *spinlock)
   return ret;
 }
 
-#else /* __USE_LDREXSTREX__ */
+#elif defined(__thumb__)
 
 /* This will not work on ARM1 or ARM2 because SWP is lacking on those
    machines.  Unfortunately we have no way to detect this at compile
@@ -88,7 +87,7 @@ PT_EI long int testandset (int *spinlock)
 	: "0"(1), "r"(spinlock));
   return ret;
 }
-#endif
+
 #else /* __thumb__ */
 
 PT_EI long int testandset (int *spinlock);
-- 
2.6.4



More information about the uClibc mailing list