Make macro checks ARMv8-M baseline proof

libgloss:

        * arm/Makefile.in: Add newlib/libc/machine/arm to the include path if
        newlib is present.
        * arm/arm.h: Include acle-compat.h.
        (THUMB_V7_V6M): Rename to ...
        (PREFER_THUMB): This.  Use ACLE macros __ARM_ARCH_ISA_ARM instead of
        __ARM_ARCH_6M__ to decide whether to define it.
        (THUMB1_ONLY): Define for Thumb-1 only targets.
        (THUMB_V7M_V6M): Rename to ...
        (THUMB_VXM): This.  Defined based on __ARM_ARCH_ISA_ARM, excluding
        ARMv7.
        * arm/crt0.S: Use THUMB1_ONLY rather than __ARM_ARCH_6M__,
        !__ARM_ARCH_ISA_ARM rather than THUMB_V7M_V6M for fp enabling, and
        PREFER_THUMB rather than THUMB_V7_V6M.  Rename other occurences of
        THUMB_V7M_V6M to THUMB_VXM.
        * arm/linux-crt0.c: Likewise.
        * arm/redboot-crt0.S: Likewise.
        * arm/swi.h: Likewise.
        * arm/trap.S: Likewise.

newlib:

        * libc/machine/arm/memcpy-stub.c: Use ACLE macros __ARM_ARCH_ISA_THUMB
        and __ARM_ARCH_ISA_ARM to check for Thumb-2 only targets rather than
        __ARM_ARCH and __ARM_ARCH_PROFILE.
        * libc/machine/arm/memcpy.S: Likewise.
        * libc/machine/arm/setjmp.S: Likewise for Thumb-1 only target and
        include acle-compat.h.
        * libc/machine/arm/strcmp.S: Likewise for Thumb-1 and Thumb-2 only
        target and include acle-compat.h.
        * libc/sys/arm/arm.h: Include acle-compat.h.
        (THUMB_V7_V6M): Rename to ...
        (PREFER_THUMB): This.  Use ACLE macro __ARM_ARCH_ISA_ARM instead of
        __ARM_ARCH_6M__ to decide whether to define it.
        (THUMB1_ONLY): Define for Thumb-1 only targets.
        (THUMB_V7M_V6M): Rename to ...
        (THUMB_VXM): This.  Defined based on __ARM_ARCH_ISA_ARM, excluding
        ARMv7.
        * libc/sys/arm/crt0.S: Use PREFER_THUMB rather than THUMB_V7_V6M and
        rename THUMB_V7M_V6M into THUMB_VXM.
        * libc/sys/arm/swi.h: Likewise.
This commit is contained in:
Thomas Preud'homme
2016-01-28 11:26:09 +01:00
committed by Corinna Vinschen
parent 0b42ea7960
commit 69f4c40291
14 changed files with 72 additions and 63 deletions

View File

@ -29,25 +29,27 @@
#ifndef _LIBGLOSS_ARM_H
#define _LIBGLOSS_ARM_H
/* __thumb2__ stands for thumb on armva7(A/R/M/EM) architectures,
__ARM_ARCH_6M__ stands for armv6-M(thumb only) architecture,
__ARM_ARCH_7M__ stands for armv7-M(thumb only) architecture.
__ARM_ARCH_7EM__ stands for armv7e-M(thumb only) architecture.
There are some macro combinations used many times in libgloss/arm,
like (__thumb2__ || (__thumb__ && __ARM_ARCH_6M__)), so factor
it out and use THUMB_V7_V6M instead, which stands for thumb on
v6-m/v7 arch as the combination does. */
#if defined(__thumb2__) || (defined(__thumb__) && defined(__ARM_ARCH_6M__))
# define THUMB_V7_V6M
#include "acle-compat.h"
/* Checking for targets supporting only Thumb instructions (eg. ARMv6-M) or
supporting Thumb-2 instructions, whether ARM instructions are available or
not, is done many times in libgloss/arm. So factor it out and use
PREFER_THUMB instead. */
#if __thumb2__ || (__thumb__ && !__ARM_ARCH_ISA_ARM)
# define PREFER_THUMB
#endif
/* The (__ARM_ARCH_7EM__ || __ARM_ARCH_7M__ || __ARM_ARCH_6M__) combination
stands for cortex-M profile architectures, which don't support ARM state.
Factor it out and use THUMB_V7M_V6M instead. */
#if defined(__ARM_ARCH_7M__) \
|| defined(__ARM_ARCH_7EM__) \
|| defined(__ARM_ARCH_6M__)
# define THUMB_V7M_V6M
/* Processor only capable of executing Thumb-1 instructions. */
#if __ARM_ARCH_ISA_THUMB == 1 && !__ARM_ARCH_ISA_ARM
# define THUMB1_ONLY
#endif
/* M profile architectures. This is a different set of architectures than
those not having ARM ISA because it does not contain ARMv7. This macro is
necessary to test which architectures use bkpt as semihosting interface from
architectures using svc. */
#if !__ARM_ARCH_ISA_ARM && !__ARM_ARCH_7__
# define THUMB_VXM
#endif
/* Defined if this target supports the BLX Rm instruction. */

View File

@ -44,7 +44,7 @@
/* .text is used instead of .section .text so it works with arm-aout too. */
.text
.syntax unified
#ifdef THUMB_V7_V6M
#ifdef PREFER_THUMB
.thumb
.macro FUNC_START name
.global \name
@ -99,7 +99,7 @@
/* Issue Angel SWI to read stack info. */
movs r0, #AngelSWI_Reason_HeapInfo
adr r1, .LC0 /* Point at ptr to 4 words to receive data. */
#ifdef THUMB_V7M_V6M
#ifdef THUMB_VXM
bkpt AngelSWI
#elif defined(__thumb2__)
/* We are in thumb mode for startup on armv7 architectures. */
@ -176,7 +176,7 @@
have somehow missed it below (in which case it gets the same
value as FIQ - not ideal, but better than nothing). */
mov sp, r3
#ifdef THUMB_V7_V6M
#ifdef PREFER_THUMB
/* XXX Fill in stack assignments for interrupt modes. */
#else
mrs r2, CPSR
@ -239,7 +239,7 @@
subs a3, a3, a1 /* Third arg: length of block. */
#if defined(__thumb__) && !defined(THUMB_V7_V6M)
#if __thumb__ && !defined(PREFER_THUMB)
/* Enter Thumb mode... */
add a4, pc, #1 /* Get the address of the Thumb block. */
bx a4 /* Go there and start Thumb decoding. */
@ -278,7 +278,7 @@ __change_mode:
#else
movs r0, #AngelSWI_Reason_GetCmdLine
adr r1, .LC30 /* Space for command line. */
#ifdef THUMB_V7M_V6M
#ifdef THUMB_VXM
bkpt AngelSWI
#else
AngelSWIAsm AngelSWI
@ -404,7 +404,7 @@ __change_mode:
bl FUNCTION (exit) /* Should not return. */
#if defined(__thumb__) && !defined(THUMB_V7_V6M)
#if __thumb__ && !defined(PREFER_THUMB)
/* Come out of Thumb mode. This code should be redundant. */
mov a4, pc
bx a4

View File

@ -36,7 +36,7 @@
#define AngelSWI AngelSWI_ARM
#endif
/* For thumb only architectures use the BKPT instruction instead of SWI. */
#ifdef THUMB_V7M_V6M
#ifdef THUMB_VXM
#define AngelSWIInsn "bkpt"
#define AngelSWIAsm bkpt
#else