r255371 - Error on redeclaring with a conflicting asm label and on redeclaring with an asm label after the first ODR-use. Detects problems like the one in PR22830 where gcc and clang both compiled the file but with different behaviour.

Nick Lewycky via cfe-commits cfe-commits at lists.llvm.org
Mon Jan 4 15:21:13 PST 2016


On 01/04/2016 01:40 PM, Kostya Serebryany wrote:
>
>
> On Thu, Dec 17, 2015 at 5:03 PM, Richard Smith <richard at metafoo.co.uk
> <mailto:richard at metafoo.co.uk>> wrote:
>
>     On Thu, Dec 17, 2015 at 3:59 PM, Nick Lewycky via cfe-commits
>     <cfe-commits at lists.llvm.org <mailto:cfe-commits at lists.llvm.org>> wrote:
>
>         On 12/17/2015 10:47 AM, Kostya Serebryany wrote:
>
>             I am now observing this error message when building glibc
>             with clang
>             (from trunk):
>             ../include/string.h:101:28: error: cannot apply asm label to
>             function
>             after its first use
>             libc_hidden_builtin_proto (memcpy)
>             (many more instances)
>
>
>             Do you think this is a bug in glibc code, or the error
>             message could be
>             more relaxed?
>
>
>         Could you email me a .i copy of a failing build? That will help
>         me decide whether it's a bug in the error or in glibc.
>
>
> [sorry for delay,]
> here is the preprocessed source file from glibc:
> % clang      ~/tmp/a.i 2>&1 | grep error:
> ../include/sys/stat.h:16:28: error: cannot apply asm label to function
> after its first use
> ../include/sys/stat.h:17:30: error: cannot apply asm label to function
> after its first use
> ../include/sys/stat.h:18:28: error: cannot apply asm label to function
> after its first use
> ../include/sys/stat.h:19:30: error: cannot apply asm label to function
> after its first use
> ...
>
>
>     Also PR22830 comment 1 seems relevant here.
>
>
> Probably, but since this is a very recent regression in clang I thought
> I should report it.

This looks like it's WAI:

3783    extern int __fxstat (int __ver, int __fildes, struct stat 
*__stat_buf)
3784         __attribute__ ((__nothrow__ )) ;
...
3827    extern __inline int
3828    __attribute__ ((__nothrow__ )) fstat (int __fd, struct stat 
*__statbuf)
3829    {
3830      return __fxstat (1, __fd, __statbuf);
3831    }
...
3910    extern __typeof (__fxstat) __fxstat __asm__ ("" "__GI___fxstat") 
__attribute__ ((visibility ("hidden")));

This is exactly the situation where GCC and Clang will emit a different 
.o file.

Nick

>             On Fri, Dec 11, 2015 at 1:28 PM, Nick Lewycky via cfe-commits
>             <cfe-commits at lists.llvm.org
>             <mailto:cfe-commits at lists.llvm.org>
>             <mailto:cfe-commits at lists.llvm.org
>             <mailto:cfe-commits at lists.llvm.org>>> wrote:
>
>                  Author: nicholas
>                  Date: Fri Dec 11 15:28:55 2015
>                  New Revision: 255371
>
>                  URL:
>             http://llvm.org/viewvc/llvm-project?rev=255371&view=rev
>                  Log:
>                  Error on redeclaring with a conflicting asm label and
>             on redeclaring
>                  with an asm label after the first ODR-use. Detects
>             problems like the
>                  one in PR22830 where gcc and clang both compiled the
>             file but with
>                  different behaviour.
>
>                  Added:
>                       cfe/trunk/test/Sema/asm-label.c
>                  Modified:
>                       cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>                       cfe/trunk/lib/Sema/SemaDecl.cpp
>
>                  Modified:
>             cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>                  URL:
>             http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=255371&r1=255370&r2=255371&view=diff
>
>             ==============================================================================
>                  ---
>             cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
>                  +++
>             cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Dec 11
>                  15:28:55 2015
>                  @@ -4259,6 +4259,9 @@ def err_tag_definition_of_typedef
>             : Erro
>                    def err_conflicting_types : Error<"conflicting types
>             for %0">;
>                    def err_different_pass_object_size_params : Error<
>                      "conflicting pass_object_size attributes on
>             parameters">;
>                  +def err_late_asm_label_name : Error<
>                  +  "cannot apply asm label to
>             %select{variable|function}0 after its
>                  first use">;
>                  +def err_different_asm_label : Error<"conflicting asm
>             label">;
>                    def err_nested_redefinition : Error<"nested
>             redefinition of %0">;
>                    def err_use_with_wrong_tag : Error<
>                      "use of %0 with tag type that does not match
>             previous declaration">;
>
>                  Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
>                  URL:
>             http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=255371&r1=255370&r2=255371&view=diff
>
>             ==============================================================================
>                  --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
>                  +++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Dec 11 15:28:55
>             2015
>                  @@ -2379,9 +2379,24 @@ void
>             Sema::mergeDeclAttributes(NamedDecl
>                      if (!Old->hasAttrs() && !New->hasAttrs())
>                        return;
>
>                  -  // attributes declared post-definition are currently
>             ignored
>                  +  // Attributes declared post-definition are currently
>             ignored.
>                      checkNewAttributesAfterDef(*this, New, Old);
>
>                  +  if (AsmLabelAttr *NewA = New->getAttr<AsmLabelAttr>()) {
>                  +    if (AsmLabelAttr *OldA =
>             Old->getAttr<AsmLabelAttr>()) {
>                  +      if (OldA->getLabel() != NewA->getLabel()) {
>                  +        // This redeclaration changes __asm__ label.
>                  +        Diag(New->getLocation(),
>             diag::err_different_asm_label);
>                  +        Diag(OldA->getLocation(),
>             diag::note_previous_declaration);
>                  +      }
>                  +    } else if (Old->isUsed()) {
>                  +      // This redeclaration adds an __asm__ label to a
>             declaration
>                  that has
>                  +      // already been ODR-used.
>                  +      Diag(New->getLocation(),
>             diag::err_late_asm_label_name)
>                  +        << isa<FunctionDecl>(Old) <<
>                  New->getAttr<AsmLabelAttr>()->getRange();
>                  +    }
>                  +  }
>                  +
>                      if (!Old->hasAttrs())
>                        return;
>
>
>                  Added: cfe/trunk/test/Sema/asm-label.c
>                  URL:
>             http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/asm-label.c?rev=255371&view=auto
>
>             ==============================================================================
>                  --- cfe/trunk/test/Sema/asm-label.c (added)
>                  +++ cfe/trunk/test/Sema/asm-label.c Fri Dec 11 15:28:55
>             2015
>                  @@ -0,0 +1,30 @@
>                  +// RUN: %clang_cc1 -verify %s
>                  +
>                  +void f();
>                  +void f() __asm__("fish");
>                  +void g();
>                  +
>                  +void f() {
>                  +  g();
>                  +}
>                  +void g() __asm__("gold");  // expected-error{{cannot
>             apply asm
>                  label to function after its first use}}
>                  +
>                  +void h() __asm__("hose");  // expected-note{{previous
>             declaration
>                  is here}}
>                  +void h() __asm__("hair");  //
>             expected-error{{conflicting asm label}}
>                  +
>                  +int x;
>                  +int x __asm__("xenon");
>                  +int y;
>                  +
>                  +int test() { return y; }
>                  +
>                  +int y __asm__("yacht");  // expected-error{{cannot
>             apply asm label
>                  to variable after its first use}}
>                  +
>                  +int z __asm__("zebra");  // expected-note{{previous
>             declaration is
>                  here}}
>                  +int z __asm__("zooms");  //
>             expected-error{{conflicting asm label}}
>                  +
>                  +
>                  +// No diagnostics on the following.
>                  +void __real_readlink() __asm("readlink");
>                  +void readlink() __asm("__protected_readlink");
>                  +void readlink() { __real_readlink(); }
>
>
>                  _______________________________________________
>                  cfe-commits mailing list
>             cfe-commits at lists.llvm.org
>             <mailto:cfe-commits at lists.llvm.org>
>             <mailto:cfe-commits at lists.llvm.org
>             <mailto:cfe-commits at lists.llvm.org>>
>             http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
>
>         _______________________________________________
>         cfe-commits mailing list
>         cfe-commits at lists.llvm.org <mailto:cfe-commits at lists.llvm.org>
>         http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
>



More information about the cfe-commits mailing list