Re: [PATCH 00/22] add support for Clang LTO
From: Peter Zijlstra
Date: Fri Jul 03 2020 - 09:13:41 EST
On Thu, Jul 02, 2020 at 10:59:48AM -0700, Paul E. McKenney wrote:
> On Thu, Jul 02, 2020 at 10:20:40AM +0200, Peter Zijlstra wrote:
> > On Wed, Jul 01, 2020 at 09:03:38AM -0700, Paul E. McKenney wrote:
> >
> > > But it looks like we are going to have to tell the compiler.
> >
> > What does the current proposal look like? I can certainly annotate the
> > seqcount latch users, but who knows what other code is out there....
>
> For pointers, yes, within the Linux kernel it is hopeless, thus the
> thought of a -fall-dependent-ptr or some such that makes the compiler
> pretend that each and every pointer is marked with the _Dependent_ptr
> qualifier.
>
> New non-Linux-kernel code might want to use his qualifier explicitly,
> perhaps something like the following:
>
> _Dependent_ptr struct foo *p; // Or maybe after the "*"?
After, as you've written it, it's a pointer to a '_Dependent struct
foo'.
>
> rcu_read_lock();
> p = rcu_dereference(gp);
> // And so on...
>
> If a function is to take a dependent pointer as a function argument,
> then the corresponding parameter need the _Dependent_ptr marking.
> Ditto for return values.
>
> The proposal did not cover integers due to concerns about the number of
> optimization passes that would need to be reviewed to make that work.
> Nevertheless, using a marked integer would be safer than using an unmarked
> one, and if the review can be carried out, why not? Maybe something
> like this:
>
> _Dependent_ptr int idx;
>
> rcu_read_lock();
> idx = READ_ONCE(gidx);
> d = rcuarray[idx];
> rcu_read_unlock();
> do_something_with(d);
>
> So use of this qualifier is quite reasonable.
The above usage might warrant a rename of the qualifier though, since
clearly there isn't anything ptr around.
> The prototype for GCC is here: https://github.com/AKG001/gcc/
Thanks! Those test cases are somewhat over qualified though:
static volatile _Atomic (TYPE) * _Dependent_ptr a; \
Also, if C goes and specifies load dependencies, in any form, is then
not the corrolary that they need to specify control dependencies? How
else can they exclude the transformation.
And of course, once we're there, can we get explicit support for control
dependencies too? :-) :-)