From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2126) id D7861395441B; Mon, 10 Oct 2022 15:34:20 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D7861395441B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1665416060; bh=+TOLJPUpOmWLDhwl38hZDq++J7YU9/+h/gxPfXVT4jQ=; h=From:To:Subject:Date:From; b=rXXeQzJYw+cSg+JxKyGcnQ/RNbbLxTarf3hdgVu2s0ZzNgo13DdOA3rMt8PSLR2zR PyefbhJbkMxMrxwlisk5ZL7u1kGppvzNEvuZiRfwjVOPnz6+r41+MwzMJtNlMqCGwS 7MjVBHCphQFqG3FnTnHQQw+LmpzL2fksfvl27kvI= Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Tom Tromey To: gdb-cvs@sourceware.org Subject: [binutils-gdb] Fix the guile build X-Act-Checkin: binutils-gdb X-Git-Author: Tom Tromey X-Git-Refname: refs/heads/master X-Git-Oldrev: c52ce603561128ca3b9bc626f27abd8cda09b4d6 X-Git-Newrev: 79aafec96b237165e66f14ba963214fb709af847 Message-Id: <20221010153420.D7861395441B@sourceware.org> Date: Mon, 10 Oct 2022 15:34:20 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3D79aafec96b23= 7165e66f14ba963214fb709af847 commit 79aafec96b237165e66f14ba963214fb709af847 Author: Tom Tromey Date: Mon Oct 10 07:47:32 2022 -0600 Fix the guile build =20 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. =20 Tested on x86-64 Fedora 34. Diff: --- 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); =20 -extern struct frame_info *frscm_frame_smob_to_frame (frame_smob *); +extern struct frame_info_ptr frscm_frame_smob_to_frame (frame_smob *); =20 /* scm-iterator.c */ =20 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 =3D (const frame_smob *) ap; const frame_smob *b =3D (const frame_smob *) bp; =20 - return (frame_id_eq (a->frame_id, b->frame_id) + return (a->frame_id =3D=3D b->frame_id && a->inferior =3D=3D b->inferior && a->inferior !=3D 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 =3D frscm_inferior_frame_map (inferior); - f_smob_for_lookup.frame_id =3D get_frame_id (frame); + f_smob_for_lookup.frame_id =3D get_frame_id (frame_info_ptr (frame)); f_smob_for_lookup.inferior =3D inferior; slot =3D gdbscm_find_eqable_gsmob_ptr_slot (htab, &f_smob_for_lookup.bas= e); if (*slot !=3D NULL) @@ -253,22 +253,24 @@ frscm_scm_from_frame (struct frame_info *frame, struc= t inferior *inferior) =20 try { + frame_info_ptr frame_ptr (frame); + /* Try to get the previous frame, to determine if this is the last f= rame 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) =3D=3D NULL - && get_frame_unwind_stop_reason (frame) !=3D UNWIND_NO_REASON - && get_next_frame (frame) !=3D NULL) + if (get_prev_frame (frame_ptr) =3D=3D NULL + && get_frame_unwind_stop_reason (frame_ptr) !=3D UNWIND_NO_REASON + && get_next_frame (frame_ptr) !=3D NULL) { - frame_id =3D get_frame_id (get_next_frame (frame)); + frame_id =3D get_frame_id (get_next_frame (frame_ptr)); frame_id_is_next =3D 1; } else { - frame_id =3D get_frame_id (frame); + frame_id =3D get_frame_id (frame_ptr); frame_id_is_next =3D 0; } - gdbarch =3D get_frame_arch (frame); + gdbarch =3D get_frame_arch (frame_ptr); } catch (const gdb_exception &except) { @@ -359,12 +361,10 @@ frscm_get_frame_smob_arg_unsafe (SCM self, int arg_po= s, const char *func_name) This function calls GDB routines, so don't assume a GDB error will not be thrown. */ =20 -struct frame_info * +struct frame_info_ptr frscm_frame_smob_to_frame (frame_smob *f_smob) { - struct frame_info *frame; - - frame =3D frame_find_by_id (f_smob->frame_id); + frame_info_ptr frame =3D frame_find_by_id (f_smob->frame_id); if (frame =3D=3D NULL) return NULL; =20 @@ -385,14 +385,15 @@ static SCM gdbscm_frame_valid_p (SCM self) { frame_smob *f_smob; - struct frame_info *frame =3D NULL; + bool result =3D false; =20 f_smob =3D frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); =20 gdbscm_gdb_exception exc {}; try { - frame =3D frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame =3D frscm_frame_smob_to_frame (f_smob); + result =3D frame !=3D nullptr; } catch (const gdb_exception &except) { @@ -400,7 +401,7 @@ gdbscm_frame_valid_p (SCM self) } =20 GDBSCM_HANDLE_GDB_EXCEPTION (exc); - return scm_from_bool (frame !=3D NULL); + return scm_from_bool (result); } =20 /* (frame-name ) -> string @@ -413,7 +414,7 @@ gdbscm_frame_name (SCM self) frame_smob *f_smob; gdb::unique_xmalloc_ptr name; enum language lang =3D language_minimal; - struct frame_info *frame =3D NULL; + bool found =3D false; SCM result; =20 f_smob =3D 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 =3D frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame =3D frscm_frame_smob_to_frame (f_smob); if (frame !=3D NULL) - name =3D find_frame_funname (frame, &lang, NULL); + { + found =3D true; + name =3D find_frame_funname (frame, &lang, NULL); + } } catch (const gdb_exception &except) { @@ -431,7 +435,7 @@ gdbscm_frame_name (SCM self) } =20 GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame =3D=3D 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 =3D NORMAL_FRAME; - struct frame_info *frame =3D NULL; + bool found =3D false; =20 f_smob =3D frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); =20 gdbscm_gdb_exception exc {}; try { - frame =3D frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame =3D frscm_frame_smob_to_frame (f_smob); if (frame !=3D NULL) - type =3D get_frame_type (frame); + { + found =3D true; + type =3D get_frame_type (frame); + } } catch (const gdb_exception &except) { @@ -470,7 +477,7 @@ gdbscm_frame_type (SCM self) } =20 GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame =3D=3D 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 =3D NULL; + bool found =3D false; =20 f_smob =3D frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); =20 gdbscm_gdb_exception exc {}; try { - frame =3D frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame =3D frscm_frame_smob_to_frame (f_smob); + found =3D frame !=3D nullptr; } catch (const gdb_exception &except) { @@ -501,7 +509,7 @@ gdbscm_frame_arch (SCM self) } =20 GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame =3D=3D 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 =3D NULL; - enum unwind_stop_reason stop_reason; + bool found =3D false; + enum unwind_stop_reason stop_reason =3D UNWIND_NO_REASON; =20 f_smob =3D frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); =20 gdbscm_gdb_exception exc {}; try { - frame =3D frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame =3D frscm_frame_smob_to_frame (f_smob); + if (frame !=3D nullptr) + { + found =3D true; + stop_reason =3D get_frame_unwind_stop_reason (frame); + } } catch (const gdb_exception &except) { @@ -533,14 +546,12 @@ gdbscm_frame_unwind_stop_reason (SCM self) } =20 GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame =3D=3D NULL) + if (!found) { gdbscm_invalid_object_error (FUNC_NAME, SCM_ARG1, self, _("")); } =20 - stop_reason =3D get_frame_unwind_stop_reason (frame); - return scm_from_int (stop_reason); } =20 @@ -552,16 +563,19 @@ gdbscm_frame_pc (SCM self) { frame_smob *f_smob; CORE_ADDR pc =3D 0; - struct frame_info *frame =3D NULL; + bool found =3D false; =20 f_smob =3D frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); =20 gdbscm_gdb_exception exc {}; try { - frame =3D frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame =3D frscm_frame_smob_to_frame (f_smob); if (frame !=3D NULL) - pc =3D get_frame_pc (frame); + { + pc =3D get_frame_pc (frame); + found =3D true; + } } catch (const gdb_exception &except) { @@ -569,7 +583,7 @@ gdbscm_frame_pc (SCM self) } =20 GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame =3D=3D 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 =3D NULL, *fn_block; - struct frame_info *frame =3D NULL; + bool found =3D false; =20 f_smob =3D frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); =20 gdbscm_gdb_exception exc {}; try { - frame =3D frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame =3D frscm_frame_smob_to_frame (f_smob); if (frame !=3D NULL) - block =3D get_frame_block (frame, NULL); + { + found =3D true; + block =3D get_frame_block (frame, NULL); + } } catch (const gdb_exception &except) { @@ -603,7 +620,7 @@ gdbscm_frame_block (SCM self) } =20 GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame =3D=3D 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 =3D NULL; - struct frame_info *frame =3D NULL; + bool found =3D false; =20 f_smob =3D frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); =20 gdbscm_gdb_exception exc {}; try { - frame =3D frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame =3D frscm_frame_smob_to_frame (f_smob); if (frame !=3D NULL) - sym =3D find_pc_function (get_frame_address_in_block (frame)); + { + found =3D true; + sym =3D find_pc_function (get_frame_address_in_block (frame)); + } } catch (const gdb_exception &except) { @@ -655,7 +675,7 @@ gdbscm_frame_function (SCM self) } =20 GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame =3D=3D 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 =3D NULL; - struct frame_info *frame =3D NULL; + bool found =3D false; =20 f_smob =3D frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); =20 gdbscm_gdb_exception exc {}; try { - frame =3D frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame =3D frscm_frame_smob_to_frame (f_smob); if (frame !=3D NULL) - prev =3D get_prev_frame (frame); + { + found =3D true; + prev =3D get_prev_frame (frame).get (); + } } catch (const gdb_exception &except) { @@ -693,7 +716,7 @@ gdbscm_frame_older (SCM self) } =20 GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame =3D=3D 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 =3D NULL; - struct frame_info *frame =3D NULL; + bool found =3D false; =20 f_smob =3D frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); =20 gdbscm_gdb_exception exc {}; try { - frame =3D frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame =3D frscm_frame_smob_to_frame (f_smob); if (frame !=3D NULL) - next =3D get_next_frame (frame); + { + found =3D true; + next =3D get_next_frame (frame).get (); + } } catch (const gdb_exception &except) { @@ -731,7 +757,7 @@ gdbscm_frame_newer (SCM self) } =20 GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame =3D=3D 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 =3D NULL; + bool found =3D false; =20 f_smob =3D frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); =20 gdbscm_gdb_exception exc {}; try { - frame =3D frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame =3D frscm_frame_smob_to_frame (f_smob); if (frame !=3D NULL) - sal =3D find_frame_sal (frame); + { + found =3D true; + sal =3D find_frame_sal (frame); + } } catch (const gdb_exception &except) { @@ -768,7 +797,7 @@ gdbscm_frame_sal (SCM self) } =20 GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame =3D=3D 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 =3D NULL; - struct frame_info *frame =3D NULL; + bool found =3D false; frame_smob *f_smob; =20 f_smob =3D 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; =20 - frame =3D frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame =3D frscm_frame_smob_to_frame (f_smob); if (frame) { + found =3D true; regnum =3D 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); =20 - if (frame =3D=3D 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 re= st) gdbscm_gdb_exception exc {}; try { - frame =3D frscm_frame_smob_to_frame (f_smob); + frame =3D 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 re= st) struct block_symbol lookup_sym; =20 if (block =3D=3D NULL) - block =3D get_frame_block (frame, NULL); + block =3D get_frame_block (frame_info_ptr (frame), NULL); lookup_sym =3D lookup_symbol (var_name.get (), block, VAR_DOMAIN, NULL); var =3D lookup_sym.symbol; @@ -932,7 +962,7 @@ gdbscm_frame_read_var (SCM self, SCM symbol_scm, SCM re= st) =20 try { - value =3D read_var_value (var, block, frame); + value =3D 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 =3D NULL; + bool found =3D false; =20 f_smob =3D frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); =20 gdbscm_gdb_exception exc {}; try { - frame =3D frscm_frame_smob_to_frame (f_smob); + frame_info_ptr frame =3D frscm_frame_smob_to_frame (f_smob); if (frame !=3D NULL) - select_frame (frame); + { + found =3D true; + select_frame (frame); + } } catch (const gdb_exception &except) { @@ -967,7 +1000,7 @@ gdbscm_frame_select (SCM self) } =20 GDBSCM_HANDLE_GDB_EXCEPTION (exc); - if (frame =3D=3D 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 =3D get_current_frame (); + frame =3D get_current_frame ().get (); } catch (const gdb_exception &except) { @@ -1009,7 +1042,7 @@ gdbscm_selected_frame (void) gdbscm_gdb_exception exc {}; try { - frame =3D get_selected_frame (_("No frame is currently selected")); + frame =3D get_selected_frame (_("No frame is currently selected")).g= et (); } 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 =3D -1; SCM frame_scm =3D SCM_BOOL_F; frame_smob *f_smob =3D NULL; - struct frame_info *frame_info =3D NULL; struct value *value =3D NULL; =20 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 !=3D NULL) { - frame_info =3D frscm_frame_smob_to_frame (f_smob); + frame_info =3D frame_info_ptr (frscm_frame_smob_to_frame (f_smob)); if (frame_info =3D=3D 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 =3D get_selected_frame (_("no frame selected")); + frame_info_ptr selected_frame + =3D get_selected_frame (_("no frame selected")); block =3D get_frame_block (selected_frame, NULL); } catch (const gdb_exception &ex)