From patchwork Thu May 11 15:33:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 20406 Received: (qmail 78705 invoked by alias); 11 May 2017 15:33:56 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 78696 invoked by uid 89); 11 May 2017 15:33:56 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.0 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=ham version=3.3.2 spammy=Hx-spam-relays-external:209.85.220.196, H*RU:209.85.220.196 X-HELO: mail-qk0-f196.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=kH3s+rPmH2z0JrMV+LvD/p5J6MCrE+z0o6+R6BWitQA=; b=F6n5K7IwOa/C/n5WCocljO3tq87bWLvzxTCRKgv4zmSIDn7w7cWODDqW9pH0hkomg6 Sr4AFyXNiGtAhK9qIR1EnLohfrvnD6z2YwrTEcvnCpiLy5p0eqtrVZWgIBPqqNXJKFMJ 8/NWXJ8vTq0EoiNWMNejQ1SDpCTobKEal4dV0FZK/SWHUq9AGkxbOWEKGEdY+ZACzgjV ucUrFlDAYlE44sY0jgoGQdMOOh4a308vpq62j84rjaPo7bTJhxSbpJQKKFPchdFj7X1r 2yt+TlD22IKzv+zJSVoeXzbrFq/eE5YVfFlecKE1fyRYKSmWnvaCBeSkV26DFVdxsxJ/ M+SA== X-Gm-Message-State: AODbwcDoQ40snvgt/5zfn4TYimAME3bxH6yodzgk29LsUTXo5HvQrZbA 80I6gZHSMXEIk3F84+RZRP/d8FX5QPcj X-Received: by 10.55.74.214 with SMTP id x205mr1021510qka.231.1494516835797; Thu, 11 May 2017 08:33:55 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: References: <20170511141836.GB26086@intel.com> From: "H.J. Lu" Date: Thu, 11 May 2017 08:33:55 -0700 Message-ID: Subject: Re: [PATCH] Add __BEGIN_DECLS and __END_DECLS for C++ To: Zack Weinberg Cc: GNU C Library On Thu, May 11, 2017 at 8:20 AM, Zack Weinberg wrote: > On Thu, May 11, 2017 at 11:10 AM, H.J. Lu wrote: >> On Thu, May 11, 2017 at 7:57 AM, Zack Weinberg wrote: >>> On Thu, May 11, 2017 at 10:45 AM, H.J. Lu wrote: >>>> On Thu, May 11, 2017 at 7:43 AM, Zack Weinberg wrote: >>>>> >>>>> This program does not appear to need ifunc-impl-list.h. Please elaborate. >>>> >>>> Please see hjl/x86/optimize branch in glibc git repo. >>> >>> I don't especially appreciate being made to dig through a bunch of >>> code I'm unfamiliar with. It would have been easy for you to write >>> "The existing benchtests framework uses ifunc-impl-list.h to iterate >>> over all ifunc implementations of a particular string function. This >>> works as long as the test program is C, but I want to integrate a >>> third-party benchmark written in C++, so I need to make >>> ifunc-impl-list.h C++-safe". If that had accompanied the original >>> patch it would have been better all around. >>> >>> It looks to me as if IFUNC_IMPL_ADD is not C++-safe and cannot easily >> >> IFUNC_IMPL_ADD is only used in ifunc-impl-list.c, which is the >> part of libc and in C. > > Can IFUNC_IMPL_ADD be removed from ifunc-impl-list.h then? I would be > okay with adding __BEGIN_DECLS/__END_DECLS to the header as long as > all of the code within it -- including macros -- was safe for use from > C++ programs, and with a comment explaining that the header may get > used from C++ benchmarks. IFUNC_IMPL_ADD is used in sysdeps/arm/armv7/multiarch/ifunc-impl-list.c sysdeps/i386/i686/multiarch/ifunc-impl-list.c sysdeps/powerpc/powerpc32/power4/multiarch/ifunc-impl-list.c sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c sysdeps/s390/multiarch/ifunc-impl-list.c sysdeps/sparc/sparc64/multiarch/ifunc-impl-list.c sysdeps/x86_64/multiarch/ifunc-impl-list.c Removing it from include/ifunc-impl-list.h isn't appropriate. Here is the updated patch with comments. >>> be made so, so I don't like this change. What prevents you from >>> rewriting the third-party benchmark in C, since you have to modify it >>> anyway? It's not doing anything that is difficult in plain C. >> >> I'd to preserve the original benchmark as much as possible so that >> little is lost, comparing with the original one. > > That's fair. > > zw From 5eb2c187b50fdc0849f60a966fbc0ff0f407fd3d Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 10 May 2017 16:02:56 -0700 Subject: [PATCH] Add __BEGIN_DECLS and __END_DECLS for C++ Add __BEGIN_DECLS and __END_DECLS to support C++. IFUNC_IMPL_ADD and IFUNC_IMPL are used internally in libc. They shouldn't be used in any programs. * include/ifunc-impl-list.h: Add __BEGIN_DECLS and __END_DECLS. (IFUNC_IMPL_ADD, IFUNC_IMPL): Define only if __cplusplus isn't defined. --- include/ifunc-impl-list.h | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/include/ifunc-impl-list.h b/include/ifunc-impl-list.h index 22ca05f..7d53f11 100644 --- a/include/ifunc-impl-list.h +++ b/include/ifunc-impl-list.h @@ -22,6 +22,8 @@ #include #include +__BEGIN_DECLS + struct libc_ifunc_impl { /* The name of function to be tested. */ @@ -32,20 +34,25 @@ struct libc_ifunc_impl bool usable; }; +#ifndef __cplusplus +/* NB: IFUNC_IMPL_ADD and IFUNC_IMPL are used internally in libc. They + shouldn't be used in any programs. */ + /* Add an IFUNC implementation, IMPL, for function FUNC, to ARRAY with USABLE at index I and advance I by one. */ -#define IFUNC_IMPL_ADD(array, i, func, usable, impl) \ +# define IFUNC_IMPL_ADD(array, i, func, usable, impl) \ extern __typeof (func) impl attribute_hidden; \ (array)[i++] = (struct libc_ifunc_impl) { #impl, (void (*) (void)) impl, (usable) }; /* Return the number of IFUNC implementations, N, for function FUNC if string NAME matches FUNC. */ -#define IFUNC_IMPL(n, name, func, ...) \ +# define IFUNC_IMPL(n, name, func, ...) \ if (strcmp (name, #func) == 0) \ { \ __VA_ARGS__; \ return n; \ } +#endif /* __cplusplus */ /* Fill ARRAY of MAX elements with IFUNC implementations for function NAME and return the number of valid entries. */ @@ -53,4 +60,6 @@ extern size_t __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, size_t max); +__END_DECLS + #endif /* ifunc-impl-list.h */ -- 2.9.3