[clang] af1d3e6 - Allow init_priority values <= 100 and > 65535 within system headers.

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Mon Sep 28 13:54:04 PDT 2020


On Mon, Sep 28, 2020 at 4:46 PM Robinson, Paul <paul.robinson at sony.com> wrote:
> > -----Original Message-----
> > From: cfe-commits <cfe-commits-bounces at lists.llvm.org> On Behalf Of Aaron
> > Ballman via cfe-commits
> > Sent: Wednesday, September 23, 2020 3:27 PM
> > To: cfe-commits at lists.llvm.org
> > Subject: [clang] af1d3e6 - Allow init_priority values <= 100 and > 65535
> > within system headers.
> >
> >
> > Author: Aaron Ballman
> > Date: 2020-09-23T15:26:50-04:00
> > New Revision: af1d3e655991e5f0c86df372b8583a60d20268e0
> >
> > URL: https://urldefense.com/v3/__https://github.com/llvm/llvm-
> > project/commit/af1d3e655991e5f0c86df372b8583a60d20268e0__;!!JmoZiZGBv3RvKR
> > Sx!uCGMaNBytzj1FhG349bRMYFleWUAIQwiwZLW4mUe1SfbBjKnJvDM4dGzlplaS-cftQ$
> > DIFF: https://urldefense.com/v3/__https://github.com/llvm/llvm-
> > project/commit/af1d3e655991e5f0c86df372b8583a60d20268e0.diff__;!!JmoZiZGBv
> > 3RvKRSx!uCGMaNBytzj1FhG349bRMYFleWUAIQwiwZLW4mUe1SfbBjKnJvDM4dGzlpn6UUxJFg
> > $
> >
> > LOG: Allow init_priority values <= 100 and > 65535 within system headers.
> >
> > This also adds some bare-bones documentation for the attribute rather
> > than leaving it undocumented.
> >
> > Added:
> >
> >
> > Modified:
> >     clang/include/clang/Basic/Attr.td
> >     clang/include/clang/Basic/AttrDocs.td
> >     clang/lib/Sema/SemaDeclAttr.cpp
> >     clang/test/SemaCXX/init-priority-attr.cpp
> >
> > Removed:
> >
> >
> >
> > ##########################################################################
> > ######
> > diff  --git a/clang/include/clang/Basic/Attr.td
> > b/clang/include/clang/Basic/Attr.td
> > index e8ac819c8b556..7222f396089e0 100644
> > --- a/clang/include/clang/Basic/Attr.td
> > +++ b/clang/include/clang/Basic/Attr.td
> > @@ -2196,7 +2196,7 @@ def InitPriority : InheritableAttr {
> >    let Spellings = [GCC<"init_priority", /*AllowInC*/0>];
> >    let Args = [UnsignedArgument<"Priority">];
> >    let Subjects = SubjectList<[Var], ErrorDiag>;
> > -  let Documentation = [Undocumented];
> > +  let Documentation = [InitPriorityDocs];
> >  }
> >
> >  def Section : InheritableAttr {
> >
> > diff  --git a/clang/include/clang/Basic/AttrDocs.td
> > b/clang/include/clang/Basic/AttrDocs.td
> > index 9c119218656d8..3e27924589e4a 100644
> > --- a/clang/include/clang/Basic/AttrDocs.td
> > +++ b/clang/include/clang/Basic/AttrDocs.td
> > @@ -57,6 +57,32 @@ global variable or function should be in after
> > translation.
> >    let Heading = "section, __declspec(allocate)";
> >  }
> >
> > +def InitPriorityDocs : Documentation {
> > +  let Category = DocCatVariable;
> > +  let Content = [{
> > +In C++, the order in which global variables are initialized across
> > translation
> > +units is unspecified, unlike the ordering within a single translation
> > unit. The
> > +``init_priority`` attribute allows you to specify a relative ordering for
> > the
> > +initialization of objects declared at namespace scope in C++. The
> > priority is
> > +given as an integer constant expression between 101 and 65535
> > (inclusive).
> > +Priorities outside of that range are reserved for use by the
> > implementation. A
> > +lower value indicates a higher priority of initialization. Note that only
> > the
> > +relative ordering of values is important. For example:
> > +
> > +.. code-block:: c++
> > +
> > +  struct SomeType { SomeType(); };
> > +  __attribute__((init_priority(200))) SomeType Obj1;
> > +  __attribute__((init_priority(101))) SomeType Obj2;
> > +
> > +``Obj1`` will be initialized *before* ``Obj2`` despite the usual order of
> > +initialization being the opposite.
>
> I think here ``Obj2`` will be initialized before ``Obj1``
> despite the usual order?  (Usual order would be in order of
> declaration, and init_priority goes from low to high.)

You are absolutely correct -- I fat-fingered the example with a late
change to the numerical suffixes. Thank you for catching this! I've
corrected it in e7549dafcd33ced4280a81ca1d1ee4cc78ed253f.

~Aaron

> --paulr
>
> > +
> > +This attribute is only supported for C++ and Objective-C++ and is ignored
> > in
> > +other language modes.
> > +  }];
> > +}
> > +
> >  def InitSegDocs : Documentation {
> >    let Category = DocCatVariable;
> >    let Content = [{
> >
> > diff  --git a/clang/lib/Sema/SemaDeclAttr.cpp
> > b/clang/lib/Sema/SemaDeclAttr.cpp
> > index 6edeb79396296..3babbe05ca8f9 100644
> > --- a/clang/lib/Sema/SemaDeclAttr.cpp
> > +++ b/clang/lib/Sema/SemaDeclAttr.cpp
> > @@ -3313,7 +3313,11 @@ static void handleInitPriorityAttr(Sema &S, Decl
> > *D, const ParsedAttr &AL) {
> >      return;
> >    }
> >
> > -  if (prioritynum < 101 || prioritynum > 65535) {
> > +  // Only perform the priority check if the attribute is outside of a
> > system
> > +  // header. Values <= 100 are reserved for the implementation, and
> > libc++
> > +  // benefits from being able to specify values in that range.
> > +  if ((prioritynum < 101 || prioritynum > 65535) &&
> > +      !S.getSourceManager().isInSystemHeader(AL.getLoc())) {
> >      S.Diag(AL.getLoc(), diag::err_attribute_argument_out_of_range)
> >          << E->getSourceRange() << AL << 101 << 65535;
> >      AL.setInvalid();
> >
> > diff  --git a/clang/test/SemaCXX/init-priority-attr.cpp
> > b/clang/test/SemaCXX/init-priority-attr.cpp
> > index 8f31e2fd62d00..5b5e3b9eb940e 100644
> > --- a/clang/test/SemaCXX/init-priority-attr.cpp
> > +++ b/clang/test/SemaCXX/init-priority-attr.cpp
> > @@ -1,4 +1,9 @@
> >  // RUN: %clang_cc1 -fsyntax-only -verify %s
> > +// RUN: %clang_cc1 -fsyntax-only -DSYSTEM -verify %s
> > +
> > +#if defined(SYSTEM)
> > +#5 "init-priority-attr.cpp" 3 // system header
> > +#endif
> >
> >  class Two {
> >  private:
> > @@ -21,7 +26,15 @@ Two foo __attribute__((init_priority(101))) ( 5, 6 );
> >
> >  Two goo __attribute__((init_priority(2,3))) ( 5, 6 ); // expected-error
> > {{'init_priority' attribute takes one argument}}
> >
> > -Two coo[2]  __attribute__((init_priority(3)));       // expected-error
> > {{'init_priority' attribute requires integer constant between 101 and
> > 65535 inclusive}}
> > +Two coo[2]  __attribute__((init_priority(100)));
> > +#if !defined(SYSTEM)
> > +// expected-error at -2 {{'init_priority' attribute requires integer
> > constant between 101 and 65535 inclusive}}
> > +#endif
> > +
> > +Two boo[2]  __attribute__((init_priority(65536)));
> > +#if !defined(SYSTEM)
> > +// expected-error at -2 {{'init_priority' attribute requires integer
> > constant between 101 and 65535 inclusive}}
> > +#endif
> >
> >  Two koo[4]  __attribute__((init_priority(1.13))); // expected-error
> > {{'init_priority' attribute requires an integer constant}}
> >
> > @@ -30,6 +43,5 @@ Two func()  __attribute__((init_priority(1001))); //
> > expected-error {{'init_prio
> >  int i  __attribute__((init_priority(1001))); // expected-error {{can only
> > use 'init_priority' attribute on file-scope definitions of objects of
> > class type}}
> >
> >  int main() {
> > -     Two foo __attribute__((init_priority(1001)));   // expected-error
> > {{can only use 'init_priority' attribute on file-scope definitions of
> > objects of class type}}
> > +  Two foo __attribute__((init_priority(1001)));      // expected-error {{can
> > only use 'init_priority' attribute on file-scope definitions of objects of
> > class type}}
> >  }
> > -
> >
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at lists.llvm.org
> > https://urldefense.com/v3/__https://lists.llvm.org/cgi-
> > bin/mailman/listinfo/cfe-
> > commits__;!!JmoZiZGBv3RvKRSx!uCGMaNBytzj1FhG349bRMYFleWUAIQwiwZLW4mUe1SfbB
> > jKnJvDM4dGzlplvreK7og$


More information about the cfe-commits mailing list