From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) by sourceware.org (Postfix) with ESMTPS id AA1CB3857350 for ; Mon, 16 May 2022 18:41:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org AA1CB3857350 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=palves.net Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-wm1-f45.google.com with SMTP id c190-20020a1c35c7000000b0038e37907b5bso125562wma.0 for ; Mon, 16 May 2022 11:41:12 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ntda+53tiUwj1ZY/jjDWGWcQHTKBpR5wrtlYSx4LD3k=; b=Tq5Sw4VtI290goerXVP7aIGZXa9Gwe0QLheljQ7qMUg5k0n5l5Tdnf00NYgv+TcRyY F00rdvgad3HtnkaK8IV2zEMI8zYHLAqpnnAkjsawzR5NVdGO9rD/f//v1UE0Q9U+wIGm 1+nil6ujVjTHLGa4PUD1IbXxRActgQAn8Tw8q/g+nz6kFQBUHjNr9ZET3CxxF0EGas8N /OK7Nad3MC14M0Zu2RzhsFx+oW7HuqC/ba01wyxtXZj72X+Xx5RxxAgcPmcjkYCgwNfm vDEfkmSj5ZHkVEnNm20+sZaiq9xKbN9+H3BPhk7oknchhxBnMq5tlCJgPEzL6ntPBBfT Az1Q== X-Gm-Message-State: AOAM5334u1WV41lfxCXCtVyIhUgIPKnLidxyD8laqWpr6r53z+ikD0nJ 203F9rYh542jWZ1NQJPMAhFuVSgCluY= X-Google-Smtp-Source: ABdhPJy4rn9cXdrFDpdvC9RfdzzXytg8c8r5opQrp6uSbnxVGLYr/cdH0dXOPLXsoB4sEEhJ79bhtA== X-Received: by 2002:a05:600c:1d23:b0:394:685b:c18b with SMTP id l35-20020a05600c1d2300b00394685bc18bmr28025960wms.121.1652726471040; Mon, 16 May 2022 11:41:11 -0700 (PDT) Received: from localhost ([2001:8a0:f924:2600:209d:85e2:409e:8726]) by smtp.gmail.com with ESMTPSA id m29-20020a05600c3b1d00b0039429bfebebsm298806wms.3.2022.05.16.11.41.09 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 16 May 2022 11:41:10 -0700 (PDT) From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 18/23] Move add_location(sal) to base_breakpoint Date: Mon, 16 May 2022 19:40:25 +0100 Message-Id: <20220516184030.665489-19-pedro@palves.net> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220516184030.665489-1-pedro@palves.net> References: <20220516184030.665489-1-pedro@palves.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-9.7 required=5.0 tests=BAYES_00, FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, 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 X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 16 May 2022 18:41:14 -0000 After the previous patches, only base_breakpoint subclasses use add_location(sal), so we can move it to base_breakpoint (a.k.a. base class for code breakpoints). This requires a few casts here and there, but always at spots where you can see from context what the breakpoint's type actually is. I inlined new_single_step_breakpoint into its only caller exactly for this reason. I did try to propagate more use of base_breakpoint to avoid casts, but that turned out unwieldy for this patch. Change-Id: I49d959322b0fdce5a88a216bb44730fc5dd7c6f8 --- gdb/breakpoint.c | 45 +++++++++++++++++++-------------------------- gdb/breakpoint.h | 8 ++++---- gdb/elfread.c | 6 +++--- gdb/minsyms.c | 4 ++-- gdb/symtab.h | 5 +++-- 5 files changed, 31 insertions(+), 37 deletions(-) diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 4dce43b1e6b..613f6a875e4 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -87,7 +87,7 @@ static void map_breakpoint_numbers (const char *, gdb::function_view); -static void breakpoint_re_set_default (struct breakpoint *); +static void breakpoint_re_set_default (base_breakpoint *); static void create_sals_from_location_default (struct event_location *location, @@ -5860,10 +5860,10 @@ bpstat_run_callbacks (bpstat *bs_head) handle_jit_event (bs->bp_location_at->address); break; case bp_gnu_ifunc_resolver: - gnu_ifunc_resolver_stop (b); + gnu_ifunc_resolver_stop ((base_breakpoint *) b); break; case bp_gnu_ifunc_resolver_return: - gnu_ifunc_resolver_return_stop (b); + gnu_ifunc_resolver_return_stop ((base_breakpoint *) b); break; } } @@ -7867,24 +7867,6 @@ enable_breakpoints_after_startup (void) breakpoint_re_set (); } -/* Create a new single-step breakpoint for thread THREAD, with no - locations. */ - -static struct breakpoint * -new_single_step_breakpoint (int thread, struct gdbarch *gdbarch) -{ - std::unique_ptr b (new momentary_breakpoint (gdbarch, - bp_single_step)); - - b->disposition = disp_donttouch; - b->frame_id = null_frame_id; - - b->thread = thread; - gdb_assert (b->thread != 0); - - return add_to_breakpoint_chain (std::move (b)); -} - /* Allocate a new momentary breakpoint. */ static momentary_breakpoint * @@ -8057,7 +8039,7 @@ handle_automatic_hardware_breakpoints (bp_location *bl) } bp_location * -breakpoint::add_location (const symtab_and_line &sal) +base_breakpoint::add_location (const symtab_and_line &sal) { struct bp_location *new_loc, **tmp; CORE_ADDR adjusted_address; @@ -12480,7 +12462,7 @@ hoist_existing_locations (struct breakpoint *b, struct program_space *pspace) untouched. */ void -update_breakpoint_locations (struct breakpoint *b, +update_breakpoint_locations (base_breakpoint *b, struct program_space *filter_pspace, gdb::array_view sals, gdb::array_view sals_end) @@ -12688,7 +12670,7 @@ location_to_sals (struct breakpoint *b, struct event_location *location, locations. */ static void -breakpoint_re_set_default (struct breakpoint *b) +breakpoint_re_set_default (base_breakpoint *b) { struct program_space *filter_pspace = current_program_space; std::vector expanded, expanded_end; @@ -13399,15 +13381,26 @@ insert_single_step_breakpoint (struct gdbarch *gdbarch, if (tp->control.single_step_breakpoints == NULL) { + std::unique_ptr b + (new momentary_breakpoint (gdbarch, bp_single_step)); + + b->disposition = disp_donttouch; + + b->thread = tp->global_num; + gdb_assert (b->thread != 0); + tp->control.single_step_breakpoints - = new_single_step_breakpoint (tp->global_num, gdbarch); + = add_to_breakpoint_chain (std::move (b)); } sal = find_pc_line (pc, 0); sal.pc = pc; sal.section = find_pc_overlay (pc); sal.explicit_pc = 1; - tp->control.single_step_breakpoints->add_location (sal); + + auto *ss_bp + = static_cast (tp->control.single_step_breakpoints); + ss_bp->add_location (sal); update_global_location_list (UGLL_INSERT); } diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h index af69af6863b..807c97a5bed 100644 --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h @@ -733,9 +733,6 @@ struct breakpoint /* Nothing to do. */ } - /* Add a location for SAL to this breakpoint. */ - bp_location *add_location (const symtab_and_line &sal); - /* Return a range of this breakpoint's locations. */ bp_location_range locations () const; @@ -874,6 +871,9 @@ struct base_breakpoint : public breakpoint ~base_breakpoint () override = 0; + /* Add a location for SAL to this breakpoint. */ + bp_location *add_location (const symtab_and_line &sal); + void re_set () override; int insert_location (struct bp_location *) override; int remove_location (struct bp_location *, @@ -1383,7 +1383,7 @@ extern void until_break_command (const char *, int, int); /* Initialize a struct bp_location. */ extern void update_breakpoint_locations - (struct breakpoint *b, + (base_breakpoint *b, struct program_space *filter_pspace, gdb::array_view sals, gdb::array_view sals_end); diff --git a/gdb/elfread.c b/gdb/elfread.c index b136c605b1a..27203722802 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -927,7 +927,7 @@ elf_gnu_ifunc_resolve_addr (struct gdbarch *gdbarch, CORE_ADDR pc) /* Handle inferior hit of bp_gnu_ifunc_resolver, see its definition. */ static void -elf_gnu_ifunc_resolver_stop (struct breakpoint *b) +elf_gnu_ifunc_resolver_stop (base_breakpoint *b) { struct breakpoint *b_return; struct frame_info *prev_frame = get_prev_frame (get_current_frame ()); @@ -978,7 +978,7 @@ elf_gnu_ifunc_resolver_stop (struct breakpoint *b) /* Handle inferior hit of bp_gnu_ifunc_resolver_return, see its definition. */ static void -elf_gnu_ifunc_resolver_return_stop (struct breakpoint *b) +elf_gnu_ifunc_resolver_return_stop (base_breakpoint *b) { thread_info *thread = inferior_thread (); struct gdbarch *gdbarch = get_frame_arch (get_current_frame ()); @@ -1008,7 +1008,7 @@ elf_gnu_ifunc_resolver_return_stop (struct breakpoint *b) "gnu-indirect-function breakpoint type %d"), (int) b->type); } - b = b_next; + b = (base_breakpoint *) b_next; } gdb_assert (b->type == bp_gnu_ifunc_resolver); gdb_assert (b->loc->next == NULL); diff --git a/gdb/minsyms.c b/gdb/minsyms.c index cbd0ad22392..217ee047446 100644 --- a/gdb/minsyms.c +++ b/gdb/minsyms.c @@ -1019,7 +1019,7 @@ stub_gnu_ifunc_resolve_name (const char *function_name, /* See elf_gnu_ifunc_resolver_stop for its real implementation. */ static void -stub_gnu_ifunc_resolver_stop (struct breakpoint *b) +stub_gnu_ifunc_resolver_stop (base_breakpoint *b) { internal_error (__FILE__, __LINE__, _("elf_gnu_ifunc_resolver_stop cannot be reached.")); @@ -1028,7 +1028,7 @@ stub_gnu_ifunc_resolver_stop (struct breakpoint *b) /* See elf_gnu_ifunc_resolver_return_stop for its real implementation. */ static void -stub_gnu_ifunc_resolver_return_stop (struct breakpoint *b) +stub_gnu_ifunc_resolver_return_stop (base_breakpoint *b) { internal_error (__FILE__, __LINE__, _("elf_gnu_ifunc_resolver_return_stop cannot be reached.")); diff --git a/gdb/symtab.h b/gdb/symtab.h index b1cf84f756f..5218be587de 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -55,6 +55,7 @@ struct obj_section; struct cmd_list_element; class probe; struct lookup_name_info; +struct base_breakpoint; /* How to match a lookup name against a symbol search name. */ enum class symbol_name_match_type @@ -2227,10 +2228,10 @@ struct gnu_ifunc_fns CORE_ADDR *function_address_p); /* See elf_gnu_ifunc_resolver_stop for its real implementation. */ - void (*gnu_ifunc_resolver_stop) (struct breakpoint *b); + void (*gnu_ifunc_resolver_stop) (base_breakpoint *b); /* See elf_gnu_ifunc_resolver_return_stop for its real implementation. */ - void (*gnu_ifunc_resolver_return_stop) (struct breakpoint *b); + void (*gnu_ifunc_resolver_return_stop) (base_breakpoint *b); }; #define gnu_ifunc_resolve_addr gnu_ifunc_fns_p->gnu_ifunc_resolve_addr -- 2.36.0