From patchwork Thu Jul 7 11:43:18 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Martin_Li=C5=A1ka?= X-Patchwork-Id: 55840 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4CE6A3856090 for ; Thu, 7 Jul 2022 11:43:42 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by sourceware.org (Postfix) with ESMTPS id E7DF23858D32 for ; Thu, 7 Jul 2022 11:43:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E7DF23858D32 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.cz Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id BED541F9F0; Thu, 7 Jul 2022 11:43:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1657194198; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=1hvphsgTss93toiOuY9BBl7FKa2aJot7SxaxvbllbA4=; b=sLOZrOtoAm/JB6bGeGQhBEgdrDkbphWG1ROdHvyXQ9pPr0zknHFR5aMrZdMcTbjAYcV4wE T0efW4wJOWQOpHdSrMd2ZGHTQRW8vReN/yb/Jpxu08whjT9aL7spMIP69CnMVpFIFxWM+I gjXHyKdOgA5asnEjhx4Nsly0eXblcpQ= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1657194198; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=1hvphsgTss93toiOuY9BBl7FKa2aJot7SxaxvbllbA4=; b=oKip8lm0/idXmBQTefc8+KMgqpjOZlQjtprKfmR3nGTIkOtzx54PIW9/acuPleszHcH8dW 5iIbCrbwNjvbjwBA== Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id A6E7D13A33; Thu, 7 Jul 2022 11:43:18 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id voDWJ9bGxmL5WgAAMHmgww (envelope-from ); Thu, 07 Jul 2022 11:43:18 +0000 Message-ID: <31546a0d-9103-dba2-cca7-261905441aa5@suse.cz> Date: Thu, 7 Jul 2022 13:43:18 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.11.0 From: =?utf-8?q?Martin_Li=C5=A1ka?= Subject: [PATCH] lto-plugin: use locking only for selected targets To: gcc-patches@gcc.gnu.org References: Content-Language: en-US In-Reply-To: X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" For now, support locking only for linux targets that are different from riscv* where the target depends on libatomic (and fails during bootstrap). Patch can bootstrap on x86_64-linux-gnu and survives regression tests. Ready to be installed? Thanks, Martin PR lto/106170 lto-plugin/ChangeLog: * configure.ac: Configure HAVE_PTHREAD_LOCKING. * lto-plugin.c (LOCK_SECTION): New. (UNLOCK_SECTION): New. (claim_file_handler): Use the newly added macros. (onload): Likewise. * config.h.in: Regenerate. * configure: Regenerate. --- lto-plugin/config.h.in | 4 ++-- lto-plugin/configure | 20 ++++++++++++++------ lto-plugin/configure.ac | 17 +++++++++++++++-- lto-plugin/lto-plugin.c | 30 ++++++++++++++++++++---------- 4 files changed, 51 insertions(+), 20 deletions(-) diff --git a/lto-plugin/config.h.in b/lto-plugin/config.h.in index 029e782f1ee..bf269f000d2 100644 --- a/lto-plugin/config.h.in +++ b/lto-plugin/config.h.in @@ -9,8 +9,8 @@ /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H -/* Define to 1 if pthread.h is present. */ -#undef HAVE_PTHREAD_H +/* Define if the system-provided pthread locking mechanism. */ +#undef HAVE_PTHREAD_LOCKING /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H diff --git a/lto-plugin/configure b/lto-plugin/configure index aaa91a63623..7ea54e6008f 100755 --- a/lto-plugin/configure +++ b/lto-plugin/configure @@ -6011,14 +6011,22 @@ fi # Check for thread headers. -ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" -if test "x$ac_cv_header_pthread_h" = xyes; then : +use_locking=no -$as_echo "#define HAVE_PTHREAD_H 1" >>confdefs.h +case $target in + riscv*) + # do not use locking as pthread depends on libatomic + ;; + *-linux*) + use_locking=yes + ;; +esac -fi +if test x$use_locking = xyes; then +$as_echo "#define HAVE_PTHREAD_LOCKING 1" >>confdefs.h +fi case `pwd` in *\ * | *\ *) @@ -12091,7 +12099,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 12094 "configure" +#line 12102 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -12197,7 +12205,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 12200 "configure" +#line 12208 "configure" #include "confdefs.h" #if HAVE_DLFCN_H diff --git a/lto-plugin/configure.ac b/lto-plugin/configure.ac index c2ec512880f..69bc5139193 100644 --- a/lto-plugin/configure.ac +++ b/lto-plugin/configure.ac @@ -88,8 +88,21 @@ AM_CONDITIONAL(LTO_PLUGIN_USE_SYMVER_GNU, [test "x$lto_plugin_use_symver" = xgnu AM_CONDITIONAL(LTO_PLUGIN_USE_SYMVER_SUN, [test "x$lto_plugin_use_symver" = xsun]) # Check for thread headers. -AC_CHECK_HEADER(pthread.h, - [AC_DEFINE(HAVE_PTHREAD_H, 1, [Define to 1 if pthread.h is present.])]) +use_locking=no + +case $target in + riscv*) + # do not use locking as pthread depends on libatomic + ;; + *-linux*) + use_locking=yes + ;; +esac + +if test x$use_locking = xyes; then + AC_DEFINE(HAVE_PTHREAD_LOCKING, 1, + [Define if the system-provided pthread locking mechanism.]) +fi AM_PROG_LIBTOOL ACX_LT_HOST_FLAGS diff --git a/lto-plugin/lto-plugin.c b/lto-plugin/lto-plugin.c index 635e126946b..cba58f5999b 100644 --- a/lto-plugin/lto-plugin.c +++ b/lto-plugin/lto-plugin.c @@ -40,11 +40,7 @@ along with this program; see the file COPYING3. If not see #ifdef HAVE_CONFIG_H #include "config.h" -#if !HAVE_PTHREAD_H -#error POSIX threads are mandatory dependency #endif -#endif - #if HAVE_STDINT_H #include #endif @@ -59,7 +55,9 @@ along with this program; see the file COPYING3. If not see #include #include #include +#if HAVE_PTHREAD_LOCKING #include +#endif #ifdef HAVE_SYS_WAIT_H #include #endif @@ -162,9 +160,18 @@ enum symbol_style ss_uscore, /* Underscore prefix all symbols. */ }; +#if HAVE_PTHREAD_LOCKING /* Plug-in mutex. */ static pthread_mutex_t plugin_lock; +#define LOCK_SECTION pthread_mutex_lock (&plugin_lock) +#define UNLOCK_SECTION pthread_mutex_unlock (&plugin_lock) +#else + +#define LOCK_SECTION +#define UNLOCK_SECTION +#endif + static char *arguments_file_name; static ld_plugin_register_claim_file register_claim_file; static ld_plugin_register_all_symbols_read register_all_symbols_read; @@ -1270,18 +1277,18 @@ claim_file_handler (const struct ld_plugin_input_file *file, int *claimed) lto_file.symtab.syms); check (status == LDPS_OK, LDPL_FATAL, "could not add symbols"); - pthread_mutex_lock (&plugin_lock); + LOCK_SECTION; num_claimed_files++; claimed_files = xrealloc (claimed_files, num_claimed_files * sizeof (struct plugin_file_info)); claimed_files[num_claimed_files - 1] = lto_file; - pthread_mutex_unlock (&plugin_lock); + UNLOCK_SECTION; *claimed = 1; } - pthread_mutex_lock (&plugin_lock); + LOCK_SECTION; if (offload_files == NULL) { /* Add dummy item to the start of the list. */ @@ -1344,14 +1351,15 @@ claim_file_handler (const struct ld_plugin_input_file *file, int *claimed) offload_files_last_lto = ofld; num_offload_files++; } - pthread_mutex_unlock (&plugin_lock); + + UNLOCK_SECTION; goto cleanup; err: - pthread_mutex_lock (&plugin_lock); + LOCK_SECTION; non_claimed_files++; - pthread_mutex_unlock (&plugin_lock); + UNLOCK_SECTION; free (lto_file.name); cleanup: @@ -1429,11 +1437,13 @@ onload (struct ld_plugin_tv *tv) struct ld_plugin_tv *p; enum ld_plugin_status status; +#if HAVE_PTHREAD_LOCKING if (pthread_mutex_init (&plugin_lock, NULL) != 0) { fprintf (stderr, "mutex init failed\n"); abort (); } +#endif p = tv; while (p->tv_tag)