Hi,

We decided to apply the following patch to the ARM embedded 5 branch.

Best regards,

Thomas

> -----Original Message-----
> From: gcc-patches-ow...@gcc.gnu.org [mailto:gcc-patches-
> ow...@gcc.gnu.org] On Behalf Of Thomas Preud'homme
> Sent: Thursday, December 17, 2015 3:25 PM
> To: gcc-patches@gcc.gnu.org; Richard Earnshaw; Ramana Radhakrishnan;
> Kyrylo Tkachov
> Subject: [PATCH, ARM 2/6] Add support for ARMv8-M
> 
> Hi,
> 
> This patch is part of a patch series to add support for ARMv8-M[1] to GCC.
> This specific patch adds basic support for the new architecture, allowing
> the new names to be accepted by -march and the compiler to behave
> like ARMv6-M (for ARMv8-M Baseline) and or ARMv7-M (for ARMv8-M
> Mainline). The changes are divided in two categories:
> 
> * those to recognize the new architecture name
> * those to keep the behavior as previous architectures
> 
> Changes to make the compiler generate code with the new instructions
> are in follow-up patches.
> 
> [1] For a quick overview of ARMv8-M please refer to the initial cover
> letter.
> 
> 
> ChangeLog entries are as follow:
> 
> *** gcc/ChangeLog ***
> 
> 2015-11-23  Thomas Preud'homme  <thomas.preudho...@arm.com>
> 
>         * config/arm/arm-arches.def (armv8-m.base): Define new
> architecture.
>         (armv8-m.main): Likewise.
>         (armv8-m.main+dsp): Likewise
>         * config/arm/arm-protos.h (FL_FOR_ARCH8M_BASE): Define.
>         (FL_FOR_ARCH8M_MAIN): Likewise.
>         * config/arm/arm-tables.opt: Regenerate.
>         * config/arm/bpabi.h: Add armv8-m.base, armv8-m.main and
>         armv8-m.main+dsp to BE8_LINK_SPEC.
>         * config/arm/arm.h (TARGET_HAVE_LDACQ): Exclude ARMv8-M.
>         (enum base_architecture): Add BASE_ARCH_8M_BASE and
> BASE_ARCH_8M_MAIN.
>         (TARGET_ARM_V8M): Define.
>         * config/arm/arm.c (arm_arch_name): Increase size to work with
> ARMv8-M
>         Baseline and Mainline.
>         (arm_option_override_internal): Also disable arm_restrict_it when
>         !arm_arch_notm.
>         (arm_file_start): Increase architecture buffer size.
>         * doc/invoke.texi: Document architectures armv8-m.base, armv8-
> m.main
>         and armv8-m.main+dsp.
>         (mno-unaligned-access): Clarify that this is disabled by default for
>         ARMv8-M Baseline architecture as well.
> 
> 
> *** gcc/testsuite/ChangeLog ***
> 
> 2015-11-10  Thomas Preud'homme  <thomas.preudho...@arm.com>
> 
>         * lib/target-supports.exp: Generate
> add_options_for_arm_arch_FUNC and
>         check_effective_target_arm_arch_FUNC_multilib for ARMv8-M
> Baseline and
>         ARMv8-M Mainline architectures.
> 
> 
> *** libgcc/ChangeLog ***
> 
> 2015-11-10  Thomas Preud'homme  <thomas.preudho...@arm.com>
> 
>         * config/arm/lib1funcs.S (__ARM_ARCH__): Define to 8 for ARMv8-
> M.
> 
> 
> diff --git a/gcc/config/arm/arm-arches.def b/gcc/config/arm/arm-
> arches.def
> index
> ddf6c3c330f91640d647d266f3d0e2350e7b986a..1d0301a3b9414127d38783
> 4584f3e42c225b6d3f 100644
> --- a/gcc/config/arm/arm-arches.def
> +++ b/gcc/config/arm/arm-arches.def
> @@ -57,6 +57,12 @@ ARM_ARCH("armv7-m", cortexm3,      7M,
>       ARM_FSET_MAKE_CPU1 (FL_CO_PROC |              FL_FOR_
>  ARM_ARCH("armv7e-m", cortexm4,  7EM, ARM_FSET_MAKE_CPU1
> (FL_CO_PROC |       FL_FOR_ARCH7EM))
>  ARM_ARCH("armv8-a", cortexa53,  8A,  ARM_FSET_MAKE_CPU1
> (FL_CO_PROC |             FL_FOR_ARCH8A))
>  ARM_ARCH("armv8-a+crc",cortexa53, 8A,   ARM_FSET_MAKE_CPU1
> (FL_CO_PROC | FL_CRC32  | FL_FOR_ARCH8A))
> +ARM_ARCH("armv8-m.base", cortexm0, 8M_BASE,
> +      ARM_FSET_MAKE_CPU1 (
> FL_FOR_ARCH8M_BASE))
> +ARM_ARCH("armv8-m.main", cortexm7, 8M_MAIN,
> +      ARM_FSET_MAKE_CPU1(FL_CO_PROC |
> FL_FOR_ARCH8M_MAIN))
> +ARM_ARCH("armv8-m.main+dsp", cortexm7, 8M_MAIN,
> +      ARM_FSET_MAKE_CPU1(FL_CO_PROC | FL_ARCH7EM |
> FL_FOR_ARCH8M_MAIN))
>  ARM_ARCH("iwmmxt",  iwmmxt,     5TE, ARM_FSET_MAKE_CPU1
> (FL_LDSCHED | FL_STRONG | FL_FOR_ARCH5TE | FL_XSCALE |
> FL_IWMMXT))
>  ARM_ARCH("iwmmxt2", iwmmxt2,    5TE, ARM_FSET_MAKE_CPU1
> (FL_LDSCHED | FL_STRONG | FL_FOR_ARCH5TE | FL_XSCALE |
> FL_IWMMXT | FL_IWMMXT2))
> 
> diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h
> index
> e7328e79650739fca1c3e21b10c194feaa697465..dc7a0871c333337bfda267
> 1f197bfe83c20c7888 100644
> --- a/gcc/config/arm/arm-protos.h
> +++ b/gcc/config/arm/arm-protos.h
> @@ -415,6 +415,8 @@ extern bool arm_is_constant_pool_ref (rtx);
>  #define FL_FOR_ARCH7M        (FL_FOR_ARCH7 | FL_THUMB_DIV)
>  #define FL_FOR_ARCH7EM  (FL_FOR_ARCH7M | FL_ARCH7EM)
>  #define FL_FOR_ARCH8A        (FL_FOR_ARCH7VE | FL_ARCH8)
> +#define FL_FOR_ARCH8M_BASE     (FL_FOR_ARCH6M | FL_ARCH8 |
> FL_THUMB_DIV)
> +#define FL_FOR_ARCH8M_MAIN     (FL_FOR_ARCH7M | FL_ARCH8)
> 
>  /* There are too many feature bits to fit in a single word so the set of
> cpu and
>     fpu capabilities is a structure.  A feature set is created and manipulated
> diff --git a/gcc/config/arm/arm-tables.opt b/gcc/config/arm/arm-
> tables.opt
> index
> 48aac41c37a35e27440f67863d4a92457916dd1b..2f24bf4c9a9ae1a12ba284
> fd160c34e577b2e4c6 100644
> --- a/gcc/config/arm/arm-tables.opt
> +++ b/gcc/config/arm/arm-tables.opt
> @@ -416,10 +416,19 @@ EnumValue
>  Enum(arm_arch) String(armv8-a+crc) Value(26)
> 
>  EnumValue
> -Enum(arm_arch) String(iwmmxt) Value(27)
> +Enum(arm_arch) String(armv8-m.base) Value(27)
> 
>  EnumValue
> -Enum(arm_arch) String(iwmmxt2) Value(28)
> +Enum(arm_arch) String(armv8-m.main) Value(28)
> +
> +EnumValue
> +Enum(arm_arch) String(armv8-m.main+dsp) Value(29)
> +
> +EnumValue
> +Enum(arm_arch) String(iwmmxt) Value(30)
> +
> +EnumValue
> +Enum(arm_arch) String(iwmmxt2) Value(31)
> 
>  Enum
>  Name(arm_fpu) Type(int)
> diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
> index
> 0d23f390f9dded95c982aa42e2c3afadb7c67a33..bad88efd26500f8245e32d
> e8ced9937e69c18337 100644
> --- a/gcc/config/arm/arm.h
> +++ b/gcc/config/arm/arm.h
> @@ -258,7 +258,7 @@ extern void
> (*arm_lang_output_object_attributes_hook)(void);
>                            || arm_arch7) && arm_arch_notm)
> 
>  /* Nonzero if this chip supports load-acquire and store-release.  */
> -#define TARGET_HAVE_LDACQ    (TARGET_ARM_ARCH >= 8)
> +#define TARGET_HAVE_LDACQ    (TARGET_ARM_ARCH >= 8 &&
> arm_arch_notm)
> 
>  /* Nonzero if integer division instructions supported.  */
>  #define TARGET_IDIV  ((TARGET_ARM && arm_arch_arm_hwdiv)     \
> @@ -395,7 +395,9 @@ enum base_architecture
>    BASE_ARCH_7R = 7,
>    BASE_ARCH_7M = 7,
>    BASE_ARCH_7EM = 7,
> -  BASE_ARCH_8A = 8
> +  BASE_ARCH_8A = 8,
> +  BASE_ARCH_8M_BASE = 8,
> +  BASE_ARCH_8M_MAIN = 8
>  };
> 
>  /* The major revision number of the ARM Architecture implemented by
> the target.  */
> @@ -2186,6 +2188,8 @@ extern int making_const_table;
>                       && !arm_arch_thumb2)
>  #define TARGET_ARM_V7M (TARGET_ARM_ARCH == BASE_ARCH_7M
> && !arm_arch_notm \
>                       && arm_arch_thumb2)
> +#define TARGET_ARM_V8M (TARGET_ARM_ARCH ==
> BASE_ARCH_8M_BASE \
> +                     && !arm_arch_notm && !arm_arch_thumb2)
> 
>  /* The highest Thumb instruction set version supported by the chip.  */
>  #define TARGET_ARM_ARCH_ISA_THUMB            \
> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
> index
> 3588b839fb6b22b2ae71798c46b385153c011855..cdced2fff383b3c750ba1f8
> da4021aad675574f7 100644
> --- a/gcc/config/arm/arm.c
> +++ b/gcc/config/arm/arm.c
> @@ -2261,9 +2261,11 @@ static const struct processors
> *arm_selected_arch;
>  static const struct processors *arm_selected_cpu;
>  static const struct processors *arm_selected_tune;
> 
> -/* The name of the preprocessor macro to define for this architecture.
> */
> +/* The name of the preprocessor macro to define for this architecture.
> PROFILE
> +   is replaced by the architecture name (eg. 8A) in arm_option_override
> () and
> +   is thus chosen to be big enough to hold the biggest architecture name.
> */
> 
> -char arm_arch_name[] = "__ARM_ARCH_0UNK__";
> +char arm_arch_name[] = "__ARM_ARCH_PROFILE__";
> 
>  /* Available values for -mfpu=.  */
> 
> @@ -2896,7 +2898,8 @@ arm_option_override_internal (struct
> gcc_options *opts,
>    if (! opts_set->x_arm_restrict_it)
>      opts->x_arm_restrict_it = arm_arch8;
> 
> -  if (!TARGET_THUMB2_P (opts->x_target_flags))
> +  /* ARM execution state and M profile don't have [restrict] IT.  */
> +  if (!TARGET_THUMB2_P (opts->x_target_flags) || !arm_arch_notm)
>      opts->x_arm_restrict_it = 0;
> 
>    /* Enable -munaligned-access by default for
> @@ -25910,7 +25913,7 @@ arm_file_start (void)
>             const char* pos = strchr (arm_selected_arch->name, '+');
>             if (pos)
>               {
> -               char buf[15];
> +               char buf[32];
>                 gcc_assert (strlen (arm_selected_arch->name)
>                             <= sizeof (buf) / sizeof (*pos));
>                 strncpy (buf, arm_selected_arch->name,
> diff --git a/gcc/config/arm/bpabi.h b/gcc/config/arm/bpabi.h
> index
> e522064441f81245fd14ffeefa4efcce3546e179..184397dd1560f3a1312ebe4
> 5de9b67e8564fb960 100644
> --- a/gcc/config/arm/bpabi.h
> +++ b/gcc/config/arm/bpabi.h
> @@ -86,6 +86,9 @@
>     |march=armv7e-m|mcpu=cortex-m4|mcpu=cortex-m7        \
>     |march=armv6-m|mcpu=cortex-m0                        \
>     |march=armv8-a                                    \
> +   |march=armv8-m.base                                       \
> +   |march=armv8-m.main                                       \
> +   |march=armv8-m.main+dsp                           \
>     :%{!r:--be8}}}"
>  #else
>  #define BE8_LINK_SPEC \
> @@ -114,6 +117,9 @@
>     |march=armv7e-m|mcpu=cortex-m4|mcpu=cortex-m7        \
>     |march=armv6-m|mcpu=cortex-m0                        \
>     |march=armv8-a                                    \
> +   |march=armv8-m.base                                       \
> +   |march=armv8-m.main                                       \
> +   |march=armv8-m.main+dsp                           \
>     :%{!r:--be8}}}"
>  #endif
> 
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index
> 33f579f88cd82a9cfeb2df1e9ff9b106f5529f2b..3e9726d96ef54b03296ed1c
> 6f1a2d212afb29180 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -13535,6 +13535,7 @@ of the @option{-mcpu=} option.  Permissible
> names are: @samp{armv2},
>  @samp{armv6t2}, @samp{armv6z}, @samp{armv6kz}, @samp{armv6-
> m},
>  @samp{armv7}, @samp{armv7-a}, @samp{armv7-r}, @samp{armv7-m},
> @samp{armv7e-m},
>  @samp{armv7ve}, @samp{armv8-a}, @samp{armv8-a+crc},
> +@samp{armv8-m.base}, @samp{armv8-m.main}, @samp{armv8-
> m.main+dsp}
>  @samp{iwmmxt}, @samp{iwmmxt2}, @samp{ep9312}.
> 
>  @option{-march=armv7ve} is the armv7-a architecture with
> virtualization
> @@ -13837,10 +13838,10 @@ generating these instructions.  This option
> is enabled by default when
>  @opindex mno-unaligned-access
>  Enables (or disables) reading and writing of 16- and 32- bit values
>  from addresses that are not 16- or 32- bit aligned.  By default
> -unaligned access is disabled for all pre-ARMv6 and all ARMv6-M
> -architectures, and enabled for all other architectures.  If unaligned
> -access is not enabled then words in packed data structures are
> -accessed a byte at a time.
> +unaligned access is disabled for all pre-ARMv6, all ARMv6-M and for
> +ARMv8-M Baseline architectures, and enabled for all other
> +architectures.  If unaligned access is not enabled then words in packed
> +data structures are accessed a byte at a time.
> 
>  The ARM attribute @code{Tag_CPU_unaligned_access} is set in the
>  generated object file to either true or false, depending upon the
> diff --git a/gcc/testsuite/lib/target-supports.exp
> b/gcc/testsuite/lib/target-supports.exp
> index
> 3f968267f32317dffb7d5d8b969698fc80c3333a..be5c183f031e11e1021997e
> 6708924f790e98e38 100644
> --- a/gcc/testsuite/lib/target-supports.exp
> +++ b/gcc/testsuite/lib/target-supports.exp
> @@ -3113,7 +3113,9 @@ foreach { armfunc armflag armdef } { v4 "-
> march=armv4 -marm" __ARM_ARCH_4__
>                                    v7m "-march=armv7-m -mthumb"
> __ARM_ARCH_7M__
>                                    v7em "-march=armv7e-m -mthumb"
> __ARM_ARCH_7EM__
>                                    v8a "-march=armv8-a"
> __ARM_ARCH_8A__
> -                                  v8_1a "-march=armv8.1a"
> __ARM_ARCH_8A__ } {
> +                                  v8_1a "-march=armv8.1a"
> __ARM_ARCH_8A__
> +                                  v8m_base "-march=armv8-m.base -
> mthumb" __ARM_ARCH_8M_BASE__
> +                                  v8m_main "-march=armv8-m.main -
> mthumb" __ARM_ARCH_8M_MAIN__ } {
>      eval [string map [list FUNC $armfunc FLAG $armflag DEF $armdef ] {
>       proc check_effective_target_arm_arch_FUNC_ok { } {
>           if { [ string match "*-marm*" "FLAG" ] &&
> diff --git a/libgcc/config/arm/lib1funcs.S b/libgcc/config/arm/lib1funcs.S
> index
> befb0423ba2bac5a597945518fc116621782f7b6..4bd2268e29486fd28f270e
> c74ae5e0fa5cd3e36d 100644
> --- a/libgcc/config/arm/lib1funcs.S
> +++ b/libgcc/config/arm/lib1funcs.S
> @@ -108,7 +108,8 @@ see the files COPYING3 and COPYING.RUNTIME
> respectively.  If not, see
>  # define __ARM_ARCH__ 7
>  #endif
> 
> -#if defined(__ARM_ARCH_8A__)
> +#if defined(__ARM_ARCH_8A__) ||
> defined(__ARM_ARCH_8M_BASE__) \
> +     || defined(__ARM_ARCH_8M_MAIN__)
>  # define __ARM_ARCH__ 8
>  #endif
> 
> 
> 
> Testing:
> 
> * Toolchain was built successfully with and without the ARMv8-M
> support patches with the following multilib list: armv6-m,armv7-
> m,armv7e-m,cortex-m7. The code generation for crtbegin.o, crtend.o,
> crti.o, crtn.o, libgcc.a, libgcov.a, libc.a, libg.a, libgloss-linux.a, libm.a,
> libnosys.a, librdimon.a, librdpmon.a, libstdc++.a and libsupc++.a is
> unchanged for all these targets.
> 
> * GCC also showed no testsuite regression when targeting ARMv8-M
> Baseline compared to ARMv6-M on ARM Fast Models and when
> targeting ARMv6-M and ARMv7-M (compared to without the patch)
> * GCC was bootstrapped successfully targeting Thumb-1 and targeting
> Thumb-2
> 
> 
> Is this ok for stage3?
> 
> Best regards,
> 
> Thomas


Reply via email to