On 07/08/17 17:27 +0200, Jakub Jelinek wrote:
On Mon, Aug 07, 2017 at 10:54:18AM -0400, Jason Merrill wrote:
On 08/07/2017 05:08 AM, Jakub Jelinek wrote:
> +            tree s = lookup_attribute ("omp declare simd",
> +                                       DECL_ATTRIBUTES (newdecl));
> +            if (s)
> +              {
> +                tree b
> +                  = builtin_decl_explicit (DECL_FUNCTION_CODE (newdecl));
> +                if (b)
> +                  {
> +                    tree s2 = lookup_attribute ("omp declare simd",
> +                                                DECL_ATTRIBUTES (b));
> +                    while (s)
> +                      {
> +                        tree s3;
> +                        for (s3 = s2; s3;
> +                             s3 = lookup_attribute ("omp declare simd",
> +                                                    TREE_CHAIN (s3)))
> +                          if (attribute_value_equal (s, s3))
> +                            break;
> +                        if (!s3)
> +                          {
> +                            s3 = copy_node (s);
> +                            TREE_CHAIN (s3) = DECL_ATTRIBUTES (b);
> +                            DECL_ATTRIBUTES (b) = s3;
> +                          }
> +                        s = lookup_attribute ("omp declare simd",
> +                                              TREE_CHAIN (s));
> +                      }
> +                  }
> +              }

This should really be a separate function.  Perhaps "merge_one_attribute"?

If it is outlined without the first 7 lines, i.e. just the body of if (b),
then it could be duplicate_one_attribute (tree *, tree, const char *);
called like if (b) duplicate_one_attribute (&DECL_ATTRIBUTES (b), s, "omp declare 
simd");
If it is duplicated as whole, it should be called
duplicate_one_attr_to_builtin or something similar.
In any case, it could be in tree.c or attribs.c.

The primary question is if we want this behavior, or if we should go the
libstdc++ patch routine (and for Jonathan the question is if he knows
why __builtin_XXXf has been used there rather than the ::XXXf).

I don't know for certain, but I suspect it's because sinf, cosf, powf
etc. were new in C99, so a strict libc might not declare them in C++98
mode.

By using __builtin_sinf we don't need a declaration of sinf, we only
require the definition to exist in libc or libm. If the function is
present, but not declared for C++98, then it works.


Reply via email to