On 01/04/2016 01:40 PM, Kostya Serebryany wrote:


On Thu, Dec 17, 2015 at 5:03 PM, Richard Smith <rich...@metafoo.co.uk
<mailto:rich...@metafoo.co.uk>> wrote:

    On Thu, Dec 17, 2015 at 3:59 PM, Nick Lewycky via cfe-commits
    <cfe-commits@lists.llvm.org <mailto:cfe-commits@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@lists.llvm.org
            <mailto:cfe-commits@lists.llvm.org>
            <mailto:cfe-commits@lists.llvm.org
            <mailto:cfe-commits@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@lists.llvm.org
            <mailto:cfe-commits@lists.llvm.org>
            <mailto:cfe-commits@lists.llvm.org
            <mailto:cfe-commits@lists.llvm.org>>
            http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits



        _______________________________________________
        cfe-commits mailing list
        cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>
        http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits




_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to