[Patch AArch64] PR target/66200 - gcc / libstdc++ TLC for weak memory models.
James Greenhalgh
james.greenhalgh@arm.com
Thu May 28 11:00:00 GMT 2015
On Wed, May 20, 2015 at 02:58:09PM +0100, Ramana Radhakrishnan wrote:
> Hi,
>
> Someone privately pointed out that the ARM and AArch64 ports do not
> define TARGET_RELAXED_ORDERING given that the architecture(s) mandates a
> weak memory model. This patch fixes it for AArch64, the ARM patch
> follows in due course after appropriate testing.
>
> I will also note that we can define __test_and_acquire as well as
> __set_and_release and I'm toying with a follow-up patch for the same.
>
> Also it may make sense to consider changing the defaults to a safer
> form, or indeed forcing ports to define some of this rather than
> allowing for silent wrong code issues. However I'm not about to do so in
> the context of this patch.
>
> Bootstrapped and regression tested on aarch64-none-linux-gnu with no
> regressions.
>
> Ok to apply to trunk and all release branches ?
>
> gcc/
>
> PR target/66200
>
> * config/aarch64/aarch64.c (TARGET_RELAXED_ORDERING): Define
>
> libstdc++-v3/
>
> PR target/66200
>
> * configure.host (host_cpu): Add aarch64 case.
> * config/cpu/aarch64/atomic_word.h: New file
This is OK for trunk and looks serious enough for backport to the
release branches.
Though,
> +// This is necessary iff TARGET_RELAXED_ORDERING is defined in tm.h.
this comment had me looking for uses of TARGET_RELAXED_ORDERING as a macro
rather than a hook, and left... But fixing that (here and in the
template) is not essential for this patch, or for backporting.
Thanks,
James
> P.S. It's interesting to note that ia64 doesn't define the barriers
> which appear to be used in a number of other places than just the
> constructor guard functions (probably wrongly on the assumption that one
> doesn't need the barriers elsewhere). I suspect other architectures like
> MIPS may also be affected by this.
> commit 414345c424fa020717c6c3083089cd987f3032db
> Author: Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
> Date: Wed May 20 13:55:44 2015 +0100
>
> Add relaxed memory ordering cases.
>
> diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
> index 7f0cc0d..273aa06 100644
> --- a/gcc/config/aarch64/aarch64.c
> +++ b/gcc/config/aarch64/aarch64.c
> @@ -11644,6 +11644,9 @@ aarch64_gen_adjusted_ldpstp (rtx *operands, bool load,
> #undef TARGET_SCHED_FUSION_PRIORITY
> #define TARGET_SCHED_FUSION_PRIORITY aarch64_sched_fusion_priority
>
> +#undef TARGET_RELAXED_ORDERING
> +#define TARGET_RELAXED_ORDERING true
> +
> struct gcc_target targetm = TARGET_INITIALIZER;
>
> #include "gt-aarch64.h"
> diff --git a/libstdc++-v3/config/cpu/aarch64/atomic_word.h b/libstdc++-v3/config/cpu/aarch64/atomic_word.h
> new file mode 100644
> index 0000000..4afe6ed
> --- /dev/null
> +++ b/libstdc++-v3/config/cpu/aarch64/atomic_word.h
> @@ -0,0 +1,44 @@
> +// Low-level type for atomic operations -*- C++ -*-
> +
> +// Copyright (C) 2015 Free Software Foundation, Inc.
> +//
> +// This file is part of the GNU ISO C++ Library. This library is free
> +// software; you can redistribute it and/or modify it under the
> +// terms of the GNU General Public License as published by the
> +// Free Software Foundation; either version 3, or (at your option)
> +// any later version.
> +
> +// This library is distributed in the hope that it will be useful,
> +// but WITHOUT ANY WARRANTY; without even the implied warranty of
> +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> +// GNU General Public License for more details.
> +
> +// Under Section 7 of GPL version 3, you are granted additional
> +// permissions described in the GCC Runtime Library Exception, version
> +// 3.1, as published by the Free Software Foundation.
> +
> +// You should have received a copy of the GNU General Public License and
> +// a copy of the GCC Runtime Library Exception along with this program;
> +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
> +// <http://www.gnu.org/licenses/>.
> +
> +/** @file atomic_word.h
> + * This file is a GNU extension to the Standard C++ Library.
> + */
> +
> +#ifndef _GLIBCXX_ATOMIC_WORD_H
> +#define _GLIBCXX_ATOMIC_WORD_H 1
> +
> +
> +typedef int _Atomic_word;
> +
> +// This one prevents loads from being hoisted across the barrier;
> +// in other words, this is a Load-Load acquire barrier.
> +// This is necessary iff TARGET_RELAXED_ORDERING is defined in tm.h.
> +#define _GLIBCXX_READ_MEM_BARRIER __asm __volatile ("dmb ishld":::"memory")
> +
> +// This one prevents stores from being sunk across the barrier; in other
> +// words, a Store-Store release barrier.
> +#define _GLIBCXX_WRITE_MEM_BARRIER __asm __volatile ("dmb ishst":::"memory")
> +
> +#endif
> diff --git a/libstdc++-v3/configure.host b/libstdc++-v3/configure.host
> index a349ce3..42a45d9 100644
> --- a/libstdc++-v3/configure.host
> +++ b/libstdc++-v3/configure.host
> @@ -153,6 +153,9 @@ esac
> # Most can just use generic.
> # THIS TABLE IS SORTED. KEEP IT THAT WAY.
> case "${host_cpu}" in
> + aarch64*)
> + atomic_word_dir=cpu/aarch64
> + ;;
> alpha*)
> atomic_word_dir=cpu/alpha
> ;;
More information about the Gcc-patches
mailing list