public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Andrew MacLeod <amacleod@redhat.com>
To: Hans-Peter Nilsson <hans-peter.nilsson@axis.com>
Cc: joseph@codesourcery.com, hp@axis.com, gcc-patches@gcc.gnu.org,
	       libstdc++@gcc.gnu.org, bkoz@redhat.com, rth@redhat.com
Subject: Re: cxx-mem-model merge [6 of 9] - libstdc++-v3
Date: Mon, 07 Nov 2011 18:27:00 -0000	[thread overview]
Message-ID: <4EB81E9A.9080401@redhat.com> (raw)
In-Reply-To: <201111071732.pA7HW2KR017052@ignucius.se.axis.com>

On 11/07/2011 12:32 PM, Hans-Peter Nilsson wrote:
>> From: "Joseph S. Myers"<joseph@codesourcery.com>
>> Date: Mon, 7 Nov 2011 17:24:04 +0100
>> On Mon, 7 Nov 2011, Andrew MacLeod wrote:
>>
>>> Actually, this target has no lock free support whatsoever?  ie, no
>>> compare_and_swap instruction, nor an implementation of sync_lock_test_and_set
>>> and sync_lock_release?
>>>
>>> I think the libstdc++ standard now requires the class atomic_flag to be lock
>>> free in order to conform (n3242 29.7.2)
>>>
>>> So I guess this is the situation which all the atomic tests are not even
>>> suppose to be run since they aren't supported.  My guess is that in the
>>> previous releases the c++ header files probably provided a locked
>>> implementation of test_and_set, and so the tests would run.
>> For bare-metal targets there should maybe be an option to presume there is
>> just one thread and map all atomic operations to dumb non-atomic versions,
>> which is perfectly valid in such a case.  But that's a new feature; we
>> didn't have it for __sync_* either.
> It'd not be a new feature, that's apparently how it worked until
> it broke now ...unless you mean something different.
>
Libstdc++-v3 use to supply a locked version of class atomic_flag 
(atomic_0.h implemented locked classes)  if there were no lock free 
routines (_GLIBCXX_ATOMIC_BUILTINS_1 was not set to true in configuration):

  /// 29.2 Lock-free Property
#if defined(_GLIBCXX_ATOMIC_BUILTINS_1) && 
defined(_GLIBCXX_ATOMIC_BUILTINS_2) \
&& defined(_GLIBCXX_ATOMIC_BUILTINS_4) && 
defined(_GLIBCXX_ATOMIC_BUILTINS_8)
# define _GLIBCXX_ATOMIC_PROPERTY 2
# define _GLIBCXX_ATOMIC_NAMESPACE __atomic2
#elif defined(_GLIBCXX_ATOMIC_BUILTINS_1)
# define _GLIBCXX_ATOMIC_PROPERTY 1
# define _GLIBCXX_ATOMIC_NAMESPACE __atomic1
#else
# define _GLIBCXX_ATOMIC_PROPERTY 0
# define _GLIBCXX_ATOMIC_NAMESPACE __atomic0
#endif


This meant it would compile and run fine...  That is no longer standard 
compliant, so we cant fall back to that any more.  This is the first 
time we've had to face not being able to supply atomic_flag, so we need 
to decide what to do.

So, what DO we do if there is no basic level of atomic support...  I 
think it is reasonable to have __sync_lock_test_and_set() and 
__sync_lock_release() perform simple loads and stores if we can decide 
how best to communicate to the expanders that we only ever operating in 
a  single threaded environment.  the as-yet unimplemented  
-fmemory-model flag seems like the best bet unless there is something 
else already being set.

Another option would be to have the libstdc++ header files resort to a 
simple load and store rather than calling a __sync routine when they 
know its not present.  Then we aren't tainting the compiler with this 
arguably offbeat requirement.

Andrew


  reply	other threads:[~2011-11-07 18:08 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-03 23:52 Andrew MacLeod
2011-11-04 18:17 ` Jeff Law
2011-11-04 18:53   ` Andrew MacLeod
2011-11-07  0:54 ` Hans-Peter Nilsson
2011-11-07  4:48   ` Andrew MacLeod
2011-11-07 11:36     ` Hans-Peter Nilsson
2011-11-07 14:41       ` Andrew MacLeod
2011-11-07 14:56       ` Andrew MacLeod
2011-11-07 15:38         ` Hans-Peter Nilsson
2011-11-07 16:28         ` Joseph S. Myers
2011-11-07 17:24           ` Andrew MacLeod
2011-11-07 17:43           ` Hans-Peter Nilsson
2011-11-07 18:27             ` Andrew MacLeod [this message]
2011-11-08  6:45               ` Hans-Peter Nilsson
2011-11-08 13:43                 ` Andrew MacLeod
2011-11-11 17:49                   ` Benjamin Kosnik
2011-11-11 17:56                     ` Andrew MacLeod
2011-11-11 21:07                       ` Hans-Peter Nilsson
2011-11-11 23:34                       ` Torvald Riegel
2011-11-11 20:27                     ` Hans-Peter Nilsson
2011-11-07 16:32         ` Richard Henderson
2011-11-08 20:22         ` Hans-Peter Nilsson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4EB81E9A.9080401@redhat.com \
    --to=amacleod@redhat.com \
    --cc=bkoz@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=hans-peter.nilsson@axis.com \
    --cc=hp@axis.com \
    --cc=joseph@codesourcery.com \
    --cc=libstdc++@gcc.gnu.org \
    --cc=rth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).