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