[Cfp-interest] exploring __attribute__

Jim Thomas jaswthomas at sbcglobal.net
Mon Jul 28 09:38:33 PDT 2014


Rajan is right. Here are the draft minutes from the WG 14 meeting of Oct 2009:

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1422.pdf

See item 4.12.

-Jim

On Jul 28, 2014, at 5:36 AM, Rajan Bhakta <rbhakta at us.ibm.com> wrote:

> Jim and Fred can probably tell you more than I could, but when I joined the C committee, at that time I recall hearing about the aversion to attribute syntax and instead the preference for keywords (noreturn for example). I believe that was intended as the strategic direction for C. 
> 
> Regards,
> 
> Rajan Bhakta
> z/OS XL C/C++ Compiler Technical Architect
> ISO C Standards Representative for Canada
> C Compiler Development
> Contact: rbhakta at us.ibm.com, Rajan Bhakta/Houston/IBM 
> 
> 
> 
> From:        David Hough CFP <pcfp at oakapple.net> 
> To:        cfp-interest at ucbtest.org 
> Date:        07/25/2014 06:20 PM 
> Subject:        [Cfp-interest] exploring __attribute__ 
> Sent by:        cfp-interest-bounces at oakapple.net 
> 
> 
> 
> 
> I followed up on Ian's suggestion and expanded the syntax discussion to
> include __attribute__
> 
> 
> 
> 
> Syntax for Directives in C
> 
> IEEE 754-2008 requests languages to define directives for specifying
> mandatory and permissible compilation attributes.    An example of the
> difference is a mandatory alternate exception handling 
> directive to perform abrupt underflow handling, in contrast to
> a permissible optimization directive that allows using fast hardware modes for
> handling underflowed results and subnormal operands if they exist.
> 
> We've gotten some feedback that #pragma is not desirable syntax for mandatory
> directives, and that try/catch semantics that we need does not match well enough
> to C++ try/catch.     So that's an opportunity to step back and think about
> what we really need.
> 
> The basic #pragma conceptual syntax is
> 
> {
> #pragma STDC PROPERTY value
> 
> code
> }
> 
> and the pragma affects all the code in the compound statement.
> There are already three such pragmas in standard C.
> 
>  #pragma STDC FP_CONTRACT on-off-switch
>  #pragma STDC FENV_ACCESS on-off-switch
>  #pragma STDC CX_LIMITED_RANGE on-off-switch
> 
> Note that these pragmas 
> 
> can occur either outside external declarations
> or preceding all explicit declarations and statements inside a
> compound statement
> 
> The catch/try syntax we considered was really just a syntactic
> transformation of a corresponding #pragma approach:
> 
> try { 
> code0
> }
> catch (FE_INVALID) {
> code1
> }
> 
> is conceptually equivalent to
> 
> {
> #pragma STDC FENV_EXCEPT FE_INVALID goto L1 
> code0
> goto L2;
> }
> L1:
> code1
> L2:
> 
> The try/catch form is a little less verbose, but has the drawback that
> the exception list (FE_INVALID in this case) has to be known in order to
> compile code0, even though the exception list appears syntactically after
> the code that it modifies.
> 
> The try/catch paradigm happens to correspond rather closely to the 
> control-transfer variety of alternate exception handling, but not closely to
> the value-substitution variety of alternate exception handling,
> nor to other kinds of compiler directives controlling optimizations.
> 
> So perhaps we should consider something more general.
> Is there a more natural C-like syntax for specifying how a compound
> statement should be compiled?
> 
> Another possible prototype comes from OpenMP 3.0:
> 
>  #pragma omp parallel [ clause[ [ , ]clause] ...] new-line
>  structured-block
> 
> where "structured-block" is defined as
> 
>  a single statement or a compound statement with a single entry
>  at the top and a single exit at the bottom
> 
> It's interesting that OpenMP puts the controlling #pragma before the
> compound statement, while FP_CONTRACT etc are within the compound statement.
> I'm not aware of a compelling compiler-implementation
> reason to do it one way or the other, but it
> might make more sense to do it consistently.
> 
> 
> Abstracting all this, we'd like to have a way of specifying attributes 
> for compound statements.    Can we really do better than #pragma?
> Some attributes are requirements, others just suggestions.
> 
> 
> How about a general __attribute__ keyword that can attach to most any 
> syntactic unit?
> Ian suggests this approach and lists the positives:
> 
> - It's reasonably understandable.
> - It avoids new keywords that conflict with user names.
> - It avoids the objections to pragmas.
> - It can apply to any compound statement including loops and if statement then or else clauses.
> - It handles substitution etc. not just trapping.
> - It can include non-floating-point exception handling.
> - It can include errno error handling.
> - It can include finally.
> - It (all, or the FP exception subset) could easily be added to C++.
> - Gcc / g++ users should like it.
> - It works with a one pass compiler.
> 
> The main negative is that it lists the exceptional case before the normal case,
> which is backwards for persons reading code,
> but it's a positive for one-pass compiler writers.
> 
> I'd interpret it thus:
> 
> __attribute__ (xyz) {
> code
> }
> 
> as equivalent to what we've been writing as
> 
> {
> #pragma STDC xyz
> code
> }
> 
> where xyz might be very general:
> 
> fe_catch_after(flaglist); code1                  # test after execution
> fe_catch_asap(exceptionlist); code1                  # catch asap
> fe_catch(exceptionlist); code1                                  # asap or after, implementation choice
> fe_sub(exceptionlist); code1                                  # code1 computes the substitute value
> fe_abrupt();                                                                    # abrupt underflow
> 
> It looks like a function invocation followed by general code1, but the 
> function names are really keywords; the general code1 would most likely be
> pretty simple, typically a goto, for the fe_catch flavors.
> 
> Our existing pragmas and other optimization and expression evaluation
> attributes could fit in as well:
> 
>  #pragma STDC FP_CONTRACT on-off-switch
>  #pragma STDC FENV_ACCESS on-off-switch
>  #pragma STDC CX_LIMITED_RANGE on-off-switch
> 
> become e.g.
> 
> __attribute__ (FP_CONTRACT(on)) {}
> or
> __attribute__ (FP_CONTRACT on) {}
> 
> multiple attributes could be handled something like
> 
> __attribute__ (attribute1) (attribute2) {
> 
> Note that the GCC feature that inspires this line of thought
> has double parentheses around xyz:
> 
> __attribute__ ((xyz)) 
> 
> no doubt for good reasons that I don't know about.
> And GCC __attribute__ doesn't apply to compound statements as I suggest;
> that idea comes from OpenCL.
> _______________________________________________
> Cfp-interest mailing list
> Cfp-interest at oakapple.net
> http://mailman.oakapple.net/mailman/listinfo/cfp-interest
> 
> 
> _______________________________________________
> Cfp-interest mailing list
> Cfp-interest at oakapple.net
> http://mailman.oakapple.net/mailman/listinfo/cfp-interest

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.oakapple.net/pipermail/cfp-interest/attachments/20140728/00add733/attachment-0001.html 


More information about the Cfp-interest mailing list