From patchwork Thu Jun 16 06:59:34 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: 55123 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 166363858297 for ; Thu, 16 Jun 2022 06:59:52 +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 E508C3858C56 for ; Thu, 16 Jun 2022 06:59:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E508C3858C56 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 9984F1F85D for ; Thu, 16 Jun 2022 06:59:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1655362774; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zRnVIiseYiUcWTeV9ja0/WaqA6D6WNB9NDMS3gddJII=; b=F7WqGEuk+nyfbnHY9+/ohCgUhAw6Di1Tty/Kw2EfBkKell+0ZTb0PE/KeSj/PGqZcZKzgJ Wq82N+vmaAgsu9Quc0QZQ6HpZnXyvEqjGR9sI3xKIlv6I/6i6k14YjiiMjlyokZVz/9U0c prll0ijkWd25CFgfSsGeBYuG1Luc4oQ= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1655362774; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zRnVIiseYiUcWTeV9ja0/WaqA6D6WNB9NDMS3gddJII=; b=GI42SX7JVKUuAbq5stIx+gOsgABuLB2y5e4fa+OkPKVa2tGnxst9QcuIuKcU1J0Ldpj6BY aAV8/33eUL1BeWBQ== 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 8AC0D13A70 for ; Thu, 16 Jun 2022 06:59:34 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id 2T25INbUqmL2DQAAMHmgww (envelope-from ) for ; Thu, 16 Jun 2022 06:59:34 +0000 Message-ID: <53ccccfd-875d-8651-4e1e-283794b32ae7@suse.cz> Date: Thu, 16 Jun 2022 08:59:34 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.10.0 From: =?utf-8?q?Martin_Li=C5=A1ka?= Subject: [PATCH 1/3] lto-plugin: support LDPT_GET_SYMBOLS_V3 To: gcc-patches@gcc.gnu.org References: <803a0290-3909-b9c5-2461-b1740a00c63a@suse.cz> Content-Language: en-US In-Reply-To: <803a0290-3909-b9c5-2461-b1740a00c63a@suse.cz> X-Spam-Status: No, score=-11.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_NUMSUBJECT, 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" That supports skipping of an object file (LDPS_NO_SYMS). lto-plugin/ChangeLog: * lto-plugin.c (struct plugin_file_info): Add skip_file flag. (write_resolution): Write resolution only if get_symbols != LDPS_NO_SYMS. (all_symbols_read_handler): Ignore file if skip_file is true. (onload): Handle LDPT_GET_SYMBOLS_V3. --- lto-plugin/lto-plugin.c | 42 ++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/lto-plugin/lto-plugin.c b/lto-plugin/lto-plugin.c index 47378435612..00b760636dc 100644 --- a/lto-plugin/lto-plugin.c +++ b/lto-plugin/lto-plugin.c @@ -136,6 +136,7 @@ struct plugin_file_info void *handle; struct plugin_symtab symtab; struct plugin_symtab conflicts; + bool skip_file; }; /* List item with name of the file with offloading. */ @@ -159,7 +160,7 @@ enum symbol_style 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; -static ld_plugin_get_symbols get_symbols, get_symbols_v2; +static ld_plugin_get_symbols get_symbols, get_symbols_v2, get_symbols_v3; static ld_plugin_register_cleanup register_cleanup; static ld_plugin_add_input_file add_input_file; static ld_plugin_add_input_library add_input_library; @@ -547,15 +548,13 @@ free_symtab (struct plugin_symtab *symtab) static void write_resolution (void) { - unsigned int i; + unsigned int i, included_files = 0; FILE *f; check (resolution_file, LDPL_FATAL, "resolution file not specified"); f = fopen (resolution_file, "w"); check (f, LDPL_FATAL, "could not open file"); - fprintf (f, "%d\n", num_claimed_files); - for (i = 0; i < num_claimed_files; i++) { struct plugin_file_info *info = &claimed_files[i]; @@ -563,13 +562,38 @@ write_resolution (void) struct ld_plugin_symbol *syms = symtab->syms; /* Version 2 of API supports IRONLY_EXP resolution that is - accepted by GCC-4.7 and newer. */ - if (get_symbols_v2) + accepted by GCC-4.7 and newer. + Version 3 can return LDPS_NO_SYMS that means the object + will not be used at all. */ + if (get_symbols_v3) + { + enum ld_plugin_status status + = get_symbols_v3 (info->handle, symtab->nsyms, syms); + if (status == LDPS_NO_SYMS) + { + info->skip_file = true; + continue; + } + } + else if (get_symbols_v2) get_symbols_v2 (info->handle, symtab->nsyms, syms); else get_symbols (info->handle, symtab->nsyms, syms); + ++included_files; + finish_conflict_resolution (symtab, &info->conflicts); + } + + fprintf (f, "%d\n", included_files); + + for (i = 0; i < num_claimed_files; i++) + { + struct plugin_file_info *info = &claimed_files[i]; + struct plugin_symtab *symtab = &info->symtab; + + if (info->skip_file) + continue; fprintf (f, "%s %d\n", info->name, symtab->nsyms + info->conflicts.nsyms); dump_symtab (f, symtab); @@ -833,7 +857,8 @@ all_symbols_read_handler (void) { struct plugin_file_info *info = &claimed_files[i]; - *lto_arg_ptr++ = info->name; + if (!info->skip_file) + *lto_arg_ptr++ = info->name; } *lto_arg_ptr++ = NULL; @@ -1410,6 +1435,9 @@ onload (struct ld_plugin_tv *tv) case LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK: register_all_symbols_read = p->tv_u.tv_register_all_symbols_read; break; + case LDPT_GET_SYMBOLS_V3: + get_symbols_v3 = p->tv_u.tv_get_symbols; + break; case LDPT_GET_SYMBOLS_V2: get_symbols_v2 = p->tv_u.tv_get_symbols; break; From patchwork Thu Jun 16 07:01:20 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: 55124 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 1BF60385736F for ; Thu, 16 Jun 2022 07:01:42 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by sourceware.org (Postfix) with ESMTPS id C5F633858C56 for ; Thu, 16 Jun 2022 07:01:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org C5F633858C56 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-out1.suse.de (Postfix) with ESMTPS id CE02421C85 for ; Thu, 16 Jun 2022 07:01:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1655362880; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=h19JkkU3KWJivqigsWVT2ppUkv594g8X7QukBGVDAog=; b=WDZxoZ3kaF4linIeciugx1m9e8xSrMNxqbScqLk9RmSIK3sc/DFvwih111dOyi5cmCw38t upeIiqnMHX5/y2NtM8YZPo03VY6CqfGOgDPYgc5vP+kaYXwUt90Of7htu37scs+wojgByQ VGfkJHf5tXb/H5ldD8BTjj9z5fQ9g/Y= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1655362880; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=h19JkkU3KWJivqigsWVT2ppUkv594g8X7QukBGVDAog=; b=2G5S1xPSz+/tBAtbcKesjLQEL85HazlSDoOoyXe8zzLNRB5jkub0EPeriaRP+wIGOWDdhP +VWn0vTx8Tom9RBA== 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 BFF3413A70 for ; Thu, 16 Jun 2022 07:01:20 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id ofj5LUDVqmLQDgAAMHmgww (envelope-from ) for ; Thu, 16 Jun 2022 07:01:20 +0000 Message-ID: Date: Thu, 16 Jun 2022 09:01:20 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.10.0 From: =?utf-8?q?Martin_Li=C5=A1ka?= Subject: [PATCH 2/3] lto-plugin: make claim_file_handler thread-safe To: gcc-patches@gcc.gnu.org References: <803a0290-3909-b9c5-2461-b1740a00c63a@suse.cz> Content-Language: en-US In-Reply-To: <803a0290-3909-b9c5-2461-b1740a00c63a@suse.cz> 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" lto-plugin/ChangeLog: * lto-plugin.c (plugin_lock): New lock. (claim_file_handler): Use mutex for critical section. (onload): Initialize mutex. --- lto-plugin/lto-plugin.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lto-plugin/lto-plugin.c b/lto-plugin/lto-plugin.c index 00b760636dc..13118c4983c 100644 --- a/lto-plugin/lto-plugin.c +++ b/lto-plugin/lto-plugin.c @@ -55,6 +55,7 @@ along with this program; see the file COPYING3. If not see #include #include #include +#include #ifdef HAVE_SYS_WAIT_H #include #endif @@ -157,6 +158,9 @@ enum symbol_style ss_uscore, /* Underscore prefix all symbols. */ }; +/* Plug-in mutex. */ +static pthread_mutex_t plugin_lock; + 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; @@ -1262,15 +1266,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); 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); *claimed = 1; } + pthread_mutex_lock (&plugin_lock); if (offload_files == NULL) { /* Add dummy item to the start of the list. */ @@ -1333,11 +1340,12 @@ 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); goto cleanup; err: - non_claimed_files++; + __atomic_fetch_add (&non_claimed_files, 1, __ATOMIC_RELAXED); free (lto_file.name); cleanup: @@ -1415,6 +1423,12 @@ onload (struct ld_plugin_tv *tv) struct ld_plugin_tv *p; enum ld_plugin_status status; + if (pthread_mutex_init (&plugin_lock, NULL) != 0) + { + fprintf (stderr, "mutex init failed\n"); + abort (); + } + p = tv; while (p->tv_tag) { From patchwork Thu Jun 16 07:01:45 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: 55125 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 DCB8D3858C56 for ; Thu, 16 Jun 2022 07:02:11 +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 893653856275 for ; Thu, 16 Jun 2022 07:01:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 893653856275 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 ADC8E1FAD9; Thu, 16 Jun 2022 07:01:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1655362905; 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=3Zd2nPSkXsH30/YRjT36ghr4+ABRwlGSuXFYFsn6qD0=; b=I1b7dGIBdqTkoy90anY8IxSSSk1azpavHGTh8W1idrJUEqqw6QZG5jNePNkdJUgCLoI5d7 J6iotw27hmhDC0OtBXyTMhpvMYBZuCHh0ajJXkhA647jM5ycQS1QzEw33jS6MkQZfGut/E //EGyTacws05du0twszt5shaABAPYDg= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1655362905; 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=3Zd2nPSkXsH30/YRjT36ghr4+ABRwlGSuXFYFsn6qD0=; b=PAiyWhthpbHkdH5EJlA33wTXrm2/D2HLdjOzwmkZGhp/u62S8+u6mKSqEGr5JtyZQN75m1 y6ONrkQW1JGUL1Ag== 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 96F3313A70; Thu, 16 Jun 2022 07:01:45 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id ThWyI1nVqmLyDgAAMHmgww (envelope-from ); Thu, 16 Jun 2022 07:01:45 +0000 Message-ID: Date: Thu, 16 Jun 2022 09:01:45 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.10.0 From: =?utf-8?q?Martin_Li=C5=A1ka?= Subject: [PATCH 3/3] lto-plugin: implement LDPT_GET_API_VERSION To: gcc-patches@gcc.gnu.org References: <803a0290-3909-b9c5-2461-b1740a00c63a@suse.cz> Content-Language: en-US In-Reply-To: <803a0290-3909-b9c5-2461-b1740a00c63a@suse.cz> 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: , Cc: Alexander Monakov Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Hi. I'm sending updated version of the patch where I addressed the comments. Patch can bootstrap on x86_64-linux-gnu and survives regression tests. Ready to be installed? Thanks, Martin include/ChangeLog: * plugin-api.h (enum linker_api_version): New enum. (ld_plugin_get_api_version): New. (enum ld_plugin_tag): Add LDPT_GET_API_VERSION. (struct ld_plugin_tv): Add tv_get_api_version. lto-plugin/ChangeLog: * lto-plugin.c (negotiate_api_version): New. (onload): Negotiate API version. --- include/plugin-api.h | 30 ++++++++++++++++++++++++++++++ lto-plugin/lto-plugin.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/include/plugin-api.h b/include/plugin-api.h index 8aebe2ff267..17b10180655 100644 --- a/include/plugin-api.h +++ b/include/plugin-api.h @@ -483,6 +483,34 @@ enum ld_plugin_level LDPL_FATAL }; +/* Contract between a plug-in and a linker. */ + +enum linker_api_version +{ + /* The linker/plugin do not implement any of the API levels below, the API + is determined solely via the transfer vector. */ + LAPI_UNSPECIFIED = 0, + + /* API level v1. The linker provides add_symbols_v3, add_symbols_v2, + the plugin will use that and not any lower versions. + claim_file is thread-safe on the plugin side and + add_symbols on the linker side. */ + LAPI_V1 = 1 +}; + +/* The linker's interface for API version negotiation. A plug-in calls + the function (with its IDENTIFIER and VERSION), plus minimal and maximal + version of linker_api_version is provided. Linker then returns selected + API version and provides its IDENTIFIER and VERSION. */ + +typedef +enum linker_api_version +(*ld_plugin_get_api_version) (const char *plugin_identifier, unsigned plugin_version, + enum linker_api_version minimal_api_supported, + enum linker_api_version maximal_api_supported, + const char **linker_identifier, + unsigned *linker_version); + /* Values for the tv_tag field of the transfer vector. */ enum ld_plugin_tag @@ -521,6 +549,7 @@ enum ld_plugin_tag LDPT_REGISTER_NEW_INPUT_HOOK, LDPT_GET_WRAP_SYMBOLS, LDPT_ADD_SYMBOLS_V2, + LDPT_GET_API_VERSION, }; /* The plugin transfer vector. */ @@ -556,6 +585,7 @@ struct ld_plugin_tv ld_plugin_get_input_section_size tv_get_input_section_size; ld_plugin_register_new_input tv_register_new_input; ld_plugin_get_wrap_symbols tv_get_wrap_symbols; + ld_plugin_get_api_version tv_get_api_version; } tv_u; }; diff --git a/lto-plugin/lto-plugin.c b/lto-plugin/lto-plugin.c index 13118c4983c..208b26d5c4b 100644 --- a/lto-plugin/lto-plugin.c +++ b/lto-plugin/lto-plugin.c @@ -70,6 +70,7 @@ along with this program; see the file COPYING3. If not see #include "../gcc/lto/common.h" #include "simple-object.h" #include "plugin-api.h" +#include "ansidecl.h" /* We need to use I64 instead of ll width-specifier on native Windows. The reason for this is that older MS-runtimes don't support the ll. */ @@ -170,6 +171,10 @@ static ld_plugin_add_input_file add_input_file; static ld_plugin_add_input_library add_input_library; static ld_plugin_message message; static ld_plugin_add_symbols add_symbols, add_symbols_v2; +static ld_plugin_get_api_version get_api_version; + +/* By default, use version LAPI_UNSPECIFIED if there is not negotiation. */ +static enum linker_api_version api_version = LAPI_UNSPECIFIED; static struct plugin_file_info *claimed_files = NULL; static unsigned int num_claimed_files = 0; @@ -1415,6 +1420,33 @@ process_option (const char *option) verbose = verbose || debug; } +/* Negotiate linker API version. */ + +static void +negotiate_api_version (void) +{ + const char *linker_identifier; + unsigned linker_version; + + api_version = get_api_version ("GCC", GCC_VERSION, LAPI_UNSPECIFIED, + LAPI_V1, &linker_identifier, &linker_version); + + switch (api_version) + { + case LAPI_UNSPECIFIED: + break; + case LAPI_V1: + check (get_symbols_v3, LDPL_FATAL, + "get_symbols_v3 required for API version 1"); + check (add_symbols_v2, LDPL_FATAL, + "add_symbols_v2 required for API version 1"); + break; + default: + fprintf (stderr, "unsupported API version\n"); + abort (); + } +} + /* Called by a linker after loading the plugin. TV is the transfer vector. */ enum ld_plugin_status @@ -1481,12 +1513,18 @@ onload (struct ld_plugin_tv *tv) /* We only use this to make user-friendly temp file names. */ link_output_name = p->tv_u.tv_string; break; + case LDPT_GET_API_VERSION: + get_api_version = p->tv_u.tv_get_api_version; + break; default: break; } p++; } + if (get_api_version) + negotiate_api_version (); + check (register_claim_file, LDPL_FATAL, "register_claim_file not found"); check (add_symbols, LDPL_FATAL, "add_symbols not found"); status = register_claim_file (claim_file_handler);