Message ID | 20191128184733.27377-1-kamleshbhalui@gmail.com |
---|---|
State | Not applicable |
Headers |
Received: (qmail 45668 invoked by alias); 28 Nov 2019 18:47:51 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: <libc-alpha.sourceware.org> List-Unsubscribe: <mailto:libc-alpha-unsubscribe-##L=##H@sourceware.org> List-Subscribe: <mailto:libc-alpha-subscribe@sourceware.org> List-Archive: <http://sourceware.org/ml/libc-alpha/> List-Post: <mailto:libc-alpha@sourceware.org> List-Help: <mailto:libc-alpha-help@sourceware.org>, <http://sourceware.org/ml/#faqs> Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 45657 invoked by uid 89); 28 Nov 2019 18:47:50 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=H*r:2099 X-HELO: mail-pl1-f179.google.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=v68kGHnhmXByRX5cKbzGvFHgRMVmbcKsmFNfUe/rZEo=; b=FvEoKxNQcxOucSsNUB2uwd3jGY2NAghaRPIH+lPTo1zTSkBBfjITHkRTrpoB9QWxoS 83hyzX5XAHYe9yeo+Jfwm8RkqZPtcS38t0EmzjraqK9Rwx9gw7HgnJ2Pl4/5cRCei2Bg JzVKohsW76NwRU0XpbIIJrZe4ApEAwYoR2eUOonl94h0c6iSbJNxIE+f1BKM5nz3ThUL 5dqFNBpfeWLcOyuO92yXqyA/Cp9TVxPvBxwroWOlnMwGUU1od7O5k4uHRghFRvmRKSQr oJ+ytp8sO+IuVL8vjtD6ez6EbZ5QuT8lSr2vddxQC1HHoWO2EGNHV81yGFeIZM9VxEUj nuDw== Return-Path: <kamleshbhalui@gmail.com> From: Kamlesh Kumar <kamleshbhalui@gmail.com> To: libc-alpha@sourceware.org Subject: [PATCH] For Adding clang check Date: Fri, 29 Nov 2019 00:17:33 +0530 Message-Id: <20191128184733.27377-1-kamleshbhalui@gmail.com> |
Commit Message
Kamlesh Kumar
Nov. 28, 2019, 6:47 p.m. UTC
ChangeLog : 2019-11-28 Kamlesh Kumar <kamleshbhalui@gmail.com> * string/string.h (__glibc_clang_prereq): Used. --- string/string.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Comments
* Kamlesh Kumar: > ChangeLog : > > 2019-11-28 Kamlesh Kumar <kamleshbhalui@gmail.com> > > * string/string.h (__glibc_clang_prereq): Used. > --- > string/string.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/string/string.h b/string/string.h > index 73c22a535a..06a8977165 100644 > --- a/string/string.h > +++ b/string/string.h > @@ -33,7 +33,7 @@ __BEGIN_DECLS > #include <stddef.h> > > /* Tell the caller that we provide correct C++ prototypes. */ > -#if defined __cplusplus && __GNUC_PREREQ (4, 4) > +#if defined __cplusplus && (__GNUC_PREREQ (4, 4) || __glibc_clang_prereq(3,5)) > # define __CORRECT_ISO_CPP_STRING_H_PROTO > #endif Sorry, what's the purpose of this change? Thanks. If it fixes a user-visible problem, it should reference a bug in Bugzilla.
It fixes this. https://bugs.llvm.org/show_bug.cgi?id=44169 On Fri, Nov 29, 2019 at 12:22 AM Florian Weimer <fw@deneb.enyo.de> wrote: > > * Kamlesh Kumar: > > > ChangeLog : > > > > 2019-11-28 Kamlesh Kumar <kamleshbhalui@gmail.com> > > > > * string/string.h (__glibc_clang_prereq): Used. > > --- > > string/string.h | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/string/string.h b/string/string.h > > index 73c22a535a..06a8977165 100644 > > --- a/string/string.h > > +++ b/string/string.h > > @@ -33,7 +33,7 @@ __BEGIN_DECLS > > #include <stddef.h> > > > > /* Tell the caller that we provide correct C++ prototypes. */ > > -#if defined __cplusplus && __GNUC_PREREQ (4, 4) > > +#if defined __cplusplus && (__GNUC_PREREQ (4, 4) || __glibc_clang_prereq(3,5)) > > # define __CORRECT_ISO_CPP_STRING_H_PROTO > > #endif > > Sorry, what's the purpose of this change? Thanks. > > If it fixes a user-visible problem, it should reference a bug in > Bugzilla.
* kamlesh kumar: > It fixes this. > https://bugs.llvm.org/show_bug.cgi?id=44169 What's the rationale for the condition? What's special about Clang 3.5? My understanding is that a compiler needs support for asm aliases *and* the C++ library headers need to be compatible. Is there a way to determine if libc++ is compatible? For libstdc++ with GCC, the compiler version check covers libstdc++ implicity, but that does not apply to Clang, or libc++ with either compiler. > On Fri, Nov 29, 2019 at 12:22 AM Florian Weimer <fw@deneb.enyo.de> wrote: >> >> * Kamlesh Kumar: >> >> > ChangeLog : >> > >> > 2019-11-28 Kamlesh Kumar <kamleshbhalui@gmail.com> >> > >> > * string/string.h (__glibc_clang_prereq): Used. >> > --- >> > string/string.h | 2 +- >> > 1 file changed, 1 insertion(+), 1 deletion(-) >> > >> > diff --git a/string/string.h b/string/string.h >> > index 73c22a535a..06a8977165 100644 >> > --- a/string/string.h >> > +++ b/string/string.h >> > @@ -33,7 +33,7 @@ __BEGIN_DECLS >> > #include <stddef.h> >> > >> > /* Tell the caller that we provide correct C++ prototypes. */ >> > -#if defined __cplusplus && __GNUC_PREREQ (4, 4) >> > +#if defined __cplusplus && (__GNUC_PREREQ (4, 4) || __glibc_clang_prereq(3,5)) >> > # define __CORRECT_ISO_CPP_STRING_H_PROTO >> > #endif >> >> Sorry, what's the purpose of this change? Thanks. >> >> If it fixes a user-visible problem, it should reference a bug in >> Bugzilla.
Hi Florian, While compiling this (https://godbolt.org/z/uV2Pjp) c++ program with clang (it uses libstdc++ by default) static_assert fails. that is because this macro __CORRECT_ISO_CPP_STRING_H_PROTO does not get defined when clang is used, because it is like this in string.h #if defined __cplusplus && __GNUC_PREREQ (4, 4) # define __CORRECT_ISO_CPP_STRING_H_PROTO #endif And return type of strchr in this case is char *, while we expect it to be const char *. That does not happen because latter declration is hidden by this macro __CORRECT_ISO_CPP_STRING_H_PROTO. I have used clang 3.5 here in check, because this is minimum version which worked with libc++ and libstdc++. ,kamlesh On Fri, Nov 29, 2019 at 1:55 PM Florian Weimer <fw@deneb.enyo.de> wrote: > > * kamlesh kumar: > > > It fixes this. > > https://bugs.llvm.org/show_bug.cgi?id=44169 > > What's the rationale for the condition? What's special about Clang > 3.5? > > My understanding is that a compiler needs support for asm aliases > *and* the C++ library headers need to be compatible. Is there a way > to determine if libc++ is compatible? For libstdc++ with GCC, the > compiler version check covers libstdc++ implicity, but that does not > apply to Clang, or libc++ with either compiler. > > > On Fri, Nov 29, 2019 at 12:22 AM Florian Weimer <fw@deneb.enyo.de> wrote: > >> > >> * Kamlesh Kumar: > >> > >> > ChangeLog : > >> > > >> > 2019-11-28 Kamlesh Kumar <kamleshbhalui@gmail.com> > >> > > >> > * string/string.h (__glibc_clang_prereq): Used. > >> > --- > >> > string/string.h | 2 +- > >> > 1 file changed, 1 insertion(+), 1 deletion(-) > >> > > >> > diff --git a/string/string.h b/string/string.h > >> > index 73c22a535a..06a8977165 100644 > >> > --- a/string/string.h > >> > +++ b/string/string.h > >> > @@ -33,7 +33,7 @@ __BEGIN_DECLS > >> > #include <stddef.h> > >> > > >> > /* Tell the caller that we provide correct C++ prototypes. */ > >> > -#if defined __cplusplus && __GNUC_PREREQ (4, 4) > >> > +#if defined __cplusplus && (__GNUC_PREREQ (4, 4) || __glibc_clang_prereq(3,5)) > >> > # define __CORRECT_ISO_CPP_STRING_H_PROTO > >> > #endif > >> > >> Sorry, what's the purpose of this change? Thanks. > >> > >> If it fixes a user-visible problem, it should reference a bug in > >> Bugzilla.
On 29/11/19 09:25 +0100, Florian Weimer wrote: >* kamlesh kumar: > >> It fixes this. >> https://bugs.llvm.org/show_bug.cgi?id=44169 > >What's the rationale for the condition? What's special about Clang >3.5? > >My understanding is that a compiler needs support for asm aliases >*and* the C++ library headers need to be compatible. Is there a way >to determine if libc++ is compatible? Libc++ already checks for this macro in its <string.h> wrapper: https://github.com/llvm/llvm-project/blob/master/libcxx/include/string.h#L62 If the __CORRECT_ISO_CPP_STRING_H_PROTO macro is *not* defined after doing #include_next <string.h> (to get the libc header) then libc++ makes use of a Clang extension to declare new overloads: https://github.com/llvm/llvm-project/blob/master/libcxx/include/string.h#L70 The _LIBCPP_PREFERRED_OVERLOAD macro is defined as: # define _LIBCPP_PREFERRED_OVERLOAD __attribute__ ((__enable_if__(true, ""))) That Clang-only attribute means the compiler will use the new overloads in preference to the libc strchr. A non-standard extension is needed because according to the C++ rules the new overloads should be ambiguous with the one that was declared by libc's <string.h>. >For libstdc++ with GCC, the >compiler version check covers libstdc++ implicity, but that does not >apply to Clang, or libc++ with either compiler. Libstdc++ with GCC already works. Libstdc++ with Clang needs this patch. If I'm reading the libc++ code right ... Libc++ with GCC should already work, because the __GNUC_PREREQ will pass and libc++ is already aware of the existence and effects of the __CORRECT_ISO_CPP_STRING_H_PROTO macro. (I doubt libc++ works with ancient GCC versions, but if it does they'll get the wrong signatures ... well tough luck, use a newer GCC). Libc++ with Clang doesn't need this patch, because it uses the Clang extension, but after this patch it would no longer need to use the extension. The right signatures would be declared by glibc. So of the four combinations, two already work and are unaffected by this patch. One already works and is affected, but not in a way users will notice (the correct signatures are already there, the patch just changes whether they come from glibc or libc++). And one doesn't currently work but is fixed by the patch. I think the patch is right.
diff --git a/string/string.h b/string/string.h index 73c22a535a..06a8977165 100644 --- a/string/string.h +++ b/string/string.h @@ -33,7 +33,7 @@ __BEGIN_DECLS #include <stddef.h> /* Tell the caller that we provide correct C++ prototypes. */ -#if defined __cplusplus && __GNUC_PREREQ (4, 4) +#if defined __cplusplus && (__GNUC_PREREQ (4, 4) || __glibc_clang_prereq(3,5)) # define __CORRECT_ISO_CPP_STRING_H_PROTO #endif