From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-io1-xd31.google.com (mail-io1-xd31.google.com [IPv6:2607:f8b0:4864:20::d31]) by sourceware.org (Postfix) with ESMTPS id AC33F3858439 for ; Mon, 10 Oct 2022 13:49:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org AC33F3858439 Received: by mail-io1-xd31.google.com with SMTP id 187so8451006iov.10 for ; Mon, 10 Oct 2022 06:49:15 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=rAVARnY7LItji4KMke1DSNlPejenWtisVGIAUH/pwMc=; b=fhWMrq3ZmoMjfL3a+weXhQJDqel5/zB8cmBpYrLw0mPiNR/sT/ISf+ovyzKINBJBQt CNLIHCpi/F25j5a19soxHa6nIB8OoUZGZav3l2L9eagsHF7dbdlIDJs4aGJ9tpJgAb3j syzj3Pn9fjokj3NF051yS/FhYkkCHL5/8j2UljNmv62R8fo+bZlgPbOKCYXuQXlm02el 1qUBB/qpSdQezS3ZjPbJNQmxsgN/eWIdtS1Nkh/pPA4WWJbb6cw/Jeq4Rr0779zdCJ70 ddTWyqXkDCjuld+EDZT7o6iMH3IxZ+LR4AOi5Ip7/C6I1Nr1OLLYkUotuhkUVCqEHzG4 v5yQ== X-Gm-Message-State: ACrzQf3VVNv/czhpw3wEuWS94c9wgAeOsHoYmXjP4CSNrrRZLRba+cG4 2RM8vLgIhXy2lennAXch+bkWwaI/FNfUKg== X-Google-Smtp-Source: AMsMyM6aAEcKgAvqJ1Pz69HPADaP0VfcxMeAIPG1RDcqSldEaHSTej1TUgmmH1FPYptjzCOzeEM/2g== X-Received: by 2002:a05:6638:4981:b0:358:43ba:6122 with SMTP id cv1-20020a056638498100b0035843ba6122mr9829712jab.3.1665409754895; Mon, 10 Oct 2022 06:49:14 -0700 (PDT) Received: from localhost.localdomain (71-211-160-49.hlrn.qwest.net. [71.211.160.49]) by smtp.gmail.com with ESMTPSA id f17-20020a056638113100b00363ac6a0b89sm2182986jar.172.2022.10.10.06.49.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Oct 2022 06:49:14 -0700 (PDT) From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH] Fix the guile build Date: Mon, 10 Oct 2022 07:49:07 -0600 Message-Id: <20221010134907.2083447-1-tromey@adacore.com> X-Mailer: git-send-email 2.34.3 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, 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 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, 10 Oct 2022 13:49:18 -0000 The frame_info_ptr patches broke the build with Guile. This patch fixes the problem. In mos cases I chose to preserve the use of frame_info_ptr, at least where I could be sure that the object lifetime did not interact with Guile's longjmp-based exception scheme. Tested on x86-64 Fedora 34. --- gdb/guile/guile-internal.h | 2 +- gdb/guile/scm-frame.c | 169 ++++++++++++++++++++++--------------- gdb/guile/scm-symbol.c | 10 +-- 3 files changed, 107 insertions(+), 74 deletions(-) diff --git a/gdb/guile/guile-internal.h b/gdb/guile/guile-internal.h index 30cc5c307ae..efd5cfd18c6 100644 --- a/gdb/guile/guile-internal.h +++ b/gdb/guile/guile-internal.h @@ -447,7 +447,7 @@ extern int frscm_is_frame (SCM scm); extern frame_smob *frscm_get_frame_smob_arg_unsafe (SCM frame_scm, int arg_pos, const char *func_name); -extern struct frame_info *frscm_frame_smob_to_frame (frame_smob *); +extern struct frame_info_ptr frscm_frame_smob_to_frame (frame_smob *); /* scm-iterator.c */ diff --git a/gdb/guile/scm-frame.c b/gdb/guile/scm-frame.c index 159603b8008..f7ca141b2a7 100644 --- a/gdb/guile/scm-frame.c +++ b/gdb/guile/scm-frame.c @@ -134,7 +134,7 @@ frscm_eq_frame_smob (const void *ap, const void *bp) const frame_smob *a = (const frame_smob *) ap; const frame_smob *b = (const frame_smob *) bp; - return (frame_id_eq (a->frame_id, b->frame_id) + return (a->frame_id == b->frame_id && a->inferior == b->inferior && a->inferior != NULL); } @@ -245,7 +245,7 @@ frscm_scm_from_frame (struct frame_info *frame, struct inferior *inferior) /* If we've already created a gsmob for this frame, return it. This makes frames eq?-able. */ htab = frscm_inferior_frame_map (inferior); - f_smob_for_lookup.frame_id = get_frame_id (frame); + f_smob_for_lookup.frame_id = get_frame_id (frame_info_ptr (frame)); f_smob_for_lookup.inferior = inferior; slot = gdbscm_find_eqable_gsmob_ptr_slot (htab, &f_smob_for_lookup.base); if (*slot != NULL) @@ -253,22 +253,24 @@ frscm_scm_from_frame (struct frame_info *frame, struct inferior *inferior) try { + frame_info_ptr frame_ptr (frame); + /* Try to get the previous frame, to determine if this is the last frame in a corrupt stack. If so, we need to store the frame_id of the next frame and not of this one (which is possibly invalid). */ - if (get_prev_frame (frame) == NULL - && get_frame_unwind_stop_reason (frame) != UNWIND_NO_REASON - && get_next_frame (frame) != NULL) + if (get_prev_frame (frame_ptr) == NULL + && get_frame_unwind_stop_reason (frame_ptr) != UNWIND_NO_REASON + && get_next_frame (frame_ptr) != NULL) { - frame_id = get_frame_id (get_next_frame (frame)); + frame_id = get_frame_id (get_next_frame (frame_ptr)); frame_id_is_next = 1; } else { - frame_id = get_frame_id (frame); + frame_id = get_frame_id (frame_ptr); frame_id_is_next = 0; } - gdbarch = get_frame_arch (frame); + gdbarch = get_frame_arch (frame_ptr); } catch (const gdb_exception &except) { @@ -359,12 +361,10 @@ frscm_get_frame_smob_arg_unsafe (SCM self, int arg_pos, const char *func_name) This function calls GDB routines, so don't assume a GDB error will not be thrown. */ -struct frame_info * +struct frame_info_ptr frscm_frame_smob_to_frame (frame_smob *f_smob) { - struct frame_info *frame; - - frame = frame_find_by_id (f_smob->frame_id); + frame_info_ptr frame = frame_find_by_id (f_smob->frame_id); if (frame == NULL) return NULL; @@ -385,14 +385,15 @@ static SCM gdbscm_frame_valid_p (SCM self) { frame_smob *f_smob; - struct frame_info *frame = NULL; + bool result = false; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); gdbscm_gdb_exception exc {}; try { - frame = frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame = frscm_frame_smob_to_frame (f_smob); + result = frame != nullptr; } catch (const gdb_exception &except) { @@ -400,7 +401,7 @@ gdbscm_frame_valid_p (SCM self) } GDBSCM_HANDLE_GDB_EXCEPTION (exc); - return scm_from_bool (frame != NULL); + return scm_from_bool (result); } /* (frame-name ) -> string @@ -413,7 +414,7 @@ gdbscm_frame_name (SCM self) frame_smob *f_smob; gdb::unique_xmalloc_ptr name; enum language lang = language_minimal; - struct frame_info *frame = NULL; + bool found = false; SCM result; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); @@ -421,9 +422,12 @@ gdbscm_frame_name (SCM self) gdbscm_gdb_exception exc {}; try { - frame = frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame = frscm_frame_smob_to_frame (f_smob); if (frame != NULL) - name = find_frame_funname (frame, &lang, NULL); + { + found = true; + name = find_frame_funname (frame, &lang, NULL); + } } catch (const gdb_exception &except) { @@ -431,7 +435,7 @@ gdbscm_frame_name (SCM self) } GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame == NULL) + if (!found) { gdbscm_invalid_object_error (FUNC_NAME, SCM_ARG1, self, _("")); @@ -453,16 +457,19 @@ gdbscm_frame_type (SCM self) { frame_smob *f_smob; enum frame_type type = NORMAL_FRAME; - struct frame_info *frame = NULL; + bool found = false; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); gdbscm_gdb_exception exc {}; try { - frame = frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame = frscm_frame_smob_to_frame (f_smob); if (frame != NULL) - type = get_frame_type (frame); + { + found = true; + type = get_frame_type (frame); + } } catch (const gdb_exception &except) { @@ -470,7 +477,7 @@ gdbscm_frame_type (SCM self) } GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame == NULL) + if (!found) { gdbscm_invalid_object_error (FUNC_NAME, SCM_ARG1, self, _("")); @@ -486,14 +493,15 @@ static SCM gdbscm_frame_arch (SCM self) { frame_smob *f_smob; - struct frame_info *frame = NULL; + bool found = false; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); gdbscm_gdb_exception exc {}; try { - frame = frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame = frscm_frame_smob_to_frame (f_smob); + found = frame != nullptr; } catch (const gdb_exception &except) { @@ -501,7 +509,7 @@ gdbscm_frame_arch (SCM self) } GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame == NULL) + if (!found) { gdbscm_invalid_object_error (FUNC_NAME, SCM_ARG1, self, _("")); @@ -517,15 +525,20 @@ static SCM gdbscm_frame_unwind_stop_reason (SCM self) { frame_smob *f_smob; - struct frame_info *frame = NULL; - enum unwind_stop_reason stop_reason; + bool found = false; + enum unwind_stop_reason stop_reason = UNWIND_NO_REASON; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); gdbscm_gdb_exception exc {}; try { - frame = frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame = frscm_frame_smob_to_frame (f_smob); + if (frame != nullptr) + { + found = true; + stop_reason = get_frame_unwind_stop_reason (frame); + } } catch (const gdb_exception &except) { @@ -533,14 +546,12 @@ gdbscm_frame_unwind_stop_reason (SCM self) } GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame == NULL) + if (!found) { gdbscm_invalid_object_error (FUNC_NAME, SCM_ARG1, self, _("")); } - stop_reason = get_frame_unwind_stop_reason (frame); - return scm_from_int (stop_reason); } @@ -552,16 +563,19 @@ gdbscm_frame_pc (SCM self) { frame_smob *f_smob; CORE_ADDR pc = 0; - struct frame_info *frame = NULL; + bool found = false; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); gdbscm_gdb_exception exc {}; try { - frame = frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame = frscm_frame_smob_to_frame (f_smob); if (frame != NULL) - pc = get_frame_pc (frame); + { + pc = get_frame_pc (frame); + found = true; + } } catch (const gdb_exception &except) { @@ -569,7 +583,7 @@ gdbscm_frame_pc (SCM self) } GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame == NULL) + if (!found) { gdbscm_invalid_object_error (FUNC_NAME, SCM_ARG1, self, _("")); @@ -586,16 +600,19 @@ gdbscm_frame_block (SCM self) { frame_smob *f_smob; const struct block *block = NULL, *fn_block; - struct frame_info *frame = NULL; + bool found = false; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); gdbscm_gdb_exception exc {}; try { - frame = frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame = frscm_frame_smob_to_frame (f_smob); if (frame != NULL) - block = get_frame_block (frame, NULL); + { + found = true; + block = get_frame_block (frame, NULL); + } } catch (const gdb_exception &except) { @@ -603,7 +620,7 @@ gdbscm_frame_block (SCM self) } GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame == NULL) + if (!found) { gdbscm_invalid_object_error (FUNC_NAME, SCM_ARG1, self, _("")); @@ -638,16 +655,19 @@ gdbscm_frame_function (SCM self) { frame_smob *f_smob; struct symbol *sym = NULL; - struct frame_info *frame = NULL; + bool found = false; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); gdbscm_gdb_exception exc {}; try { - frame = frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame = frscm_frame_smob_to_frame (f_smob); if (frame != NULL) - sym = find_pc_function (get_frame_address_in_block (frame)); + { + found = true; + sym = find_pc_function (get_frame_address_in_block (frame)); + } } catch (const gdb_exception &except) { @@ -655,7 +675,7 @@ gdbscm_frame_function (SCM self) } GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame == NULL) + if (!found) { gdbscm_invalid_object_error (FUNC_NAME, SCM_ARG1, self, _("")); @@ -676,16 +696,19 @@ gdbscm_frame_older (SCM self) { frame_smob *f_smob; struct frame_info *prev = NULL; - struct frame_info *frame = NULL; + bool found = false; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); gdbscm_gdb_exception exc {}; try { - frame = frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame = frscm_frame_smob_to_frame (f_smob); if (frame != NULL) - prev = get_prev_frame (frame); + { + found = true; + prev = get_prev_frame (frame).get (); + } } catch (const gdb_exception &except) { @@ -693,7 +716,7 @@ gdbscm_frame_older (SCM self) } GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame == NULL) + if (!found) { gdbscm_invalid_object_error (FUNC_NAME, SCM_ARG1, self, _("")); @@ -714,16 +737,19 @@ gdbscm_frame_newer (SCM self) { frame_smob *f_smob; struct frame_info *next = NULL; - struct frame_info *frame = NULL; + bool found = false; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); gdbscm_gdb_exception exc {}; try { - frame = frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame = frscm_frame_smob_to_frame (f_smob); if (frame != NULL) - next = get_next_frame (frame); + { + found = true; + next = get_next_frame (frame).get (); + } } catch (const gdb_exception &except) { @@ -731,7 +757,7 @@ gdbscm_frame_newer (SCM self) } GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame == NULL) + if (!found) { gdbscm_invalid_object_error (FUNC_NAME, SCM_ARG1, self, _("")); @@ -751,16 +777,19 @@ gdbscm_frame_sal (SCM self) { frame_smob *f_smob; struct symtab_and_line sal; - struct frame_info *frame = NULL; + bool found = false; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); gdbscm_gdb_exception exc {}; try { - frame = frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame = frscm_frame_smob_to_frame (f_smob); if (frame != NULL) - sal = find_frame_sal (frame); + { + found = true; + sal = find_frame_sal (frame); + } } catch (const gdb_exception &except) { @@ -768,7 +797,7 @@ gdbscm_frame_sal (SCM self) } GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame == NULL) + if (!found) { gdbscm_invalid_object_error (FUNC_NAME, SCM_ARG1, self, _("")); @@ -785,7 +814,7 @@ gdbscm_frame_read_register (SCM self, SCM register_scm) { char *register_str; struct value *value = NULL; - struct frame_info *frame = NULL; + bool found = false; frame_smob *f_smob; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); @@ -798,9 +827,10 @@ gdbscm_frame_read_register (SCM self, SCM register_scm) { int regnum; - frame = frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame = frscm_frame_smob_to_frame (f_smob); if (frame) { + found = true; regnum = user_reg_map_name_to_regnum (get_frame_arch (frame), register_str, strlen (register_str)); @@ -816,7 +846,7 @@ gdbscm_frame_read_register (SCM self, SCM register_scm) xfree (register_str); GDBSCM_HANDLE_GDB_EXCEPTION (except); - if (frame == NULL) + if (!found) { gdbscm_invalid_object_error (FUNC_NAME, SCM_ARG1, self, _("")); @@ -856,7 +886,7 @@ gdbscm_frame_read_var (SCM self, SCM symbol_scm, SCM rest) gdbscm_gdb_exception exc {}; try { - frame = frscm_frame_smob_to_frame (f_smob); + frame = frscm_frame_smob_to_frame (f_smob).get (); } catch (const gdb_exception &except) { @@ -905,7 +935,7 @@ gdbscm_frame_read_var (SCM self, SCM symbol_scm, SCM rest) struct block_symbol lookup_sym; if (block == NULL) - block = get_frame_block (frame, NULL); + block = get_frame_block (frame_info_ptr (frame), NULL); lookup_sym = lookup_symbol (var_name.get (), block, VAR_DOMAIN, NULL); var = lookup_sym.symbol; @@ -932,7 +962,7 @@ gdbscm_frame_read_var (SCM self, SCM symbol_scm, SCM rest) try { - value = read_var_value (var, block, frame); + value = read_var_value (var, block, frame_info_ptr (frame)); } catch (const gdb_exception &except) { @@ -950,16 +980,19 @@ static SCM gdbscm_frame_select (SCM self) { frame_smob *f_smob; - struct frame_info *frame = NULL; + bool found = false; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); gdbscm_gdb_exception exc {}; try { - frame = frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame = frscm_frame_smob_to_frame (f_smob); if (frame != NULL) - select_frame (frame); + { + found = true; + select_frame (frame); + } } catch (const gdb_exception &except) { @@ -967,7 +1000,7 @@ gdbscm_frame_select (SCM self) } GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame == NULL) + if (!found) { gdbscm_invalid_object_error (FUNC_NAME, SCM_ARG1, self, _("")); @@ -987,7 +1020,7 @@ gdbscm_newest_frame (void) gdbscm_gdb_exception exc {}; try { - frame = get_current_frame (); + frame = get_current_frame ().get (); } catch (const gdb_exception &except) { @@ -1009,7 +1042,7 @@ gdbscm_selected_frame (void) gdbscm_gdb_exception exc {}; try { - frame = get_selected_frame (_("No frame is currently selected")); + frame = get_selected_frame (_("No frame is currently selected")).get (); } catch (const gdb_exception &except) { diff --git a/gdb/guile/scm-symbol.c b/gdb/guile/scm-symbol.c index 4344a633334..b5704cdcb18 100644 --- a/gdb/guile/scm-symbol.c +++ b/gdb/guile/scm-symbol.c @@ -520,7 +520,6 @@ gdbscm_symbol_value (SCM self, SCM rest) int frame_pos = -1; SCM frame_scm = SCM_BOOL_F; frame_smob *f_smob = NULL; - struct frame_info *frame_info = NULL; struct value *value = NULL; gdbscm_parse_function_args (FUNC_NAME, SCM_ARG2, keywords, "#O", @@ -537,9 +536,11 @@ gdbscm_symbol_value (SCM self, SCM rest) gdbscm_gdb_exception exc {}; try { + frame_info_ptr frame_info; + if (f_smob != NULL) { - frame_info = frscm_frame_smob_to_frame (f_smob); + frame_info = frame_info_ptr (frscm_frame_smob_to_frame (f_smob)); if (frame_info == NULL) error (_("Invalid frame")); } @@ -598,12 +599,11 @@ gdbscm_lookup_symbol (SCM name_scm, SCM rest) } else { - struct frame_info *selected_frame; - gdbscm_gdb_exception exc {}; try { - selected_frame = get_selected_frame (_("no frame selected")); + frame_info_ptr selected_frame + = get_selected_frame (_("no frame selected")); block = get_frame_block (selected_frame, NULL); } catch (const gdb_exception &ex) -- 2.34.3