From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from omta040.useast.a.cloudfilter.net (omta040.useast.a.cloudfilter.net [44.202.169.39]) by sourceware.org (Postfix) with ESMTPS id 7BE893858C60 for ; Thu, 14 Mar 2024 18:49:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 7BE893858C60 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=tromey.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tromey.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 7BE893858C60 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=44.202.169.39 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1710442183; cv=none; b=tzgwqMKXLnNX5ON4qBfIc/g3DpNKVLldZzErpBqp7pqHVWRvxMK4HaErjJ4FOs224GFktgltVGaOxpjjmp6/hUljxZpU83pbNkrjdPm9y6VQmxDFLP+zrnaB8VCE5O8THDUKKv13NfTd131HL/EEVQrh0+oFup/Anb05uEMmdp0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1710442183; c=relaxed/simple; bh=89/UCoT3Ztris/IeK9UzXylnFeO90i5a5H0I3UYb3P4=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=Q5/L/D+p0Jyhgw4mQvxVwiom+8qqQpa9MnC6TGdBUz/2DE4MEmvZFPoshVn1VOMMiwyHML5CowTKHHj00dvT7J7XfRWxJq6a4h51+yLNh1IhWbOffllnuQlry2XDYPkx+Vavb78Iga4rpZZQPjgAeyJiuQfm1dEWlKEeDRkkznA= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from eig-obgw-5001a.ext.cloudfilter.net ([10.0.29.139]) by cmsmtp with ESMTPS id kpUNr1Zuol9dRkq97rVF0l; Thu, 14 Mar 2024 18:49:41 +0000 Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with ESMTPS id kq96r2II8JAzikq96rvG0u; Thu, 14 Mar 2024 18:49:40 +0000 X-Authority-Analysis: v=2.4 cv=Yt4JRZYX c=1 sm=1 tr=0 ts=65f346c4 a=ApxJNpeYhEAb1aAlGBBbmA==:117 a=ApxJNpeYhEAb1aAlGBBbmA==:17 a=K6JAEmCyrfEA:10 a=Qbun_eYptAEA:10 a=O66hTV7_bUDj0adYowUA:9 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=Content-Transfer-Encoding:MIME-Version:Message-ID:Date:Subject: Cc:To:From:Sender:Reply-To:Content-Type:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=tBu3567WzsKQgv9XXFVqosN2emKVbzgT6OwebV+Y4Mc=; b=pPmP2hSrzcqp2QjBk8FUiTRyga 21CYCDAK2CZ+5z3Lh8611O9vIJMc2DOMAOqDJNeYUV8QjuEGqHD+UyYHZtHQTOIkzN335DioWukQG cOxvtIKtrPzR5mw47VrxHH3eX; Received: from 97-122-82-115.hlrn.qwest.net ([97.122.82.115]:33410 helo=localhost.localdomain) by box5379.bluehost.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96.2) (envelope-from ) id 1rkq95-002Ti9-2O; Thu, 14 Mar 2024 12:49:39 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH] Rewrite gdb_bfd_error_handler Date: Thu, 14 Mar 2024 12:49:28 -0600 Message-ID: <20240314184928.544952-1-tom@tromey.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - box5379.bluehost.com X-AntiAbuse: Original Domain - sourceware.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - tromey.com X-BWhitelist: no X-Source-IP: 97.122.82.115 X-Source-L: No X-Exim-ID: 1rkq95-002Ti9-2O X-Source: X-Source-Args: X-Source-Dir: X-Source-Sender: 97-122-82-115.hlrn.qwest.net (localhost.localdomain) [97.122.82.115]:33410 X-Source-Auth: tom+tromey.com X-Email-Count: 1 X-Org: HG=bhshared;ORG=bluehost; X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes X-CMAE-Envelope: MS4xfBaI/ez9tiTaLgOOTRiKFmSCLmaLJ9xIkeMQXvPBJeX6OWT9x74MU15pkobgehFRRuU+pv8sAa6SNh0Pup07ZNGym43yjzsfcSXfYw3EFiqgmOcb2w3r C1wFRoBFgciN74yp1+3oAMLZ0uvIv0PyBV/G1LckKXBBTjvOO+T/uJeiDcVjlZJcU+kmG0xcqIaLgyMJE3t29ygMUnusoaYbKLo= X-Spam-Status: No, score=-3021.5 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,GIT_PATCH_0,JMQ_SPF_NEUTRAL,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,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 List-Id: This patch rewrites gdb_bfd_error_handler to use 'bfd_print_error' to generate the text of the warning, and then emits it using 'warning'. The current code in the tree is a bit wrong because it may do the wrong thing when BFD uses ones of its printf extensions. This also adds locking to increment_bfd_error_count. This is important now that some BFD operations can be done on worker threads. This approach makes it simpler for worker threads to intercept any messages. Regression tested on x86-64 Fedora 38. --- gdb/gdb_bfd.c | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/gdb/gdb_bfd.c b/gdb/gdb_bfd.c index 4df1e66a388..b579ba0cc92 100644 --- a/gdb/gdb_bfd.c +++ b/gdb/gdb_bfd.c @@ -1180,15 +1180,30 @@ get_bfd_inferior_data (struct inferior *inf) count. */ static unsigned long -increment_bfd_error_count (std::string str) +increment_bfd_error_count (const std::string &str) { +#if CXX_STD_THREAD + std::lock_guard guard (gdb_bfd_mutex); +#endif struct bfd_inferior_data *bid = get_bfd_inferior_data (current_inferior ()); auto &map = bid->bfd_error_string_counts; - return ++map[std::move (str)]; + return ++map[str]; } -static bfd_error_handler_type default_bfd_error_handler; +/* A print callback for bfd_print_error. */ + +static int +print_error_callback (void *stream, const char *fmt, ...) +{ + string_file *file = (string_file *) stream; + size_t in_size = file->size (); + va_list ap; + va_start (ap, fmt); + file->vprintf (fmt, ap); + va_end (ap); + return file->size () - in_size; +} /* Define a BFD error handler which will suppress the printing of messages which have been printed once already. This is done on a @@ -1197,20 +1212,14 @@ static bfd_error_handler_type default_bfd_error_handler; static void ATTRIBUTE_PRINTF (1, 0) gdb_bfd_error_handler (const char *fmt, va_list ap) { - va_list ap_copy; - - va_copy(ap_copy, ap); - const std::string str = string_vprintf (fmt, ap_copy); - va_end (ap_copy); + string_file output; + bfd_print_error (print_error_callback, &output, fmt, ap); + std::string str = output.release (); - if (increment_bfd_error_count (std::move (str)) > 1) + if (increment_bfd_error_count (str) > 1) return; - /* We must call the BFD mechanism for printing format strings since - it supports additional format specifiers that GDB's vwarning() doesn't - recognize. It also outputs additional text, i.e. "BFD: ", which - makes it clear that it's a BFD warning/error. */ - (*default_bfd_error_handler) (fmt, ap); + warning ("%s", str.c_str ()); } /* See gdb_bfd.h. */ @@ -1263,5 +1272,5 @@ When non-zero, bfd cache specific debugging is enabled."), &setdebuglist, &showdebuglist); /* Hook the BFD error/warning handler to limit amount of output. */ - default_bfd_error_handler = bfd_set_error_handler (gdb_bfd_error_handler); + bfd_set_error_handler (gdb_bfd_error_handler); } -- 2.43.0