This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH, ARM] Switch to EABI version 5 for RTEMS


Hello,

there were several requests for ARM Cortex-M support on RTEMS recently.  The
first step towards this is a suitable ARM tool chain.  I want to use this event
to clean up the multilibs and switch to the EABI version 5.  The benefit of
EABI version 5 is that this brings RTEMS more in line with the primary GCC
platform arm-linux-gnueabi.  For standards related to this please have a look
at the following documents.

Base Platform ABI for the ARM Architecture (BPABI):

http://infocenter.arm.com/help/topic/com.arm.doc.ihi0037b/IHI0037B_bpabi.pdf

ARM Architecture Procedure Call Standard (AAPCS):

http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf

ELF for the ARM Architecture:

http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044d/IHI0044D_aaelf.pdf

The EABI makes the VFP floating point format mandatory and enables us to
use hardware floating point support in the future.  RTEMS has currently no
support for hardware floating point units (the context switch part is missing).
The Thumb interwork support is mandatory with this ABI.  The exception handling
implementation changes from SJLJ to a table-based system, which is not based on
DWARF unwinding tables as they are too bulky for use on small embedded systems.

I propose to change the ARM multilibs as follows:

 1. Default: armv4, ARM
 2. thumb: armv4t, Thumb
 3. armv6-m: armv6-m, subset of Thumb 2
 4. armv7: armv7, Thumb 2
 5. armv7-m: armv7-m, Thumb 2, hardware integer division (SDIV/UDIV)

Multilib 1. and 2. support the standard ARM7TDMI and ARM926EJ-S targets.

Multilib 3. supports the Cortex-M0 and Cortex-M1 cores.

Multilib 5. supports the Cortex-M3 and Cortex-M4 cores, which have a special
hardware integer division instruction (this is not present in the A and R
profiles).

Multilib 4. supports Cortex-A and Cortex-R variants.

Does this make sense?  Please have a look at the attached patch.

What bothers me a bit, is that some functions of libgcc are compiled
unnecessarily with the -fexceptions flag.  This pulls in the unwind mechanic
for simple things like

int64_t f(int64_t a, int64_t b)
{
  return a / b;
}

Is is possible to make parts of libgcc/Makefile.am target specific?

Have a nice day!

PS: I am not subscribed to the gcc-patches list, so please CC me.

-- 
Sebastian Huber, embedded brains GmbH

Address : Obere Lagerstr. 30, D-82178 Puchheim, Germany
Phone   : +49 89 18 90 80 79-6
Fax     : +49 89 18 90 80 79-9
E-Mail  : sebastian.huber@embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.

2011-04-05	Sebastian Huber <sebastian.huber@embedded-brains.de>

	* config.gcc (arm*-*-rtems*), config/arm/rtems-elf.h: Switch to ARM
	EABI version 5.
	* config/arm/t-rtems: Provide multilibs for ARMv4, ARMv4T, ARMv6M,
	ARMv7, and ARMv7M.

diff --git a/gcc/config.gcc b/gcc/config.gcc
index 58f6787..421279d 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -895,8 +895,14 @@ arm*-*-eabi* | arm*-*-symbianelf* )
 	tmake_file="${tmake_file} arm/t-arm-softfp soft-fp/t-softfp"
 	;;
 arm*-*-rtems*)
-	tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/rtems-elf.h rtems.h newlib-stdint.h"
-	tmake_file="arm/t-arm arm/t-arm-elf t-rtems arm/t-rtems"
+	need_64bit_hwint=yes
+	default_use_cxa_atexit=yes
+	tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/bpabi.h"
+	tm_file="${tm_file} ../../libgcc/config/arm/bpabi-lib.h"
+	tm_file="${tm_file} rtems.h arm/rtems-elf.h newlib-stdint.h"
+	tm_file="${tm_file} arm/aout.h arm/arm.h"
+	tmake_file="arm/t-arm arm/t-arm-elf"
+	tmake_file="${tmake_file} arm/t-bpabi t-rtems arm/t-rtems"
 	tmake_file="${tmake_file} arm/t-arm-softfp soft-fp/t-softfp"
 	;;
 arm*-*-elf)
diff --git a/gcc/config/arm/rtems-elf.h b/gcc/config/arm/rtems-elf.h
index dade74b..ad7e5b8 100644
--- a/gcc/config/arm/rtems-elf.h
+++ b/gcc/config/arm/rtems-elf.h
@@ -23,23 +23,10 @@
 
 #define HAS_INIT_SECTION
 
+#undef TARGET_OS_CPP_BUILTINS
 #define TARGET_OS_CPP_BUILTINS()		\
     do {					\
 	builtin_define ("__rtems__");		\
-	builtin_define ("__USE_INIT_FINI__");	\
 	builtin_assert ("system=rtems");	\
+	TARGET_BPABI_CPP_BUILTINS();    	\
     } while (0)
-
-/*
- * The default in gcc now is soft-float, but gcc misses it to 
- * pass it to the assembler.
- */
-#undef SUBTARGET_EXTRA_ASM_SPEC
-#define SUBTARGET_EXTRA_ASM_SPEC "\
-  %{!mhard-float: %{!msoft-float:-mfpu=softfpa}}"
-
-/*
- *  The default includes --start-group and --end-group which conflicts
- *  with how this used to be defined.
- */
-#undef LINK_GCC_C_SEQUENCE_SPEC
diff --git a/gcc/config/arm/t-rtems b/gcc/config/arm/t-rtems
index 52d14ba..9c68dc0 100644
--- a/gcc/config/arm/t-rtems
+++ b/gcc/config/arm/t-rtems
@@ -1,10 +1,6 @@
 # Custom rtems multilibs
 
-MULTILIB_OPTIONS     = marm/mthumb
-MULTILIB_DIRNAMES    = arm thumb
-MULTILIB_EXCEPTIONS  = 
-MULTILIB_MATCHES     = marm=mno-thumb
-
-MULTILIB_OPTIONS    += msoft-float/mhard-float
-MULTILIB_DIRNAMES   += soft fpu
-MULTILIB_EXCEPTIONS += *mthumb/*mhard-float*
+MULTILIB_OPTIONS    = mthumb march=armv6-m/march=armv7/march=armv7-m
+MULTILIB_DIRNAMES   = thumb armv6-m armv7 armv7-m
+MULTILIB_EXCEPTIONS = march=armv6-m march=armv7 march=armv7-m
+MULTILIB_MATCHES    = marm=mno-thumb


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]