diff mbox

[v2,RTEMS] Always use atomic builtins for libstdc++

Message ID 1474534063-8867-1-git-send-email-sebastian.huber@embedded-brains.de
State New
Headers show

Commit Message

Sebastian Huber Sept. 22, 2016, 8:47 a.m. UTC
v2: Fix shell script part since shell grouping is expressed by { }.

libstdc++-v3/
	* config/cpu/m68k/atomicity.h: Adjust comment.
	* acinclude.m4 (GLIBCXX_ENABLE_ATOMIC_BUILTINS): Honor
	explicit atomicity_dir setup via configure.host.
	* configure.host (rtems-*): Set atomicity_dir.
	* configure: Regenerate.
---
 libstdc++-v3/acinclude.m4                |  5 +++--
 libstdc++-v3/config/cpu/m68k/atomicity.h |  3 +++
 libstdc++-v3/configure                   | 11 ++++++-----
 libstdc++-v3/configure.host              |  4 ++++
 4 files changed, 16 insertions(+), 7 deletions(-)

Comments

Andreas Schwab Sept. 22, 2016, 9:11 a.m. UTC | #1
On Sep 22 2016, Sebastian Huber <sebastian.huber@embedded-brains.de> wrote:

> diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
> index 6d897be..d7db435 100644
> --- a/libstdc++-v3/acinclude.m4
> +++ b/libstdc++-v3/acinclude.m4
> @@ -3490,9 +3490,10 @@ EOF
>    AC_LANG_RESTORE
>  
>    # Set atomicity_dir to builtins if all but the long long test above passes.
> -  if test "$glibcxx_cv_atomic_bool" = yes \
> +  if { test "$glibcxx_cv_atomic_bool" = yes \
>       && test "$glibcxx_cv_atomic_short" = yes \
> -     && test "$glibcxx_cv_atomic_int" = yes; then
> +     && test "$glibcxx_cv_atomic_int" = yes } \

You need a semicolon (or newline) before }.

Andreas.
Sebastian Huber Sept. 22, 2016, 1:32 p.m. UTC | #2
On 22/09/16 15:25, Joel Sherrill wrote:
> /The target pattern in the commit message doesn't look right.
> It should be *-*-rtems* I think.

It should be ok since host_os is used:

# It uses the following shell variables as set by config.guess:
#   host                The configuration host (full CPU-vendor-OS triplet)
#   host_cpu            The configuration host CPU
#   host_os             The configuration host OS

>
> Do all BSPs for m68k build with C++ enabled?

Yes, but I face currently some other problems with GCC 7:

https://gcc.gnu.org/ml/gcc/2016-09/msg00114.html

There is also a NULL pointer access in wctob() with the latest Newlib.

>
> What code is used for atomic operations on say a 68000 or
> 68020?

They use the libatomic if the atomic operations are not supported by 
hardware. libatomic uses _Libatomic_Protect_start() and 
_Libatomic_Protect_end() on RTEMS.

>
> Thanks.
>
> --joel
>
> On Thu, Sep 22, 2016 at 3:47 AM, Sebastian Huber 
> <sebastian.huber@embedded-brains.de 
> <mailto:sebastian.huber@embedded-brains.de>> wrote:
>
>     v2: Fix shell script part since shell grouping is expressed by { }.
>
>     libstdc++-v3/
>             * config/cpu/m68k/atomicity.h: Adjust comment.
>             * acinclude.m4 (GLIBCXX_ENABLE_ATOMIC_BUILTINS): Honor
>             explicit atomicity_dir setup via configure.host.
>             * configure.host (rtems-*): Set atomicity_dir.
>             * configure: Regenerate.
>     ---
>      libstdc++-v3/acinclude.m4                |  5 +++--
>      libstdc++-v3/config/cpu/m68k/atomicity.h |  3 +++
>      libstdc++-v3/configure                   | 11 ++++++-----
>      libstdc++-v3/configure.host              |  4 ++++
>      4 files changed, 16 insertions(+), 7 deletions(-)
>
>     diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
>     index 6d897be..d7db435 100644
>     --- a/libstdc++-v3/acinclude.m4
>     +++ b/libstdc++-v3/acinclude.m4
>     @@ -3490,9 +3490,10 @@ EOF
>        AC_LANG_RESTORE
>
>        # Set atomicity_dir to builtins if all but the long long test
>     above passes.
>     -  if test "$glibcxx_cv_atomic_bool" = yes \
>     +  if { test "$glibcxx_cv_atomic_bool" = yes \
>           && test "$glibcxx_cv_atomic_short" = yes \
>     -     && test "$glibcxx_cv_atomic_int" = yes; then
>     +     && test "$glibcxx_cv_atomic_int" = yes } \
>     +     || test "$atomicity_dir" = "cpu/generic/atomicity_builtins";
>     then
>          AC_DEFINE(_GLIBCXX_ATOMIC_BUILTINS, 1,
>          [Define if the compiler supports C++11 atomics.])
>          atomicity_dir=cpu/generic/atomicity_builtins
>     diff --git a/libstdc++-v3/config/cpu/m68k/atomicity.h
>     b/libstdc++-v3/config/cpu/m68k/atomicity.h
>     index f421330..a9ddc6b 100644
>     --- a/libstdc++-v3/config/cpu/m68k/atomicity.h
>     +++ b/libstdc++-v3/config/cpu/m68k/atomicity.h
>     @@ -48,6 +48,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>        }
>
>      #elif defined(__rtems__)
>     +  // This code is only provided for reference.  RTEMS uses now
>     the atomic
>     +  // builtins and libatomic.  See configure.host.
>     +  //
>        // TAS/JBNE is unsafe on systems with strict priority-based
>     scheduling.
>        // Disable interrupts, which we can do only from supervisor mode.
>        _Atomic_word
>     diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
>     index 6332c4d..d09a7e0 100755
>     --- a/libstdc++-v3/configure
>     +++ b/libstdc++-v3/configure
>     @@ -15539,9 +15539,10 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
>
>
>        # Set atomicity_dir to builtins if all but the long long test
>     above passes.
>     -  if test "$glibcxx_cv_atomic_bool" = yes \
>     +  if { test "$glibcxx_cv_atomic_bool" = yes \
>           && test "$glibcxx_cv_atomic_short" = yes \
>     -     && test "$glibcxx_cv_atomic_int" = yes; then
>     +     && test "$glibcxx_cv_atomic_int" = yes } \
>     +     || test "$atomicity_dir" = "cpu/generic/atomicity_builtins";
>     then
>
>      $as_echo "#define _GLIBCXX_ATOMIC_BUILTINS 1" >>confdefs.h
>
>     @@ -15573,7 +15574,7 @@ $as_echo "$as_me: WARNING: Performance of
>     certain classes will degrade as a resu
>        # unnecessary for this test.
>
>          cat > conftest.$ac_ext << EOF
>     -#line 15576 "configure"
>     +#line 15577 "configure"
>      int main()
>      {
>        _Decimal32 d1;
>     @@ -15615,7 +15616,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
>        # unnecessary for this test.
>
>          cat > conftest.$ac_ext << EOF
>     -#line 15618 "configure"
>     +#line 15619 "configure"
>      template<typename T1, typename T2>
>        struct same
>        { typedef T2 type; };
>     @@ -15649,7 +15650,7 @@ $as_echo "$enable_int128" >&6; }
>          rm -f conftest*
>
>          cat > conftest.$ac_ext << EOF
>     -#line 15652 "configure"
>     +#line 15653 "configure"
>      template<typename T1, typename T2>
>        struct same
>        { typedef T2 type; };
>     diff --git a/libstdc++-v3/configure.host b/libstdc++-v3/configure.host
>     index c0cc3ee..eb56ab1 100644
>     --- a/libstdc++-v3/configure.host
>     +++ b/libstdc++-v3/configure.host
>     @@ -296,6 +296,10 @@ case "${host_os}" in
>          os_include_dir="os/qnx/qnx6.1"
>          c_model=c
>          ;;
>     +  rtems*)
>     +    # Use libatomic if necessary and avoid libstdc++ specific
>     atomicity support
>     +    atomicity_dir="cpu/generic/atomicity_builtins"
>     +    ;;
>        solaris2)
>          # This too-vague configuration does not provide enough
>     information
>          # to select a ctype include, and thus os_include_dir is a
>     crap shoot.
>     --
>     1.8.4.5
>
>     _______________________________________________
>     devel mailing list
>     devel@rtems.org <mailto:devel@rtems.org>
>     http://lists.rtems.org/mailman/listinfo/devel
>     <http://lists.rtems.org/mailman/listinfo/devel>
>
>
Bernhard Reutner-Fischer Sept. 22, 2016, 7:02 p.m. UTC | #3
On 22 September 2016 11:11:42 CEST, Andreas Schwab <schwab@suse.de> wrote:
>On Sep 22 2016, Sebastian Huber <sebastian.huber@embedded-brains.de>
>wrote:
>
>> diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
>> index 6d897be..d7db435 100644
>> --- a/libstdc++-v3/acinclude.m4
>> +++ b/libstdc++-v3/acinclude.m4
>> @@ -3490,9 +3490,10 @@ EOF
>>    AC_LANG_RESTORE
>>  
>>    # Set atomicity_dir to builtins if all but the long long test
>above passes.
>> -  if test "$glibcxx_cv_atomic_bool" = yes \
>> +  if { test "$glibcxx_cv_atomic_bool" = yes \
>>       && test "$glibcxx_cv_atomic_short" = yes \
>> -     && test "$glibcxx_cv_atomic_int" = yes; then
>> +     && test "$glibcxx_cv_atomic_int" = yes } \
>
>You need a semicolon (or newline) before }.

Please remind me why you need curly braces at all?

thanks
Sebastian Huber Sept. 23, 2016, 7:03 a.m. UTC | #4
I checked in the following:

https://gcc.gnu.org/viewcvs/gcc?view=revision&revision=240387

All m68k BSPs build and link the samples using RTEMS

https://git.rtems.org/rtems/commit/?id=8ace7ee42ff50eee4541fd7151bf8ecc32f82384
Andreas Schwab Sept. 26, 2016, 8:27 a.m. UTC | #5
On Sep 22 2016, Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> wrote:

> On 22 September 2016 11:11:42 CEST, Andreas Schwab <schwab@suse.de> wrote:
>>On Sep 22 2016, Sebastian Huber <sebastian.huber@embedded-brains.de>
>>wrote:
>>
>>> diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
>>> index 6d897be..d7db435 100644
>>> --- a/libstdc++-v3/acinclude.m4
>>> +++ b/libstdc++-v3/acinclude.m4
>>> @@ -3490,9 +3490,10 @@ EOF
>>>    AC_LANG_RESTORE
>>>  
>>>    # Set atomicity_dir to builtins if all but the long long test
>>above passes.
>>> -  if test "$glibcxx_cv_atomic_bool" = yes \
>>> +  if { test "$glibcxx_cv_atomic_bool" = yes \
>>>       && test "$glibcxx_cv_atomic_short" = yes \
>>> -     && test "$glibcxx_cv_atomic_int" = yes; then
>>> +     && test "$glibcxx_cv_atomic_int" = yes } \
>>
>>You need a semicolon (or newline) before }.
>
> Please remind me why you need curly braces at all?

Shell operand precedence is non-intuitive.

Andreas.
Bernhard Reutner-Fischer Sept. 26, 2016, 3:55 p.m. UTC | #6
On 26 September 2016 10:27:13 CEST, Andreas Schwab <schwab@suse.de> wrote:
>On Sep 22 2016, Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> wrote:
>
>> On 22 September 2016 11:11:42 CEST, Andreas Schwab <schwab@suse.de>
>wrote:
>>>On Sep 22 2016, Sebastian Huber <sebastian.huber@embedded-brains.de>
>>>wrote:
>>>
>>>> diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
>>>> index 6d897be..d7db435 100644
>>>> --- a/libstdc++-v3/acinclude.m4
>>>> +++ b/libstdc++-v3/acinclude.m4
>>>> @@ -3490,9 +3490,10 @@ EOF
>>>>    AC_LANG_RESTORE
>>>>  
>>>>    # Set atomicity_dir to builtins if all but the long long test
>>>above passes.
>>>> -  if test "$glibcxx_cv_atomic_bool" = yes \
>>>> +  if { test "$glibcxx_cv_atomic_bool" = yes \
>>>>       && test "$glibcxx_cv_atomic_short" = yes \
>>>> -     && test "$glibcxx_cv_atomic_int" = yes; then
>>>> +     && test "$glibcxx_cv_atomic_int" = yes } \
>>>
>>>You need a semicolon (or newline) before }.
>>
>> Please remind me why you need curly braces at all?
>
>Shell operand precedence is non-intuitive.

[ ... -a ... -a ... ] as per at least SUSv4.

thanks
Andreas Schwab Sept. 26, 2016, 4:11 p.m. UTC | #7
On Sep 26 2016, Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> wrote:

> On 26 September 2016 10:27:13 CEST, Andreas Schwab <schwab@suse.de> wrote:
>>On Sep 22 2016, Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> wrote:
>>
>>> On 22 September 2016 11:11:42 CEST, Andreas Schwab <schwab@suse.de>
>>wrote:
>>>>On Sep 22 2016, Sebastian Huber <sebastian.huber@embedded-brains.de>
>>>>wrote:
>>>>
>>>>> diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
>>>>> index 6d897be..d7db435 100644
>>>>> --- a/libstdc++-v3/acinclude.m4
>>>>> +++ b/libstdc++-v3/acinclude.m4
>>>>> @@ -3490,9 +3490,10 @@ EOF
>>>>>    AC_LANG_RESTORE
>>>>>  
>>>>>    # Set atomicity_dir to builtins if all but the long long test
>>>>above passes.
>>>>> -  if test "$glibcxx_cv_atomic_bool" = yes \
>>>>> +  if { test "$glibcxx_cv_atomic_bool" = yes \
>>>>>       && test "$glibcxx_cv_atomic_short" = yes \
>>>>> -     && test "$glibcxx_cv_atomic_int" = yes; then
>>>>> +     && test "$glibcxx_cv_atomic_int" = yes } \
>>>>
>>>>You need a semicolon (or newline) before }.
>>>
>>> Please remind me why you need curly braces at all?
>>
>>Shell operand precedence is non-intuitive.
>
> [ ... -a ... -a ... ] as per at least SUSv4.

That is even worse.  POSIX marks it as obsolescent.

Andreas.
diff mbox

Patch

diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
index 6d897be..d7db435 100644
--- a/libstdc++-v3/acinclude.m4
+++ b/libstdc++-v3/acinclude.m4
@@ -3490,9 +3490,10 @@  EOF
   AC_LANG_RESTORE
 
   # Set atomicity_dir to builtins if all but the long long test above passes.
-  if test "$glibcxx_cv_atomic_bool" = yes \
+  if { test "$glibcxx_cv_atomic_bool" = yes \
      && test "$glibcxx_cv_atomic_short" = yes \
-     && test "$glibcxx_cv_atomic_int" = yes; then
+     && test "$glibcxx_cv_atomic_int" = yes } \
+     || test "$atomicity_dir" = "cpu/generic/atomicity_builtins"; then
     AC_DEFINE(_GLIBCXX_ATOMIC_BUILTINS, 1,
     [Define if the compiler supports C++11 atomics.])
     atomicity_dir=cpu/generic/atomicity_builtins
diff --git a/libstdc++-v3/config/cpu/m68k/atomicity.h b/libstdc++-v3/config/cpu/m68k/atomicity.h
index f421330..a9ddc6b 100644
--- a/libstdc++-v3/config/cpu/m68k/atomicity.h
+++ b/libstdc++-v3/config/cpu/m68k/atomicity.h
@@ -48,6 +48,9 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
   }
 
 #elif defined(__rtems__)
+  // This code is only provided for reference.  RTEMS uses now the atomic
+  // builtins and libatomic.  See configure.host.
+  //
   // TAS/JBNE is unsafe on systems with strict priority-based scheduling.
   // Disable interrupts, which we can do only from supervisor mode.
   _Atomic_word
diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
index 6332c4d..d09a7e0 100755
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -15539,9 +15539,10 @@  ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
   # Set atomicity_dir to builtins if all but the long long test above passes.
-  if test "$glibcxx_cv_atomic_bool" = yes \
+  if { test "$glibcxx_cv_atomic_bool" = yes \
      && test "$glibcxx_cv_atomic_short" = yes \
-     && test "$glibcxx_cv_atomic_int" = yes; then
+     && test "$glibcxx_cv_atomic_int" = yes } \
+     || test "$atomicity_dir" = "cpu/generic/atomicity_builtins"; then
 
 $as_echo "#define _GLIBCXX_ATOMIC_BUILTINS 1" >>confdefs.h
 
@@ -15573,7 +15574,7 @@  $as_echo "$as_me: WARNING: Performance of certain classes will degrade as a resu
   # unnecessary for this test.
 
     cat > conftest.$ac_ext << EOF
-#line 15576 "configure"
+#line 15577 "configure"
 int main()
 {
   _Decimal32 d1;
@@ -15615,7 +15616,7 @@  ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
   # unnecessary for this test.
 
     cat > conftest.$ac_ext << EOF
-#line 15618 "configure"
+#line 15619 "configure"
 template<typename T1, typename T2>
   struct same
   { typedef T2 type; };
@@ -15649,7 +15650,7 @@  $as_echo "$enable_int128" >&6; }
     rm -f conftest*
 
     cat > conftest.$ac_ext << EOF
-#line 15652 "configure"
+#line 15653 "configure"
 template<typename T1, typename T2>
   struct same
   { typedef T2 type; };
diff --git a/libstdc++-v3/configure.host b/libstdc++-v3/configure.host
index c0cc3ee..eb56ab1 100644
--- a/libstdc++-v3/configure.host
+++ b/libstdc++-v3/configure.host
@@ -296,6 +296,10 @@  case "${host_os}" in
     os_include_dir="os/qnx/qnx6.1"
     c_model=c
     ;;
+  rtems*)
+    # Use libatomic if necessary and avoid libstdc++ specific atomicity support
+    atomicity_dir="cpu/generic/atomicity_builtins"
+    ;;
   solaris2)
     # This too-vague configuration does not provide enough information
     # to select a ctype include, and thus os_include_dir is a crap shoot.