From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp.polymtl.ca (smtp.polymtl.ca [132.207.4.11]) by sourceware.org (Postfix) with ESMTPS id 4E4303858C83 for ; Tue, 29 Nov 2022 02:51:01 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 4E4303858C83 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=polymtl.ca Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=polymtl.ca Received: from simark.ca (simark.ca [158.69.221.121]) (authenticated bits=0) by smtp.polymtl.ca (8.14.7/8.14.7) with ESMTP id 2AT2otXm008907 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 28 Nov 2022 21:51:00 -0500 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp.polymtl.ca 2AT2otXm008907 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=polymtl.ca; s=default; t=1669690260; bh=3Mkhis0NMlM/gKpk1gx1SssO8dQfF6f5VvOoBF5yJBg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=n7/skff1dkdll2kVA979cE4mdtOt2IvoVnMJNJ/xGVr9ssnkQzFLsghUbsh+4rszW Z1KARbwDaxh+UexhoTTUmKc7iIcZaXe4TtKt4DQN5TpbjPLZ9XPBD/HH9JtW0X6Kfo hrUOTmVYpWk6wClItAUaXhhOeJMIoGO7z+uOtVw4= Received: from simark.localdomain (unknown [217.28.27.60]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id 9E3C11E11A; Mon, 28 Nov 2022 21:50:55 -0500 (EST) From: Simon Marchi To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH 2/3] gdb: break up core_target initialization Date: Mon, 28 Nov 2022 21:50:47 -0500 Message-Id: <20221129025048.44490-2-simon.marchi@polymtl.ca> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221129025048.44490-1-simon.marchi@polymtl.ca> References: <20221129025048.44490-1-simon.marchi@polymtl.ca> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Poly-FromMTA: (simark.ca [158.69.221.121]) at Tue, 29 Nov 2022 02:50:55 +0000 X-Spam-Status: No, score=-3189.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_PASS,SPF_PASS,TXREP 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: In the core target constructor, we currently have to jump through some hoops to read the auxv data from the core, in order to choose an appropriate gdbarch for the inferior. The core BFD gives us a gdbarch, but it might not tell the whole story. By reading some auxv fields, some architectures are able to choose a more specific gdbarch. The problem is that to read auxv from the core using the inferior's target stack, the core target needs to be pushed on the inferior's target stack. But this work is done in the core target constructor, so it can't be pushed at this point. The current solution is to pass a pointer to the core target to gdbarch_core_read_description, in core_target::read_description. That "hack" must then propagate to many functions involved in selecting the architecture and reading auxv. With this patch, I propose to break things up to avoid the problem. The core_target constructor will now do only trivial stuff that doesn't need to call things outside core_target. Then, we'll push the core_target on the inferior's target stack. And finally, complete the initialization that potentially requires doing target calls. The target calls to read auxv at this point will just be regular target calls. Change-Id: Icf072ccb777b260d67409ddf48fa1966ecdb2af3 --- gdb/corelow.c | 24 +++++++++++++++++++++--- gdb/inferior.h | 1 + 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/gdb/corelow.c b/gdb/corelow.c index 293bc8d4f593..c8cd5b7a2570 100644 --- a/gdb/corelow.c +++ b/gdb/corelow.c @@ -72,6 +72,13 @@ class core_target final : public process_stratum_target public: core_target (); + /* Complete the initialization. + + Called after construction, after pushing the target to the inferior's + target stack, so that arches are can do target calls, for instance to read + auxv. */ + void initialize (); + const target_info &info () const override { return core_target_info; } @@ -170,7 +177,11 @@ core_target::core_target () /* Find a first arch based on the BFD. We need the initial gdbarch so we can setup the hooks to find a target description. */ m_core_gdbarch = gdbarch_from_bfd (core_bfd); +} +void +core_target::initialize () +{ /* If the arch is able to read a target description from the core, it could yield a more specific gdbarch. */ const struct target_desc *tdesc = read_description (); @@ -517,8 +528,15 @@ core_target_open (const char *arg, int from_tty) core_target *target = new core_target (); - /* Own the target until it is successfully pushed. */ - target_ops_up target_holder (target); + /* Push the target to the inferior's target stack. Unpush it if something + goes wrong. */ + current_inferior ()->push_target (target); + target_unpush_up unpusher (target); + + /* Finish initialization. The work done in setup may need to some target + calls (read auxv data from the core), hence the need to do it after + pushing the target. */ + target->initialize (); validate_files (); @@ -529,7 +547,7 @@ core_target_open (const char *arg, int from_tty) if (!current_program_space->exec_bfd ()) set_gdbarch_from_file (core_bfd); - current_inferior ()->push_target (std::move (target_holder)); + (void) unpusher.release (); switch_to_no_thread (); diff --git a/gdb/inferior.h b/gdb/inferior.h index 909e1819922d..a4a0304052e6 100644 --- a/gdb/inferior.h +++ b/gdb/inferior.h @@ -50,6 +50,7 @@ struct thread_info; #include "progspace.h" #include "registry.h" +#include "observable.h" #include "symfile-add-flags.h" #include "gdbsupport/refcounted-object.h" -- 2.38.1