diff options
author | Pedro Alves <palves@redhat.com> | 2015-03-07 15:14:14 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2015-03-07 15:14:14 +0000 |
commit | 492d29ea1c9a8b2c7d5193908119a4e27c045687 (patch) | |
tree | ea592a514ec482e6c57020670e9bc447f827e298 /gdb | |
parent | ece957c859c00fbea7152a2275674d7061dc468a (diff) | |
download | gdb-492d29ea1c9a8b2c7d5193908119a4e27c045687.zip gdb-492d29ea1c9a8b2c7d5193908119a4e27c045687.tar.gz gdb-492d29ea1c9a8b2c7d5193908119a4e27c045687.tar.bz2 |
Split TRY_CATCH into TRY + CATCH
This patch splits the TRY_CATCH macro into three, so that we go from
this:
~~~
volatile gdb_exception ex;
TRY_CATCH (ex, RETURN_MASK_ERROR)
{
}
if (ex.reason < 0)
{
}
~~~
to this:
~~~
TRY
{
}
CATCH (ex, RETURN_MASK_ERROR)
{
}
END_CATCH
~~~
Thus, we'll be getting rid of the local volatile exception object, and
declaring the caught exception in the catch block.
This allows reimplementing TRY/CATCH in terms of C++ exceptions when
building in C++ mode, while still allowing to build GDB in C mode
(using setjmp/longjmp), as a transition step.
TBC, after this patch, is it _not_ valid to have code between the TRY
and the CATCH blocks, like:
TRY
{
}
// some code here.
CATCH (ex, RETURN_MASK_ERROR)
{
}
END_CATCH
Just like it isn't valid to do that with C++'s native try/catch.
By switching to creating the exception object inside the CATCH block
scope, we can get rid of all the explicitly allocated volatile
exception objects all over the tree, and map the CATCH block more
directly to C++'s catch blocks.
The majority of the TRY_CATCH -> TRY+CATCH+END_CATCH conversion was
done with a script, rerun from scratch at every rebase, no manual
editing involved. After the mechanical conversion, a few places
needed manual intervention, to fix preexisting cases where we were
using the exception object outside of the TRY_CATCH block, and cases
where we were using "else" after a 'if (ex.reason) < 0)' [a CATCH
after this patch]. The result was folded into this patch so that GDB
still builds at each incremental step.
END_CATCH is necessary for two reasons:
First, because we name the exception object in the CATCH block, which
requires creating a scope, which in turn must be closed somewhere.
Declaring the exception variable in the initializer field of a for
block, like:
#define CATCH(EXCEPTION, mask) \
for (struct gdb_exception EXCEPTION; \
exceptions_state_mc_catch (&EXCEPTION, MASK); \
EXCEPTION = exception_none)
would avoid needing END_CATCH, but alas, in C mode, we build with C90,
which doesn't allow mixed declarations and code.
Second, because when TRY/CATCH are wired to real C++ try/catch, as
long as we need to handle cleanup chains, even if there's no CATCH
block that wants to catch the exception, we need for stop at every
frame in the unwind chain and run cleanups, then rethrow. That will
be done in END_CATCH.
After we require C++, we'll still need TRY/CATCH/END_CATCH until
cleanups are completely phased out -- TRY/CATCH in C++ mode will
save/restore the current cleanup chain, like in C mode, and END_CATCH
catches otherwise uncaugh exceptions, runs cleanups and rethrows, so
that C++ cleanups and exceptions can coexist.
IMO, this still makes the TRY/CATCH code look a bit more like a
newcomer would expect, so IMO worth it even if we weren't considering
C++.
gdb/ChangeLog.
2015-03-07 Pedro Alves <palves@redhat.com>
* common/common-exceptions.c (struct catcher) <exception>: No
longer a pointer to volatile exception. Now an exception value.
<mask>: Delete field.
(exceptions_state_mc_init): Remove all parameters. Adjust.
(exceptions_state_mc): No longer pop the catcher here.
(exceptions_state_mc_catch): New function.
(throw_exception): Adjust.
* common/common-exceptions.h (exceptions_state_mc_init): Remove
all parameters.
(exceptions_state_mc_catch): Declare.
(TRY_CATCH): Rename to ...
(TRY): ... this. Remove EXCEPTION and MASK parameters.
(CATCH, END_CATCH): New.
All callers adjusted.
gdb/gdbserver/ChangeLog:
2015-03-07 Pedro Alves <palves@redhat.com>
Adjust all callers of TRY_CATCH to use TRY/CATCH/END_CATCH
instead.
Diffstat (limited to 'gdb')
112 files changed, 2190 insertions, 1295 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 641a94c..6df72f7 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,20 @@ +2015-03-07 Pedro Alves <palves@redhat.com> + + * common/common-exceptions.c (struct catcher) <exception>: No + longer a pointer to volatile exception. Now an exception value. + <mask>: Delete field. + (exceptions_state_mc_init): Remove all parameters. Adjust. + (exceptions_state_mc): No longer pop the catcher here. + (exceptions_state_mc_catch): New function. + (throw_exception): Adjust. + * common/common-exceptions.h (exceptions_state_mc_init): Remove + all parameters. + (exceptions_state_mc_catch): Declare. + (TRY_CATCH): Rename to ... + (TRY): ... this. Remove EXCEPTION and MASK parameters. + (CATCH, END_CATCH): New. + All callers adjusted. + 2015-03-07 Tom Tromey <tromey@redhat.com> * top.c (quit_force): Inline and delete DO_TRY, DO_PRINT_EX. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 1e70d12..124e370 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -6479,7 +6479,6 @@ type_from_tag (struct value *tag) struct value * ada_tag_value_at_base_address (struct value *obj) { - volatile struct gdb_exception e; struct value *val; LONGEST offset_to_top = 0; struct type *ptr_type, *obj_type; @@ -6514,13 +6513,16 @@ ada_tag_value_at_base_address (struct value *obj) see ada_tag_name for more details. We do not print the error message for the same reason. */ - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { offset_to_top = value_as_long (value_ind (value_ptradd (val, -2))); } - if (e.reason < 0) - return obj; + CATCH (e, RETURN_MASK_ERROR) + { + return obj; + } + END_CATCH /* If offset is null, nothing to do. */ @@ -6632,7 +6634,6 @@ ada_tag_name_from_tsd (struct value *tsd) const char * ada_tag_name (struct value *tag) { - volatile struct gdb_exception e; char *name = NULL; if (!ada_is_tag_type (value_type (tag))) @@ -6647,13 +6648,17 @@ ada_tag_name (struct value *tag) We also do not print the error message either (which often is very low-level (Eg: "Cannot read memory at 0x[...]"), but instead let the caller print a more meaningful message if necessary. */ - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { struct value *tsd = ada_get_tsd_from_tag (tag); if (tsd != NULL) name = ada_tag_name_from_tsd (tsd); } + CATCH (e, RETURN_MASK_ERROR) + { + } + END_CATCH return name; } @@ -11817,19 +11822,19 @@ static CORE_ADDR ada_exception_name_addr (enum ada_exception_catchpoint_kind ex, struct breakpoint *b) { - volatile struct gdb_exception e; CORE_ADDR result = 0; - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { result = ada_exception_name_addr_1 (ex, b); } - if (e.reason < 0) + CATCH (e, RETURN_MASK_ERROR) { warning (_("failed to get exception name: %s"), e.message); return 0; } + END_CATCH return result; } @@ -11929,16 +11934,15 @@ create_excep_cond_exprs (struct ada_catchpoint *c) if (!bl->shlib_disabled) { - volatile struct gdb_exception e; const char *s; s = cond_string; - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { exp = parse_exp_1 (&s, bl->address, block_for_pc (bl->address), 0); } - if (e.reason < 0) + CATCH (e, RETURN_MASK_ERROR) { warning (_("failed to reevaluate internal exception condition " "for catchpoint %d: %s"), @@ -11951,6 +11955,7 @@ create_excep_cond_exprs (struct ada_catchpoint *c) to NULL. */ exp = NULL; } + END_CATCH } ada_loc->excep_cond_expr = exp; @@ -12014,7 +12019,6 @@ should_stop_exception (const struct bp_location *bl) struct ada_catchpoint *c = (struct ada_catchpoint *) bl->owner; const struct ada_catchpoint_location *ada_loc = (const struct ada_catchpoint_location *) bl; - volatile struct gdb_exception ex; int stop; /* With no specific exception, should always stop. */ @@ -12029,7 +12033,7 @@ should_stop_exception (const struct bp_location *bl) } stop = 1; - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { struct value *mark; @@ -12037,9 +12041,13 @@ should_stop_exception (const struct bp_location *bl) stop = value_true (evaluate_expression (ada_loc->excep_cond_expr)); value_free_to_mark (mark); } - if (ex.reason < 0) - exception_fprintf (gdb_stderr, ex, - _("Error in testing exception condition:\n")); + CATCH (ex, RETURN_MASK_ALL) + { + exception_fprintf (gdb_stderr, ex, + _("Error in testing exception condition:\n")); + } + END_CATCH + return stop; } diff --git a/gdb/ada-typeprint.c b/gdb/ada-typeprint.c index 6dba71b..fd85138 100644 --- a/gdb/ada-typeprint.c +++ b/gdb/ada-typeprint.c @@ -159,19 +159,19 @@ print_range (struct type *type, struct ui_file *stream, case TYPE_CODE_ENUM: { struct type *target_type; - volatile struct gdb_exception e; LONGEST lo = 0, hi = 0; /* init for gcc -Wall */ + int got_error = 0; target_type = TYPE_TARGET_TYPE (type); if (target_type == NULL) target_type = type; - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { lo = ada_discrete_type_low_bound (type); hi = ada_discrete_type_high_bound (type); } - if (e.reason < 0) + CATCH (e, RETURN_MASK_ERROR) { /* This can happen when the range is dynamic. Sometimes, resolving dynamic property values requires us to have @@ -179,8 +179,11 @@ print_range (struct type *type, struct ui_file *stream, when the user is using the "ptype" command on a type. Print the range as an unbounded range. */ fprintf_filtered (stream, "<>"); + got_error = 1; } - else + END_CATCH + + if (!got_error) { ada_print_scalar (target_type, lo, stream); fprintf_filtered (stream, " .. "); diff --git a/gdb/ada-valprint.c b/gdb/ada-valprint.c index d5cd04f..34539de 100644 --- a/gdb/ada-valprint.c +++ b/gdb/ada-valprint.c @@ -1159,15 +1159,18 @@ ada_val_print (struct type *type, const gdb_byte *valaddr, const struct value *val, const struct value_print_options *options) { - volatile struct gdb_exception except; /* XXX: this catches QUIT/ctrl-c as well. Isn't that busted? */ - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { ada_val_print_1 (type, valaddr, embedded_offset, address, stream, recurse, val, options, current_language); } + CATCH (except, RETURN_MASK_ALL) + { + } + END_CATCH } void diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c index ca82858..3e5d1bd 100644 --- a/gdb/amd64-tdep.c +++ b/gdb/amd64-tdep.c @@ -2466,7 +2466,6 @@ amd64_frame_cache_1 (struct frame_info *this_frame, static struct amd64_frame_cache * amd64_frame_cache (struct frame_info *this_frame, void **this_cache) { - volatile struct gdb_exception ex; struct amd64_frame_cache *cache; if (*this_cache) @@ -2475,15 +2474,16 @@ amd64_frame_cache (struct frame_info *this_frame, void **this_cache) cache = amd64_alloc_frame_cache (); *this_cache = cache; - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { amd64_frame_cache_1 (this_frame, cache); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error != NOT_AVAILABLE_ERROR) throw_exception (ex); } + END_CATCH return cache; } @@ -2582,7 +2582,6 @@ amd64_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache) struct gdbarch *gdbarch = get_frame_arch (this_frame); struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - volatile struct gdb_exception ex; struct amd64_frame_cache *cache; CORE_ADDR addr; gdb_byte buf[8]; @@ -2593,7 +2592,7 @@ amd64_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache) cache = amd64_alloc_frame_cache (); - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { get_frame_register (this_frame, AMD64_RSP_REGNUM, buf); cache->base = extract_unsigned_integer (buf, 8, byte_order) - 8; @@ -2607,11 +2606,12 @@ amd64_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache) cache->base_p = 1; } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error != NOT_AVAILABLE_ERROR) throw_exception (ex); } + END_CATCH *this_cache = cache; return cache; @@ -2758,7 +2758,6 @@ amd64_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache) { struct gdbarch *gdbarch = get_frame_arch (this_frame); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - volatile struct gdb_exception ex; struct amd64_frame_cache *cache; gdb_byte buf[8]; @@ -2768,7 +2767,7 @@ amd64_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache) cache = amd64_alloc_frame_cache (); *this_cache = cache; - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { /* Cache base will be %esp plus cache->sp_offset (-8). */ get_frame_register (this_frame, AMD64_RSP_REGNUM, buf); @@ -2786,11 +2785,12 @@ amd64_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache) cache->base_p = 1; } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error != NOT_AVAILABLE_ERROR) throw_exception (ex); } + END_CATCH return cache; } diff --git a/gdb/break-catch-throw.c b/gdb/break-catch-throw.c index 726825a..f5616c8 100644 --- a/gdb/break-catch-throw.c +++ b/gdb/break-catch-throw.c @@ -163,7 +163,6 @@ check_status_exception_catchpoint (struct bpstats *bs) struct exception_catchpoint *self = (struct exception_catchpoint *) bs->breakpoint_at; char *type_name = NULL; - volatile struct gdb_exception e; bkpt_breakpoint_ops.check_status (bs); if (bs->stop == 0) @@ -172,7 +171,7 @@ check_status_exception_catchpoint (struct bpstats *bs) if (self->pattern == NULL) return; - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { struct value *typeinfo_arg; char *canon; @@ -187,8 +186,11 @@ check_status_exception_catchpoint (struct bpstats *bs) type_name = canon; } } - if (e.reason < 0) - exception_print (gdb_stderr, e); + CATCH (e, RETURN_MASK_ERROR) + { + exception_print (gdb_stderr, e); + } + END_CATCH if (type_name != NULL) { @@ -206,38 +208,38 @@ re_set_exception_catchpoint (struct breakpoint *self) { struct symtabs_and_lines sals = {0}; struct symtabs_and_lines sals_end = {0}; - volatile struct gdb_exception e; struct cleanup *cleanup; enum exception_event_kind kind = classify_exception_breakpoint (self); /* We first try to use the probe interface. */ - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { char *spec = ASTRDUP (exception_functions[kind].probe); sals = parse_probes (&spec, NULL); } - if (e.reason < 0) + CATCH (e, RETURN_MASK_ERROR) { - volatile struct gdb_exception ex; /* Using the probe interface failed. Let's fallback to the normal catchpoint mode. */ - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { char *spec = ASTRDUP (exception_functions[kind].function); self->ops->decode_linespec (self, &spec, &sals); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { /* NOT_FOUND_ERROR just means the breakpoint will be pending, so let it through. */ if (ex.error != NOT_FOUND_ERROR) throw_exception (ex); } + END_CATCH } + END_CATCH cleanup = make_cleanup (xfree, sals.sals); update_breakpoint_locations (self, sals, sals_end); diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index d85f271..0e59638 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -2221,25 +2221,25 @@ static struct agent_expr * parse_cond_to_aexpr (CORE_ADDR scope, struct expression *cond) { struct agent_expr *aexpr = NULL; - volatile struct gdb_exception ex; if (!cond) return NULL; /* We don't want to stop processing, so catch any errors that may show up. */ - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { aexpr = gen_eval_for_expr (scope, cond); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { /* If we got here, it means the condition could not be parsed to a valid bytecode expression and thus can't be evaluated on the target's side. It's no use iterating through the conditions. */ return NULL; } + END_CATCH /* We have a valid agent expression. */ return aexpr; @@ -2361,7 +2361,6 @@ parse_cmd_to_aexpr (CORE_ADDR scope, char *cmd) struct cleanup *old_cleanups = 0; struct expression *expr, **argvec; struct agent_expr *aexpr = NULL; - volatile struct gdb_exception ex; const char *cmdrest; const char *format_start, *format_end; struct format_piece *fpieces; @@ -2420,22 +2419,22 @@ parse_cmd_to_aexpr (CORE_ADDR scope, char *cmd) /* We don't want to stop processing, so catch any errors that may show up. */ - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { aexpr = gen_printf (scope, gdbarch, 0, 0, format_start, format_end - format_start, fpieces, nargs, argvec); } - - do_cleanups (old_cleanups); - - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { /* If we got here, it means the command could not be parsed to a valid bytecode expression and thus can't be evaluated on the target's side. It's no use iterating through the other commands. */ - return NULL; + aexpr = NULL; } + END_CATCH + + do_cleanups (old_cleanups); /* We have a valid agent expression, return it. */ return aexpr; @@ -2572,7 +2571,6 @@ insert_bp_location (struct bp_location *bl, { enum errors bp_err = GDB_NO_ERROR; const char *bp_err_message = NULL; - volatile struct gdb_exception e; if (!should_be_inserted (bl) || (bl->inserted && !bl->needs_update)) return 0; @@ -2675,7 +2673,7 @@ insert_bp_location (struct bp_location *bl, || !(section_is_overlay (bl->section))) { /* No overlay handling: just set the breakpoint. */ - TRY_CATCH (e, RETURN_MASK_ALL) + TRY { int val; @@ -2683,11 +2681,12 @@ insert_bp_location (struct bp_location *bl, if (val) bp_err = GENERIC_ERROR; } - if (e.reason < 0) + CATCH (e, RETURN_MASK_ALL) { bp_err = e.error; bp_err_message = e.message; } + END_CATCH } else { @@ -2710,7 +2709,7 @@ insert_bp_location (struct bp_location *bl, bl->overlay_target_info.reqstd_address = addr; /* No overlay handling: just set the breakpoint. */ - TRY_CATCH (e, RETURN_MASK_ALL) + TRY { int val; @@ -2719,11 +2718,12 @@ insert_bp_location (struct bp_location *bl, if (val) bp_err = GENERIC_ERROR; } - if (e.reason < 0) + CATCH (e, RETURN_MASK_ALL) { bp_err = e.error; bp_err_message = e.message; } + END_CATCH if (bp_err != GDB_NO_ERROR) fprintf_unfiltered (tmp_error_stream, @@ -2736,7 +2736,7 @@ insert_bp_location (struct bp_location *bl, if (section_is_mapped (bl->section)) { /* Yes. This overlay section is mapped into memory. */ - TRY_CATCH (e, RETURN_MASK_ALL) + TRY { int val; @@ -2744,11 +2744,12 @@ insert_bp_location (struct bp_location *bl, if (val) bp_err = GENERIC_ERROR; } - if (e.reason < 0) + CATCH (e, RETURN_MASK_ALL) { bp_err = e.error; bp_err_message = e.message; } + END_CATCH } else { @@ -10004,7 +10005,6 @@ create_breakpoint (struct gdbarch *gdbarch, int from_tty, int enabled, int internal, unsigned flags) { - volatile struct gdb_exception e; char *copy_arg = NULL; char *addr_start = arg; struct linespec_result canonical; @@ -10018,24 +10018,17 @@ create_breakpoint (struct gdbarch *gdbarch, init_linespec_result (&canonical); - TRY_CATCH (e, RETURN_MASK_ALL) + TRY { ops->create_sals_from_address (&arg, &canonical, type_wanted, addr_start, ©_arg); } - - /* If caller is interested in rc value from parse, set value. */ - switch (e.reason) + CATCH (e, RETURN_MASK_ERROR) { - case GDB_NO_ERROR: - if (VEC_empty (linespec_sals, canonical.sals)) - return 0; - break; - case RETURN_ERROR: - switch (e.error) + /* If caller is interested in rc value from parse, set + value. */ + if (e.error == NOT_FOUND_ERROR) { - case NOT_FOUND_ERROR: - /* If pending breakpoint support is turned off, throw error. */ @@ -10066,14 +10059,14 @@ create_breakpoint (struct gdbarch *gdbarch, pending = 1; VEC_safe_push (linespec_sals, canonical.sals, &lsal); } - break; - default: - throw_exception (e); } - break; - default: - throw_exception (e); + else + throw_exception (e); } + END_CATCH + + if (VEC_empty (linespec_sals, canonical.sals)) + return 0; /* Create a chain of things that always need to be cleaned up. */ old_chain = make_cleanup_destroy_linespec_result (&canonical); @@ -11343,7 +11336,6 @@ static void watch_command_1 (const char *arg, int accessflag, int from_tty, int just_location, int internal) { - volatile struct gdb_exception e; struct breakpoint *b, *scope_breakpoint = NULL; struct expression *exp; const struct block *exp_valid_block = NULL, *cond_exp_valid_block = NULL; @@ -11655,17 +11647,18 @@ watch_command_1 (const char *arg, int accessflag, int from_tty, if (!just_location) value_free_to_mark (mark); - TRY_CATCH (e, RETURN_MASK_ALL) + TRY { /* Finally update the new watchpoint. This creates the locations that should be inserted. */ update_watchpoint (w, 1); } - if (e.reason < 0) + CATCH (e, RETURN_MASK_ALL) { delete_breakpoint (b); throw_exception (e); } + END_CATCH install_breakpoint (internal, b, 1); do_cleanups (back_to); @@ -13011,10 +13004,15 @@ breakpoint_retire_moribund (void) static void update_global_location_list_nothrow (enum ugll_insert_mode insert_mode) { - volatile struct gdb_exception e; - TRY_CATCH (e, RETURN_MASK_ERROR) - update_global_location_list (insert_mode); + TRY + { + update_global_location_list (insert_mode); + } + CATCH (e, RETURN_MASK_ERROR) + { + } + END_CATCH } /* Clear BKP from a BPS. */ @@ -14485,22 +14483,22 @@ update_breakpoint_locations (struct breakpoint *b, if (b->cond_string != NULL) { const char *s; - volatile struct gdb_exception e; s = b->cond_string; - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { new_loc->cond = parse_exp_1 (&s, sals.sals[i].pc, block_for_pc (sals.sals[i].pc), 0); } - if (e.reason < 0) + CATCH (e, RETURN_MASK_ERROR) { warning (_("failed to reevaluate condition " "for breakpoint %d: %s"), b->number, e.message); new_loc->enabled = 0; } + END_CATCH } if (sals_end.nelts) @@ -14564,18 +14562,21 @@ addr_string_to_sals (struct breakpoint *b, char *addr_string, int *found) { char *s; struct symtabs_and_lines sals = {0}; - volatile struct gdb_exception e; + struct gdb_exception exception = exception_none; gdb_assert (b->ops != NULL); s = addr_string; - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { b->ops->decode_linespec (b, &s, &sals); } - if (e.reason < 0) + CATCH (e, RETURN_MASK_ERROR) { int not_found_and_ok = 0; + + exception = e; + /* For pending breakpoints, it's expected that parsing will fail until the right shared library is loaded. User has already told to create pending breakpoints and don't need @@ -14602,8 +14603,9 @@ addr_string_to_sals (struct breakpoint *b, char *addr_string, int *found) throw_exception (e); } } + END_CATCH - if (e.reason == 0 || e.error != NOT_FOUND_ERROR) + if (exception.reason == 0 || exception.error != NOT_FOUND_ERROR) { int i; @@ -15094,9 +15096,8 @@ enable_breakpoint_disp (struct breakpoint *bpt, enum bpdisp disposition, { /* Initialize it just to avoid a GCC false warning. */ enum enable_state orig_enable_state = 0; - volatile struct gdb_exception e; - TRY_CATCH (e, RETURN_MASK_ALL) + TRY { struct watchpoint *w = (struct watchpoint *) bpt; @@ -15104,13 +15105,14 @@ enable_breakpoint_disp (struct breakpoint *bpt, enum bpdisp disposition, bpt->enable_state = bp_enabled; update_watchpoint (w, 1 /* reparse */); } - if (e.reason < 0) + CATCH (e, RETURN_MASK_ALL) { bpt->enable_state = orig_enable_state; exception_fprintf (gdb_stderr, e, _("Cannot enable watchpoint %d: "), bpt->number); return; } + END_CATCH } bpt->enable_state = bp_enabled; @@ -15924,19 +15926,21 @@ save_breakpoints (char *filename, int from_tty, if (tp->type != bp_dprintf && tp->commands) { - volatile struct gdb_exception ex; fprintf_unfiltered (fp, " commands\n"); ui_out_redirect (current_uiout, fp); - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { print_command_lines (current_uiout, tp->commands->commands, 2); } ui_out_redirect (current_uiout, NULL); - if (ex.reason < 0) - throw_exception (ex); + CATCH (ex, RETURN_MASK_ALL) + { + throw_exception (ex); + } + END_CATCH fprintf_unfiltered (fp, " end\n"); } diff --git a/gdb/btrace.c b/gdb/btrace.c index 5436ee9..68057c5 100644 --- a/gdb/btrace.c +++ b/gdb/btrace.c @@ -549,11 +549,10 @@ ftrace_update_insns (struct btrace_function *bfun, static enum btrace_insn_class ftrace_classify_insn (struct gdbarch *gdbarch, CORE_ADDR pc) { - volatile struct gdb_exception error; enum btrace_insn_class iclass; iclass = BTRACE_INSN_OTHER; - TRY_CATCH (error, RETURN_MASK_ERROR) + TRY { if (gdbarch_insn_is_call (gdbarch, pc)) iclass = BTRACE_INSN_CALL; @@ -562,6 +561,10 @@ ftrace_classify_insn (struct gdbarch *gdbarch, CORE_ADDR pc) else if (gdbarch_insn_is_jump (gdbarch, pc)) iclass = BTRACE_INSN_JUMP; } + CATCH (error, RETURN_MASK_ERROR) + { + } + END_CATCH return iclass; } @@ -598,7 +601,6 @@ btrace_compute_ftrace_bts (struct thread_info *tp, for (;;) { - volatile struct gdb_exception error; struct btrace_insn insn; int size; @@ -628,8 +630,14 @@ btrace_compute_ftrace_bts (struct thread_info *tp, level = min (level, end->level); size = 0; - TRY_CATCH (error, RETURN_MASK_ERROR) - size = gdb_insn_length (gdbarch, pc); + TRY + { + size = gdb_insn_length (gdbarch, pc); + } + CATCH (error, RETURN_MASK_ERROR) + { + } + END_CATCH insn.pc = pc; insn.size = size; diff --git a/gdb/c-varobj.c b/gdb/c-varobj.c index 363a356..59d8b0f 100644 --- a/gdb/c-varobj.c +++ b/gdb/c-varobj.c @@ -91,15 +91,17 @@ adjust_value_for_child_access (struct value **value, { if (value && *value) { - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { *value = value_ind (*value); } - if (except.reason < 0) - *value = NULL; + CATCH (except, RETURN_MASK_ERROR) + { + *value = NULL; + } + END_CATCH } *type = target_type; if (was_ptr) @@ -245,7 +247,6 @@ static struct value * value_struct_element_index (struct value *value, int type_index) { struct value *result = NULL; - volatile struct gdb_exception e; struct type *type = value_type (value); type = check_typedef (type); @@ -253,21 +254,20 @@ value_struct_element_index (struct value *value, int type_index) gdb_assert (TYPE_CODE (type) == TYPE_CODE_STRUCT || TYPE_CODE (type) == TYPE_CODE_UNION); - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { if (field_is_static (&TYPE_FIELD (type, type_index))) result = value_static_field (type, type_index); else result = value_primitive_field (value, 0, type_index, type); } - if (e.reason < 0) + CATCH (e, RETURN_MASK_ERROR) { return NULL; } - else - { - return result; - } + END_CATCH + + return result; } /* Obtain the information about child INDEX of the variable @@ -290,7 +290,6 @@ c_describe_child (const struct varobj *parent, int index, struct type *type = varobj_get_value_type (parent); char *parent_expression = NULL; int was_ptr; - volatile struct gdb_exception except; if (cname) *cname = NULL; @@ -319,10 +318,14 @@ c_describe_child (const struct varobj *parent, int index, { int real_index = index + TYPE_LOW_BOUND (TYPE_INDEX_TYPE (type)); - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { *cvalue = value_subscript (value, real_index); } + CATCH (except, RETURN_MASK_ERROR) + { + } + END_CATCH } if (ctype) @@ -391,13 +394,16 @@ c_describe_child (const struct varobj *parent, int index, if (cvalue && value) { - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { *cvalue = value_ind (value); } - if (except.reason < 0) - *cvalue = NULL; + CATCH (except, RETURN_MASK_ERROR) + { + *cvalue = NULL; + } + END_CATCH } /* Don't use get_target_type because it calls diff --git a/gdb/cli/cli-interp.c b/gdb/cli/cli-interp.c index 1069018..ce43a4a 100644 --- a/gdb/cli/cli-interp.c +++ b/gdb/cli/cli-interp.c @@ -179,7 +179,6 @@ cli_interpreter_exec (void *data, const char *command_str) static struct gdb_exception safe_execute_command (struct ui_out *command_uiout, char *command, int from_tty) { - volatile struct gdb_exception exception; struct gdb_exception e = exception_none; struct ui_out *saved_uiout; @@ -187,14 +186,15 @@ safe_execute_command (struct ui_out *command_uiout, char *command, int from_tty) saved_uiout = current_uiout; current_uiout = command_uiout; - TRY_CATCH (exception, RETURN_MASK_ALL) + TRY { execute_command (command, from_tty); } - if (exception.reason < 0) + CATCH (exception, RETURN_MASK_ALL) { e = exception; } + END_CATCH /* Restore the global builder. */ current_uiout = saved_uiout; diff --git a/gdb/cli/cli-script.c b/gdb/cli/cli-script.c index 2ec8bcd..7a4ed78 100644 --- a/gdb/cli/cli-script.c +++ b/gdb/cli/cli-script.c @@ -1111,17 +1111,17 @@ process_next_line (char *p, struct command_line **command, int parse_commands, if (validator) { - volatile struct gdb_exception ex; - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { validator ((*command)->line, closure); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ALL) { xfree (*command); throw_exception (ex); } + END_CATCH } /* Nothing special. */ @@ -1700,13 +1700,12 @@ script_from_file (FILE *stream, const char *file) interpreter_async = 0; { - volatile struct gdb_exception e; - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { read_command_file (stream); } - if (e.reason < 0) + CATCH (e, RETURN_MASK_ERROR) { /* Re-throw the error, but with the file name information prepended. */ @@ -1714,6 +1713,7 @@ script_from_file (FILE *stream, const char *file) _("%s:%d: Error in sourced command file:\n%s"), source_file_name, source_line_number, e.message); } + END_CATCH } do_cleanups (old_cleanups); diff --git a/gdb/common/common-exceptions.c b/gdb/common/common-exceptions.c index b65f259..2ad0ce1 100644 --- a/gdb/common/common-exceptions.c +++ b/gdb/common/common-exceptions.c @@ -46,9 +46,7 @@ struct catcher /* Jump buffer pointing back at the exception handler. */ SIGJMP_BUF buf; /* Status buffer belonging to the exception handler. */ - volatile struct gdb_exception *exception; - /* Saved/current state. */ - int mask; + struct gdb_exception exception; struct cleanup *saved_cleanup_chain; /* Back link. */ struct catcher *prev; @@ -74,16 +72,12 @@ catcher_list_size (void) } SIGJMP_BUF * -exceptions_state_mc_init (volatile struct gdb_exception *exception, - return_mask mask) +exceptions_state_mc_init (void) { struct catcher *new_catcher = XCNEW (struct catcher); - /* Start with no exception, save it's address. */ - *exception = exception_none; - new_catcher->exception = exception; - - new_catcher->mask = mask; + /* Start with no exception. */ + new_catcher->exception = exception_none; /* Prevent error/quit during FUNC from calling cleanups established prior to here. */ @@ -134,8 +128,7 @@ exceptions_state_mc (enum catcher_action action) switch (action) { case CATCH_ITER: - /* No error/quit has occured. Just clean up. */ - catcher_pop (); + /* No error/quit has occured. */ return 0; case CATCH_ITER_1: current_catcher->state = CATCHER_RUNNING_1; @@ -152,7 +145,6 @@ exceptions_state_mc (enum catcher_action action) { case CATCH_ITER: /* The did a "break" from the inner while loop. */ - catcher_pop (); return 0; case CATCH_ITER_1: current_catcher->state = CATCHER_RUNNING; @@ -169,21 +161,10 @@ exceptions_state_mc (enum catcher_action action) { case CATCH_ITER: { - struct gdb_exception exception = *current_catcher->exception; - - if (current_catcher->mask & RETURN_MASK (exception.reason)) - { - /* Exit normally if this catcher can handle this - exception. The caller analyses the func return - values. */ - catcher_pop (); - return 0; - } - /* The caller didn't request that the event be caught, - relay the event to the next containing - catch_errors(). */ - catcher_pop (); - throw_exception (exception); + /* Exit normally if this catcher can handle this + exception. The caller analyses the func return + values. */ + return 0; } default: internal_error (__FILE__, __LINE__, _("bad state")); @@ -194,6 +175,31 @@ exceptions_state_mc (enum catcher_action action) } int +exceptions_state_mc_catch (struct gdb_exception *exception, + int mask) +{ + *exception = current_catcher->exception; + catcher_pop (); + + if (exception->reason < 0) + { + if (mask & RETURN_MASK (exception->reason)) + { + /* Exit normally and let the called handle the + exception. */ + return 1; + } + + /* The caller didn't request that the event be caught, relay the + event to the next exception_catch/CATCH. */ + throw_exception (*exception); + } + + /* No exception was thrown. */ + return 0; +} + +int exceptions_state_mc_action_iter (void) { return exceptions_state_mc (CATCH_ITER); @@ -218,7 +224,7 @@ throw_exception (struct gdb_exception exception) to that call via setjmp's return value. Note that REASON can't be zero, by definition in defs.h. */ exceptions_state_mc (CATCH_THROWING); - *current_catcher->exception = exception; + current_catcher->exception = exception; SIGLONGJMP (current_catcher->buf, exception.reason); } diff --git a/gdb/common/common-exceptions.h b/gdb/common/common-exceptions.h index a32e6f9..d2c0bee 100644 --- a/gdb/common/common-exceptions.h +++ b/gdb/common/common-exceptions.h @@ -118,14 +118,13 @@ struct gdb_exception /* Functions to drive the exceptions state machine. Though declared here by necessity, these functions should be considered internal to - the exceptions subsystem and not used other than via the TRY_CATCH - macro defined below. */ + the exceptions subsystem and not used other than via the TRY/CATCH + macros defined below. */ -extern SIGJMP_BUF *exceptions_state_mc_init (volatile struct - gdb_exception *exception, - return_mask mask); +extern SIGJMP_BUF *exceptions_state_mc_init (void); extern int exceptions_state_mc_action_iter (void); extern int exceptions_state_mc_action_iter_1 (void); +extern int exceptions_state_mc_catch (struct gdb_exception *, int); /* Macro to wrap up standard try/catch behavior. @@ -138,26 +137,37 @@ extern int exceptions_state_mc_action_iter_1 (void); *INDENT-OFF* - volatile struct gdb_exception e; - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { } - switch (e.reason) + CATCH (e, RETURN_MASK_ERROR) { - case RETURN_ERROR: ... + switch (e.reason) + { + case RETURN_ERROR: ... + } } + END_CATCH */ -#define TRY_CATCH(EXCEPTION,MASK) \ +#define TRY \ { \ SIGJMP_BUF *buf = \ - exceptions_state_mc_init (&(EXCEPTION), (MASK)); \ + exceptions_state_mc_init (); \ SIGSETJMP (*buf); \ } \ while (exceptions_state_mc_action_iter ()) \ while (exceptions_state_mc_action_iter_1 ()) +#define CATCH(EXCEPTION, MASK) \ + { \ + struct gdb_exception EXCEPTION; \ + if (exceptions_state_mc_catch (&(EXCEPTION), MASK)) + +#define END_CATCH \ + } + /* *INDENT-ON* */ /* Hook to allow client-specific actions to be performed prior to diff --git a/gdb/compile/compile-c-symbols.c b/gdb/compile/compile-c-symbols.c index 1921704..15efeff 100644 --- a/gdb/compile/compile-c-symbols.c +++ b/gdb/compile/compile-c-symbols.c @@ -424,7 +424,6 @@ gcc_convert_symbol (void *datum, { struct compile_c_instance *context = datum; domain_enum domain; - volatile struct gdb_exception e; int found = 0; switch (request) @@ -444,7 +443,7 @@ gcc_convert_symbol (void *datum, /* We can't allow exceptions to escape out of this callback. Safest is to simply emit a gcc error. */ - TRY_CATCH (e, RETURN_MASK_ALL) + TRY { struct symbol *sym; @@ -467,8 +466,11 @@ gcc_convert_symbol (void *datum, } } - if (e.reason < 0) - C_CTX (context)->c_ops->error (C_CTX (context), e.message); + CATCH (e, RETURN_MASK_ALL) + { + C_CTX (context)->c_ops->error (C_CTX (context), e.message); + } + END_CATCH if (compile_debug && !found) fprintf_unfiltered (gdb_stdout, @@ -484,13 +486,12 @@ gcc_symbol_address (void *datum, struct gcc_c_context *gcc_context, const char *identifier) { struct compile_c_instance *context = datum; - volatile struct gdb_exception e; gcc_address result = 0; int found = 0; /* We can't allow exceptions to escape out of this callback. Safest is to simply emit a gcc error. */ - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { struct symbol *sym; @@ -527,8 +528,11 @@ gcc_symbol_address (void *datum, struct gcc_c_context *gcc_context, } } - if (e.reason < 0) - C_CTX (context)->c_ops->error (C_CTX (context), e.message); + CATCH (e, RETURN_MASK_ERROR) + { + C_CTX (context)->c_ops->error (C_CTX (context), e.message); + } + END_CATCH if (compile_debug && !found) fprintf_unfiltered (gdb_stdout, @@ -643,9 +647,8 @@ generate_c_for_for_one_variable (struct compile_c_instance *compiler, CORE_ADDR pc, struct symbol *sym) { - volatile struct gdb_exception e; - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { if (is_dynamic_type (SYMBOL_TYPE (sym))) { @@ -699,7 +702,7 @@ generate_c_for_for_one_variable (struct compile_c_instance *compiler, } } - if (e.reason < 0) + CATCH (e, RETURN_MASK_ERROR) { if (compiler->symbol_err_map == NULL) compiler->symbol_err_map = htab_create_alloc (10, @@ -710,6 +713,7 @@ generate_c_for_for_one_variable (struct compile_c_instance *compiler, xfree); insert_symbol_error (compiler->symbol_err_map, sym, e.message); } + END_CATCH } /* See compile-internal.h. */ diff --git a/gdb/compile/compile-object-run.c b/gdb/compile/compile-object-run.c index c40de0e..6738aad 100644 --- a/gdb/compile/compile-object-run.c +++ b/gdb/compile/compile-object-run.c @@ -87,7 +87,6 @@ compile_object_run (struct compile_module *module) struct frame_id dummy_id; struct cleanup *cleanups; struct do_module_cleanup *data; - volatile struct gdb_exception ex; const char *objfile_name_s = objfile_name (module->objfile); int dtor_found, executed = 0; CORE_ADDR func_addr = module->func_addr; @@ -101,7 +100,7 @@ compile_object_run (struct compile_module *module) xfree (module->source_file); xfree (module); - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { func_val = value_from_pointer (builtin_type (target_gdbarch ())->builtin_func_ptr, @@ -121,7 +120,7 @@ compile_object_run (struct compile_module *module) do_module_cleanup, data); } } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { /* In the case of DTOR_FOUND or in the case of EXECUTED nothing needs to be done. */ @@ -133,6 +132,7 @@ compile_object_run (struct compile_module *module) do_module_cleanup (data); throw_exception (ex); } + END_CATCH dtor_found = find_dummy_frame_dtor (do_module_cleanup, data); gdb_assert (!dtor_found && executed); diff --git a/gdb/completer.c b/gdb/completer.c index 58418f6..c8c0e4c 100644 --- a/gdb/completer.c +++ b/gdb/completer.c @@ -395,18 +395,21 @@ expression_completer (struct cmd_list_element *ignore, struct type *type = NULL; char *fieldname; const char *p; - volatile struct gdb_exception except; enum type_code code = TYPE_CODE_UNDEF; /* Perform a tentative parse of the expression, to see whether a field completion is required. */ fieldname = NULL; - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { type = parse_expression_for_completion (text, &fieldname, &code); } - if (except.reason < 0) - return NULL; + CATCH (except, RETURN_MASK_ERROR) + { + return NULL; + } + END_CATCH + if (fieldname && type) { for (;;) diff --git a/gdb/corelow.c b/gdb/corelow.c index 65e1326..9218003 100644 --- a/gdb/corelow.c +++ b/gdb/corelow.c @@ -278,7 +278,6 @@ core_open (const char *arg, int from_tty) bfd *temp_bfd; int scratch_chan; int flags; - volatile struct gdb_exception except; char *filename; target_preopen (from_tty); @@ -411,13 +410,16 @@ core_open (const char *arg, int from_tty) may be a thread_stratum target loaded on top of target core by now. The layer above should claim threads found in the BFD sections. */ - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { target_update_thread_list (); } - if (except.reason < 0) - exception_print (gdb_stderr, except); + CATCH (except, RETURN_MASK_ERROR) + { + exception_print (gdb_stderr, except); + } + END_CATCH p = bfd_core_file_failing_command (core_bfd); if (p) @@ -462,12 +464,15 @@ core_open (const char *arg, int from_tty) anything about threads. That is why the test is >= 2. */ if (thread_count () >= 2) { - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { thread_command (NULL, from_tty); } - if (except.reason < 0) - exception_print (gdb_stderr, except); + CATCH (except, RETURN_MASK_ERROR) + { + exception_print (gdb_stderr, except); + } + END_CATCH } } diff --git a/gdb/cp-abi.c b/gdb/cp-abi.c index 70a0528..b8af8f0 100644 --- a/gdb/cp-abi.c +++ b/gdb/cp-abi.c @@ -69,18 +69,17 @@ baseclass_offset (struct type *type, int index, const gdb_byte *valaddr, int embedded_offset, CORE_ADDR address, const struct value *val) { - volatile struct gdb_exception ex; int res = 0; gdb_assert (current_cp_abi.baseclass_offset != NULL); - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { res = (*current_cp_abi.baseclass_offset) (type, index, valaddr, embedded_offset, address, val); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error != NOT_AVAILABLE_ERROR) throw_exception (ex); @@ -89,6 +88,7 @@ baseclass_offset (struct type *type, int index, const gdb_byte *valaddr, _("Cannot determine virtual baseclass offset " "of incomplete object")); } + END_CATCH return res; } @@ -109,16 +109,19 @@ value_rtti_type (struct value *v, int *full, int *top, int *using_enc) { struct type *ret = NULL; - volatile struct gdb_exception e; if ((current_cp_abi.rtti_type) == NULL) return NULL; - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { ret = (*current_cp_abi.rtti_type) (v, full, top, using_enc); } - if (e.reason < 0) - return NULL; + CATCH (e, RETURN_MASK_ERROR) + { + return NULL; + } + END_CATCH + return ret; } diff --git a/gdb/cp-support.c b/gdb/cp-support.c index 260601f..4bbee94 100644 --- a/gdb/cp-support.c +++ b/gdb/cp-support.c @@ -157,7 +157,6 @@ inspect_type (struct demangle_parse_info *info, int i; char *name; struct symbol *sym; - volatile struct gdb_exception except; /* Copy the symbol's name from RET_COMP and look it up in the symbol table. */ @@ -173,12 +172,18 @@ inspect_type (struct demangle_parse_info *info, } sym = NULL; - TRY_CATCH (except, RETURN_MASK_ALL) - { - sym = lookup_symbol (name, 0, VAR_DOMAIN, 0); - } - if (except.reason >= 0 && sym != NULL) + TRY + { + sym = lookup_symbol (name, 0, VAR_DOMAIN, 0); + } + CATCH (except, RETURN_MASK_ALL) + { + return 0; + } + END_CATCH + + if (sym != NULL) { struct type *otype = SYMBOL_TYPE (sym); @@ -241,18 +246,19 @@ inspect_type (struct demangle_parse_info *info, } buf = mem_fileopen (); - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { type_print (type, "", buf, -1); } /* If type_print threw an exception, there is little point in continuing, so just bow out gracefully. */ - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { ui_file_delete (buf); return 0; } + END_CATCH name = ui_file_obsavestring (buf, &info->obstack, &len); ui_file_delete (buf); @@ -446,17 +452,21 @@ replace_typedefs (struct demangle_parse_info *info, if (local_name != NULL) { - struct symbol *sym; - volatile struct gdb_exception except; + struct symbol *sym = NULL; sym = NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { sym = lookup_symbol (local_name, 0, VAR_DOMAIN, 0); } + CATCH (except, RETURN_MASK_ALL) + { + } + END_CATCH + xfree (local_name); - if (except.reason >= 0 && sym != NULL) + if (sym != NULL) { struct type *otype = SYMBOL_TYPE (sym); const char *new_name = (*finder) (otype, data); diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c index deb0ed8..feb3a66 100644 --- a/gdb/cp-valprint.c +++ b/gdb/cp-valprint.c @@ -313,18 +313,21 @@ cp_print_value_fields (struct type *type, struct type *real_type, } else if (field_is_static (&TYPE_FIELD (type, i))) { - volatile struct gdb_exception ex; struct value *v = NULL; - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { v = value_static_field (type, i); } - if (ex.reason < 0) - fprintf_filtered (stream, - _("<error reading variable: %s>"), - ex.message); + CATCH (ex, RETURN_MASK_ERROR) + { + fprintf_filtered (stream, + _("<error reading variable: %s>"), + ex.message); + } + END_CATCH + cp_print_static_field (TYPE_FIELD_TYPE (type, i), v, stream, recurse + 1, options); @@ -486,7 +489,6 @@ cp_print_value (struct type *type, struct type *real_type, const char *basename = TYPE_NAME (baseclass); const gdb_byte *base_valaddr = NULL; const struct value *base_val = NULL; - volatile struct gdb_exception ex; if (BASETYPE_VIA_VIRTUAL (type, i)) { @@ -506,17 +508,18 @@ cp_print_value (struct type *type, struct type *real_type, thisoffset = offset; thistype = real_type; - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { boffset = baseclass_offset (type, i, valaddr, offset, address, val); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error == NOT_AVAILABLE_ERROR) skip = -1; else skip = 1; } + END_CATCH if (skip == 0) { diff --git a/gdb/dwarf2-frame-tailcall.c b/gdb/dwarf2-frame-tailcall.c index c99fde0..b412a5b 100644 --- a/gdb/dwarf2-frame-tailcall.c +++ b/gdb/dwarf2-frame-tailcall.c @@ -368,7 +368,6 @@ dwarf2_tailcall_sniffer_first (struct frame_info *this_frame, struct gdbarch *prev_gdbarch; struct call_site_chain *chain = NULL; struct tailcall_cache *cache; - volatile struct gdb_exception except; gdb_assert (*tailcall_cachep == NULL); @@ -377,7 +376,7 @@ dwarf2_tailcall_sniffer_first (struct frame_info *this_frame, this_pc = get_frame_address_in_block (this_frame); /* Catch any unwinding errors. */ - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { int sp_regnum; @@ -397,12 +396,13 @@ dwarf2_tailcall_sniffer_first (struct frame_info *this_frame, prev_sp = frame_unwind_register_unsigned (this_frame, sp_regnum); prev_sp_p = 1; } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { if (entry_values_debug) exception_print (gdb_stdout, except); return; } + END_CATCH /* Ambiguous unwind or unambiguous unwind verified as matching. */ if (chain == NULL || chain->length == 0) diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c index b648aa3..8fb2ac7 100644 --- a/gdb/dwarf2-frame.c +++ b/gdb/dwarf2-frame.c @@ -1025,7 +1025,6 @@ dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache) struct dwarf2_frame_cache *cache; struct dwarf2_frame_state *fs; struct dwarf2_fde *fde; - volatile struct gdb_exception ex; CORE_ADDR entry_pc; const gdb_byte *instr; @@ -1102,7 +1101,7 @@ dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache) execute_cfa_program (fde, instr, fde->end, gdbarch, get_frame_address_in_block (this_frame), fs); - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { /* Calculate the CFA. */ switch (fs->regs.cfa_how) @@ -1126,7 +1125,7 @@ dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache) internal_error (__FILE__, __LINE__, _("Unknown CFA rule.")); } } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error == NOT_AVAILABLE_ERROR) { @@ -1138,6 +1137,7 @@ dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache) throw_exception (ex); } + END_CATCH /* Initialize the register state. */ { @@ -2269,7 +2269,6 @@ dwarf2_build_frame_info (struct objfile *objfile) struct dwarf2_cie_table cie_table; struct dwarf2_fde_table fde_table; struct dwarf2_fde_table *fde_table2; - volatile struct gdb_exception e; cie_table.num_entries = 0; cie_table.entries = NULL; @@ -2311,7 +2310,7 @@ dwarf2_build_frame_info (struct objfile *objfile) if (txt) unit->tbase = txt->vma; - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { frame_ptr = unit->dwarf_frame_buffer; while (frame_ptr < unit->dwarf_frame_buffer + unit->dwarf_frame_size) @@ -2320,7 +2319,7 @@ dwarf2_build_frame_info (struct objfile *objfile) EH_CIE_OR_FDE_TYPE_ID); } - if (e.reason < 0) + CATCH (e, RETURN_MASK_ERROR) { warning (_("skipping .eh_frame info of %s: %s"), objfile_name (objfile), e.message); @@ -2333,6 +2332,7 @@ dwarf2_build_frame_info (struct objfile *objfile) } /* The cie_table is discarded by the next if. */ } + END_CATCH if (cie_table.num_entries != 0) { @@ -2352,7 +2352,7 @@ dwarf2_build_frame_info (struct objfile *objfile) { int num_old_fde_entries = fde_table.num_entries; - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { frame_ptr = unit->dwarf_frame_buffer; while (frame_ptr < unit->dwarf_frame_buffer + unit->dwarf_frame_size) @@ -2360,7 +2360,7 @@ dwarf2_build_frame_info (struct objfile *objfile) &cie_table, &fde_table, EH_CIE_OR_FDE_TYPE_ID); } - if (e.reason < 0) + CATCH (e, RETURN_MASK_ERROR) { warning (_("skipping .debug_frame info of %s: %s"), objfile_name (objfile), e.message); @@ -2383,6 +2383,7 @@ dwarf2_build_frame_info (struct objfile *objfile) fde_table.num_entries = num_old_fde_entries; /* The cie_table is discarded by the next if. */ } + END_CATCH } /* Discard the cie_table, it is no longer needed. */ diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index aa569ee..e674933 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -983,14 +983,13 @@ struct call_site_chain * call_site_find_chain (struct gdbarch *gdbarch, CORE_ADDR caller_pc, CORE_ADDR callee_pc) { - volatile struct gdb_exception e; struct call_site_chain *retval = NULL; - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { retval = call_site_find_chain_1 (gdbarch, caller_pc, callee_pc); } - if (e.reason < 0) + CATCH (e, RETURN_MASK_ERROR) { if (e.error == NO_ENTRY_VALUE_ERROR) { @@ -1002,6 +1001,8 @@ call_site_find_chain (struct gdbarch *gdbarch, CORE_ADDR caller_pc, else throw_exception (e); } + END_CATCH + return retval; } @@ -2183,7 +2184,6 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, struct dwarf_expr_context *ctx; struct cleanup *old_chain, *value_chain; struct objfile *objfile = dwarf2_per_cu_objfile (per_cu); - volatile struct gdb_exception ex; if (byte_offset < 0) invalid_synthetic_pointer (); @@ -2206,11 +2206,11 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, ctx->baton = &baton; ctx->funcs = &dwarf_expr_ctx_funcs; - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { dwarf_expr_eval (ctx, data, size); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error == NOT_AVAILABLE_ERROR) { @@ -2229,6 +2229,7 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, else throw_exception (ex); } + END_CATCH if (ctx->num_pieces > 0) { diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index a283cba..c185d51 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -4221,14 +4221,13 @@ dwarf2_initialize_objfile (struct objfile *objfile) void dwarf2_build_psymtabs (struct objfile *objfile) { - volatile struct gdb_exception except; if (objfile->global_psymbols.size == 0 && objfile->static_psymbols.size == 0) { init_psymbol_list (objfile, 1024); } - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { /* This isn't really ideal: all the data we allocate on the objfile's obstack is still uselessly kept around. However, @@ -4238,8 +4237,11 @@ dwarf2_build_psymtabs (struct objfile *objfile) dwarf2_build_psymtabs_hard (objfile); discard_cleanups (cleanups); } - if (except.reason < 0) - exception_print (gdb_stderr, except); + CATCH (except, RETURN_MASK_ERROR) + { + exception_print (gdb_stderr, except); + } + END_CATCH } /* Return the total length of the CU described by HEADER. */ @@ -23171,16 +23173,18 @@ save_gdb_index_command (char *arg, int from_tty) dwarf2_per_objfile = objfile_data (objfile, dwarf2_objfile_data_key); if (dwarf2_per_objfile) { - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { write_psymtabs_to_index (objfile, arg); } - if (except.reason < 0) - exception_fprintf (gdb_stderr, except, - _("Error while writing index for `%s': "), - objfile_name (objfile)); + CATCH (except, RETURN_MASK_ERROR) + { + exception_fprintf (gdb_stderr, except, + _("Error while writing index for `%s': "), + objfile_name (objfile)); + } + END_CATCH } } } @@ -212,7 +212,6 @@ fetch_subexp_value (struct expression *exp, int *pc, struct value **valp, int preserve_errors) { struct value *mark, *new_mark, *result; - volatile struct gdb_exception ex; *valp = NULL; if (resultp) @@ -224,11 +223,11 @@ fetch_subexp_value (struct expression *exp, int *pc, struct value **valp, mark = value_mark (); result = NULL; - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { result = evaluate_subexp (NULL_TYPE, exp, pc, EVAL_NORMAL); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ALL) { /* Ignore memory errors if we want watchpoints pointing at inaccessible memory to still be created; otherwise, throw the @@ -243,6 +242,7 @@ fetch_subexp_value (struct expression *exp, int *pc, struct value **valp, break; } } + END_CATCH new_mark = value_mark (); if (mark == new_mark) @@ -258,13 +258,16 @@ fetch_subexp_value (struct expression *exp, int *pc, struct value **valp, *valp = result; else { - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { value_fetch_lazy (result); *valp = result; } + CATCH (except, RETURN_MASK_ERROR) + { + } + END_CATCH } } @@ -762,16 +765,15 @@ evaluate_subexp_standard (struct type *expect_type, or reference to a base class and print object is on. */ { - volatile struct gdb_exception except; struct value *ret = NULL; - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { ret = value_of_variable (exp->elts[pc + 2].symbol, exp->elts[pc + 1].block); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { if (noside == EVAL_AVOID_SIDE_EFFECTS) ret = value_zero (SYMBOL_TYPE (exp->elts[pc + 2].symbol), @@ -779,6 +781,7 @@ evaluate_subexp_standard (struct type *expect_type, else throw_exception (except); } + END_CATCH return ret; } @@ -1446,20 +1449,21 @@ evaluate_subexp_standard (struct type *expect_type, operator and continue evaluation. */ while (unop_user_defined_p (op, arg2)) { - volatile struct gdb_exception except; struct value *value = NULL; - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { value = value_x_unop (arg2, op, noside); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { if (except.error == NOT_FOUND_ERROR) break; else throw_exception (except); } + END_CATCH + arg2 = value; } } @@ -1863,20 +1867,21 @@ evaluate_subexp_standard (struct type *expect_type, arg1 with the value returned by evaluating operator->(). */ while (unop_user_defined_p (op, arg1)) { - volatile struct gdb_exception except; struct value *value = NULL; - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { value = value_x_unop (arg1, op, noside); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { if (except.error == NOT_FOUND_ERROR) break; else throw_exception (except); } + END_CATCH + arg1 = value; } diff --git a/gdb/event-loop.c b/gdb/event-loop.c index a2b41a7..79e41fd 100644 --- a/gdb/event-loop.c +++ b/gdb/event-loop.c @@ -326,14 +326,13 @@ start_event_loop (void) processes it. */ while (1) { - volatile struct gdb_exception ex; int result = 0; - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { result = gdb_do_one_event (); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ALL) { exception_print (gdb_stderr, ex); @@ -356,6 +355,8 @@ start_event_loop (void) /* Maybe better to set a flag to be checked somewhere as to whether display the prompt or not. */ } + END_CATCH + if (result < 0) break; } diff --git a/gdb/event-top.c b/gdb/event-top.c index bbda5dc..e9cc2d7 100644 --- a/gdb/event-top.c +++ b/gdb/event-top.c @@ -935,24 +935,28 @@ handle_sighup (int sig) static void async_disconnect (gdb_client_data arg) { - volatile struct gdb_exception exception; - TRY_CATCH (exception, RETURN_MASK_ALL) + TRY { quit_cover (); } - if (exception.reason < 0) + CATCH (exception, RETURN_MASK_ALL) { fputs_filtered ("Could not kill the program being debugged", gdb_stderr); exception_print (gdb_stderr, exception); } + END_CATCH - TRY_CATCH (exception, RETURN_MASK_ALL) + TRY { pop_all_targets (); } + CATCH (exception, RETURN_MASK_ALL) + { + } + END_CATCH signal (SIGHUP, SIG_DFL); /*FIXME: ??????????? */ raise (SIGHUP); diff --git a/gdb/exceptions.c b/gdb/exceptions.c index 64a653a..623e8e0 100644 --- a/gdb/exceptions.c +++ b/gdb/exceptions.c @@ -174,7 +174,6 @@ catch_exceptions_with_msg (struct ui_out *func_uiout, char **gdberrmsg, return_mask mask) { - volatile struct gdb_exception ex; struct gdb_exception exception = exception_none; volatile int val = 0; struct ui_out *saved_uiout; @@ -183,14 +182,15 @@ catch_exceptions_with_msg (struct ui_out *func_uiout, saved_uiout = current_uiout; current_uiout = func_uiout; - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { val = (*func) (current_uiout, func_args); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ALL) { exception = ex; } + END_CATCH /* Restore the global builder. */ current_uiout = saved_uiout; @@ -228,17 +228,22 @@ int catch_errors (catch_errors_ftype *func, void *func_args, char *errstring, return_mask mask) { + struct gdb_exception exception = exception_none; volatile int val = 0; - volatile struct gdb_exception exception; struct ui_out *saved_uiout; /* Save the global ``struct ui_out'' builder. */ saved_uiout = current_uiout; - TRY_CATCH (exception, RETURN_MASK_ALL) + TRY { val = func (func_args); } + CATCH (ex, RETURN_MASK_ALL) + { + exception = ex; + } + END_CATCH /* Restore the global builder. */ current_uiout = saved_uiout; diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c index c2aca71..e841edf 100644 --- a/gdb/f-valprint.c +++ b/gdb/f-valprint.c @@ -443,19 +443,22 @@ info_common_command_for_block (const struct block *block, const char *comname, for (index = 0; index < common->n_entries; index++) { struct value *val = NULL; - volatile struct gdb_exception except; printf_filtered ("%s = ", SYMBOL_PRINT_NAME (common->contents[index])); - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { val = value_of_variable (common->contents[index], block); value_print (val, gdb_stdout, &opts); } - if (except.reason < 0) - printf_filtered ("<error reading variable: %s>", except.message); + CATCH (except, RETURN_MASK_ERROR) + { + printf_filtered ("<error reading variable: %s>", except.message); + } + END_CATCH + putchar_filtered ('\n'); } } diff --git a/gdb/frame-unwind.c b/gdb/frame-unwind.c index fcfedfd..bba1ae7 100644 --- a/gdb/frame-unwind.c +++ b/gdb/frame-unwind.c @@ -96,16 +96,15 @@ frame_unwind_try_unwinder (struct frame_info *this_frame, void **this_cache, const struct frame_unwind *unwinder) { struct cleanup *old_cleanup; - volatile struct gdb_exception ex; int res = 0; old_cleanup = frame_prepare_for_sniffer (this_frame, unwinder); - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { res = unwinder->sniffer (unwinder, this_frame, this_cache); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error == NOT_AVAILABLE_ERROR) { @@ -118,6 +117,7 @@ frame_unwind_try_unwinder (struct frame_info *this_frame, void **this_cache, } throw_exception (ex); } + END_CATCH if (res) { diff --git a/gdb/frame.c b/gdb/frame.c index 7088f32..b3cbf23 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -784,9 +784,9 @@ frame_unwind_pc (struct frame_info *this_frame) { if (gdbarch_unwind_pc_p (frame_unwind_arch (this_frame))) { - volatile struct gdb_exception ex; struct gdbarch *prev_gdbarch; CORE_ADDR pc = 0; + int pc_p = 0; /* The right way. The `pure' way. The one true way. This method depends solely on the register-unwind code to @@ -806,11 +806,12 @@ frame_unwind_pc (struct frame_info *this_frame) different ways that a PC could be unwound. */ prev_gdbarch = frame_unwind_arch (this_frame); - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { pc = gdbarch_unwind_pc (prev_gdbarch, this_frame); + pc_p = 1; } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error == NOT_AVAILABLE_ERROR) { @@ -835,7 +836,9 @@ frame_unwind_pc (struct frame_info *this_frame) else throw_exception (ex); } - else + END_CATCH + + if (pc_p) { this_frame->prev_pc.value = pc; this_frame->prev_pc.status = CC_VALUE; @@ -1963,14 +1966,13 @@ get_prev_frame_always_1 (struct frame_info *this_frame) struct frame_info * get_prev_frame_always (struct frame_info *this_frame) { - volatile struct gdb_exception ex; struct frame_info *prev_frame = NULL; - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { prev_frame = get_prev_frame_always_1 (this_frame); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error == MEMORY_ERROR) { @@ -1994,6 +1996,7 @@ get_prev_frame_always (struct frame_info *this_frame) else throw_exception (ex); } + END_CATCH return prev_frame; } @@ -2222,21 +2225,21 @@ get_frame_pc (struct frame_info *frame) int get_frame_pc_if_available (struct frame_info *frame, CORE_ADDR *pc) { - volatile struct gdb_exception ex; gdb_assert (frame->next != NULL); - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { *pc = frame_unwind_pc (frame->next); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error == NOT_AVAILABLE_ERROR) return 0; else throw_exception (ex); } + END_CATCH return 1; } @@ -2307,18 +2310,18 @@ int get_frame_address_in_block_if_available (struct frame_info *this_frame, CORE_ADDR *pc) { - volatile struct gdb_exception ex; - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { *pc = get_frame_address_in_block (this_frame); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error == NOT_AVAILABLE_ERROR) return 0; throw_exception (ex); } + END_CATCH return 1; } diff --git a/gdb/gcore.c b/gdb/gcore.c index 3e05c61..44b9d0c 100644 --- a/gdb/gcore.c +++ b/gdb/gcore.c @@ -114,12 +114,19 @@ write_gcore_file_1 (bfd *obfd) void write_gcore_file (bfd *obfd) { - volatile struct gdb_exception except; + struct gdb_exception except = exception_none; target_prepare_to_generate_core (); - TRY_CATCH (except, RETURN_MASK_ALL) - write_gcore_file_1 (obfd); + TRY + { + write_gcore_file_1 (obfd); + } + CATCH (e, RETURN_MASK_ALL) + { + except = e; + } + END_CATCH target_done_generating_core (); diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index e735c8e..70cc374 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,8 @@ +2015-03-07 Pedro Alves <palves@redhat.com> + + Adjust all callers of TRY_CATCH to use TRY/CATCH/END_CATCH + instead. + 2015-03-06 Yao Qi <yao.qi@linaro.org> * linux-aarch64-low.c (aarch64_insert_point): Use diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 4189877..08dbb60 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -3144,19 +3144,19 @@ static int exit_code; static void detach_or_kill_for_exit_cleanup (void *ignore) { - volatile struct gdb_exception exception; - TRY_CATCH (exception, RETURN_MASK_ALL) + TRY { detach_or_kill_for_exit (); } - if (exception.reason < 0) + CATCH (exception, RETURN_MASK_ALL) { fflush (stdout); fprintf (stderr, "Detach or kill failed: %s\n", exception.message); exit_code = 1; } + END_CATCH } /* Main function. This is called by the real "main" function, @@ -3385,7 +3385,6 @@ captured_main (int argc, char *argv[]) while (1) { - volatile struct gdb_exception exception; noack_mode = 0; multi_process = 0; @@ -3397,7 +3396,7 @@ captured_main (int argc, char *argv[]) remote_open (port); - TRY_CATCH (exception, RETURN_MASK_ERROR) + TRY { /* Wait for events. This will return when all event sources are removed from the event loop. */ @@ -3450,8 +3449,7 @@ captured_main (int argc, char *argv[]) } } } - - if (exception.reason == RETURN_ERROR) + CATCH (exception, RETURN_MASK_ERROR) { if (response_needed) { @@ -3459,6 +3457,7 @@ captured_main (int argc, char *argv[]) putpkt (own_buf); } } + END_CATCH } } @@ -3467,25 +3466,26 @@ captured_main (int argc, char *argv[]) int main (int argc, char *argv[]) { - volatile struct gdb_exception exception; - TRY_CATCH (exception, RETURN_MASK_ALL) + TRY { captured_main (argc, argv); } - - /* captured_main should never return. */ - gdb_assert (exception.reason < 0); - - if (exception.reason == RETURN_ERROR) + CATCH (exception, RETURN_MASK_ALL) { - fflush (stdout); - fprintf (stderr, "%s\n", exception.message); - fprintf (stderr, "Exiting\n"); - exit_code = 1; + if (exception.reason == RETURN_ERROR) + { + fflush (stdout); + fprintf (stderr, "%s\n", exception.message); + fprintf (stderr, "Exiting\n"); + exit_code = 1; + } + + exit (exit_code); } + END_CATCH - exit (exit_code); + gdb_assert_not_reached ("captured_main should never return"); } /* Skip PACKET until the next semi-colon (or end of string). */ diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index d087a12..af59d42 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -2299,20 +2299,22 @@ safe_parse_type (struct gdbarch *gdbarch, char *p, int length) { struct ui_file *saved_gdb_stderr; struct type *type = NULL; /* Initialize to keep gcc happy. */ - volatile struct gdb_exception except; /* Suppress error messages. */ saved_gdb_stderr = gdb_stderr; gdb_stderr = ui_file_new (); /* Call parse_and_eval_type() without fear of longjmp()s. */ - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { type = parse_and_eval_type (p, length); } - if (except.reason < 0) - type = builtin_type (gdbarch)->builtin_void; + CATCH (except, RETURN_MASK_ERROR) + { + type = builtin_type (gdbarch)->builtin_void; + } + END_CATCH /* Stop suppressing error messages. */ ui_file_delete (gdb_stderr); @@ -3235,7 +3237,6 @@ check_types_worklist (VEC (type_equality_entry_d) **worklist, int types_deeply_equal (struct type *type1, struct type *type2) { - volatile struct gdb_exception except; int result = 0; struct bcache *cache; VEC (type_equality_entry_d) *worklist = NULL; @@ -3253,7 +3254,7 @@ types_deeply_equal (struct type *type1, struct type *type2) entry.type2 = type2; VEC_safe_push (type_equality_entry_d, worklist, &entry); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { result = check_types_worklist (&worklist, cache); } @@ -3264,8 +3265,11 @@ types_deeply_equal (struct type *type1, struct type *type2) bcache_xfree (cache); VEC_free (type_equality_entry_d, worklist); /* Rethrow if there was a problem. */ - if (except.reason < 0) - throw_exception (except); + CATCH (except, RETURN_MASK_ALL) + { + throw_exception (except); + } + END_CATCH return result; } diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c index d1ed8fc..5c04011 100644 --- a/gdb/gnu-v3-abi.c +++ b/gdb/gnu-v3-abi.c @@ -904,8 +904,8 @@ print_one_vtable (struct gdbarch *gdbarch, struct value *value, { /* Initialize it just to avoid a GCC false warning. */ CORE_ADDR addr = 0; + int got_error = 0; struct value *vfn; - volatile struct gdb_exception ex; printf_filtered ("[%d]: ", i); @@ -916,13 +916,18 @@ print_one_vtable (struct gdbarch *gdbarch, struct value *value, if (gdbarch_vtable_function_descriptors (gdbarch)) vfn = value_addr (vfn); - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { addr = value_as_address (vfn); } - if (ex.reason < 0) - printf_filtered (_("<error: %s>"), ex.message); - else + CATCH (ex, RETURN_MASK_ERROR) + { + printf_filtered (_("<error: %s>"), ex.message); + got_error = 1; + } + END_CATCH + + if (!got_error) print_function_pointer_address (opts, gdbarch, addr, gdb_stdout); printf_filtered ("\n"); } diff --git a/gdb/guile/guile.c b/gdb/guile/guile.c index 1895118..16d15b7 100644 --- a/gdb/guile/guile.c +++ b/gdb/guile/guile.c @@ -310,11 +310,11 @@ gdbscm_execute_gdb_command (SCM command_scm, SCM rest) { int from_tty_arg_pos = -1, to_string_arg_pos = -1; int from_tty = 0, to_string = 0; - volatile struct gdb_exception except; const SCM keywords[] = { from_tty_keyword, to_string_keyword, SCM_BOOL_F }; char *command; char *result = NULL; struct cleanup *cleanups; + struct gdb_exception except = exception_none; gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, keywords, "s#tt", command_scm, &command, rest, @@ -325,7 +325,7 @@ gdbscm_execute_gdb_command (SCM command_scm, SCM rest) executed. */ cleanups = make_cleanup (xfree, command); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct cleanup *inner_cleanups; @@ -346,6 +346,12 @@ gdbscm_execute_gdb_command (SCM command_scm, SCM rest) do_cleanups (inner_cleanups); } + CATCH (ex, RETURN_MASK_ALL) + { + except = ex; + } + END_CATCH + do_cleanups (cleanups); GDBSCM_HANDLE_GDB_EXCEPTION (except); diff --git a/gdb/guile/scm-block.c b/gdb/guile/scm-block.c index 36c14da..50dc6c7 100644 --- a/gdb/guile/scm-block.c +++ b/gdb/guile/scm-block.c @@ -678,18 +678,21 @@ gdbscm_lookup_block (SCM pc_scm) CORE_ADDR pc; const struct block *block = NULL; struct compunit_symtab *cust = NULL; - volatile struct gdb_exception except; gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, NULL, "U", pc_scm, &pc); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { cust = find_pc_compunit_symtab (pc); if (cust != NULL && COMPUNIT_OBJFILE (cust) != NULL) block = block_for_pc (pc); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH if (cust == NULL || COMPUNIT_OBJFILE (cust) == NULL) { diff --git a/gdb/guile/scm-breakpoint.c b/gdb/guile/scm-breakpoint.c index c1f9f91..ad853ed 100644 --- a/gdb/guile/scm-breakpoint.c +++ b/gdb/guile/scm-breakpoint.c @@ -407,7 +407,7 @@ gdbscm_register_breakpoint_x (SCM self) { breakpoint_smob *bp_smob = bpscm_get_breakpoint_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - volatile struct gdb_exception except; + struct gdb_exception except = exception_none; /* We only support registering breakpoints created with make-breakpoint. */ if (!bp_smob->is_scheme_bkpt) @@ -418,7 +418,7 @@ gdbscm_register_breakpoint_x (SCM self) pending_breakpoint_scm = self; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { char *location = bp_smob->spec.location; int internal = bp_smob->spec.is_internal; @@ -455,6 +455,12 @@ gdbscm_register_breakpoint_x (SCM self) gdb_assert_not_reached ("invalid breakpoint type"); } } + CATCH (ex, RETURN_MASK_ALL) + { + except = ex; + } + END_CATCH + /* Ensure this gets reset, even if there's an error. */ pending_breakpoint_scm = SCM_BOOL_F; GDBSCM_HANDLE_GDB_EXCEPTION (except); @@ -473,13 +479,16 @@ gdbscm_delete_breakpoint_x (SCM self) { breakpoint_smob *bp_smob = bpscm_get_valid_breakpoint_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { delete_breakpoint (bp_smob->bp); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return SCM_UNSPECIFIED; } @@ -565,19 +574,22 @@ gdbscm_set_breakpoint_enabled_x (SCM self, SCM newvalue) { breakpoint_smob *bp_smob = bpscm_get_valid_breakpoint_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - volatile struct gdb_exception except; SCM_ASSERT_TYPE (gdbscm_is_bool (newvalue), newvalue, SCM_ARG2, FUNC_NAME, _("boolean")); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (gdbscm_is_true (newvalue)) enable_breakpoint (bp_smob->bp); else disable_breakpoint (bp_smob->bp); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return SCM_UNSPECIFIED; } @@ -600,16 +612,19 @@ gdbscm_set_breakpoint_silent_x (SCM self, SCM newvalue) { breakpoint_smob *bp_smob = bpscm_get_valid_breakpoint_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - volatile struct gdb_exception except; SCM_ASSERT_TYPE (gdbscm_is_bool (newvalue), newvalue, SCM_ARG2, FUNC_NAME, _("boolean")); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { breakpoint_set_silent (bp_smob->bp, gdbscm_is_true (newvalue)); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return SCM_UNSPECIFIED; } @@ -634,7 +649,6 @@ gdbscm_set_breakpoint_ignore_count_x (SCM self, SCM newvalue) breakpoint_smob *bp_smob = bpscm_get_valid_breakpoint_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); long value; - volatile struct gdb_exception except; SCM_ASSERT_TYPE (scm_is_signed_integer (newvalue, LONG_MIN, LONG_MAX), newvalue, SCM_ARG2, FUNC_NAME, _("integer")); @@ -643,11 +657,15 @@ gdbscm_set_breakpoint_ignore_count_x (SCM self, SCM newvalue) if (value < 0) value = 0; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { set_ignore_count (bp_smob->number, (int) value, 0); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return SCM_UNSPECIFIED; } @@ -755,17 +773,20 @@ gdbscm_set_breakpoint_task_x (SCM self, SCM newvalue) = bpscm_get_valid_breakpoint_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); long id; int valid_id = 0; - volatile struct gdb_exception except; if (scm_is_signed_integer (newvalue, LONG_MIN, LONG_MAX)) { id = scm_to_long (newvalue); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { valid_id = valid_task_id (id); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH if (! valid_id) { @@ -778,11 +799,15 @@ gdbscm_set_breakpoint_task_x (SCM self, SCM newvalue) else SCM_ASSERT_TYPE (0, newvalue, SCM_ARG2, FUNC_NAME, _("integer or #f")); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { breakpoint_set_task (bp_smob->bp, id); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return SCM_UNSPECIFIED; } @@ -855,7 +880,7 @@ gdbscm_set_breakpoint_condition_x (SCM self, SCM newvalue) breakpoint_smob *bp_smob = bpscm_get_valid_breakpoint_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); char *exp; - volatile struct gdb_exception except; + struct gdb_exception except = exception_none; SCM_ASSERT_TYPE (scm_is_string (newvalue) || gdbscm_is_false (newvalue), newvalue, SCM_ARG2, FUNC_NAME, @@ -866,10 +891,16 @@ gdbscm_set_breakpoint_condition_x (SCM self, SCM newvalue) else exp = gdbscm_scm_to_c_string (newvalue); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { set_breakpoint_condition (bp_smob->bp, exp ? exp : "", 0); } + CATCH (ex, RETURN_MASK_ALL) + { + except = ex; + } + END_CATCH + xfree (exp); GDBSCM_HANDLE_GDB_EXCEPTION (except); @@ -936,7 +967,6 @@ gdbscm_breakpoint_commands (SCM self) = bpscm_get_valid_breakpoint_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); struct breakpoint *bp; long length; - volatile struct gdb_exception except; struct ui_file *string_file; struct cleanup *chain; SCM result; @@ -951,16 +981,17 @@ gdbscm_breakpoint_commands (SCM self) chain = make_cleanup_ui_file_delete (string_file); ui_out_redirect (current_uiout, string_file); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { print_command_lines (current_uiout, breakpoint_commands (bp), 0); } ui_out_redirect (current_uiout, NULL); - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { do_cleanups (chain); gdbscm_throw_gdb_exception (except); } + END_CATCH cmdstr = ui_file_xstrdup (string_file, &length); make_cleanup (xfree, cmdstr); diff --git a/gdb/guile/scm-cmd.c b/gdb/guile/scm-cmd.c index 7c6d010..c870fcc 100644 --- a/gdb/guile/scm-cmd.c +++ b/gdb/guile/scm-cmd.c @@ -762,7 +762,6 @@ gdbscm_register_command_x (SCM self) char *cmd_name, *pfx_name; struct cmd_list_element **cmd_list; struct cmd_list_element *cmd = NULL; - volatile struct gdb_exception except; if (cmdscm_is_valid (c_smob)) scm_misc_error (FUNC_NAME, _("command is already registered"), SCM_EOL); @@ -772,7 +771,7 @@ gdbscm_register_command_x (SCM self) c_smob->cmd_name = gdbscm_gc_xstrdup (cmd_name); xfree (cmd_name); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (c_smob->is_prefix) { @@ -790,7 +789,11 @@ gdbscm_register_command_x (SCM self) NULL, c_smob->doc, cmd_list); } } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH /* Note: At this point the command exists in gdb. So no more errors after this point. */ diff --git a/gdb/guile/scm-disasm.c b/gdb/guile/scm-disasm.c index 5ae7075..782d915 100644 --- a/gdb/guile/scm-disasm.c +++ b/gdb/guile/scm-disasm.c @@ -283,9 +283,8 @@ gdbscm_arch_disassemble (SCM self, SCM start_scm, SCM rest) char *as = NULL; struct ui_file *memfile = mem_fileopen (); struct cleanup *cleanups = make_cleanup_ui_file_delete (memfile); - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (using_port) { @@ -295,7 +294,11 @@ gdbscm_arch_disassemble (SCM self, SCM start_scm, SCM rest) else insn_len = gdb_print_insn (gdbarch, pc, memfile, NULL); } - GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + } + END_CATCH as = ui_file_xstrdup (memfile, NULL); diff --git a/gdb/guile/scm-frame.c b/gdb/guile/scm-frame.c index a30c093..6189802 100644 --- a/gdb/guile/scm-frame.c +++ b/gdb/guile/scm-frame.c @@ -220,7 +220,6 @@ frscm_scm_from_frame (struct frame_info *frame, struct inferior *inferior) SCM f_scm; htab_t htab; eqable_gdb_smob **slot; - volatile struct gdb_exception except; struct frame_id frame_id = null_frame_id; struct gdbarch *gdbarch = NULL; int frame_id_is_next = 0; @@ -234,7 +233,7 @@ frscm_scm_from_frame (struct frame_info *frame, struct inferior *inferior) if (*slot != NULL) return (*slot)->containing_scm; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { /* 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 @@ -253,8 +252,11 @@ frscm_scm_from_frame (struct frame_info *frame, struct inferior *inferior) } gdbarch = get_frame_arch (frame); } - if (except.reason < 0) - return gdbscm_scm_from_gdb_exception (except); + CATCH (except, RETURN_MASK_ALL) + { + return gdbscm_scm_from_gdb_exception (except); + } + END_CATCH f_scm = frscm_make_frame_smob (); f_smob = (frame_smob *) SCM_SMOB_DATA (f_scm); @@ -396,15 +398,18 @@ gdbscm_frame_valid_p (SCM self) { frame_smob *f_smob; struct frame_info *frame = NULL; - volatile struct gdb_exception except; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { frame = frscm_frame_smob_to_frame (f_smob); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return scm_from_bool (frame != NULL); } @@ -421,18 +426,23 @@ gdbscm_frame_name (SCM self) enum language lang = language_minimal; struct frame_info *frame = NULL; SCM result; - volatile struct gdb_exception except; + struct gdb_exception except = exception_none; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { frame = frscm_frame_smob_to_frame (f_smob); if (frame != NULL) find_frame_funname (frame, &name, &lang, NULL); } - if (except.reason < 0) - xfree (name); + CATCH (ex, RETURN_MASK_ALL) + { + except = ex; + } + END_CATCH + + xfree (name); GDBSCM_HANDLE_GDB_EXCEPTION (except); if (frame == NULL) @@ -461,17 +471,20 @@ gdbscm_frame_type (SCM self) frame_smob *f_smob; enum frame_type type = NORMAL_FRAME; struct frame_info *frame = NULL; - volatile struct gdb_exception except; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { frame = frscm_frame_smob_to_frame (f_smob); if (frame != NULL) type = get_frame_type (frame); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH if (frame == NULL) { @@ -490,15 +503,18 @@ gdbscm_frame_arch (SCM self) { frame_smob *f_smob; struct frame_info *frame = NULL; - volatile struct gdb_exception except; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { frame = frscm_frame_smob_to_frame (f_smob); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH if (frame == NULL) { @@ -517,16 +533,19 @@ gdbscm_frame_unwind_stop_reason (SCM self) { frame_smob *f_smob; struct frame_info *frame = NULL; - volatile struct gdb_exception except; enum unwind_stop_reason stop_reason; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { frame = frscm_frame_smob_to_frame (f_smob); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH if (frame == NULL) { @@ -548,17 +567,20 @@ gdbscm_frame_pc (SCM self) frame_smob *f_smob; CORE_ADDR pc = 0; struct frame_info *frame = NULL; - volatile struct gdb_exception except; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { frame = frscm_frame_smob_to_frame (f_smob); if (frame != NULL) pc = get_frame_pc (frame); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH if (frame == NULL) { @@ -578,17 +600,20 @@ gdbscm_frame_block (SCM self) frame_smob *f_smob; const struct block *block = NULL, *fn_block; struct frame_info *frame = NULL; - volatile struct gdb_exception except; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { frame = frscm_frame_smob_to_frame (f_smob); if (frame != NULL) block = get_frame_block (frame, NULL); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH if (frame == NULL) { @@ -626,17 +651,20 @@ gdbscm_frame_function (SCM self) frame_smob *f_smob; struct symbol *sym = NULL; struct frame_info *frame = NULL; - volatile struct gdb_exception except; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { frame = frscm_frame_smob_to_frame (f_smob); if (frame != NULL) sym = find_pc_function (get_frame_address_in_block (frame)); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH if (frame == NULL) { @@ -660,17 +688,20 @@ gdbscm_frame_older (SCM self) frame_smob *f_smob; struct frame_info *prev = NULL; struct frame_info *frame = NULL; - volatile struct gdb_exception except; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { frame = frscm_frame_smob_to_frame (f_smob); if (frame != NULL) prev = get_prev_frame (frame); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH if (frame == NULL) { @@ -694,17 +725,20 @@ gdbscm_frame_newer (SCM self) frame_smob *f_smob; struct frame_info *next = NULL; struct frame_info *frame = NULL; - volatile struct gdb_exception except; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { frame = frscm_frame_smob_to_frame (f_smob); if (frame != NULL) next = get_next_frame (frame); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH if (frame == NULL) { @@ -727,17 +761,20 @@ gdbscm_frame_sal (SCM self) frame_smob *f_smob; struct symtab_and_line sal; struct frame_info *frame = NULL; - volatile struct gdb_exception except; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { frame = frscm_frame_smob_to_frame (f_smob); if (frame != NULL) find_frame_sal (frame, &sal); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH if (frame == NULL) { @@ -767,15 +804,18 @@ gdbscm_frame_read_var (SCM self, SCM symbol_scm, SCM rest) struct frame_info *frame = NULL; struct symbol *var = NULL; struct value *value = NULL; - volatile struct gdb_exception except; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { frame = frscm_frame_smob_to_frame (f_smob); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH if (frame == NULL) { @@ -797,7 +837,7 @@ gdbscm_frame_read_var (SCM self, SCM symbol_scm, SCM rest) char *var_name; const struct block *block = NULL; struct cleanup *cleanup; - volatile struct gdb_exception except; + struct gdb_exception except = exception_none; if (! SCM_UNBNDP (block_scm)) { @@ -815,14 +855,19 @@ gdbscm_frame_read_var (SCM self, SCM symbol_scm, SCM rest) /* N.B. Between here and the call to do_cleanups, don't do anything to cause a Scheme exception without performing the cleanup. */ - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (block == NULL) block = get_frame_block (frame, NULL); var = lookup_symbol (var_name, block, VAR_DOMAIN, NULL); } - if (except.reason < 0) - do_cleanups (cleanup); + CATCH (ex, RETURN_MASK_ALL) + { + except = ex; + } + END_CATCH + + do_cleanups (cleanup); GDBSCM_HANDLE_GDB_EXCEPTION (except); if (var == NULL) @@ -841,11 +886,15 @@ gdbscm_frame_read_var (SCM self, SCM symbol_scm, SCM rest) _("gdb:symbol or string")); } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { value = read_var_value (var, frame); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return vlscm_scm_from_value (value); } @@ -858,17 +907,20 @@ gdbscm_frame_select (SCM self) { frame_smob *f_smob; struct frame_info *frame = NULL; - volatile struct gdb_exception except; f_smob = frscm_get_frame_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { frame = frscm_frame_smob_to_frame (f_smob); if (frame != NULL) select_frame (frame); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH if (frame == NULL) { @@ -886,13 +938,16 @@ static SCM gdbscm_newest_frame (void) { struct frame_info *frame = NULL; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { frame = get_current_frame (); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return frscm_scm_from_frame_unsafe (frame, current_inferior ()); } @@ -904,13 +959,16 @@ static SCM gdbscm_selected_frame (void) { struct frame_info *frame = NULL; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { frame = get_selected_frame (_("No frame is currently selected")); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return frscm_scm_from_frame_unsafe (frame, current_inferior ()); } diff --git a/gdb/guile/scm-lazy-string.c b/gdb/guile/scm-lazy-string.c index d9ca97e9..c84ead7 100644 --- a/gdb/guile/scm-lazy-string.c +++ b/gdb/guile/scm-lazy-string.c @@ -234,7 +234,6 @@ gdbscm_lazy_string_to_value (SCM self) SCM ls_scm = lsscm_get_lazy_string_arg_unsafe (self, SCM_ARG1, FUNC_NAME); lazy_string_smob *ls_smob = (lazy_string_smob *) SCM_SMOB_DATA (ls_scm); struct value *value = NULL; - volatile struct gdb_exception except; if (ls_smob->address == 0) { @@ -242,11 +241,15 @@ gdbscm_lazy_string_to_value (SCM self) _("cannot create a value from NULL"))); } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { value = value_at_lazy (ls_smob->type, ls_smob->address); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return vlscm_scm_from_value (value); } @@ -268,7 +271,6 @@ lsscm_safe_lazy_string_to_value (SCM string, int arg_pos, { lazy_string_smob *ls_smob; struct value *value = NULL; - volatile struct gdb_exception except; gdb_assert (lsscm_is_lazy_string (string)); @@ -283,15 +285,16 @@ lsscm_safe_lazy_string_to_value (SCM string, int arg_pos, return NULL; } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { value = value_at_lazy (ls_smob->type, ls_smob->address); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { *except_scmp = gdbscm_scm_from_gdb_exception (except); return NULL; } + END_CATCH return value; } diff --git a/gdb/guile/scm-math.c b/gdb/guile/scm-math.c index 7ff37ce..4b6bb5d 100644 --- a/gdb/guile/scm-math.c +++ b/gdb/guile/scm-math.c @@ -83,7 +83,6 @@ vlscm_unop (enum valscm_unary_opcode opcode, SCM x, const char *func_name) struct value *res_val = NULL; SCM except_scm; struct cleanup *cleanups; - volatile struct gdb_exception except; cleanups = make_cleanup_value_free_to_mark (value_mark ()); @@ -95,7 +94,7 @@ vlscm_unop (enum valscm_unary_opcode opcode, SCM x, const char *func_name) gdbscm_throw (except_scm); } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { switch (opcode) { @@ -128,7 +127,11 @@ vlscm_unop (enum valscm_unary_opcode opcode, SCM x, const char *func_name) gdb_assert_not_reached ("unsupported operation"); } } - GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + } + END_CATCH gdb_assert (res_val != NULL); result = vlscm_scm_from_value (res_val); @@ -156,7 +159,6 @@ vlscm_binop (enum valscm_binary_opcode opcode, SCM x, SCM y, struct value *res_val = NULL; SCM except_scm; struct cleanup *cleanups; - volatile struct gdb_exception except; cleanups = make_cleanup_value_free_to_mark (value_mark ()); @@ -175,7 +177,7 @@ vlscm_binop (enum valscm_binary_opcode opcode, SCM x, SCM y, gdbscm_throw (except_scm); } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { switch (opcode) { @@ -264,7 +266,11 @@ vlscm_binop (enum valscm_binary_opcode opcode, SCM x, SCM y, gdb_assert_not_reached ("unsupported operation"); } } - GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + } + END_CATCH gdb_assert (res_val != NULL); result = vlscm_scm_from_value (res_val); @@ -441,7 +447,7 @@ vlscm_rich_compare (int op, SCM x, SCM y, const char *func_name) int result = 0; SCM except_scm; struct cleanup *cleanups; - volatile struct gdb_exception except; + struct gdb_exception except = exception_none; cleanups = make_cleanup_value_free_to_mark (value_mark ()); @@ -460,7 +466,7 @@ vlscm_rich_compare (int op, SCM x, SCM y, const char *func_name) gdbscm_throw (except_scm); } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { switch (op) { @@ -487,6 +493,12 @@ vlscm_rich_compare (int op, SCM x, SCM y, const char *func_name) gdb_assert_not_reached ("invalid <gdb:value> comparison"); } } + CATCH (ex, RETURN_MASK_ALL) + { + except = ex; + } + END_CATCH + do_cleanups (cleanups); GDBSCM_HANDLE_GDB_EXCEPTION (except); @@ -742,7 +754,6 @@ vlscm_convert_typed_value_from_scheme (const char *func_name, { struct value *value = NULL; SCM except_scm = SCM_BOOL_F; - volatile struct gdb_exception except; if (type == NULL) { @@ -752,7 +763,7 @@ vlscm_convert_typed_value_from_scheme (const char *func_name, *except_scmp = SCM_BOOL_F; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (vlscm_is_value (obj)) { @@ -859,8 +870,11 @@ vlscm_convert_typed_value_from_scheme (const char *func_name, value = NULL; } } - if (except.reason < 0) - except_scm = gdbscm_scm_from_gdb_exception (except); + CATCH (except, RETURN_MASK_ALL) + { + except_scm = gdbscm_scm_from_gdb_exception (except); + } + END_CATCH if (gdbscm_is_true (except_scm)) { diff --git a/gdb/guile/scm-param.c b/gdb/guile/scm-param.c index 02b4f8a..508bcb9 100644 --- a/gdb/guile/scm-param.c +++ b/gdb/guile/scm-param.c @@ -990,7 +990,6 @@ gdbscm_register_parameter_x (SCM self) = pascm_get_param_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); char *cmd_name; struct cmd_list_element **set_list, **show_list; - volatile struct gdb_exception except; if (pascm_is_valid (p_smob)) scm_misc_error (FUNC_NAME, _("parameter is already registered"), SCM_EOL); @@ -1014,7 +1013,7 @@ gdbscm_register_parameter_x (SCM self) _("parameter exists, \"show\" command is already defined")); } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { add_setshow_generic (p_smob->type, p_smob->cmd_class, p_smob->cmd_name, p_smob, @@ -1026,7 +1025,11 @@ gdbscm_register_parameter_x (SCM self) set_list, show_list, &p_smob->set_command, &p_smob->show_command); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH /* Note: At this point the parameter exists in gdb. So no more errors after this point. */ @@ -1063,16 +1066,22 @@ gdbscm_parameter_value (SCM self) const char *arg; char *newarg; int found = -1; - volatile struct gdb_exception except; + struct gdb_exception except = exception_none; name = gdbscm_scm_to_host_string (self, NULL, &except_scm); if (name == NULL) gdbscm_throw (except_scm); newarg = concat ("show ", name, (char *) NULL); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { found = lookup_cmd_composition (newarg, &alias, &prefix, &cmd); } + CATCH (ex, RETURN_MASK_ALL) + { + except = ex; + } + END_CATCH + xfree (name); xfree (newarg); GDBSCM_HANDLE_GDB_EXCEPTION (except); diff --git a/gdb/guile/scm-ports.c b/gdb/guile/scm-ports.c index dcf7d2d..8967b92 100644 --- a/gdb/guile/scm-ports.c +++ b/gdb/guile/scm-ports.c @@ -263,20 +263,23 @@ fputsn_filtered (const char *s, size_t size, struct ui_file *stream) static void ioscm_write (SCM port, const void *data, size_t size) { - volatile struct gdb_exception except; /* If we're called on stdin, punt. */ if (scm_is_eq (port, input_port_scm)) return; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (scm_is_eq (port, error_port_scm)) fputsn_filtered (data, size, gdb_stderr); else fputsn_filtered (data, size, gdb_stdout); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH } /* Flush gdb's stdout or stderr. */ diff --git a/gdb/guile/scm-pretty-print.c b/gdb/guile/scm-pretty-print.c index 82cf96c..860cf8e 100644 --- a/gdb/guile/scm-pretty-print.c +++ b/gdb/guile/scm-pretty-print.c @@ -529,11 +529,10 @@ ppscm_pretty_print_one_value (SCM printer, struct value **out_value, struct gdbarch *gdbarch, const struct language_defn *language) { - volatile struct gdb_exception except; SCM result = SCM_BOOL_F; *out_value = NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { int rc; pretty_printer_worker_smob *w_smob @@ -568,6 +567,10 @@ ppscm_pretty_print_one_value (SCM printer, struct value **out_value, (_("invalid result from pretty-printer to-string"), result); } } + CATCH (except, RETURN_MASK_ALL) + { + } + END_CATCH return result; } diff --git a/gdb/guile/scm-symbol.c b/gdb/guile/scm-symbol.c index 1891237..99ef928 100644 --- a/gdb/guile/scm-symbol.c +++ b/gdb/guile/scm-symbol.c @@ -483,14 +483,17 @@ gdbscm_symbol_needs_frame_p (SCM self) symbol_smob *s_smob = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); struct symbol *symbol = s_smob->symbol; - volatile struct gdb_exception except; int result = 0; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { result = symbol_read_needs_frame (symbol); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return scm_from_bool (result); } @@ -523,7 +526,6 @@ gdbscm_symbol_value (SCM self, SCM rest) frame_smob *f_smob = NULL; struct frame_info *frame_info = NULL; struct value *value = NULL; - volatile struct gdb_exception except; gdbscm_parse_function_args (FUNC_NAME, SCM_ARG2, keywords, "#O", rest, &frame_pos, &frame_scm); @@ -536,7 +538,7 @@ gdbscm_symbol_value (SCM self, SCM rest) _("cannot get the value of a typedef")); } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (f_smob != NULL) { @@ -550,7 +552,11 @@ gdbscm_symbol_value (SCM self, SCM rest) value = read_var_value (symbol, frame_info); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return vlscm_scm_from_value (value); } @@ -571,8 +577,8 @@ gdbscm_lookup_symbol (SCM name_scm, SCM rest) int block_arg_pos = -1, domain_arg_pos = -1; struct field_of_this_result is_a_field_of_this; struct symbol *symbol = NULL; - volatile struct gdb_exception except; struct cleanup *cleanups; + struct gdb_exception except = exception_none; gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, keywords, "s#Oi", name_scm, &name, rest, @@ -597,18 +603,28 @@ gdbscm_lookup_symbol (SCM name_scm, SCM rest) { struct frame_info *selected_frame; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { selected_frame = get_selected_frame (_("no frame selected")); block = get_frame_block (selected_frame, NULL); } - GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + } + END_CATCH } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { symbol = lookup_symbol (name, block, domain, &is_a_field_of_this); } + CATCH (ex, RETURN_MASK_ALL) + { + except = ex; + } + END_CATCH + do_cleanups (cleanups); GDBSCM_HANDLE_GDB_EXCEPTION (except); @@ -630,8 +646,8 @@ gdbscm_lookup_global_symbol (SCM name_scm, SCM rest) int domain_arg_pos = -1; int domain = VAR_DOMAIN; struct symbol *symbol = NULL; - volatile struct gdb_exception except; struct cleanup *cleanups; + struct gdb_exception except = exception_none; gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, keywords, "s#i", name_scm, &name, rest, @@ -639,10 +655,16 @@ gdbscm_lookup_global_symbol (SCM name_scm, SCM rest) cleanups = make_cleanup (xfree, name); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { symbol = lookup_global_symbol (name, NULL, domain); } + CATCH (ex, RETURN_MASK_ALL) + { + except = ex; + } + END_CATCH + do_cleanups (cleanups); GDBSCM_HANDLE_GDB_EXCEPTION (except); diff --git a/gdb/guile/scm-symtab.c b/gdb/guile/scm-symtab.c index 03f616d..009a2b4 100644 --- a/gdb/guile/scm-symtab.c +++ b/gdb/guile/scm-symtab.c @@ -590,19 +590,22 @@ gdbscm_find_pc_line (SCM pc_scm) { ULONGEST pc_ull; struct symtab_and_line sal; - volatile struct gdb_exception except; init_sal (&sal); /* -Wall */ gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, NULL, "U", pc_scm, &pc_ull); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { CORE_ADDR pc = (CORE_ADDR) pc_ull; sal = find_pc_line (pc, 0); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return stscm_scm_from_sal (sal); } diff --git a/gdb/guile/scm-type.c b/gdb/guile/scm-type.c index d21a7ae..fa0c213 100644 --- a/gdb/guile/scm-type.c +++ b/gdb/guile/scm-type.c @@ -108,9 +108,8 @@ static char * tyscm_type_name (struct type *type, SCM *excp) { char *name = NULL; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct cleanup *old_chain; struct ui_file *stb; @@ -123,11 +122,12 @@ tyscm_type_name (struct type *type, SCM *excp) name = ui_file_xstrdup (stb, NULL); do_cleanups (old_chain); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { *excp = gdbscm_scm_from_gdb_exception (except); return NULL; } + END_CATCH return name; } @@ -239,7 +239,6 @@ tyscm_equal_p_type_smob (SCM type1_scm, SCM type2_scm) type_smob *type1_smob, *type2_smob; struct type *type1, *type2; int result = 0; - volatile struct gdb_exception except; SCM_ASSERT_TYPE (tyscm_is_type (type1_scm), type1_scm, SCM_ARG1, FUNC_NAME, type_smob_name); @@ -250,11 +249,15 @@ tyscm_equal_p_type_smob (SCM type1_scm, SCM type2_scm) type1 = type1_smob->type; type2 = type2_smob->type; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { result = types_deeply_equal (type1, type2); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return scm_from_bool (result); } @@ -628,12 +631,16 @@ gdbscm_type_sizeof (SCM self) type_smob *t_smob = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); struct type *type = t_smob->type; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { check_typedef (type); } + CATCH (except, RETURN_MASK_ALL) + { + } + END_CATCH + /* Ignore exceptions. */ return scm_from_long (TYPE_LENGTH (type)); @@ -648,13 +655,16 @@ gdbscm_type_strip_typedefs (SCM self) type_smob *t_smob = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); struct type *type = t_smob->type; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { type = check_typedef (type); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return tyscm_scm_from_type (type); } @@ -665,15 +675,18 @@ gdbscm_type_strip_typedefs (SCM self) static struct type * tyscm_get_composite (struct type *type) { - volatile struct gdb_exception except; for (;;) { - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { type = check_typedef (type); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH if (TYPE_CODE (type) != TYPE_CODE_PTR && TYPE_CODE (type) != TYPE_CODE_REF) @@ -702,7 +715,6 @@ tyscm_array_1 (SCM self, SCM n1_scm, SCM n2_scm, int is_vector, struct type *type = t_smob->type; long n1, n2 = 0; struct type *array = NULL; - volatile struct gdb_exception except; gdbscm_parse_function_args (func_name, SCM_ARG2, NULL, "l|l", n1_scm, &n1, n2_scm, &n2); @@ -721,13 +733,17 @@ tyscm_array_1 (SCM self, SCM n1_scm, SCM n2_scm, int is_vector, _("Array length must not be negative")); } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { array = lookup_array_range_type (type, n1, n2); if (is_vector) make_vector_type (array); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return tyscm_scm_from_type (array); } @@ -773,13 +789,16 @@ gdbscm_type_pointer (SCM self) type_smob *t_smob = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); struct type *type = t_smob->type; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { type = lookup_pointer_type (type); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return tyscm_scm_from_type (type); } @@ -832,13 +851,16 @@ gdbscm_type_reference (SCM self) type_smob *t_smob = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); struct type *type = t_smob->type; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { type = lookup_reference_type (type); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return tyscm_scm_from_type (type); } @@ -867,13 +889,16 @@ gdbscm_type_const (SCM self) type_smob *t_smob = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); struct type *type = t_smob->type; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { type = make_cv_type (1, 0, type, NULL); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return tyscm_scm_from_type (type); } @@ -887,13 +912,16 @@ gdbscm_type_volatile (SCM self) type_smob *t_smob = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); struct type *type = t_smob->type; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { type = make_cv_type (0, 1, type, NULL); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return tyscm_scm_from_type (type); } @@ -907,13 +935,16 @@ gdbscm_type_unqualified (SCM self) type_smob *t_smob = tyscm_get_type_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); struct type *type = t_smob->type; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { type = make_cv_type (0, 0, type, NULL); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return tyscm_scm_from_type (type); } @@ -1212,9 +1243,8 @@ static struct type * tyscm_lookup_typename (const char *type_name, const struct block *block) { struct type *type = NULL; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (startswith (type_name, "struct ")) type = lookup_struct (type_name + 7, NULL); @@ -1226,8 +1256,11 @@ tyscm_lookup_typename (const char *type_name, const struct block *block) type = lookup_typename (current_language, get_current_arch (), type_name, block, 0); } - if (except.reason < 0) - return NULL; + CATCH (except, RETURN_MASK_ALL) + { + return NULL; + } + END_CATCH return type; } diff --git a/gdb/guile/scm-value.c b/gdb/guile/scm-value.c index cacc55c..b10460d 100644 --- a/gdb/guile/scm-value.c +++ b/gdb/guile/scm-value.c @@ -143,7 +143,6 @@ vlscm_print_value_smob (SCM self, SCM port, scm_print_state *pstate) value_smob *v_smob = (value_smob *) SCM_SMOB_DATA (self); char *s = NULL; struct value_print_options opts; - volatile struct gdb_exception except; if (pstate->writingp) gdbscm_printf (port, "#<%s ", value_smob_name); @@ -157,7 +156,7 @@ vlscm_print_value_smob (SCM self, SCM port, scm_print_state *pstate) instead of writingp. */ opts.raw = !!pstate->writingp; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct ui_file *stb = mem_fileopen (); struct cleanup *old_chain = make_cleanup_ui_file_delete (stb); @@ -167,7 +166,11 @@ vlscm_print_value_smob (SCM self, SCM port, scm_print_state *pstate) do_cleanups (old_chain); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH if (s != NULL) { @@ -192,13 +195,16 @@ vlscm_equal_p_value_smob (SCM v1, SCM v2) const value_smob *v1_smob = (value_smob *) SCM_SMOB_DATA (v1); const value_smob *v2_smob = (value_smob *) SCM_SMOB_DATA (v2); int result = 0; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { result = value_equal (v1_smob->value, v2_smob->value); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return scm_from_bool (result); } @@ -360,7 +366,6 @@ gdbscm_make_lazy_value (SCM type_scm, SCM address_scm) struct value *value = NULL; SCM result; struct cleanup *cleanups; - volatile struct gdb_exception except; t_smob = tyscm_get_type_smob_arg_unsafe (type_scm, SCM_ARG1, FUNC_NAME); type = tyscm_type_smob_type (t_smob); @@ -372,11 +377,15 @@ gdbscm_make_lazy_value (SCM type_scm, SCM address_scm) /* There's no (current) need to wrap this in a TRY_CATCH, but for consistency and future-proofing we do. */ - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { value = value_from_contents_and_address (type, NULL, address); } - GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + } + END_CATCH result = vlscm_scm_from_value (value); @@ -396,13 +405,16 @@ gdbscm_value_optimized_out_p (SCM self) = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); struct value *value = v_smob->value; int opt = 0; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { opt = value_optimized_out (value); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return scm_from_bool (opt); } @@ -423,15 +435,18 @@ gdbscm_value_address (SCM self) struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ()); SCM address; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { res_val = value_addr (value); } - if (except.reason < 0) - address = SCM_BOOL_F; - else + CATCH (except, RETURN_MASK_ALL) + { + address = SCM_BOOL_F; + } + END_CATCH + + if (res_val != NULL) address = vlscm_scm_from_value (res_val); do_cleanups (cleanup); @@ -457,15 +472,18 @@ gdbscm_value_dereference (SCM self) SCM result; struct value *res_val = NULL; struct cleanup *cleanups; - volatile struct gdb_exception except; cleanups = make_cleanup_value_free_to_mark (value_mark ()); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { res_val = value_ind (value); } - GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + } + END_CATCH result = vlscm_scm_from_value (res_val); @@ -495,11 +513,10 @@ gdbscm_value_referenced_value (SCM self) SCM result; struct value *res_val = NULL; struct cleanup *cleanups; - volatile struct gdb_exception except; cleanups = make_cleanup_value_free_to_mark (value_mark ()); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { switch (TYPE_CODE (check_typedef (value_type (value)))) { @@ -514,7 +531,11 @@ gdbscm_value_referenced_value (SCM self) " neither a pointer nor a reference")); } } - GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + } + END_CATCH result = vlscm_scm_from_value (res_val); @@ -550,12 +571,11 @@ gdbscm_value_dynamic_type (SCM self) = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); struct value *value = v_smob->value; struct type *type = NULL; - volatile struct gdb_exception except; if (! SCM_UNBNDP (v_smob->type)) return v_smob->dynamic_type; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ()); @@ -594,7 +614,11 @@ gdbscm_value_dynamic_type (SCM self) do_cleanups (cleanup); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH if (type == NULL) v_smob->dynamic_type = gdbscm_value_type (self); @@ -619,11 +643,10 @@ vlscm_do_cast (SCM self, SCM type_scm, enum exp_opcode op, SCM result; struct value *res_val = NULL; struct cleanup *cleanups; - volatile struct gdb_exception except; cleanups = make_cleanup_value_free_to_mark (value_mark ()); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (op == UNOP_DYNAMIC_CAST) res_val = value_dynamic_cast (type, value); @@ -635,7 +658,11 @@ vlscm_do_cast (SCM self, SCM type_scm, enum exp_opcode op, res_val = value_cast (type, value); } } - GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + } + END_CATCH gdb_assert (res_val != NULL); result = vlscm_scm_from_value (res_val); @@ -686,7 +713,6 @@ gdbscm_value_field (SCM self, SCM field_scm) struct value *res_val = NULL; SCM result; struct cleanup *cleanups; - volatile struct gdb_exception except; SCM_ASSERT_TYPE (scm_is_string (field_scm), field_scm, SCM_ARG2, FUNC_NAME, _("string")); @@ -696,13 +722,17 @@ gdbscm_value_field (SCM self, SCM field_scm) field = gdbscm_scm_to_c_string (field_scm); make_cleanup (xfree, field); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct value *tmp = value; res_val = value_struct_elt (&tmp, NULL, field, NULL, NULL); } - GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + } + END_CATCH gdb_assert (res_val != NULL); result = vlscm_scm_from_value (res_val); @@ -730,7 +760,6 @@ gdbscm_value_subscript (SCM self, SCM index_scm) struct gdbarch *gdbarch; SCM result, except_scm; struct cleanup *cleanups; - volatile struct gdb_exception except; /* The sequencing here, as everywhere else, is important. We can't have existing cleanups when a Scheme exception is thrown. */ @@ -749,7 +778,7 @@ gdbscm_value_subscript (SCM self, SCM index_scm) gdbscm_throw (except_scm); } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct value *tmp = value; @@ -765,7 +794,11 @@ gdbscm_value_subscript (SCM self, SCM index_scm) res_val = value_subscript (tmp, value_as_long (index)); } - GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + } + END_CATCH gdb_assert (res_val != NULL); result = vlscm_scm_from_value (res_val); @@ -792,13 +825,16 @@ gdbscm_value_call (SCM self, SCM args) long args_count; struct value **vargs = NULL; SCM result = SCM_BOOL_F; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { ftype = check_typedef (value_type (function)); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH SCM_ASSERT_TYPE (TYPE_CODE (ftype) == TYPE_CODE_FUNC, self, SCM_ARG1, FUNC_NAME, @@ -832,7 +868,7 @@ gdbscm_value_call (SCM self, SCM args) gdb_assert (gdbscm_is_true (scm_null_p (args))); } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct cleanup *cleanup = make_cleanup_value_free_to_mark (mark); struct value *return_value; @@ -841,7 +877,11 @@ gdbscm_value_call (SCM self, SCM args) result = vlscm_scm_from_value (return_value); do_cleanups (cleanup); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH if (gdbscm_is_exception (result)) gdbscm_throw (result); @@ -861,17 +901,20 @@ gdbscm_value_to_bytevector (SCM self) size_t length = 0; const gdb_byte *contents = NULL; SCM bv; - volatile struct gdb_exception except; type = value_type (value); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { CHECK_TYPEDEF (type); length = TYPE_LENGTH (type); contents = value_contents (value); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH bv = scm_c_make_bytevector (length); memcpy (SCM_BYTEVECTOR_CONTENTS (bv), contents, length); @@ -902,27 +945,34 @@ gdbscm_value_to_bool (SCM self) struct value *value = v_smob->value; struct type *type; LONGEST l = 0; - volatile struct gdb_exception except; type = value_type (value); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { CHECK_TYPEDEF (type); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH SCM_ASSERT_TYPE (is_intlike (type, 1), self, SCM_ARG1, FUNC_NAME, _("integer-like gdb value")); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (TYPE_CODE (type) == TYPE_CODE_PTR) l = value_as_address (value); else l = value_as_long (value); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return scm_from_bool (l != 0); } @@ -938,27 +988,34 @@ gdbscm_value_to_integer (SCM self) struct value *value = v_smob->value; struct type *type; LONGEST l = 0; - volatile struct gdb_exception except; type = value_type (value); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { CHECK_TYPEDEF (type); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH SCM_ASSERT_TYPE (is_intlike (type, 1), self, SCM_ARG1, FUNC_NAME, _("integer-like gdb value")); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (TYPE_CODE (type) == TYPE_CODE_PTR) l = value_as_address (value); else l = value_as_long (value); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH if (TYPE_UNSIGNED (type)) return gdbscm_scm_from_ulongest (l); @@ -977,24 +1034,31 @@ gdbscm_value_to_real (SCM self) struct value *value = v_smob->value; struct type *type; DOUBLEST d = 0; - volatile struct gdb_exception except; type = value_type (value); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { CHECK_TYPEDEF (type); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH SCM_ASSERT_TYPE (is_intlike (type, 0) || TYPE_CODE (type) == TYPE_CODE_FLT, self, SCM_ARG1, FUNC_NAME, _("number")); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { d = value_as_double (value); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH /* TODO: Is there a better way to check if the value fits? */ if (d != (double) d) @@ -1045,7 +1109,6 @@ gdbscm_value_to_string (SCM self, SCM rest) struct type *char_type = NULL; SCM result; struct cleanup *cleanups; - volatile struct gdb_exception except; /* The sequencing here, as everywhere else, is important. We can't have existing cleanups when a Scheme exception is thrown. */ @@ -1081,11 +1144,15 @@ gdbscm_value_to_string (SCM self, SCM rest) /* We don't assume anything about the result of scm_port_conversion_strategy. From this point on, if errors is not 'errors, use 'substitute. */ - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { LA_GET_STRING (value, &buffer, &length, &char_type, &la_encoding); } - GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + } + END_CATCH /* If errors is "error" scm_from_stringn may throw a Scheme exception. Make sure we don't leak. This is done via scm_dynwind_begin, et.al. */ @@ -1131,7 +1198,7 @@ gdbscm_value_to_lazy_string (SCM self, SCM rest) int length = -1; SCM result = SCM_BOOL_F; /* -Wall */ struct cleanup *cleanups; - volatile struct gdb_exception except; + struct gdb_exception except = exception_none; /* The sequencing here, as everywhere else, is important. We can't have existing cleanups when a Scheme exception is thrown. */ @@ -1142,7 +1209,7 @@ gdbscm_value_to_lazy_string (SCM self, SCM rest) cleanups = make_cleanup (xfree, encoding); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct cleanup *inner_cleanup = make_cleanup_value_free_to_mark (value_mark ()); @@ -1155,6 +1222,12 @@ gdbscm_value_to_lazy_string (SCM self, SCM rest) do_cleanups (inner_cleanup); } + CATCH (ex, RETURN_MASK_ALL) + { + except = ex; + } + END_CATCH + do_cleanups (cleanups); GDBSCM_HANDLE_GDB_EXCEPTION (except); @@ -1184,14 +1257,17 @@ gdbscm_value_fetch_lazy_x (SCM self) value_smob *v_smob = vlscm_get_value_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME); struct value *value = v_smob->value; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (value_lazy (value)) value_fetch_lazy (value); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return SCM_UNSPECIFIED; } @@ -1207,12 +1283,11 @@ gdbscm_value_print (SCM self) struct value_print_options opts; char *s = NULL; SCM result; - volatile struct gdb_exception except; get_user_print_options (&opts); opts.deref_ref = 0; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct ui_file *stb = mem_fileopen (); struct cleanup *old_chain = make_cleanup_ui_file_delete (stb); @@ -1222,7 +1297,11 @@ gdbscm_value_print (SCM self) do_cleanups (old_chain); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH /* Use SCM_FAILED_CONVERSION_QUESTION_MARK to ensure this doesn't throw an error if the encoding fails. @@ -1246,7 +1325,6 @@ gdbscm_parse_and_eval (SCM expr_scm) struct value *res_val = NULL; SCM result; struct cleanup *cleanups; - volatile struct gdb_exception except; /* The sequencing here, as everywhere else, is important. We can't have existing cleanups when a Scheme exception is thrown. */ @@ -1257,11 +1335,15 @@ gdbscm_parse_and_eval (SCM expr_scm) cleanups = make_cleanup_value_free_to_mark (value_mark ()); make_cleanup (xfree, expr_str); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { res_val = parse_and_eval (expr_str); } - GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups); + } + END_CATCH gdb_assert (res_val != NULL); result = vlscm_scm_from_value (res_val); @@ -1282,15 +1364,18 @@ gdbscm_history_ref (SCM index) { int i; struct value *res_val = NULL; /* Initialize to appease gcc warning. */ - volatile struct gdb_exception except; gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, NULL, "i", index, &i); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { res_val = access_value_history (i); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return vlscm_scm_from_value (res_val); } @@ -1304,16 +1389,19 @@ gdbscm_history_append_x (SCM value) int res_index = -1; struct value *v; value_smob *v_smob; - volatile struct gdb_exception except; v_smob = vlscm_get_value_smob_arg_unsafe (value, SCM_ARG1, FUNC_NAME); v = v_smob->value; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { res_index = record_latest_value (v); } - GDBSCM_HANDLE_GDB_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDBSCM_HANDLE_GDB_EXCEPTION (except); + } + END_CATCH return scm_from_int (res_index); } diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index d15d05a..4d97915 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -2049,7 +2049,6 @@ i386_frame_cache_1 (struct frame_info *this_frame, static struct i386_frame_cache * i386_frame_cache (struct frame_info *this_frame, void **this_cache) { - volatile struct gdb_exception ex; struct i386_frame_cache *cache; if (*this_cache) @@ -2058,15 +2057,16 @@ i386_frame_cache (struct frame_info *this_frame, void **this_cache) cache = i386_alloc_frame_cache (); *this_cache = cache; - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { i386_frame_cache_1 (this_frame, cache); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error != NOT_AVAILABLE_ERROR) throw_exception (ex); } + END_CATCH return cache; } @@ -2216,7 +2216,6 @@ i386_epilogue_frame_sniffer (const struct frame_unwind *self, static struct i386_frame_cache * i386_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache) { - volatile struct gdb_exception ex; struct i386_frame_cache *cache; CORE_ADDR sp; @@ -2226,7 +2225,7 @@ i386_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache) cache = i386_alloc_frame_cache (); *this_cache = cache; - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { cache->pc = get_frame_func (this_frame); @@ -2240,11 +2239,12 @@ i386_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache) cache->base_p = 1; } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error != NOT_AVAILABLE_ERROR) throw_exception (ex); } + END_CATCH return cache; } @@ -2402,7 +2402,6 @@ i386_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache) struct gdbarch *gdbarch = get_frame_arch (this_frame); struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - volatile struct gdb_exception ex; struct i386_frame_cache *cache; CORE_ADDR addr; gdb_byte buf[4]; @@ -2412,7 +2411,7 @@ i386_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache) cache = i386_alloc_frame_cache (); - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { get_frame_register (this_frame, I386_ESP_REGNUM, buf); cache->base = extract_unsigned_integer (buf, 4, byte_order) - 4; @@ -2436,11 +2435,12 @@ i386_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache) cache->base_p = 1; } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error != NOT_AVAILABLE_ERROR) throw_exception (ex); } + END_CATCH *this_cache = cache; return cache; diff --git a/gdb/inf-loop.c b/gdb/inf-loop.c index adeb659..429cd73 100644 --- a/gdb/inf-loop.c +++ b/gdb/inf-loop.c @@ -50,13 +50,12 @@ inferior_event_handler (enum inferior_event_type event_type, error status. If an error occurs while getting an event from the target, just cancel the current command. */ { - volatile struct gdb_exception ex; - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { fetch_inferior_event (client_data); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ALL) { bpstat_clear_actions (); do_all_intermediate_continuations (1); @@ -64,6 +63,7 @@ inferior_event_handler (enum inferior_event_type event_type, throw_exception (ex); } + END_CATCH } break; @@ -111,18 +111,21 @@ inferior_event_handler (enum inferior_event_type event_type, are only run when the command list is all done. */ if (interpreter_async) { - volatile struct gdb_exception e; check_frame_language_change (); /* Don't propagate breakpoint commands errors. Either we're stopping or some command resumes the inferior. The user will be informed. */ - TRY_CATCH (e, RETURN_MASK_ALL) + TRY { bpstat_do_actions (); } - exception_print (gdb_stderr, e); + CATCH (e, RETURN_MASK_ALL) + { + exception_print (gdb_stderr, e); + } + END_CATCH } break; diff --git a/gdb/infcall.c b/gdb/infcall.c index 350572b..705e377 100644 --- a/gdb/infcall.c +++ b/gdb/infcall.c @@ -383,7 +383,7 @@ get_function_name (CORE_ADDR funaddr, char *buf, int buf_size) static struct gdb_exception run_inferior_call (struct thread_info *call_thread, CORE_ADDR real_pc) { - volatile struct gdb_exception e; + struct gdb_exception caught_error = exception_none; int saved_in_infcall = call_thread->control.in_infcall; ptid_t call_thread_ptid = call_thread->ptid; int saved_sync_execution = sync_execution; @@ -401,7 +401,7 @@ run_inferior_call (struct thread_info *call_thread, CORE_ADDR real_pc) /* We want stop_registers, please... */ call_thread->control.proceed_to_finish = 1; - TRY_CATCH (e, RETURN_MASK_ALL) + TRY { int was_sync = sync_execution; @@ -423,6 +423,11 @@ run_inferior_call (struct thread_info *call_thread, CORE_ADDR real_pc) async_disable_stdin (); } } + CATCH (e, RETURN_MASK_ALL) + { + caught_error = e; + } + END_CATCH /* At this point the current thread may have changed. Refresh CALL_THREAD as it could be invalid if its thread has exited. */ @@ -435,7 +440,7 @@ run_inferior_call (struct thread_info *call_thread, CORE_ADDR real_pc) If all error()s out of proceed ended up calling normal_stop (and perhaps they should; it already does in the special case of error out of resume()), then we wouldn't need this. */ - if (e.reason < 0) + if (caught_error.reason < 0) { if (call_thread != NULL) breakpoint_auto_delete (call_thread->control.stop_bpstat); @@ -446,7 +451,7 @@ run_inferior_call (struct thread_info *call_thread, CORE_ADDR real_pc) sync_execution = saved_sync_execution; - return e; + return caught_error; } /* A cleanup function that calls delete_std_terminate_breakpoint. */ diff --git a/gdb/infcmd.c b/gdb/infcmd.c index e92b777..0211b5d 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -411,7 +411,6 @@ strip_bg_char (const char *args, int *bg_char_p) void post_create_inferior (struct target_ops *target, int from_tty) { - volatile struct gdb_exception ex; /* Be sure we own the terminal in case write operations are performed. */ target_terminal_ours (); @@ -426,15 +425,16 @@ post_create_inferior (struct target_ops *target, int from_tty) if the PC is unavailable (e.g., we're opening a core file with missing registers info), ignore it. */ stop_pc = 0; - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { stop_pc = regcache_read_pc (get_current_regcache ()); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error != NOT_AVAILABLE_ERROR) throw_exception (ex); } + END_CATCH if (exec_bfd) { @@ -1669,19 +1669,21 @@ finish_command_continuation (void *arg, int err) if (TYPE_CODE (value_type) != TYPE_CODE_VOID) { - volatile struct gdb_exception ex; struct value *func; func = read_var_value (a->function, get_current_frame ()); - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { /* print_return_value can throw an exception in some circumstances. We need to catch this so that we still delete the breakpoint. */ print_return_value (func, value_type); } - if (ex.reason < 0) - exception_print (gdb_stdout, ex); + CATCH (ex, RETURN_MASK_ALL) + { + exception_print (gdb_stdout, ex); + } + END_CATCH } } diff --git a/gdb/infrun.c b/gdb/infrun.c index b8c5d8e..0f8f531 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -6030,10 +6030,7 @@ insert_exception_resume_breakpoint (struct thread_info *tp, struct frame_info *frame, struct symbol *sym) { - volatile struct gdb_exception e; - - /* We want to ignore errors here. */ - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { struct symbol *vsym; struct value *value; @@ -6062,6 +6059,11 @@ insert_exception_resume_breakpoint (struct thread_info *tp, inferior_thread ()->control.exception_resume_breakpoint = bp; } } + CATCH (e, RETURN_MASK_ERROR) + { + /* We want to ignore errors here. */ + } + END_CATCH } /* A helper for check_exception_resume that sets an @@ -6102,7 +6104,6 @@ static void check_exception_resume (struct execution_control_state *ecs, struct frame_info *frame) { - volatile struct gdb_exception e; struct bound_probe probe; struct symbol *func; @@ -6121,7 +6122,7 @@ check_exception_resume (struct execution_control_state *ecs, if (!func) return; - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { const struct block *b; struct block_iterator iter; @@ -6158,6 +6159,10 @@ check_exception_resume (struct execution_control_state *ecs, } } } + CATCH (e, RETURN_MASK_ERROR) + { + } + END_CATCH } static void @@ -6200,7 +6205,6 @@ keep_going (struct execution_control_state *ecs) } else { - volatile struct gdb_exception e; struct regcache *regcache = get_current_regcache (); int remove_bp; int remove_wps; @@ -6240,16 +6244,17 @@ keep_going (struct execution_control_state *ecs) clear_step_over_info (); /* Stop stepping if inserting breakpoints fails. */ - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { insert_breakpoints (); } - if (e.reason < 0) + CATCH (e, RETURN_MASK_ERROR) { exception_print (gdb_stderr, e); stop_waiting (ecs); return; } + END_CATCH ecs->event_thread->control.trap_expected = (remove_bp || remove_wps); @@ -816,7 +816,6 @@ jit_reader_try_read_symtab (struct jit_code_entry *code_entry, int status; jit_dbg_reader_data priv_data; struct gdb_reader_funcs *funcs; - volatile struct gdb_exception e; struct gdb_symbol_callbacks callbacks = { jit_object_open_impl, @@ -839,12 +838,17 @@ jit_reader_try_read_symtab (struct jit_code_entry *code_entry, gdb_mem = xmalloc (code_entry->symfile_size); status = 1; - TRY_CATCH (e, RETURN_MASK_ALL) - if (target_read_memory (code_entry->symfile_addr, gdb_mem, - code_entry->symfile_size)) + TRY + { + if (target_read_memory (code_entry->symfile_addr, gdb_mem, + code_entry->symfile_size)) + status = 0; + } + CATCH (e, RETURN_MASK_ALL) + { status = 0; - if (e.reason < 0) - status = 0; + } + END_CATCH if (status) { diff --git a/gdb/linespec.c b/gdb/linespec.c index 265742d..9ec4a5e 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -2260,22 +2260,22 @@ parse_linespec (linespec_parser *parser, const char **argptr) if (token.type == LSTOKEN_COLON) { char *user_filename; - volatile struct gdb_exception ex; /* Get the current token again and extract the filename. */ token = linespec_lexer_lex_one (parser); user_filename = copy_token_string (token); /* Check if the input is a filename. */ - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { PARSER_RESULT (parser)->file_symtabs = symtabs_from_filename (user_filename); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { file_exception = ex; } + END_CATCH if (file_exception.reason >= 0) { @@ -3106,7 +3106,6 @@ find_linespec_symbols (struct linespec_state *state, struct cleanup *cleanup; char *canon; const char *lookup_name; - volatile struct gdb_exception except; cleanup = demangle_for_lookup (name, state->language->la_language, &lookup_name); @@ -3194,7 +3193,7 @@ find_linespec_symbols (struct linespec_state *state, if (!VEC_empty (symbolp, classes)) { /* Now locate a list of suitable methods named METHOD. */ - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { find_method (state, file_symtabs, klass, method, classes, symbols, minsyms); @@ -3202,11 +3201,12 @@ find_linespec_symbols (struct linespec_state *state, /* If successful, we're done. If NOT_FOUND_ERROR was not thrown, rethrow the exception that we did get. */ - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { if (except.error != NOT_FOUND_ERROR) throw_exception (except); } + END_CATCH } } diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index 627280e..22ce842 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -1202,16 +1202,15 @@ linux_nat_attach (struct target_ops *ops, const char *args, int from_tty) struct lwp_info *lp; int status; ptid_t ptid; - volatile struct gdb_exception ex; /* Make sure we report all signals during attach. */ linux_nat_pass_signals (ops, 0, NULL); - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { linux_ops->to_attach (ops, args, from_tty); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { pid_t pid = parse_pid_to_attach (args); struct buffer buffer; @@ -1232,6 +1231,7 @@ linux_nat_attach (struct target_ops *ops, const char *args, int from_tty) else throw_error (ex.error, "%s", message); } + END_CATCH /* The ptrace base target adds the main thread with (pid,0,0) format. Decorate it with lwp info. */ diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c index d9884f3..ea0d4cd 100644 --- a/gdb/linux-tdep.c +++ b/gdb/linux-tdep.c @@ -1545,7 +1545,6 @@ linux_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size) char *note_data = NULL; gdb_byte *auxv; int auxv_len; - volatile struct gdb_exception e; if (! gdbarch_iterate_over_regset_sections_p (gdbarch)) return NULL; @@ -1572,12 +1571,16 @@ linux_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size) } /* Thread register information. */ - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { update_thread_list (); } - if (e.reason < 0) - exception_print (gdb_stderr, e); + CATCH (e, RETURN_MASK_ERROR) + { + exception_print (gdb_stderr, e); + } + END_CATCH + thread_args.gdbarch = gdbarch; thread_args.pid = ptid_get_pid (inferior_ptid); thread_args.obfd = obfd; diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c index f7f0d38..0669750 100644 --- a/gdb/linux-thread-db.c +++ b/gdb/linux-thread-db.c @@ -611,14 +611,13 @@ enable_thread_event_reporting (void) static int thread_db_find_new_threads_silently (ptid_t ptid) { - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { thread_db_find_new_threads_2 (ptid, 1); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { if (libthread_db_debug) exception_fprintf (gdb_stdlog, except, @@ -648,6 +647,8 @@ thread_db_find_new_threads_silently (ptid_t ptid) return 1; } } + END_CATCH + return 0; } @@ -1681,7 +1682,6 @@ static int find_new_threads_once (struct thread_db_info *info, int iteration, td_err_e *errp) { - volatile struct gdb_exception except; struct callback_data data; td_err_e err = TD_ERR; @@ -1691,7 +1691,7 @@ find_new_threads_once (struct thread_db_info *info, int iteration, /* See comment in thread_db_update_thread_list. */ gdb_assert (!target_has_execution || thread_db_use_events ()); - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { /* Iterate over all user-space threads to discover new threads. */ err = info->td_ta_thr_iter_p (info->thread_agent, @@ -1705,9 +1705,12 @@ find_new_threads_once (struct thread_db_info *info, int iteration, if (libthread_db_debug) { - if (except.reason < 0) - exception_fprintf (gdb_stdlog, except, - "Warning: find_new_threads_once: "); + CATCH (except, RETURN_MASK_ERROR) + { + exception_fprintf (gdb_stdlog, except, + "Warning: find_new_threads_once: "); + } + END_CATCH fprintf_unfiltered (gdb_stdlog, _("Found %d new threads in iteration %d.\n"), @@ -364,9 +364,7 @@ static int catch_command_errors (catch_command_errors_ftype *command, char *arg, int from_tty) { - volatile struct gdb_exception e; - - TRY_CATCH (e, RETURN_MASK_ALL) + TRY { int was_sync = sync_execution; @@ -374,7 +372,13 @@ catch_command_errors (catch_command_errors_ftype *command, maybe_wait_sync_command_done (was_sync); } - return handle_command_errors (e); + CATCH (e, RETURN_MASK_ALL) + { + return handle_command_errors (e); + } + END_CATCH + + return 1; } /* Type of the command callback passed to catch_command_errors_const. */ @@ -387,9 +391,7 @@ static int catch_command_errors_const (catch_command_errors_const_ftype *command, const char *arg, int from_tty) { - volatile struct gdb_exception e; - - TRY_CATCH (e, RETURN_MASK_ALL) + TRY { int was_sync = sync_execution; @@ -397,7 +399,13 @@ catch_command_errors_const (catch_command_errors_const_ftype *command, maybe_wait_sync_command_done (was_sync); } - return handle_command_errors (e); + CATCH (e, RETURN_MASK_ALL) + { + return handle_command_errors (e); + } + END_CATCH + + return 1; } /* Type of this option. */ diff --git a/gdb/mi/mi-cmd-stack.c b/gdb/mi/mi-cmd-stack.c index 18a357e..1b863eb 100644 --- a/gdb/mi/mi-cmd-stack.c +++ b/gdb/mi/mi-cmd-stack.c @@ -537,15 +537,13 @@ list_arg_or_local (const struct frame_arg *arg, enum what_to_list what, if (arg->val || arg->error) { - volatile struct gdb_exception except; + const char *error_message = NULL; if (arg->error) - except.message = arg->error; + error_message = arg->error; else { - /* TRY_CATCH has two statements, wrap it in a block. */ - - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { struct value_print_options opts; @@ -554,10 +552,15 @@ list_arg_or_local (const struct frame_arg *arg, enum what_to_list what, common_val_print (arg->val, stb, 0, &opts, language_def (SYMBOL_LANGUAGE (arg->sym))); } + CATCH (except, RETURN_MASK_ERROR) + { + error_message = except.message; + } + END_CATCH } - if (except.message) + if (error_message != NULL) fprintf_filtered (stb, _("<error reading variable: %s>"), - except.message); + error_message); ui_out_field_stream (uiout, "value", stb); } diff --git a/gdb/mi/mi-interp.c b/gdb/mi/mi-interp.c index f10b0bb..99ce385 100644 --- a/gdb/mi/mi-interp.c +++ b/gdb/mi/mi-interp.c @@ -808,7 +808,6 @@ mi_breakpoint_created (struct breakpoint *b) { struct mi_interp *mi = top_level_interpreter_data (); struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ()); - volatile struct gdb_exception e; if (mi_suppress_notification.breakpoint) return; @@ -827,8 +826,15 @@ mi_breakpoint_created (struct breakpoint *b) breakpoint_created notifications. So, we use ui_out_redirect. */ ui_out_redirect (mi_uiout, mi->event_channel); - TRY_CATCH (e, RETURN_MASK_ERROR) - gdb_breakpoint_query (mi_uiout, b->number, NULL); + TRY + { + gdb_breakpoint_query (mi_uiout, b->number, NULL); + } + CATCH (e, RETURN_MASK_ERROR) + { + } + END_CATCH + ui_out_redirect (mi_uiout, NULL); gdb_flush (mi->event_channel); @@ -862,7 +868,6 @@ mi_breakpoint_modified (struct breakpoint *b) { struct mi_interp *mi = top_level_interpreter_data (); struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ()); - volatile struct gdb_exception e; if (mi_suppress_notification.breakpoint) return; @@ -881,8 +886,15 @@ mi_breakpoint_modified (struct breakpoint *b) breakpoint_created notifications. So, we use ui_out_redirect. */ ui_out_redirect (mi_uiout, mi->event_channel); - TRY_CATCH (e, RETURN_MASK_ERROR) - gdb_breakpoint_query (mi_uiout, b->number, NULL); + TRY + { + gdb_breakpoint_query (mi_uiout, b->number, NULL); + } + CATCH (e, RETURN_MASK_ERROR) + { + } + END_CATCH + ui_out_redirect (mi_uiout, NULL); gdb_flush (mi->event_channel); diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index 7412f7d..acbdb55 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -2080,7 +2080,6 @@ mi_execute_command (const char *cmd, int from_tty) { char *token; struct mi_parse *command = NULL; - volatile struct gdb_exception exception; /* This is to handle EOF (^D). We just quit gdb. */ /* FIXME: we should call some API function here. */ @@ -2089,18 +2088,19 @@ mi_execute_command (const char *cmd, int from_tty) target_log_command (cmd); - TRY_CATCH (exception, RETURN_MASK_ALL) + TRY { command = mi_parse (cmd, &token); } - if (exception.reason < 0) + CATCH (exception, RETURN_MASK_ALL) { mi_print_exception (token, exception); xfree (token); } - else + END_CATCH + + if (command != NULL) { - volatile struct gdb_exception result; ptid_t previous_ptid = inferior_ptid; command->token = token; @@ -2112,17 +2112,18 @@ mi_execute_command (const char *cmd, int from_tty) timestamp (command->cmd_start); } - TRY_CATCH (result, RETURN_MASK_ALL) + TRY { captured_mi_execute_command (current_uiout, command); } - if (result.reason < 0) + CATCH (result, RETURN_MASK_ALL) { /* The command execution failed and error() was called somewhere. */ mi_print_exception (command->token, result); mi_out_rewind (current_uiout); } + END_CATCH bpstat_do_actions (); diff --git a/gdb/p-valprint.c b/gdb/p-valprint.c index 043f98b..a66ff44 100644 --- a/gdb/p-valprint.c +++ b/gdb/p-valprint.c @@ -725,7 +725,6 @@ pascal_object_print_value (struct type *type, const gdb_byte *valaddr, const char *basename = type_name_no_tag (baseclass); const gdb_byte *base_valaddr = NULL; int thisoffset; - volatile struct gdb_exception ex; int skip = 0; if (BASETYPE_VIA_VIRTUAL (type, i)) @@ -745,17 +744,18 @@ pascal_object_print_value (struct type *type, const gdb_byte *valaddr, thisoffset = offset; - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { boffset = baseclass_offset (type, i, valaddr, offset, address, val); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error == NOT_AVAILABLE_ERROR) skip = -1; else skip = 1; } + END_CATCH if (skip == 0) { diff --git a/gdb/parse.c b/gdb/parse.c index 09fb0b3..ec23dbb 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -1133,7 +1133,6 @@ parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc, const struct block *block, int comma, int void_context_p, int *out_subexp) { - volatile struct gdb_exception except; struct cleanup *old_chain, *inner_chain; const struct language_defn *lang = NULL; struct parser_state ps; @@ -1215,12 +1214,12 @@ parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc, inner_chain = make_cleanup_restore_current_language (); set_language (lang->la_language); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (lang->la_parser (&ps)) lang->la_error (NULL); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { if (! parse_completion) { @@ -1228,6 +1227,7 @@ parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc, throw_exception (except); } } + END_CATCH reallocate_expout (&ps); @@ -1283,17 +1283,17 @@ parse_expression_for_completion (const char *string, char **name, struct expression *exp = NULL; struct value *val; int subexp; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { parse_completion = 1; exp = parse_exp_in_context (&string, 0, 0, 0, 0, &subexp); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { /* Nothing, EXP remains NULL. */ } + END_CATCH parse_completion = 0; if (exp == NULL) diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c index 6c6eacf..3afbff2 100644 --- a/gdb/ppc-linux-tdep.c +++ b/gdb/ppc-linux-tdep.c @@ -1231,9 +1231,8 @@ ppc_linux_spe_context (int wordsize, enum bfd_endian byte_order, if (!ptid_equal (spe_context_cache_ptid, inferior_ptid)) { struct target_ops *target = ¤t_target; - volatile struct gdb_exception ex; - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { /* We do not call target_translate_tls_address here, because svr4_fetch_objfile_link_map may invalidate the frame chain, @@ -1248,8 +1247,11 @@ ppc_linux_spe_context (int wordsize, enum bfd_endian byte_order, spe_context_cache_ptid = inferior_ptid; } - if (ex.reason < 0) - return 0; + CATCH (ex, RETURN_MASK_ERROR) + { + return 0; + } + END_CATCH } /* Read variable value. */ diff --git a/gdb/printcmd.c b/gdb/printcmd.c index cdbed30..05c68a0 100644 --- a/gdb/printcmd.c +++ b/gdb/printcmd.c @@ -1692,15 +1692,14 @@ do_one_display (struct display *d) if (d->exp == NULL) { - volatile struct gdb_exception ex; - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { innermost_block = NULL; d->exp = parse_expression (d->exp_string); d->block = innermost_block; } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ALL) { /* Can't re-parse the expression. Disable this display item. */ d->enabled_p = 0; @@ -1708,6 +1707,7 @@ do_one_display (struct display *d) d->exp_string, ex.message); return; } + END_CATCH } if (d->block) @@ -1731,7 +1731,6 @@ do_one_display (struct display *d) printf_filtered (": "); if (d->format.size) { - volatile struct gdb_exception ex; annotate_display_format (); @@ -1755,7 +1754,7 @@ do_one_display (struct display *d) annotate_display_value (); - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { struct value *val; CORE_ADDR addr; @@ -1766,13 +1765,15 @@ do_one_display (struct display *d) addr = gdbarch_addr_bits_remove (d->exp->gdbarch, addr); do_examine (d->format, d->exp->gdbarch, addr); } - if (ex.reason < 0) - fprintf_filtered (gdb_stdout, _("<error: %s>\n"), ex.message); + CATCH (ex, RETURN_MASK_ERROR) + { + fprintf_filtered (gdb_stdout, _("<error: %s>\n"), ex.message); + } + END_CATCH } else { struct value_print_options opts; - volatile struct gdb_exception ex; annotate_display_format (); @@ -1791,15 +1792,19 @@ do_one_display (struct display *d) get_formatted_print_options (&opts, d->format.format); opts.raw = d->format.raw; - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { struct value *val; val = evaluate_expression (d->exp); print_formatted (val, d->format.size, &opts, gdb_stdout); } - if (ex.reason < 0) - fprintf_filtered (gdb_stdout, _("<error: %s>"), ex.message); + CATCH (ex, RETURN_MASK_ERROR) + { + fprintf_filtered (gdb_stdout, _("<error: %s>"), ex.message); + } + END_CATCH + printf_filtered ("\n"); } @@ -1975,13 +1980,12 @@ print_variable_and_value (const char *name, struct symbol *var, struct frame_info *frame, struct ui_file *stream, int indent) { - volatile struct gdb_exception except; if (!name) name = SYMBOL_PRINT_NAME (var); fprintf_filtered (stream, "%s%s = ", n_spaces (2 * indent), name); - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { struct value *val; struct value_print_options opts; @@ -1995,9 +1999,13 @@ print_variable_and_value (const char *name, struct symbol *var, function. */ frame = NULL; } - if (except.reason < 0) - fprintf_filtered(stream, "<error reading variable %s (%s)>", name, - except.message); + CATCH (except, RETURN_MASK_ERROR) + { + fprintf_filtered(stream, "<error reading variable %s (%s)>", name, + except.message); + } + END_CATCH + fprintf_filtered (stream, "\n"); } diff --git a/gdb/python/py-arch.c b/gdb/python/py-arch.c index 49c654b..4fece39 100644 --- a/gdb/python/py-arch.c +++ b/gdb/python/py-arch.c @@ -199,7 +199,6 @@ archpy_disassemble (PyObject *self, PyObject *args, PyObject *kw) char *as = NULL; struct ui_file *memfile = mem_fileopen (); PyObject *insn_dict = PyDict_New (); - volatile struct gdb_exception except; if (insn_dict == NULL) { @@ -217,11 +216,11 @@ archpy_disassemble (PyObject *self, PyObject *args, PyObject *kw) return NULL; /* PyList_Append Sets the exception. */ } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { insn_len = gdb_print_insn (gdbarch, pc, memfile, NULL); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { Py_DECREF (result_list); ui_file_delete (memfile); @@ -229,6 +228,7 @@ archpy_disassemble (PyObject *self, PyObject *args, PyObject *kw) gdbpy_convert_exception (except); return NULL; } + END_CATCH as = ui_file_xstrdup (memfile, NULL); if (PyDict_SetItemString (insn_dict, "addr", diff --git a/gdb/python/py-block.c b/gdb/python/py-block.c index fb6a6b6..6c0f5cb 100644 --- a/gdb/python/py-block.c +++ b/gdb/python/py-block.c @@ -373,19 +373,22 @@ gdbpy_block_for_pc (PyObject *self, PyObject *args) gdb_py_ulongest pc; const struct block *block = NULL; struct compunit_symtab *cust = NULL; - volatile struct gdb_exception except; if (!PyArg_ParseTuple (args, GDB_PY_LLU_ARG, &pc)) return NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { cust = find_pc_compunit_symtab (pc); if (cust != NULL && COMPUNIT_OBJFILE (cust) != NULL) block = block_for_pc (pc); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH if (cust == NULL || COMPUNIT_OBJFILE (cust) == NULL) { diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c index 7807e4e..dcf1d5a 100644 --- a/gdb/python/py-breakpoint.c +++ b/gdb/python/py-breakpoint.c @@ -114,7 +114,6 @@ bppy_set_enabled (PyObject *self, PyObject *newvalue, void *closure) { gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self; int cmp; - volatile struct gdb_exception except; BPPY_SET_REQUIRE_VALID (self_bp); @@ -136,14 +135,18 @@ bppy_set_enabled (PyObject *self, PyObject *newvalue, void *closure) if (cmp < 0) return -1; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (cmp == 1) enable_breakpoint (self_bp->bp); else disable_breakpoint (self_bp->bp); } - GDB_PY_SET_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_SET_HANDLE_EXCEPTION (except); + } + END_CATCH return 0; } @@ -227,7 +230,6 @@ bppy_set_task (PyObject *self, PyObject *newvalue, void *closure) gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self; long id; int valid_id = 0; - volatile struct gdb_exception except; BPPY_SET_REQUIRE_VALID (self_bp); @@ -242,11 +244,15 @@ bppy_set_task (PyObject *self, PyObject *newvalue, void *closure) if (! gdb_py_int_as_long (newvalue, &id)) return -1; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { valid_id = valid_task_id (id); } - GDB_PY_SET_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_SET_HANDLE_EXCEPTION (except); + } + END_CATCH if (! valid_id) { @@ -278,15 +284,18 @@ static PyObject * bppy_delete_breakpoint (PyObject *self, PyObject *args) { gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self; - volatile struct gdb_exception except; BPPY_REQUIRE_VALID (self_bp); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { delete_breakpoint (self_bp->bp); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH Py_RETURN_NONE; } @@ -298,7 +307,6 @@ bppy_set_ignore_count (PyObject *self, PyObject *newvalue, void *closure) { gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self; long value; - volatile struct gdb_exception except; BPPY_SET_REQUIRE_VALID (self_bp); @@ -321,11 +329,15 @@ bppy_set_ignore_count (PyObject *self, PyObject *newvalue, void *closure) if (value < 0) value = 0; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { set_ignore_count (self_bp->number, (int) value, 0); } - GDB_PY_SET_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_SET_HANDLE_EXCEPTION (except); + } + END_CATCH return 0; } @@ -429,7 +441,7 @@ bppy_set_condition (PyObject *self, PyObject *newvalue, void *closure) { char *exp; gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self; - volatile struct gdb_exception except; + struct gdb_exception except = exception_none; BPPY_SET_REQUIRE_VALID (self_bp); @@ -448,10 +460,15 @@ bppy_set_condition (PyObject *self, PyObject *newvalue, void *closure) return -1; } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { set_breakpoint_condition (self_bp->bp, exp, 0); } + CATCH (ex, RETURN_MASK_ALL) + { + except = ex; + } + END_CATCH if (newvalue != Py_None) xfree (exp); @@ -468,7 +485,6 @@ bppy_get_commands (PyObject *self, void *closure) gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self; struct breakpoint *bp = self_bp->bp; long length; - volatile struct gdb_exception except; struct ui_file *string_file; struct cleanup *chain; PyObject *result; @@ -483,17 +499,18 @@ bppy_get_commands (PyObject *self, void *closure) chain = make_cleanup_ui_file_delete (string_file); ui_out_redirect (current_uiout, string_file); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { print_command_lines (current_uiout, breakpoint_commands (bp), 0); } ui_out_redirect (current_uiout, NULL); - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { do_cleanups (chain); gdbpy_convert_exception (except); return NULL; } + END_CATCH cmdstr = ui_file_xstrdup (string_file, &length); make_cleanup (xfree, cmdstr); @@ -619,7 +636,6 @@ bppy_init (PyObject *self, PyObject *args, PyObject *kwargs) PyObject *temporary = NULL; int internal_bp = 0; int temporary_bp = 0; - volatile struct gdb_exception except; if (! PyArg_ParseTupleAndKeywords (args, kwargs, "s|iiOO", keywords, &spec, &type, &access_type, @@ -644,7 +660,7 @@ bppy_init (PyObject *self, PyObject *args, PyObject *kwargs) bppy_pending_object->number = -1; bppy_pending_object->bp = NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { char *copy = xstrdup (spec); struct cleanup *cleanup = make_cleanup (xfree, copy); @@ -681,13 +697,14 @@ bppy_init (PyObject *self, PyObject *args, PyObject *kwargs) do_cleanups (cleanup); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { PyErr_Format (except.reason == RETURN_QUIT ? PyExc_KeyboardInterrupt : PyExc_RuntimeError, "%s", except.message); return -1; } + END_CATCH BPPY_SET_REQUIRE_VALID ((gdbpy_breakpoint_object *) self); return 0; diff --git a/gdb/python/py-cmd.c b/gdb/python/py-cmd.c index a5e96d6..1d89912 100644 --- a/gdb/python/py-cmd.c +++ b/gdb/python/py-cmd.c @@ -537,7 +537,6 @@ cmdpy_init (PyObject *self, PyObject *args, PyObject *kw) int cmdtype; int completetype = -1; char *docstring = NULL; - volatile struct gdb_exception except; struct cmd_list_element **cmd_list; char *cmd_name, *pfx_name; static char *keywords[] = { "name", "command_class", "completer_class", @@ -637,7 +636,7 @@ cmdpy_init (PyObject *self, PyObject *args, PyObject *kw) Py_INCREF (self); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct cmd_list_element *cmd; @@ -668,7 +667,7 @@ cmdpy_init (PyObject *self, PyObject *args, PyObject *kw) set_cmd_completer_handle_brkchars (cmd, cmdpy_completer_handle_brkchars); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { xfree (cmd_name); xfree (docstring); @@ -679,6 +678,8 @@ cmdpy_init (PyObject *self, PyObject *args, PyObject *kw) "%s", except.message); return -1; } + END_CATCH + return 0; } diff --git a/gdb/python/py-finishbreakpoint.c b/gdb/python/py-finishbreakpoint.c index 43f6807..34e9643 100644 --- a/gdb/python/py-finishbreakpoint.c +++ b/gdb/python/py-finishbreakpoint.c @@ -93,7 +93,6 @@ bpfinishpy_pre_stop_hook (struct gdbpy_breakpoint_object *bp_obj) { struct finish_breakpoint_object *self_finishbp = (struct finish_breakpoint_object *) bp_obj; - volatile struct gdb_exception except; /* Can compute return_value only once. */ gdb_assert (!self_finishbp->return_value); @@ -101,7 +100,7 @@ bpfinishpy_pre_stop_hook (struct gdbpy_breakpoint_object *bp_obj) if (!self_finishbp->return_type) return; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct value *function = value_object_to_value (self_finishbp->function_value); @@ -121,11 +120,12 @@ bpfinishpy_pre_stop_hook (struct gdbpy_breakpoint_object *bp_obj) self_finishbp->return_value = Py_None; } } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { gdbpy_convert_exception (except); gdbpy_print_stack (); } + END_CATCH } /* Triggered when gdbpy_should_stop has triggered the `stop' callback @@ -134,19 +134,19 @@ bpfinishpy_pre_stop_hook (struct gdbpy_breakpoint_object *bp_obj) void bpfinishpy_post_stop_hook (struct gdbpy_breakpoint_object *bp_obj) { - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { /* Can't delete it here, but it will be removed at the next stop. */ disable_breakpoint (bp_obj->bp); gdb_assert (bp_obj->bp->disposition == disp_del); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { gdbpy_convert_exception (except); gdbpy_print_stack (); } + END_CATCH } /* Python function to create a new breakpoint. */ @@ -166,7 +166,6 @@ bpfinishpy_init (PyObject *self, PyObject *args, PyObject *kwargs) PyObject *internal = NULL; int internal_bp = 0; CORE_ADDR finish_pc, pc; - volatile struct gdb_exception except; char *addr_str, small_buf[100]; struct symbol *function; @@ -174,7 +173,7 @@ bpfinishpy_init (PyObject *self, PyObject *args, PyObject *kwargs) &frame_obj, &internal)) return -1; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { /* Default frame to newest frame if necessary. */ if (frame_obj == NULL) @@ -212,12 +211,14 @@ bpfinishpy_init (PyObject *self, PyObject *args, PyObject *kwargs) } } } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { gdbpy_convert_exception (except); return -1; } - else if (PyErr_Occurred ()) + END_CATCH + + if (PyErr_Occurred ()) return -1; thread = pid_to_thread_id (inferior_ptid); @@ -243,7 +244,7 @@ bpfinishpy_init (PyObject *self, PyObject *args, PyObject *kwargs) self_bpfinish->return_type = NULL; self_bpfinish->function_value = NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (get_frame_pc_if_available (frame, &pc)) { @@ -269,11 +270,12 @@ bpfinishpy_init (PyObject *self, PyObject *args, PyObject *kwargs) } } } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { /* Just swallow. Either the return type or the function value remain NULL. */ } + END_CATCH if (self_bpfinish->return_type == NULL || self_bpfinish->function_value == NULL) { @@ -289,7 +291,7 @@ bpfinishpy_init (PyObject *self, PyObject *args, PyObject *kwargs) bppy_pending_object->number = -1; bppy_pending_object->bp = NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { /* Set a breakpoint on the return address. */ finish_pc = get_frame_pc (prev_frame); @@ -306,7 +308,11 @@ bpfinishpy_init (PyObject *self, PyObject *args, PyObject *kwargs) &bkpt_breakpoint_ops, 0, 1, internal_bp, 0); } - GDB_PY_SET_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_SET_HANDLE_EXCEPTION (except); + } + END_CATCH self_bpfinish->py_bp.bp->frame_id = frame_id; self_bpfinish->py_bp.is_finish_bp = 1; @@ -347,7 +353,6 @@ bpfinishpy_out_of_scope (struct finish_breakpoint_object *bpfinish_obj) static int bpfinishpy_detect_out_scope_cb (struct breakpoint *b, void *args) { - volatile struct gdb_exception except; struct breakpoint *bp_stopped = (struct breakpoint *) args; PyObject *py_bp = (PyObject *) b->py_bp_object; struct gdbarch *garch = b->gdbarch ? b->gdbarch : get_current_arch (); @@ -362,18 +367,19 @@ bpfinishpy_detect_out_scope_cb (struct breakpoint *b, void *args) /* Check scope if not currently stopped at the FinishBreakpoint. */ if (b != bp_stopped) { - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (b->pspace == current_inferior ()->pspace && (!target_has_registers || frame_find_by_id (b->frame_id) == NULL)) bpfinishpy_out_of_scope (finish_bp); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { gdbpy_convert_exception (except); gdbpy_print_stack (); } + END_CATCH } } diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c index 9ef8608..cd6e859 100644 --- a/gdb/python/py-frame.c +++ b/gdb/python/py-frame.c @@ -101,13 +101,16 @@ static PyObject * frapy_is_valid (PyObject *self, PyObject *args) { struct frame_info *frame = NULL; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { frame = frame_object_to_frame_info (self); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH if (frame == NULL) Py_RETURN_FALSE; @@ -125,19 +128,19 @@ frapy_name (PyObject *self, PyObject *args) char *name = NULL; enum language lang; PyObject *result; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { FRAPY_REQUIRE_VALID (self, frame); find_frame_funname (frame, &name, &lang, NULL); } - - if (except.reason < 0) - xfree (name); - - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + xfree (name); + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH if (name) { @@ -161,15 +164,18 @@ frapy_type (PyObject *self, PyObject *args) { struct frame_info *frame; enum frame_type type = NORMAL_FRAME;/* Initialize to appease gcc warning. */ - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { FRAPY_REQUIRE_VALID (self, frame); type = get_frame_type (frame); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return PyInt_FromLong (type); } @@ -182,13 +188,16 @@ frapy_arch (PyObject *self, PyObject *args) { struct frame_info *frame = NULL; /* Initialize to appease gcc warning. */ frame_object *obj = (frame_object *) self; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { FRAPY_REQUIRE_VALID (self, frame); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return gdbarch_to_arch_object (obj->gdbarch); } @@ -200,14 +209,17 @@ static PyObject * frapy_unwind_stop_reason (PyObject *self, PyObject *args) { struct frame_info *frame = NULL; /* Initialize to appease gcc warning. */ - volatile struct gdb_exception except; enum unwind_stop_reason stop_reason; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { FRAPY_REQUIRE_VALID (self, frame); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH stop_reason = get_frame_unwind_stop_reason (frame); @@ -222,15 +234,18 @@ frapy_pc (PyObject *self, PyObject *args) { CORE_ADDR pc = 0; /* Initialize to appease gcc warning. */ struct frame_info *frame; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { FRAPY_REQUIRE_VALID (self, frame); pc = get_frame_pc (frame); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return gdb_py_long_from_ulongest (pc); } @@ -241,14 +256,13 @@ frapy_pc (PyObject *self, PyObject *args) static PyObject * frapy_read_register (PyObject *self, PyObject *args) { - volatile struct gdb_exception except; const char *regnum_str; struct value *val = NULL; if (!PyArg_ParseTuple (args, "s", ®num_str)) return NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct frame_info *frame; int regnum; @@ -264,7 +278,11 @@ frapy_read_register (PyObject *self, PyObject *args) if (val == NULL) PyErr_SetString (PyExc_ValueError, _("Unknown register.")); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return val == NULL ? NULL : value_to_value_object (val); } @@ -277,14 +295,17 @@ frapy_block (PyObject *self, PyObject *args) { struct frame_info *frame; const struct block *block = NULL, *fn_block; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { FRAPY_REQUIRE_VALID (self, frame); block = get_frame_block (frame, NULL); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH for (fn_block = block; fn_block != NULL && BLOCK_FUNCTION (fn_block) == NULL; @@ -316,15 +337,18 @@ frapy_function (PyObject *self, PyObject *args) { struct symbol *sym = NULL; struct frame_info *frame; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { FRAPY_REQUIRE_VALID (self, frame); sym = find_pc_function (get_frame_address_in_block (frame)); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH if (sym) return symbol_to_symbol_object (sym); @@ -339,13 +363,12 @@ PyObject * frame_info_to_frame_object (struct frame_info *frame) { frame_object *frame_obj; - volatile struct gdb_exception except; frame_obj = PyObject_New (frame_object, &frame_object_type); if (frame_obj == NULL) return NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { /* Try to get the previous frame, to determine if this is the last frame @@ -365,12 +388,14 @@ frame_info_to_frame_object (struct frame_info *frame) } frame_obj->gdbarch = get_frame_arch (frame); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { Py_DECREF (frame_obj); gdbpy_convert_exception (except); return NULL; } + END_CATCH + return (PyObject *) frame_obj; } @@ -382,16 +407,19 @@ static PyObject * frapy_older (PyObject *self, PyObject *args) { struct frame_info *frame, *prev = NULL; - volatile struct gdb_exception except; PyObject *prev_obj = NULL; /* Initialize to appease gcc warning. */ - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { FRAPY_REQUIRE_VALID (self, frame); prev = get_prev_frame (frame); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH if (prev) prev_obj = (PyObject *) frame_info_to_frame_object (prev); @@ -412,16 +440,19 @@ static PyObject * frapy_newer (PyObject *self, PyObject *args) { struct frame_info *frame, *next = NULL; - volatile struct gdb_exception except; PyObject *next_obj = NULL; /* Initialize to appease gcc warning. */ - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { FRAPY_REQUIRE_VALID (self, frame); next = get_next_frame (frame); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH if (next) next_obj = (PyObject *) frame_info_to_frame_object (next); @@ -442,17 +473,20 @@ frapy_find_sal (PyObject *self, PyObject *args) { struct frame_info *frame; struct symtab_and_line sal; - volatile struct gdb_exception except; PyObject *sal_obj = NULL; /* Initialize to appease gcc warning. */ - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { FRAPY_REQUIRE_VALID (self, frame); find_frame_sal (frame, &sal); sal_obj = symtab_and_line_to_sal_object (sal); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return sal_obj; } @@ -471,7 +505,6 @@ frapy_read_var (PyObject *self, PyObject *args) PyObject *sym_obj, *block_obj = NULL; struct symbol *var = NULL; /* gcc-4.3.2 false warning. */ struct value *val = NULL; - volatile struct gdb_exception except; if (!PyArg_ParseTuple (args, "O|O", &sym_obj, &block_obj)) return NULL; @@ -483,7 +516,6 @@ frapy_read_var (PyObject *self, PyObject *args) char *var_name; const struct block *block = NULL; struct cleanup *cleanup; - volatile struct gdb_exception except; var_name = python_string_to_target_string (sym_obj); if (!var_name) @@ -502,7 +534,7 @@ frapy_read_var (PyObject *self, PyObject *args) } } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { FRAPY_REQUIRE_VALID (self, frame); @@ -510,12 +542,13 @@ frapy_read_var (PyObject *self, PyObject *args) block = get_frame_block (frame, NULL); var = lookup_symbol (var_name, block, VAR_DOMAIN, NULL); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { do_cleanups (cleanup); gdbpy_convert_exception (except); return NULL; } + END_CATCH if (!var) { @@ -535,13 +568,17 @@ frapy_read_var (PyObject *self, PyObject *args) return NULL; } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { FRAPY_REQUIRE_VALID (self, frame); val = read_var_value (var, frame); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return value_to_value_object (val); } @@ -552,15 +589,18 @@ static PyObject * frapy_select (PyObject *self, PyObject *args) { struct frame_info *fi; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { FRAPY_REQUIRE_VALID (self, fi); select_frame (fi); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH Py_RETURN_NONE; } @@ -572,13 +612,16 @@ PyObject * gdbpy_newest_frame (PyObject *self, PyObject *args) { struct frame_info *frame = NULL; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { frame = get_current_frame (); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return frame_info_to_frame_object (frame); } @@ -590,13 +633,16 @@ PyObject * gdbpy_selected_frame (PyObject *self, PyObject *args) { struct frame_info *frame = NULL; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { frame = get_selected_frame ("No frame is currently selected."); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return frame_info_to_frame_object (frame); } diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c index 5531d2b..e3336b1 100644 --- a/gdb/python/py-framefilter.c +++ b/gdb/python/py-framefilter.c @@ -201,9 +201,8 @@ mi_should_print (struct symbol *sym, enum mi_print_types type) static enum ext_lang_bt_status py_print_type (struct ui_out *out, struct value *val) { - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct type *type; struct ui_file *stb; @@ -216,11 +215,12 @@ py_print_type (struct ui_out *out, struct value *val) ui_out_field_stream (out, "type", stb); do_cleanups (cleanup); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { gdbpy_convert_exception (except); return EXT_LANG_BT_ERROR; } + END_CATCH return EXT_LANG_BT_OK; } @@ -242,7 +242,6 @@ py_print_value (struct ui_out *out, struct value *val, const struct language_defn *language) { int should_print = 0; - volatile struct gdb_exception except; int local_indent = (4 * indent); /* Never set an indent level for common_val_print if MI. */ @@ -257,15 +256,16 @@ py_print_value (struct ui_out *out, struct value *val, { struct type *type = NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { type = check_typedef (value_type (val)); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { gdbpy_convert_exception (except); return EXT_LANG_BT_ERROR; } + END_CATCH if (args_type == MI_PRINT_ALL_VALUES) should_print = 1; @@ -280,7 +280,7 @@ py_print_value (struct ui_out *out, struct value *val, if (should_print) { - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct ui_file *stb; struct cleanup *cleanup; @@ -291,11 +291,12 @@ py_print_value (struct ui_out *out, struct value *val, ui_out_field_stream (out, "value", stb); do_cleanups (cleanup); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { gdbpy_convert_exception (except); return EXT_LANG_BT_ERROR; } + END_CATCH } return EXT_LANG_BT_OK; @@ -363,7 +364,6 @@ py_print_single_arg (struct ui_out *out, const struct language_defn *language) { struct value *val; - volatile struct gdb_exception except; enum ext_lang_bt_status retval = EXT_LANG_BT_OK; if (fa != NULL) @@ -376,7 +376,7 @@ py_print_single_arg (struct ui_out *out, else val = fv; - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { struct cleanup *cleanups = make_cleanup (null_cleanup, NULL); @@ -473,8 +473,11 @@ py_print_single_arg (struct ui_out *out, do_cleanups (cleanups); } - if (except.reason < 0) - gdbpy_convert_exception (except); + CATCH (except, RETURN_MASK_ERROR) + { + gdbpy_convert_exception (except); + } + END_CATCH return retval; } @@ -499,7 +502,6 @@ enumerate_args (PyObject *iter, { PyObject *item; struct value_print_options opts; - volatile struct gdb_exception except; get_user_print_options (&opts); @@ -511,15 +513,16 @@ enumerate_args (PyObject *iter, opts.deref_ref = 1; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { annotate_frame_args (); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { gdbpy_convert_exception (except); goto error; } + END_CATCH /* Collect the first argument outside of the loop, so output of commas in the argument output is correct. At the end of the @@ -578,16 +581,17 @@ enumerate_args (PyObject *iter, goto error; } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { read_frame_arg (sym, frame, &arg, &entryarg); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { xfree (sym_name); gdbpy_convert_exception (except); goto error; } + END_CATCH /* The object has not provided a value, so this is a frame argument to be read by GDB. In this case we have to @@ -612,12 +616,12 @@ enumerate_args (PyObject *iter, { if (arg.entry_kind != print_entry_values_only) { - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { ui_out_text (out, ", "); ui_out_wrap_hint (out, " "); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { xfree (arg.error); xfree (entryarg.error); @@ -625,6 +629,7 @@ enumerate_args (PyObject *iter, gdbpy_convert_exception (except); goto error; } + END_CATCH } if (py_print_single_arg (out, NULL, &entryarg, NULL, &opts, @@ -664,30 +669,32 @@ enumerate_args (PyObject *iter, item = PyIter_Next (iter); if (item != NULL) { - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { ui_out_text (out, ", "); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { Py_DECREF (item); gdbpy_convert_exception (except); goto error; } + END_CATCH } else if (PyErr_Occurred ()) goto error; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { annotate_arg_end (); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { Py_DECREF (item); gdbpy_convert_exception (except); goto error; } + END_CATCH } return EXT_LANG_BT_OK; @@ -729,7 +736,6 @@ enumerate_locals (PyObject *iter, struct value *val; enum ext_lang_bt_status success = EXT_LANG_BT_ERROR; struct symbol *sym; - volatile struct gdb_exception except; int local_indent = 8 + (8 * indent); struct cleanup *locals_cleanups; @@ -761,16 +767,17 @@ enumerate_locals (PyObject *iter, /* If the object did not provide a value, read it. */ if (val == NULL) { - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { val = read_var_value (sym, frame); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { gdbpy_convert_exception (except); do_cleanups (locals_cleanups); goto error; } + END_CATCH } /* With PRINT_NO_VALUES, MI does not emit a tuple normally as @@ -781,7 +788,7 @@ enumerate_locals (PyObject *iter, if (print_args_field || args_type != NO_VALUES) make_cleanup_ui_out_tuple_begin_end (out, NULL); } - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { if (! ui_out_is_mi_like_p (out)) { @@ -794,12 +801,13 @@ enumerate_locals (PyObject *iter, if (! ui_out_is_mi_like_p (out)) ui_out_text (out, " = "); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { gdbpy_convert_exception (except); do_cleanups (locals_cleanups); goto error; } + END_CATCH if (args_type == MI_PRINT_SIMPLE_VALUES) { @@ -838,15 +846,16 @@ enumerate_locals (PyObject *iter, do_cleanups (locals_cleanups); - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { ui_out_text (out, "\n"); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { gdbpy_convert_exception (except); goto error; } + END_CATCH } if (item == NULL && PyErr_Occurred ()) @@ -947,40 +956,41 @@ py_print_args (PyObject *filter, { PyObject *args_iter = get_py_iter_from_func (filter, "frame_args"); struct cleanup *old_chain = make_cleanup_py_xdecref (args_iter); - volatile struct gdb_exception except; if (args_iter == NULL) goto args_error; make_cleanup_ui_out_list_begin_end (out, "args"); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { annotate_frame_args (); if (! ui_out_is_mi_like_p (out)) ui_out_text (out, " ("); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { gdbpy_convert_exception (except); goto args_error; } + END_CATCH if (args_iter != Py_None) if (enumerate_args (args_iter, out, args_type, 0, frame) == EXT_LANG_BT_ERROR) goto args_error; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (! ui_out_is_mi_like_p (out)) ui_out_text (out, ")"); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { gdbpy_convert_exception (except); goto args_error; } + END_CATCH do_cleanups (old_chain); return EXT_LANG_BT_OK; @@ -1018,7 +1028,6 @@ py_print_frame (PyObject *filter, int flags, struct value_print_options opts; PyObject *py_inf_frame; int print_level, print_frame_info, print_args, print_locals; - volatile struct gdb_exception except; /* Extract print settings from FLAGS. */ print_level = (flags & PRINT_LEVEL) ? 1 : 0; @@ -1042,15 +1051,16 @@ py_print_frame (PyObject *filter, int flags, if (frame == NULL) return EXT_LANG_BT_ERROR; - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { gdbarch = get_frame_arch (frame); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { gdbpy_convert_exception (except); return EXT_LANG_BT_ERROR; } + END_CATCH /* stack-list-variables. */ if (print_locals && print_args && ! print_frame_info) @@ -1074,16 +1084,17 @@ py_print_frame (PyObject *filter, int flags, and are printed with indention. */ if (indent > 0) { - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { ui_out_spaces (out, indent*4); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { gdbpy_convert_exception (except); do_cleanups (cleanup_stack); return EXT_LANG_BT_ERROR; } + END_CATCH } /* The address is required for frame annotations, and also for @@ -1113,11 +1124,10 @@ py_print_frame (PyObject *filter, int flags, { struct frame_info **slot; int level; - volatile struct gdb_exception except; slot = (struct frame_info **) htab_find_slot (levels_printed, frame, INSERT); - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { level = frame_relative_level (frame); @@ -1137,12 +1147,13 @@ py_print_frame (PyObject *filter, int flags, level); } } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { gdbpy_convert_exception (except); do_cleanups (cleanup_stack); return EXT_LANG_BT_ERROR; } + END_CATCH } if (print_frame_info) @@ -1151,19 +1162,20 @@ py_print_frame (PyObject *filter, int flags, print nothing. */ if (opts.addressprint && has_addr) { - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { annotate_frame_address (); ui_out_field_core_addr (out, "addr", gdbarch, address); annotate_frame_address_end (); ui_out_text (out, " in "); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { gdbpy_convert_exception (except); do_cleanups (cleanup_stack); return EXT_LANG_BT_ERROR; } + END_CATCH } /* Print frame function name. */ @@ -1218,7 +1230,7 @@ py_print_frame (PyObject *filter, int flags, return EXT_LANG_BT_ERROR; } - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { annotate_frame_function_name (); if (function == NULL) @@ -1226,12 +1238,14 @@ py_print_frame (PyObject *filter, int flags, else ui_out_field_string (out, "func", function); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { gdbpy_convert_exception (except); do_cleanups (cleanup_stack); return EXT_LANG_BT_ERROR; } + END_CATCH + do_cleanups (py_func_cleanup); } } @@ -1251,16 +1265,17 @@ py_print_frame (PyObject *filter, int flags, /* File name/source/line number information. */ if (print_frame_info) { - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { annotate_frame_source_begin (); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { gdbpy_convert_exception (except); do_cleanups (cleanup_stack); return EXT_LANG_BT_ERROR; } + END_CATCH if (PyObject_HasAttrString (filter, "filename")) { @@ -1285,7 +1300,7 @@ py_print_frame (PyObject *filter, int flags, } make_cleanup (xfree, filename); - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { ui_out_wrap_hint (out, " "); ui_out_text (out, " at "); @@ -1293,12 +1308,13 @@ py_print_frame (PyObject *filter, int flags, ui_out_field_string (out, "file", filename); annotate_frame_source_file_end (); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { gdbpy_convert_exception (except); do_cleanups (cleanup_stack); return EXT_LANG_BT_ERROR; } + END_CATCH } do_cleanups (py_fn_cleanup); } @@ -1319,18 +1335,19 @@ py_print_frame (PyObject *filter, int flags, if (py_line != Py_None) { line = PyLong_AsLong (py_line); - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { ui_out_text (out, ":"); annotate_frame_source_line (); ui_out_field_int (out, "line", line); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { gdbpy_convert_exception (except); do_cleanups (cleanup_stack); return EXT_LANG_BT_ERROR; } + END_CATCH } do_cleanups (py_line_cleanup); } @@ -1340,17 +1357,18 @@ py_print_frame (PyObject *filter, int flags, elided frames, so if MI output detected do not send newline. */ if (! ui_out_is_mi_like_p (out)) { - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { annotate_frame_end (); ui_out_text (out, "\n"); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { gdbpy_convert_exception (except); do_cleanups (cleanup_stack); return EXT_LANG_BT_ERROR; } + END_CATCH } if (print_locals) @@ -1503,22 +1521,22 @@ gdbpy_apply_frame_filter (const struct extension_language_defn *extlang, struct cleanup *cleanups; enum ext_lang_bt_status success = EXT_LANG_BT_ERROR; PyObject *iterable; - volatile struct gdb_exception except; PyObject *item; htab_t levels_printed; if (!gdb_python_initialized) return EXT_LANG_BT_NO_FILTERS; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { gdbarch = get_frame_arch (frame); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { /* Let gdb try to print the stack trace. */ return EXT_LANG_BT_NO_FILTERS; } + END_CATCH cleanups = ensure_python_env (gdbarch, current_language); diff --git a/gdb/python/py-gdb-readline.c b/gdb/python/py-gdb-readline.c index 7a5c853..0cf4dfd 100644 --- a/gdb/python/py-gdb-readline.c +++ b/gdb/python/py-gdb-readline.c @@ -37,18 +37,18 @@ gdbpy_readline_wrapper (FILE *sys_stdin, FILE *sys_stdout, { int n; char *p = NULL, *q; - volatile struct gdb_exception except; - - TRY_CATCH (except, RETURN_MASK_ALL) - p = command_line_input (prompt, 0, "python"); - - /* Detect user interrupt (Ctrl-C). */ - if (except.reason == RETURN_QUIT) - return NULL; + TRY + { + p = command_line_input (prompt, 0, "python"); + } /* Handle errors by raising Python exceptions. */ - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { + /* Detect user interrupt (Ctrl-C). */ + if (except.reason == RETURN_QUIT) + return NULL; + /* The thread state is nulled during gdbpy_readline_wrapper, with the original value saved in the following undocumented variable (see Python's Parser/myreadline.c and @@ -58,6 +58,7 @@ gdbpy_readline_wrapper (FILE *sys_stdin, FILE *sys_stdout, PyEval_SaveThread (); return NULL; } + END_CATCH /* Detect EOF (Ctrl-D). */ if (p == NULL) diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c index 5d13e07..fe8a705 100644 --- a/gdb/python/py-inferior.c +++ b/gdb/python/py-inferior.c @@ -395,13 +395,18 @@ infpy_threads (PyObject *self, PyObject *args) struct threadlist_entry *entry; inferior_object *inf_obj = (inferior_object *) self; PyObject *tuple; - volatile struct gdb_exception except; INFPY_REQUIRE_VALID (inf_obj); - TRY_CATCH (except, RETURN_MASK_ALL) - update_thread_list (); - GDB_PY_HANDLE_EXCEPTION (except); + TRY + { + update_thread_list (); + } + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH tuple = PyTuple_New (inf_obj->nthreads); if (!tuple) @@ -503,7 +508,6 @@ infpy_read_memory (PyObject *self, PyObject *args, PyObject *kw) void *buffer = NULL; membuf_object *membuf_obj; PyObject *addr_obj, *length_obj, *result; - volatile struct gdb_exception except; static char *keywords[] = { "address", "length", NULL }; if (! PyArg_ParseTupleAndKeywords (args, kw, "OO", keywords, @@ -514,17 +518,18 @@ infpy_read_memory (PyObject *self, PyObject *args, PyObject *kw) || get_addr_from_python (length_obj, &length) < 0) return NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { buffer = xmalloc (length); read_memory (addr, buffer, length); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { xfree (buffer); GDB_PY_HANDLE_EXCEPTION (except); } + END_CATCH membuf_obj = PyObject_New (membuf_object, &membuf_object_type); if (membuf_obj == NULL) @@ -557,11 +562,11 @@ infpy_read_memory (PyObject *self, PyObject *args, PyObject *kw) static PyObject * infpy_write_memory (PyObject *self, PyObject *args, PyObject *kw) { + struct gdb_exception except = exception_none; Py_ssize_t buf_len; const char *buffer; CORE_ADDR addr, length; PyObject *addr_obj, *length_obj = NULL; - volatile struct gdb_exception except; static char *keywords[] = { "address", "buffer", "length", NULL }; #ifdef IS_PY3K Py_buffer pybuf; @@ -588,10 +593,16 @@ infpy_write_memory (PyObject *self, PyObject *args, PyObject *kw) else if (get_addr_from_python (length_obj, &length) < 0) goto fail; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { write_memory_with_notification (addr, (gdb_byte *) buffer, length); } + CATCH (ex, RETURN_MASK_ALL) + { + except = ex; + } + END_CATCH + #ifdef IS_PY3K PyBuffer_Release (&pybuf); #endif @@ -701,10 +712,10 @@ get_char_buffer (PyObject *self, Py_ssize_t segment, char **ptrptr) static PyObject * infpy_search_memory (PyObject *self, PyObject *args, PyObject *kw) { + struct gdb_exception except = exception_none; CORE_ADDR start_addr, length; static char *keywords[] = { "address", "length", "pattern", NULL }; PyObject *start_addr_obj, *length_obj; - volatile struct gdb_exception except; Py_ssize_t pattern_size; const void *buffer; CORE_ADDR found_addr; @@ -760,12 +771,18 @@ infpy_search_memory (PyObject *self, PyObject *args, PyObject *kw) goto fail; } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { found = target_search_memory (start_addr, length, buffer, pattern_size, &found_addr); } + CATCH (ex, RETURN_MASK_ALL) + { + except = ex; + } + END_CATCH + #ifdef IS_PY3K PyBuffer_Release (&pybuf); #endif diff --git a/gdb/python/py-infthread.c b/gdb/python/py-infthread.c index 9a9a2e6..4d0a020 100644 --- a/gdb/python/py-infthread.c +++ b/gdb/python/py-infthread.c @@ -147,15 +147,18 @@ static PyObject * thpy_switch (PyObject *self, PyObject *args) { thread_object *thread_obj = (thread_object *) self; - volatile struct gdb_exception except; THPY_REQUIRE_VALID (thread_obj); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { switch_to_thread (thread_obj->thread->ptid); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH Py_RETURN_NONE; } diff --git a/gdb/python/py-lazy-string.c b/gdb/python/py-lazy-string.c index 9c0f7a4..c9774ab 100644 --- a/gdb/python/py-lazy-string.c +++ b/gdb/python/py-lazy-string.c @@ -96,7 +96,6 @@ stpy_convert_to_value (PyObject *self, PyObject *args) { lazy_string_object *self_string = (lazy_string_object *) self; struct value *val = NULL; - volatile struct gdb_exception except; if (self_string->address == 0) { @@ -105,11 +104,15 @@ stpy_convert_to_value (PyObject *self, PyObject *args) return NULL; } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { val = value_at_lazy (self_string->type, self_string->address); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return value_to_value_object (val); } diff --git a/gdb/python/py-linetable.c b/gdb/python/py-linetable.c index ff1716b..195a8b3 100644 --- a/gdb/python/py-linetable.c +++ b/gdb/python/py-linetable.c @@ -172,18 +172,21 @@ ltpy_get_pcs_for_line (PyObject *self, PyObject *args) linetable_entry_object *result; VEC (CORE_ADDR) *pcs = NULL; PyObject *tuple; - volatile struct gdb_exception except; LTPY_REQUIRE_VALID (self, symtab); if (! PyArg_ParseTuple (args, GDB_PY_LL_ARG, &py_line)) return NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { pcs = find_pcs_for_symtab_line (symtab, py_line, &best_entry); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH tuple = build_line_table_tuple_from_pcs (py_line, pcs); VEC_free (CORE_ADDR, pcs); diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c index 0a10623..157d200 100644 --- a/gdb/python/py-objfile.c +++ b/gdb/python/py-objfile.c @@ -131,15 +131,18 @@ objfpy_get_build_id (PyObject *self, void *closure) objfile_object *obj = (objfile_object *) self; struct objfile *objfile = obj->objfile; const struct elf_build_id *build_id = NULL; - volatile struct gdb_exception except; OBJFPY_REQUIRE_VALID (obj); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { build_id = build_id_bfd_get (objfile->obfd); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH if (build_id != NULL) { @@ -386,20 +389,23 @@ objfpy_add_separate_debug_file (PyObject *self, PyObject *args, PyObject *kw) objfile_object *obj = (objfile_object *) self; const char *file_name; int symfile_flags = 0; - volatile struct gdb_exception except; OBJFPY_REQUIRE_VALID (obj); if (!PyArg_ParseTupleAndKeywords (args, kw, "s", keywords, &file_name)) return NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { bfd *abfd = symfile_bfd_open (file_name); symbol_file_add_separate (abfd, file_name, symfile_flags, obj->objfile); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH Py_RETURN_NONE; } diff --git a/gdb/python/py-param.c b/gdb/python/py-param.c index 2fe5be6..06b9ae9 100644 --- a/gdb/python/py-param.c +++ b/gdb/python/py-param.c @@ -662,7 +662,6 @@ parmpy_init (PyObject *self, PyObject *args, PyObject *kwds) int parmclass, cmdtype; PyObject *enum_values = NULL; struct cmd_list_element **set_list, **show_list; - volatile struct gdb_exception except; if (! PyArg_ParseTuple (args, "sii|O", &name, &cmdtype, &parmclass, &enum_values)) @@ -724,14 +723,14 @@ parmpy_init (PyObject *self, PyObject *args, PyObject *kwds) Py_INCREF (self); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { add_setshow_generic (parmclass, (enum command_class) cmdtype, cmd_name, obj, set_doc, show_doc, doc, set_list, show_list); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { xfree (cmd_name); xfree (set_doc); @@ -743,6 +742,8 @@ parmpy_init (PyObject *self, PyObject *args, PyObject *kwds) "%s", except.message); return -1; } + END_CATCH + return 0; } diff --git a/gdb/python/py-prettyprint.c b/gdb/python/py-prettyprint.c index f4c91d0..d8579fa 100644 --- a/gdb/python/py-prettyprint.c +++ b/gdb/python/py-prettyprint.c @@ -213,11 +213,10 @@ find_pretty_printer (PyObject *value) static PyObject * pretty_print_one_value (PyObject *printer, struct value **out_value) { - volatile struct gdb_exception except; PyObject *result = NULL; *out_value = NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { result = PyObject_CallMethodObjArgs (printer, gdbpy_to_string_cst, NULL); if (result) @@ -233,6 +232,10 @@ pretty_print_one_value (PyObject *printer, struct value **out_value) } } } + CATCH (except, RETURN_MASK_ALL) + { + } + END_CATCH return result; } @@ -803,13 +806,16 @@ gdbpy_get_varobj_pretty_printer (struct value *value) { PyObject *val_obj; PyObject *pretty_printer = NULL; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { value = value_copy (value); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH val_obj = value_to_value_object (value); if (! val_obj) diff --git a/gdb/python/py-symbol.c b/gdb/python/py-symbol.c index 729bc64..4306f61 100644 --- a/gdb/python/py-symbol.c +++ b/gdb/python/py-symbol.c @@ -192,16 +192,19 @@ static PyObject * sympy_needs_frame (PyObject *self, void *closure) { struct symbol *symbol = NULL; - volatile struct gdb_exception except; int result = 0; SYMPY_REQUIRE_VALID (self, symbol); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { result = symbol_read_needs_frame (symbol); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH if (result) Py_RETURN_TRUE; @@ -246,7 +249,6 @@ sympy_value (PyObject *self, PyObject *args) struct frame_info *frame_info = NULL; PyObject *frame_obj = NULL; struct value *value = NULL; - volatile struct gdb_exception except; if (!PyArg_ParseTuple (args, "|O", &frame_obj)) return NULL; @@ -264,7 +266,7 @@ sympy_value (PyObject *self, PyObject *args) return NULL; } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (frame_obj != NULL) { @@ -278,7 +280,11 @@ sympy_value (PyObject *self, PyObject *args) value = read_var_value (symbol, frame_info); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return value_to_value_object (value); } @@ -365,7 +371,6 @@ gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw) struct symbol *symbol = NULL; PyObject *block_obj = NULL, *ret_tuple, *sym_obj, *bool_obj; const struct block *block = NULL; - volatile struct gdb_exception except; if (! PyArg_ParseTupleAndKeywords (args, kw, "s|O!i", keywords, &name, &block_object_type, &block_obj, &domain)) @@ -376,21 +381,28 @@ gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw) else { struct frame_info *selected_frame; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { selected_frame = get_selected_frame (_("No frame selected.")); block = get_frame_block (selected_frame, NULL); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { symbol = lookup_symbol (name, block, domain, &is_a_field_of_this); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH ret_tuple = PyTuple_New (2); if (!ret_tuple) @@ -430,17 +442,20 @@ gdbpy_lookup_global_symbol (PyObject *self, PyObject *args, PyObject *kw) static char *keywords[] = { "name", "domain", NULL }; struct symbol *symbol = NULL; PyObject *sym_obj; - volatile struct gdb_exception except; if (! PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &name, &domain)) return NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { symbol = lookup_global_symbol (name, NULL, domain); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH if (symbol) { diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c index 72d4dcf..39376a1 100644 --- a/gdb/python/py-type.c +++ b/gdb/python/py-type.c @@ -341,15 +341,18 @@ typy_fields_items (PyObject *self, enum gdbpy_iter_kind kind) { PyObject *py_type = self; PyObject *result = NULL, *iter = NULL; - volatile struct gdb_exception except; struct type *type = ((type_object *) py_type)->type; struct type *checked_type = type; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { CHECK_TYPEDEF (checked_type); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH if (checked_type != type) py_type = type_to_type_object (checked_type); @@ -449,13 +452,16 @@ static PyObject * typy_strip_typedefs (PyObject *self, PyObject *args) { struct type *type = ((type_object *) self)->type; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { type = check_typedef (type); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return type_to_type_object (type); } @@ -466,15 +472,18 @@ typy_strip_typedefs (PyObject *self, PyObject *args) static struct type * typy_get_composite (struct type *type) { - volatile struct gdb_exception except; for (;;) { - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { CHECK_TYPEDEF (type); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH if (TYPE_CODE (type) != TYPE_CODE_PTR && TYPE_CODE (type) != TYPE_CODE_REF) @@ -505,7 +514,6 @@ typy_array_1 (PyObject *self, PyObject *args, int is_vector) PyObject *n2_obj = NULL; struct type *array = NULL; struct type *type = ((type_object *) self)->type; - volatile struct gdb_exception except; if (! PyArg_ParseTuple (args, "l|O", &n1, &n2_obj)) return NULL; @@ -535,13 +543,17 @@ typy_array_1 (PyObject *self, PyObject *args, int is_vector) return NULL; } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { array = lookup_array_range_type (type, n1, n2); if (is_vector) make_vector_type (array); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return type_to_type_object (array); } @@ -567,13 +579,16 @@ static PyObject * typy_pointer (PyObject *self, PyObject *args) { struct type *type = ((type_object *) self)->type; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { type = lookup_pointer_type (type); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return type_to_type_object (type); } @@ -648,13 +663,16 @@ static PyObject * typy_reference (PyObject *self, PyObject *args) { struct type *type = ((type_object *) self)->type; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { type = lookup_reference_type (type); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return type_to_type_object (type); } @@ -680,13 +698,16 @@ static PyObject * typy_const (PyObject *self, PyObject *args) { struct type *type = ((type_object *) self)->type; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { type = make_cv_type (1, 0, type, NULL); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return type_to_type_object (type); } @@ -696,13 +717,16 @@ static PyObject * typy_volatile (PyObject *self, PyObject *args) { struct type *type = ((type_object *) self)->type; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { type = make_cv_type (0, 1, type, NULL); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return type_to_type_object (type); } @@ -712,13 +736,16 @@ static PyObject * typy_unqualified (PyObject *self, PyObject *args) { struct type *type = ((type_object *) self)->type; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { type = make_cv_type (0, 0, type, NULL); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return type_to_type_object (type); } @@ -728,12 +755,16 @@ static PyObject * typy_get_sizeof (PyObject *self, void *closure) { struct type *type = ((type_object *) self)->type; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { check_typedef (type); } + CATCH (except, RETURN_MASK_ALL) + { + } + END_CATCH + /* Ignore exceptions. */ return gdb_py_long_from_longest (TYPE_LENGTH (type)); @@ -743,9 +774,8 @@ static struct type * typy_lookup_typename (const char *type_name, const struct block *block) { struct type *type = NULL; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (startswith (type_name, "struct ")) type = lookup_struct (type_name + 7, NULL); @@ -757,7 +787,11 @@ typy_lookup_typename (const char *type_name, const struct block *block) type = lookup_typename (python_language, python_gdbarch, type_name, block, 0); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return type; } @@ -769,7 +803,6 @@ typy_lookup_type (struct demangle_component *demangled, struct type *type, *rtype = NULL; char *type_name = NULL; enum demangle_component_type demangled_type; - volatile struct gdb_exception except; /* Save the type: typy_lookup_type() may (indirectly) overwrite memory pointed by demangled. */ @@ -784,7 +817,7 @@ typy_lookup_type (struct demangle_component *demangled, if (! type) return NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { /* If the demangled_type matches with one of the types below, run the corresponding function and save the type @@ -806,7 +839,11 @@ typy_lookup_type (struct demangle_component *demangled, break; } } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH } /* If we have a type from the switch statement above, just return @@ -837,7 +874,6 @@ typy_legacy_template_argument (struct type *type, const struct block *block, const char *err; struct type *argtype; struct cleanup *cleanup; - volatile struct gdb_exception except; if (TYPE_NAME (type) == NULL) { @@ -845,12 +881,16 @@ typy_legacy_template_argument (struct type *type, const struct block *block, return NULL; } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { /* Note -- this is not thread-safe. */ info = cp_demangled_name_to_comp (TYPE_NAME (type), &err); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH if (! info) { @@ -903,7 +943,6 @@ typy_template_argument (PyObject *self, PyObject *args) PyObject *block_obj = NULL; struct symbol *sym; struct value *val = NULL; - volatile struct gdb_exception except; if (! PyArg_ParseTuple (args, "i|O", &argno, &block_obj)) return NULL; @@ -919,13 +958,17 @@ typy_template_argument (PyObject *self, PyObject *args) } } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { type = check_typedef (type); if (TYPE_CODE (type) == TYPE_CODE_REF) type = check_typedef (TYPE_TARGET_TYPE (type)); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH /* We might not have DW_TAG_template_*, so try to parse the type's name. This is inefficient if we do not have a template type -- @@ -950,11 +993,15 @@ typy_template_argument (PyObject *self, PyObject *args) return NULL; } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { val = value_of_variable (sym, block); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return value_to_value_object (val); } @@ -962,12 +1009,11 @@ typy_template_argument (PyObject *self, PyObject *args) static PyObject * typy_str (PyObject *self) { - volatile struct gdb_exception except; char *thetype = NULL; long length = 0; PyObject *result; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct cleanup *old_chain; struct ui_file *stb; @@ -981,11 +1027,12 @@ typy_str (PyObject *self) thetype = ui_file_xstrdup (stb, &length); do_cleanups (old_chain); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { xfree (thetype); GDB_PY_HANDLE_EXCEPTION (except); } + END_CATCH result = PyUnicode_Decode (thetype, length, host_charset (), NULL); xfree (thetype); @@ -1001,7 +1048,6 @@ typy_richcompare (PyObject *self, PyObject *other, int op) int result = Py_NE; struct type *type1 = type_object_to_type (self); struct type *type2 = type_object_to_type (other); - volatile struct gdb_exception except; /* We can only compare ourselves to another Type object, and only for equality or inequality. */ @@ -1015,13 +1061,17 @@ typy_richcompare (PyObject *self, PyObject *other, int op) result = Py_EQ; else { - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { result = types_deeply_equal (type1, type2); } - /* If there is a GDB exception, a comparison is not capable - (or trusted), so exit. */ - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + /* If there is a GDB exception, a comparison is not capable + (or trusted), so exit. */ + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH } if (op == (result ? Py_EQ : Py_NE)) diff --git a/gdb/python/py-utils.c b/gdb/python/py-utils.c index 58a5934..2e32f11 100644 --- a/gdb/python/py-utils.c +++ b/gdb/python/py-utils.c @@ -316,13 +316,16 @@ get_addr_from_python (PyObject *obj, CORE_ADDR *addr) { if (gdbpy_is_value_object (obj)) { - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { *addr = value_as_address (value_object_to_value (obj)); } - GDB_PY_SET_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_SET_HANDLE_EXCEPTION (except); + } + END_CATCH } else { diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index 5a13777..6622d11 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -172,10 +172,9 @@ gdbpy_preserve_values (const struct extension_language_defn *extlang, static PyObject * valpy_dereference (PyObject *self, PyObject *args) { - volatile struct gdb_exception except; PyObject *result = NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct value *res_val; struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ()); @@ -184,7 +183,11 @@ valpy_dereference (PyObject *self, PyObject *args) result = value_to_value_object (res_val); do_cleanups (cleanup); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return result; } @@ -200,10 +203,9 @@ valpy_dereference (PyObject *self, PyObject *args) static PyObject * valpy_referenced_value (PyObject *self, PyObject *args) { - volatile struct gdb_exception except; PyObject *result = NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct value *self_val, *res_val; struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ()); @@ -225,7 +227,11 @@ valpy_referenced_value (PyObject *self, PyObject *args) result = value_to_value_object (res_val); do_cleanups (cleanup); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return result; } @@ -235,11 +241,10 @@ static PyObject * valpy_get_address (PyObject *self, void *closure) { value_object *val_obj = (value_object *) self; - volatile struct gdb_exception except; if (!val_obj->address) { - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct value *res_val; struct cleanup *cleanup @@ -249,11 +254,12 @@ valpy_get_address (PyObject *self, void *closure) val_obj->address = value_to_value_object (res_val); do_cleanups (cleanup); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { val_obj->address = Py_None; Py_INCREF (Py_None); } + END_CATCH } Py_XINCREF (val_obj->address); @@ -283,7 +289,6 @@ static PyObject * valpy_get_dynamic_type (PyObject *self, void *closure) { value_object *obj = (value_object *) self; - volatile struct gdb_exception except; struct type *type = NULL; if (obj->dynamic_type != NULL) @@ -292,7 +297,7 @@ valpy_get_dynamic_type (PyObject *self, void *closure) return obj->dynamic_type; } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct value *val = obj->value; struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ()); @@ -331,7 +336,11 @@ valpy_get_dynamic_type (PyObject *self, void *closure) do_cleanups (cleanup); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH if (type == NULL) obj->dynamic_type = valpy_get_type (self, NULL); @@ -358,13 +367,12 @@ valpy_lazy_string (PyObject *self, PyObject *args, PyObject *kw) const char *user_encoding = NULL; static char *keywords[] = { "encoding", "length", NULL }; PyObject *str_obj = NULL; - volatile struct gdb_exception except; if (!PyArg_ParseTupleAndKeywords (args, kw, "|s" GDB_PY_LL_ARG, keywords, &user_encoding, &length)) return NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ()); @@ -377,7 +385,11 @@ valpy_lazy_string (PyObject *self, PyObject *args, PyObject *kw) do_cleanups (cleanup); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return str_obj; } @@ -394,7 +406,6 @@ valpy_string (PyObject *self, PyObject *args, PyObject *kw) int length = -1; gdb_byte *buffer; struct value *value = ((value_object *) self)->value; - volatile struct gdb_exception except; PyObject *unicode; const char *encoding = NULL; const char *errors = NULL; @@ -407,11 +418,15 @@ valpy_string (PyObject *self, PyObject *args, PyObject *kw) &user_encoding, &errors, &length)) return NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { LA_GET_STRING (value, &buffer, &length, &char_type, &la_encoding); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH encoding = (user_encoding && *user_encoding) ? user_encoding : la_encoding; unicode = PyUnicode_Decode ((const char *) buffer, @@ -429,7 +444,6 @@ valpy_do_cast (PyObject *self, PyObject *args, enum exp_opcode op) { PyObject *type_obj, *result = NULL; struct type *type; - volatile struct gdb_exception except; if (! PyArg_ParseTuple (args, "O", &type_obj)) return NULL; @@ -442,7 +456,7 @@ valpy_do_cast (PyObject *self, PyObject *args, enum exp_opcode op) return NULL; } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct value *val = ((value_object *) self)->value; struct value *res_val; @@ -461,7 +475,11 @@ valpy_do_cast (PyObject *self, PyObject *args, enum exp_opcode op) result = value_to_value_object (res_val); do_cleanups (cleanup); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return result; } @@ -508,7 +526,6 @@ value_has_field (struct value *v, PyObject *field) struct type *parent_type, *val_type; enum type_code type_code; PyObject *type_object = PyObject_GetAttrString (field, "parent_type"); - volatile struct gdb_exception except; int has_field = 0; if (type_object == NULL) @@ -524,7 +541,7 @@ value_has_field (struct value *v, PyObject *field) return -1; } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { val_type = value_type (v); val_type = check_typedef (val_type); @@ -539,7 +556,11 @@ value_has_field (struct value *v, PyObject *field) else has_field = 0; } - GDB_PY_SET_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_SET_HANDLE_EXCEPTION (except); + } + END_CATCH return has_field; } @@ -591,11 +612,11 @@ get_field_type (PyObject *field) static PyObject * valpy_getitem (PyObject *self, PyObject *key) { + struct gdb_exception except = exception_none; value_object *self_value = (value_object *) self; char *field = NULL; struct type *base_class_type = NULL, *field_type = NULL; long bitpos = -1; - volatile struct gdb_exception except; PyObject *result = NULL; if (gdbpy_is_string (key)) @@ -673,7 +694,7 @@ valpy_getitem (PyObject *self, PyObject *key) } } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct value *tmp = self_value->value; struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ()); @@ -723,6 +744,11 @@ valpy_getitem (PyObject *self, PyObject *key) result = value_to_value_object (res_val); do_cleanups (cleanup); } + CATCH (ex, RETURN_MASK_ALL) + { + except = ex; + } + END_CATCH xfree (field); GDB_PY_HANDLE_EXCEPTION (except); @@ -744,18 +770,21 @@ static PyObject * valpy_call (PyObject *self, PyObject *args, PyObject *keywords) { Py_ssize_t args_count; - volatile struct gdb_exception except; struct value *function = ((value_object *) self)->value; struct value **vargs = NULL; struct type *ftype = NULL; struct value *mark = value_mark (); PyObject *result = NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { ftype = check_typedef (value_type (function)); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH if (TYPE_CODE (ftype) != TYPE_CODE_FUNC) { @@ -790,7 +819,7 @@ valpy_call (PyObject *self, PyObject *args, PyObject *keywords) } } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct cleanup *cleanup = make_cleanup_value_free_to_mark (mark); struct value *return_value; @@ -799,7 +828,11 @@ valpy_call (PyObject *self, PyObject *args, PyObject *keywords) result = value_to_value_object (return_value); do_cleanups (cleanup); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return result; } @@ -812,12 +845,11 @@ valpy_str (PyObject *self) char *s = NULL; PyObject *result; struct value_print_options opts; - volatile struct gdb_exception except; get_user_print_options (&opts); opts.deref_ref = 0; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct ui_file *stb = mem_fileopen (); struct cleanup *old_chain = make_cleanup_ui_file_delete (stb); @@ -828,7 +860,11 @@ valpy_str (PyObject *self) do_cleanups (old_chain); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH result = PyUnicode_Decode (s, strlen (s), host_charset (), NULL); xfree (s); @@ -842,13 +878,16 @@ valpy_get_is_optimized_out (PyObject *self, void *closure) { struct value *value = ((value_object *) self)->value; int opt = 0; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { opt = value_optimized_out (value); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH if (opt) Py_RETURN_TRUE; @@ -862,13 +901,16 @@ valpy_get_is_lazy (PyObject *self, void *closure) { struct value *value = ((value_object *) self)->value; int opt = 0; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { opt = value_lazy (value); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH if (opt) Py_RETURN_TRUE; @@ -881,14 +923,17 @@ static PyObject * valpy_fetch_lazy (PyObject *self, PyObject *args) { struct value *value = ((value_object *) self)->value; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (value_lazy (value)) value_fetch_lazy (value); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH Py_RETURN_NONE; } @@ -926,10 +971,9 @@ enum valpy_opcode static PyObject * valpy_binop (enum valpy_opcode opcode, PyObject *self, PyObject *other) { - volatile struct gdb_exception except; PyObject *result = NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct value *arg1, *arg2; struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ()); @@ -1049,7 +1093,11 @@ valpy_binop (enum valpy_opcode opcode, PyObject *self, PyObject *other) do_cleanups (cleanup); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return result; } @@ -1103,10 +1151,9 @@ valpy_power (PyObject *self, PyObject *other, PyObject *unused) static PyObject * valpy_negative (PyObject *self) { - volatile struct gdb_exception except; PyObject *result = NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { /* Perhaps overkill, but consistency has some virtue. */ struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ()); @@ -1116,7 +1163,11 @@ valpy_negative (PyObject *self) result = value_to_value_object (val); do_cleanups (cleanup); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return result; } @@ -1131,10 +1182,9 @@ static PyObject * valpy_absolute (PyObject *self) { struct value *value = ((value_object *) self)->value; - volatile struct gdb_exception except; int isabs = 1; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct cleanup *cleanup = make_cleanup_value_free_to_mark (value_mark ()); @@ -1143,7 +1193,11 @@ valpy_absolute (PyObject *self) do_cleanups (cleanup); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH if (isabs) return valpy_positive (self); @@ -1155,12 +1209,12 @@ valpy_absolute (PyObject *self) static int valpy_nonzero (PyObject *self) { - volatile struct gdb_exception except; + struct gdb_exception except = exception_none; value_object *self_value = (value_object *) self; struct type *type; int nonzero = 0; /* Appease GCC warning. */ - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { type = check_typedef (value_type (self_value->value)); @@ -1176,6 +1230,12 @@ valpy_nonzero (PyObject *self) /* All other values are True. */ nonzero = 1; } + CATCH (ex, RETURN_MASK_ALL) + { + except = ex; + } + END_CATCH + /* This is not documented in the Python documentation, but if this function fails, return -1 as slot_nb_nonzero does (the default Python nonzero function). */ @@ -1189,13 +1249,16 @@ static PyObject * valpy_invert (PyObject *self) { struct value *val = NULL; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { val = value_complement (((value_object *) self)->value); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return value_to_value_object (val); } @@ -1241,7 +1304,6 @@ static PyObject * valpy_richcompare (PyObject *self, PyObject *other, int op) { int result = 0; - volatile struct gdb_exception except; if (other == Py_None) /* Comparing with None is special. From what I can tell, in Python @@ -1262,7 +1324,7 @@ valpy_richcompare (PyObject *self, PyObject *other, int op) return NULL; } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct value *value_other, *mark = value_mark (); struct cleanup *cleanup; @@ -1307,7 +1369,11 @@ valpy_richcompare (PyObject *self, PyObject *other, int op) do_cleanups (cleanup); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH /* In this case, the Python exception has already been set. */ if (result < 0) @@ -1327,16 +1393,19 @@ valpy_int (PyObject *self) struct value *value = ((value_object *) self)->value; struct type *type = value_type (value); LONGEST l = 0; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (!is_integral_type (type)) error (_("Cannot convert value to int.")); l = value_as_long (value); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return gdb_py_object_from_longest (l); } @@ -1349,9 +1418,8 @@ valpy_long (PyObject *self) struct value *value = ((value_object *) self)->value; struct type *type = value_type (value); LONGEST l = 0; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { CHECK_TYPEDEF (type); @@ -1361,7 +1429,11 @@ valpy_long (PyObject *self) l = value_as_long (value); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return gdb_py_long_from_longest (l); } @@ -1373,9 +1445,8 @@ valpy_float (PyObject *self) struct value *value = ((value_object *) self)->value; struct type *type = value_type (value); double d = 0; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { CHECK_TYPEDEF (type); @@ -1384,7 +1455,11 @@ valpy_float (PyObject *self) d = value_as_double (value); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return PyFloat_FromDouble (d); } @@ -1431,12 +1506,11 @@ struct value * convert_value_from_python (PyObject *obj) { struct value *value = NULL; /* -Wall */ - volatile struct gdb_exception except; int cmp; gdb_assert (obj != NULL); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (PyBool_Check (obj)) { @@ -1532,13 +1606,14 @@ convert_value_from_python (PyObject *obj) PyString_AsString (PyObject_Str (obj))); #endif } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { PyErr_Format (except.reason == RETURN_QUIT ? PyExc_KeyboardInterrupt : PyExc_RuntimeError, "%s", except.message); return NULL; } + END_CATCH return value; } @@ -1549,16 +1624,19 @@ gdbpy_history (PyObject *self, PyObject *args) { int i; struct value *res_val = NULL; /* Initialize to appease gcc warning. */ - volatile struct gdb_exception except; if (!PyArg_ParseTuple (args, "i", &i)) return NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { res_val = access_value_history (i); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return value_to_value_object (res_val); } diff --git a/gdb/python/python.c b/gdb/python/python.c index c3ffbae..58c7c92 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -564,21 +564,27 @@ gdbpy_parameter_value (enum var_types type, void *var) PyObject * gdbpy_parameter (PyObject *self, PyObject *args) { + struct gdb_exception except = exception_none; struct cmd_list_element *alias, *prefix, *cmd; const char *arg; char *newarg; int found = -1; - volatile struct gdb_exception except; if (! PyArg_ParseTuple (args, "s", &arg)) return NULL; newarg = concat ("show ", arg, (char *) NULL); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { found = lookup_cmd_composition (newarg, &alias, &prefix, &cmd); } + CATCH (ex, RETURN_MASK_ALL) + { + except = ex; + } + END_CATCH + xfree (newarg); GDB_PY_HANDLE_EXCEPTION (except); if (!found) @@ -619,7 +625,6 @@ execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw) const char *arg; PyObject *from_tty_obj = NULL, *to_string_obj = NULL; int from_tty, to_string; - volatile struct gdb_exception except; static char *keywords[] = {"command", "from_tty", "to_string", NULL }; char *result = NULL; @@ -646,7 +651,7 @@ execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw) to_string = cmp; } - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { /* Copy the argument text in case the command modifies it. */ char *copy = xstrdup (arg); @@ -666,7 +671,11 @@ execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw) do_cleanups (cleanup); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH /* Do any commands attached to breakpoint we stopped at. */ bpstat_do_actions (); @@ -710,6 +719,7 @@ gdbpy_solib_name (PyObject *self, PyObject *args) static PyObject * gdbpy_decode_line (PyObject *self, PyObject *args) { + struct gdb_exception except = exception_none; struct symtabs_and_lines sals = { NULL, 0 }; /* Initialize to appease gcc. */ struct symtab_and_line sal; @@ -719,7 +729,6 @@ gdbpy_decode_line (PyObject *self, PyObject *args) PyObject *result = NULL; PyObject *return_result = NULL; PyObject *unparsed = NULL; - volatile struct gdb_exception except; if (! PyArg_ParseTuple (args, "|s", &arg)) return NULL; @@ -727,7 +736,8 @@ gdbpy_decode_line (PyObject *self, PyObject *args) cleanups = make_cleanup (null_cleanup, NULL); sals.sals = NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + + TRY { if (arg) { @@ -743,6 +753,11 @@ gdbpy_decode_line (PyObject *self, PyObject *args) sals.nelts = 1; } } + CATCH (ex, RETURN_MASK_ALL) + { + except = ex; + } + END_CATCH if (sals.sals != NULL && sals.sals != &sal) { @@ -824,16 +839,19 @@ gdbpy_parse_and_eval (PyObject *self, PyObject *args) { const char *expr_str; struct value *result = NULL; - volatile struct gdb_exception except; if (!PyArg_ParseTuple (args, "s", &expr_str)) return NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { result = parse_and_eval (expr_str); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return value_to_value_object (result); } @@ -845,13 +863,12 @@ static PyObject * gdbpy_find_pc_line (PyObject *self, PyObject *args) { gdb_py_ulongest pc_llu; - volatile struct gdb_exception except; PyObject *result = NULL; /* init for gcc -Wall */ if (!PyArg_ParseTuple (args, GDB_PY_LLU_ARG, &pc_llu)) return NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct symtab_and_line sal; CORE_ADDR pc; @@ -860,7 +877,11 @@ gdbpy_find_pc_line (PyObject *self, PyObject *args) sal = find_pc_line (pc, 0); result = symtab_and_line_to_sal_object (sal); } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH return result; } @@ -1096,13 +1117,12 @@ gdbpy_write (PyObject *self, PyObject *args, PyObject *kw) const char *arg; static char *keywords[] = {"text", "stream", NULL }; int stream_type = 0; - volatile struct gdb_exception except; if (! PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &arg, &stream_type)) return NULL; - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { switch (stream_type) { @@ -1120,7 +1140,11 @@ gdbpy_write (PyObject *self, PyObject *args, PyObject *kw) fprintf_filtered (gdb_stdout, "%s", arg); } } - GDB_PY_HANDLE_EXCEPTION (except); + CATCH (except, RETURN_MASK_ALL) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + END_CATCH Py_RETURN_NONE; } @@ -1165,7 +1189,6 @@ gdbpy_flush (PyObject *self, PyObject *args, PyObject *kw) void gdbpy_print_stack (void) { - volatile struct gdb_exception except; /* Print "none", just clear exception. */ if (gdbpy_should_print_stack == python_excp_none) @@ -1179,10 +1202,14 @@ gdbpy_print_stack (void) /* PyErr_Print doesn't necessarily end output with a newline. This works because Python's stdout/stderr is fed through printf_filtered. */ - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { begin_line (); } + CATCH (except, RETURN_MASK_ALL) + { + } + END_CATCH } /* Print "message", just error print message. */ else @@ -1196,7 +1223,7 @@ gdbpy_print_stack (void) msg = gdbpy_exception_to_string (ptype, pvalue); type = gdbpy_obj_to_string (ptype); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { if (msg == NULL) { @@ -1210,6 +1237,10 @@ gdbpy_print_stack (void) fprintf_filtered (gdb_stderr, "Python Exception %s %s: \n", type, msg); } + CATCH (except, RETURN_MASK_ALL) + { + } + END_CATCH Py_XDECREF (ptype); Py_XDECREF (pvalue); diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c index f2d35a3..6bd9d01 100644 --- a/gdb/record-btrace.c +++ b/gdb/record-btrace.c @@ -139,13 +139,15 @@ require_btrace (void) static void record_btrace_enable_warn (struct thread_info *tp) { - volatile struct gdb_exception error; - - TRY_CATCH (error, RETURN_MASK_ERROR) - btrace_enable (tp, &record_btrace_conf); - - if (error.message != NULL) - warning ("%s", error.message); + TRY + { + btrace_enable (tp, &record_btrace_conf); + } + CATCH (error, RETURN_MASK_ERROR) + { + warning ("%s", error.message); + } + END_CATCH } /* Callback function to disable branch tracing for one thread. */ @@ -1140,7 +1142,6 @@ record_btrace_insert_breakpoint (struct target_ops *ops, struct gdbarch *gdbarch, struct bp_target_info *bp_tgt) { - volatile struct gdb_exception except; const char *old; int ret; @@ -1150,13 +1151,18 @@ record_btrace_insert_breakpoint (struct target_ops *ops, replay_memory_access = replay_memory_access_read_write; ret = 0; - TRY_CATCH (except, RETURN_MASK_ALL) - ret = ops->beneath->to_insert_breakpoint (ops->beneath, gdbarch, bp_tgt); + TRY + { + ret = ops->beneath->to_insert_breakpoint (ops->beneath, gdbarch, bp_tgt); + } replay_memory_access = old; - if (except.reason < 0) - throw_exception (except); + CATCH (except, RETURN_MASK_ALL) + { + throw_exception (except); + } + END_CATCH return ret; } @@ -1168,7 +1174,6 @@ record_btrace_remove_breakpoint (struct target_ops *ops, struct gdbarch *gdbarch, struct bp_target_info *bp_tgt) { - volatile struct gdb_exception except; const char *old; int ret; @@ -1178,13 +1183,18 @@ record_btrace_remove_breakpoint (struct target_ops *ops, replay_memory_access = replay_memory_access_read_write; ret = 0; - TRY_CATCH (except, RETURN_MASK_ALL) - ret = ops->beneath->to_remove_breakpoint (ops->beneath, gdbarch, bp_tgt); + TRY + { + ret = ops->beneath->to_remove_breakpoint (ops->beneath, gdbarch, bp_tgt); + } replay_memory_access = old; - if (except.reason < 0) - throw_exception (except); + CATCH (except, RETURN_MASK_ALL) + { + throw_exception (except); + } + END_CATCH return ret; } @@ -1622,7 +1632,6 @@ record_btrace_find_resume_thread (ptid_t ptid) static struct btrace_insn_iterator * record_btrace_start_replaying (struct thread_info *tp) { - volatile struct gdb_exception except; struct btrace_insn_iterator *replay; struct btrace_thread_info *btinfo; int executing; @@ -1649,7 +1658,7 @@ record_btrace_start_replaying (struct thread_info *tp) Since frames are computed differently when we're replaying, we need to recompute those stored frames and fix them up so we can still detect subroutines after we started replaying. */ - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { struct frame_info *frame; struct frame_id frame_id; @@ -1701,7 +1710,7 @@ record_btrace_start_replaying (struct thread_info *tp) /* Restore the previous execution state. */ set_executing (tp->ptid, executing); - if (except.reason < 0) + CATCH (except, RETURN_MASK_ALL) { xfree (btinfo->replay); btinfo->replay = NULL; @@ -1710,6 +1719,7 @@ record_btrace_start_replaying (struct thread_info *tp) throw_exception (except); } + END_CATCH return replay; } @@ -2298,21 +2308,22 @@ init_record_btrace_ops (void) static void cmd_record_btrace_bts_start (char *args, int from_tty) { - volatile struct gdb_exception exception; if (args != NULL && *args != 0) error (_("Invalid argument.")); record_btrace_conf.format = BTRACE_FORMAT_BTS; - TRY_CATCH (exception, RETURN_MASK_ALL) - execute_command ("target record-btrace", from_tty); - - if (exception.error != 0) + TRY + { + execute_command ("target record-btrace", from_tty); + } + CATCH (exception, RETURN_MASK_ALL) { record_btrace_conf.format = BTRACE_FORMAT_NONE; throw_exception (exception); } + END_CATCH } /* Alias for "target record". */ @@ -2320,21 +2331,22 @@ cmd_record_btrace_bts_start (char *args, int from_tty) static void cmd_record_btrace_start (char *args, int from_tty) { - volatile struct gdb_exception exception; if (args != NULL && *args != 0) error (_("Invalid argument.")); record_btrace_conf.format = BTRACE_FORMAT_BTS; - TRY_CATCH (exception, RETURN_MASK_ALL) - execute_command ("target record-btrace", from_tty); - - if (exception.error == 0) - return; - - record_btrace_conf.format = BTRACE_FORMAT_NONE; - throw_exception (exception); + TRY + { + execute_command ("target record-btrace", from_tty); + } + CATCH (exception, RETURN_MASK_ALL) + { + record_btrace_conf.format = BTRACE_FORMAT_NONE; + throw_exception (exception); + } + END_CATCH } /* The "set record btrace" command. */ diff --git a/gdb/remote.c b/gdb/remote.c index eb1eb27..19f56a1 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -497,7 +497,6 @@ remote_get_noisy_reply (char **buf_p, CORE_ADDR from, to, org_to; char *p, *pp; int adjusted_size = 0; - volatile struct gdb_exception ex; int relocated = 0; p = buf + strlen ("qRelocInsn:"); @@ -512,12 +511,12 @@ remote_get_noisy_reply (char **buf_p, org_to = to; - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { gdbarch_relocate_instruction (target_gdbarch (), &to, from); relocated = 1; } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ALL) { if (ex.error == MEMORY_ERROR) { @@ -536,6 +535,7 @@ remote_get_noisy_reply (char **buf_p, } putpkt ("E01"); } + END_CATCH if (relocated) { @@ -4382,13 +4382,12 @@ remote_open_1 (const char *name, int from_tty, all the ``target ....'' commands to share a common callback function. See cli-dump.c. */ { - volatile struct gdb_exception ex; - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { remote_start_remote (from_tty, target, extended_p); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ALL) { /* Pop the partially set up target - unless something else did already before throwing the exception. */ @@ -4398,6 +4397,7 @@ remote_open_1 (const char *name, int from_tty, wait_forever_enabled_p = 1; throw_exception (ex); } + END_CATCH } remote_btrace_reset (); @@ -7835,15 +7835,14 @@ getpkt_or_notif_sane (char **buf, long *sizeof_buf, int forever, static void remote_kill (struct target_ops *ops) { - volatile struct gdb_exception ex; /* Catch errors so the user can quit from gdb even when we aren't on speaking terms with the remote system. */ - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { putpkt ("k"); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error == TARGET_CLOSE_ERROR) { @@ -7861,6 +7860,7 @@ remote_kill (struct target_ops *ops) user or higher layers decide what to do. */ throw_exception (ex); } + END_CATCH /* We've killed the remote end, we get to mourn it. Since this is target remote, single-process, mourning the inferior also @@ -10948,7 +10948,6 @@ remote_get_trace_status (struct target_ops *self, struct trace_status *ts) char *p = NULL; /* FIXME we need to get register block size some other way. */ extern int trace_regblock_size; - volatile struct gdb_exception ex; enum packet_result result; if (packet_support (PACKET_qTStatus) == PACKET_DISABLE) @@ -10958,11 +10957,11 @@ remote_get_trace_status (struct target_ops *self, struct trace_status *ts) putpkt ("qTStatus"); - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { p = remote_get_noisy_reply (&target_buf, &target_buf_size); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error != TARGET_CLOSE_ERROR) { @@ -10971,6 +10970,7 @@ remote_get_trace_status (struct target_ops *self, struct trace_status *ts) } throw_exception (ex); } + END_CATCH result = packet_ok (p, &remote_protocol_packets[PACKET_qTStatus]); @@ -11537,7 +11537,6 @@ remote_enable_btrace (struct target_ops *self, ptid_t ptid, struct remote_state *rs = get_remote_state (); char *buf = rs->buf; char *endbuf = rs->buf + get_remote_packet_size (); - volatile struct gdb_exception err; if (packet_config_support (packet) != PACKET_ENABLE) error (_("Target does not support branch tracing.")); @@ -11565,11 +11564,16 @@ remote_enable_btrace (struct target_ops *self, ptid_t ptid, /* If we fail to read the configuration, we lose some information, but the tracing itself is not impacted. */ - TRY_CATCH (err, RETURN_MASK_ERROR) - btrace_read_config (&tinfo->conf); - - if (err.message != NULL) - warning ("%s", err.message); + TRY + { + btrace_read_config (&tinfo->conf); + } + CATCH (err, RETURN_MASK_ERROR) + { + if (err.message != NULL) + warning ("%s", err.message); + } + END_CATCH return tinfo; } diff --git a/gdb/rs6000-aix-tdep.c b/gdb/rs6000-aix-tdep.c index 6940727..ca262e9 100644 --- a/gdb/rs6000-aix-tdep.c +++ b/gdb/rs6000-aix-tdep.c @@ -572,19 +572,20 @@ rs6000_convert_from_func_ptr_addr (struct gdbarch *gdbarch, { CORE_ADDR pc = 0; struct obj_section *pc_section; - volatile struct gdb_exception e; - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { pc = read_memory_unsigned_integer (addr, tdep->wordsize, byte_order); } - if (e.reason < 0) + CATCH (e, RETURN_MASK_ERROR) { /* An error occured during reading. Probably a memory error due to the section not being loaded yet. This address cannot be a function descriptor. */ return addr; } + END_CATCH + pc_section = find_pc_section (pc); if (pc_section && (pc_section->the_bfd_section->flags & SEC_CODE)) diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c index 16ffaff..a125000 100644 --- a/gdb/rs6000-tdep.c +++ b/gdb/rs6000-tdep.c @@ -3355,7 +3355,6 @@ static const struct frame_unwind rs6000_frame_unwind = static struct rs6000_frame_cache * rs6000_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache) { - volatile struct gdb_exception ex; struct rs6000_frame_cache *cache; struct gdbarch *gdbarch = get_frame_arch (this_frame); struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); @@ -3367,7 +3366,7 @@ rs6000_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache) (*this_cache) = cache; cache->saved_regs = trad_frame_alloc_saved_regs (this_frame); - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { /* At this point the stack looks as if we just entered the function, and the return address is stored in LR. */ @@ -3382,11 +3381,12 @@ rs6000_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache) trad_frame_set_value (cache->saved_regs, gdbarch_pc_regnum (gdbarch), lr); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error != NOT_AVAILABLE_ERROR) throw_exception (ex); } + END_CATCH return cache; } diff --git a/gdb/s390-linux-tdep.c b/gdb/s390-linux-tdep.c index 769ec9b..e33eb8e 100644 --- a/gdb/s390-linux-tdep.c +++ b/gdb/s390-linux-tdep.c @@ -1950,7 +1950,6 @@ static struct s390_unwind_cache * s390_frame_unwind_cache (struct frame_info *this_frame, void **this_prologue_cache) { - volatile struct gdb_exception ex; struct s390_unwind_cache *info; if (*this_prologue_cache) @@ -1963,18 +1962,19 @@ s390_frame_unwind_cache (struct frame_info *this_frame, info->frame_base = -1; info->local_base = -1; - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { /* Try to use prologue analysis to fill the unwind cache. If this fails, fall back to reading the stack backchain. */ if (!s390_prologue_frame_unwind_cache (this_frame, info)) s390_backchain_frame_unwind_cache (this_frame, info); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error != NOT_AVAILABLE_ERROR) throw_exception (ex); } + END_CATCH return info; } diff --git a/gdb/solib-dsbt.c b/gdb/solib-dsbt.c index 685534f..7da5833 100644 --- a/gdb/solib-dsbt.c +++ b/gdb/solib-dsbt.c @@ -820,7 +820,6 @@ enable_break (void) CORE_ADDR addr; gdb_byte addr_buf[TIC6X_PTR_SIZE]; struct int_elf32_dsbt_loadmap *ldm; - volatile struct gdb_exception ex; int ret; /* Read the contents of the .interp section into a local buffer; @@ -834,10 +833,15 @@ enable_break (void) loaded so that we can load its symbols and place a breakpoint in the dynamic linker itself. */ - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { tmp_bfd = solib_bfd_open (buf); } + CATCH (ex, RETURN_MASK_ALL) + { + } + END_CATCH + if (tmp_bfd == NULL) { enable_break_failure_warning (); diff --git a/gdb/solib-frv.c b/gdb/solib-frv.c index 76f6527..f7ef38b 100644 --- a/gdb/solib-frv.c +++ b/gdb/solib-frv.c @@ -539,7 +539,6 @@ enable_break2 (void) CORE_ADDR addr, interp_loadmap_addr; gdb_byte addr_buf[FRV_PTR_SIZE]; struct int_elf32_fdpic_loadmap *ldm; - volatile struct gdb_exception ex; /* Read the contents of the .interp section into a local buffer; the contents specify the dynamic linker this program uses. */ @@ -557,10 +556,15 @@ enable_break2 (void) be trivial on GNU/Linux). Therefore, we have to try an alternate mechanism to find the dynamic linker's base address. */ - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { tmp_bfd = solib_bfd_open (buf); } + CATCH (ex, RETURN_MASK_ALL) + { + } + END_CATCH + if (tmp_bfd == NULL) { enable_break_failure_warning (); diff --git a/gdb/solib-ia64-hpux.c b/gdb/solib-ia64-hpux.c index 3b0bf48..b133c12 100644 --- a/gdb/solib-ia64-hpux.c +++ b/gdb/solib-ia64-hpux.c @@ -163,18 +163,20 @@ ia64_hpux_at_dld_breakpoint_1_p (ptid_t ptid) int ia64_hpux_at_dld_breakpoint_p (ptid_t ptid) { - volatile struct gdb_exception e; ptid_t saved_ptid = inferior_ptid; int result = 0; inferior_ptid = ptid; - TRY_CATCH (e, RETURN_MASK_ALL) + TRY { result = ia64_hpux_at_dld_breakpoint_1_p (ptid); } inferior_ptid = saved_ptid; - if (e.reason < 0) - warning (_("error while checking for dld breakpoint: %s"), e.message); + CATCH (e, RETURN_MASK_ALL) + { + warning (_("error while checking for dld breakpoint: %s"), e.message); + } + END_CATCH return result; } @@ -277,17 +279,19 @@ ia64_hpux_handle_dld_breakpoint_1 (ptid_t ptid) void ia64_hpux_handle_dld_breakpoint (ptid_t ptid) { - volatile struct gdb_exception e; ptid_t saved_ptid = inferior_ptid; inferior_ptid = ptid; - TRY_CATCH (e, RETURN_MASK_ALL) + TRY { ia64_hpux_handle_dld_breakpoint_1 (ptid); } inferior_ptid = saved_ptid; - if (e.reason < 0) - warning (_("error detected while handling dld breakpoint: %s"), e.message); + CATCH (e, RETURN_MASK_ALL) + { + warning (_("error detected while handling dld breakpoint: %s"), e.message); + } + END_CATCH } /* Find the address of the code and data segments in ABFD, and update diff --git a/gdb/solib-spu.c b/gdb/solib-spu.c index 3c8cd1a..250cf21 100644 --- a/gdb/solib-spu.c +++ b/gdb/solib-spu.c @@ -110,8 +110,7 @@ append_ocl_sos (struct so_list **link_ptr) { enum bfd_endian byte_order = bfd_big_endian (objfile->obfd)? BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE; - volatile struct gdb_exception ex; - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { CORE_ADDR data = read_memory_unsigned_integer (*ocl_program_addr_base, @@ -134,7 +133,7 @@ append_ocl_sos (struct so_list **link_ptr) link_ptr = &newobj->next; } } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ALL) { /* Ignore memory errors. */ switch (ex.error) @@ -146,6 +145,7 @@ append_ocl_sos (struct so_list **link_ptr) break; } } + END_CATCH } } } diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 3fa8d6f..0cecc2a 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -874,15 +874,18 @@ solib_svr4_r_map (struct svr4_info *info) struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); struct type *ptr_type = builtin_type (target_gdbarch ())->builtin_data_ptr; CORE_ADDR addr = 0; - volatile struct gdb_exception ex; - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { addr = read_memory_typed_address (info->debug_base + lmo->r_map_offset, ptr_type); } - if (ex.reason < 0) - exception_print (gdb_stderr, ex); + CATCH (ex, RETURN_MASK_ERROR) + { + exception_print (gdb_stderr, ex); + } + END_CATCH + return addr; } @@ -2267,7 +2270,6 @@ enable_break (struct svr4_info *info, int from_tty) struct so_list *so; bfd *tmp_bfd = NULL; struct target_ops *tmp_bfd_target; - volatile struct gdb_exception ex; sym_addr = 0; @@ -2280,10 +2282,15 @@ enable_break (struct svr4_info *info, int from_tty) be trivial on GNU/Linux). Therefore, we have to try an alternate mechanism to find the dynamic linker's base address. */ - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { tmp_bfd = solib_bfd_open (interp_name); } + CATCH (ex, RETURN_MASK_ALL) + { + } + END_CATCH + if (tmp_bfd == NULL) goto bkpt_at_symbol; diff --git a/gdb/solib.c b/gdb/solib.c index 98d5cfd..8417f88 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -613,11 +613,10 @@ solib_read_symbols (struct so_list *so, int flags) } else { - volatile struct gdb_exception e; flags |= current_inferior ()->symfile_flags; - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { struct section_addr_info *sap; @@ -638,14 +637,17 @@ solib_read_symbols (struct so_list *so, int flags) NULL); so->objfile->addr_low = so->addr_low; free_section_addr_info (sap); + + so->symbols_loaded = 1; + } + CATCH (e, RETURN_MASK_ERROR) + { + exception_fprintf (gdb_stderr, e, _("Error while reading shared" + " library symbols for %s:\n"), + so->so_name); } + END_CATCH - if (e.reason < 0) - exception_fprintf (gdb_stderr, e, _("Error while reading shared" - " library symbols for %s:\n"), - so->so_name); - else - so->symbols_loaded = 1; return 1; } @@ -814,12 +816,11 @@ update_solib_list (int from_tty, struct target_ops *target) /* Fill in the rest of each of the `struct so_list' nodes. */ for (i = inferior; i; i = i->next) { - volatile struct gdb_exception e; i->pspace = current_program_space; VEC_safe_push (so_list_ptr, current_program_space->added_solibs, i); - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { /* Fill in the rest of the `struct so_list' node. */ if (!solib_map_sections (i)) @@ -830,10 +831,13 @@ update_solib_list (int from_tty, struct target_ops *target) } } - if (e.reason < 0) - exception_fprintf (gdb_stderr, e, - _("Error while mapping shared " - "library sections:\n")); + CATCH (e, RETURN_MASK_ERROR) + { + exception_fprintf (gdb_stderr, e, + _("Error while mapping shared " + "library sections:\n")); + } + END_CATCH /* Notify any observer that the shared object has been loaded now that we've added it to GDB's tables. */ @@ -1320,17 +1324,25 @@ reload_shared_libraries_1 (int from_tty) && (!was_loaded || filename_cmp (found_pathname, so->so_name) != 0)) { - volatile struct gdb_exception e; + int got_error = 0; - TRY_CATCH (e, RETURN_MASK_ERROR) - solib_map_sections (so); + TRY + { + solib_map_sections (so); + } + + CATCH (e, RETURN_MASK_ERROR) + { + exception_fprintf (gdb_stderr, e, + _("Error while mapping " + "shared library sections:\n")); + got_error = 1; + } + END_CATCH - if (e.reason < 0) - exception_fprintf (gdb_stderr, e, - _("Error while mapping " - "shared library sections:\n")); - else if (auto_solib_add || was_loaded || libpthread_solib_p (so)) - solib_read_symbols (so, flags); + if (!got_error + && (auto_solib_add || was_loaded || libpthread_solib_p (so))) + solib_read_symbols (so, flags); } } diff --git a/gdb/stack.c b/gdb/stack.c index 5831999..76a2360 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -154,19 +154,22 @@ print_stack_frame (struct frame_info *frame, int print_level, enum print_what print_what, int set_current_sal) { - volatile struct gdb_exception e; /* For mi, alway print location and address. */ if (ui_out_is_mi_like_p (current_uiout)) print_what = LOC_AND_ADDRESS; - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { print_frame_info (frame, print_level, print_what, 1 /* print_args */, set_current_sal); if (set_current_sal) set_current_sal_from_frame (frame); } + CATCH (e, RETURN_MASK_ERROR) + { + } + END_CATCH } /* Print nameless arguments of frame FRAME on STREAM, where START is @@ -210,9 +213,9 @@ static void print_frame_arg (const struct frame_arg *arg) { struct ui_out *uiout = current_uiout; - volatile struct gdb_exception except; struct cleanup *old_chain; struct ui_file *stb; + const char *error_message = NULL; stb = mem_fileopen (); old_chain = make_cleanup_ui_file_delete (stb); @@ -250,12 +253,10 @@ print_frame_arg (const struct frame_arg *arg) else { if (arg->error) - except.message = arg->error; + error_message = arg->error; else { - /* TRY_CATCH has two statements, wrap it in a block. */ - - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { const struct language_defn *language; struct value_print_options opts; @@ -284,10 +285,15 @@ print_frame_arg (const struct frame_arg *arg) common_val_print (arg->val, stb, 2, &opts, language); } + CATCH (except, RETURN_MASK_ERROR) + { + error_message = except.message; + } + END_CATCH } - if (except.message) + if (error_message != NULL) fprintf_filtered (stb, _("<error reading variable: %s>"), - except.message); + error_message); } ui_out_field_stream (uiout, "value", stb); @@ -306,17 +312,21 @@ void read_frame_local (struct symbol *sym, struct frame_info *frame, struct frame_arg *argp) { - volatile struct gdb_exception except; struct value *val = NULL; - TRY_CATCH (except, RETURN_MASK_ERROR) + argp->sym = sym; + argp->val = NULL; + argp->error = NULL; + + TRY { - val = read_var_value (sym, frame); + argp->val = read_var_value (sym, frame); } - - argp->error = (val == NULL) ? xstrdup (except.message) : NULL; - argp->sym = sym; - argp->val = val; + CATCH (except, RETURN_MASK_ERROR) + { + argp->error = xstrdup (except.message); + } + END_CATCH } /* Read in inferior function parameter SYM at FRAME into ARGP. Caller is @@ -330,20 +340,20 @@ read_frame_arg (struct symbol *sym, struct frame_info *frame, struct value *val = NULL, *entryval = NULL; char *val_error = NULL, *entryval_error = NULL; int val_equal = 0; - volatile struct gdb_exception except; if (print_entry_values != print_entry_values_only && print_entry_values != print_entry_values_preferred) { - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { val = read_var_value (sym, frame); } - if (!val) + CATCH (except, RETURN_MASK_ERROR) { val_error = alloca (strlen (except.message) + 1); strcpy (val_error, except.message); } + END_CATCH } if (SYMBOL_COMPUTED_OPS (sym) != NULL @@ -352,25 +362,25 @@ read_frame_arg (struct symbol *sym, struct frame_info *frame, && (print_entry_values != print_entry_values_if_needed || !val || value_optimized_out (val))) { - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { const struct symbol_computed_ops *ops; ops = SYMBOL_COMPUTED_OPS (sym); entryval = ops->read_variable_at_entry (sym, frame); } - if (!entryval) + CATCH (except, RETURN_MASK_ERROR) { - entryval_error = alloca (strlen (except.message) + 1); - strcpy (entryval_error, except.message); + if (except.error != NO_ENTRY_VALUE_ERROR) + { + entryval_error = (char *) alloca (strlen (except.message) + 1); + strcpy (entryval_error, except.message); + } } + END_CATCH - if (except.error == NO_ENTRY_VALUE_ERROR - || (entryval && value_optimized_out (entryval))) - { - entryval = NULL; - entryval_error = NULL; - } + if (entryval != NULL && value_optimized_out (entryval)) + entryval = NULL; if (print_entry_values == print_entry_values_compact || print_entry_values == print_entry_values_default) @@ -396,7 +406,7 @@ read_frame_arg (struct symbol *sym, struct frame_info *frame, dereferenced DW_AT_GNU_call_site_data_value does not differ. */ - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { struct type *type_deref; @@ -417,19 +427,23 @@ read_frame_arg (struct symbol *sym, struct frame_info *frame, TYPE_LENGTH (type_deref))) val_equal = 1; } + CATCH (except, RETURN_MASK_ERROR) + { + /* If the dereferenced content could not be + fetched do not display anything. */ + if (except.error == NO_ENTRY_VALUE_ERROR) + val_equal = 1; + else if (except.message != NULL) + { + entryval_error = (char *) alloca (strlen (except.message) + 1); + strcpy (entryval_error, except.message); + } + } + END_CATCH /* Value was not a reference; and its content matches. */ if (val == val_deref) val_equal = 1; - /* If the dereferenced content could not be fetched do not - display anything. */ - else if (except.error == NO_ENTRY_VALUE_ERROR) - val_equal = 1; - else if (except.message) - { - entryval_error = alloca (strlen (except.message) + 1); - strcpy (entryval_error, except.message); - } if (val_equal) entryval = NULL; @@ -455,15 +469,18 @@ read_frame_arg (struct symbol *sym, struct frame_info *frame, { if (print_entry_values == print_entry_values_preferred) { - TRY_CATCH (except, RETURN_MASK_ERROR) + gdb_assert (val == NULL); + + TRY { val = read_var_value (sym, frame); } - if (!val) + CATCH (except, RETURN_MASK_ERROR) { val_error = alloca (strlen (except.message) + 1); strcpy (val_error, except.message); } + END_CATCH } if (print_entry_values == print_entry_values_only || print_entry_values == print_entry_values_both @@ -748,20 +765,20 @@ static void do_gdb_disassembly (struct gdbarch *gdbarch, int how_many, CORE_ADDR low, CORE_ADDR high) { - volatile struct gdb_exception exception; - TRY_CATCH (exception, RETURN_MASK_ERROR) + TRY { gdb_disassembly (gdbarch, current_uiout, 0, DISASSEMBLY_RAW_INSN, how_many, low, high); } - if (exception.reason < 0) + CATCH (exception, RETURN_MASK_ERROR) { /* If an exception was thrown while doing the disassembly, print the error message, to give the user a clue of what happened. */ exception_print (gdb_stderr, exception); } + END_CATCH } /* Print information about frame FRAME. The output is format according @@ -1188,7 +1205,6 @@ print_frame (struct frame_info *frame, int print_level, struct gdbarch *gdbarch = get_frame_arch (frame); int numargs; struct cleanup *args_list_chain; - volatile struct gdb_exception e; if (gdbarch_frame_num_args_p (gdbarch)) { @@ -1199,10 +1215,15 @@ print_frame (struct frame_info *frame, int print_level, numargs = -1; args_list_chain = make_cleanup_ui_out_list_begin_end (uiout, "args"); - TRY_CATCH (e, RETURN_MASK_ERROR) + TRY { print_frame_args (func, frame, numargs, gdb_stdout); } + CATCH (e, RETURN_MASK_ERROR) + { + } + END_CATCH + /* FIXME: ARGS must be a list. If one argument is a string it will have " that will not be properly escaped. */ /* Invoke ui_out_tuple_end. */ @@ -1410,7 +1431,7 @@ frame_info (char *addr_exp, int from_tty) int frame_pc_p; /* Initialize it to avoid "may be used uninitialized" warning. */ CORE_ADDR caller_pc = 0; - volatile struct gdb_exception ex; + int caller_pc_p = 0; fi = parse_frame_specification_1 (addr_exp, "No stack.", &selected_frame_p); gdbarch = get_frame_arch (fi); @@ -1498,11 +1519,12 @@ frame_info (char *addr_exp, int from_tty) wrap_here (" "); printf_filtered ("saved %s = ", pc_regname); - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { caller_pc = frame_unwind_caller_pc (fi); + caller_pc_p = 1; } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { switch (ex.error) { @@ -1517,7 +1539,9 @@ frame_info (char *addr_exp, int from_tty) break; } } - else + END_CATCH + + if (caller_pc_p) fputs_filtered (paddress (gdbarch, caller_pc), gdb_stdout); printf_filtered ("\n"); @@ -2571,8 +2595,8 @@ get_frame_language (void) if (frame) { - volatile struct gdb_exception ex; CORE_ADDR pc = 0; + int pc_p = 0; /* We determine the current frame language by looking up its associated symtab. To retrieve this symtab, we use the frame @@ -2583,16 +2607,19 @@ get_frame_language (void) a PC that is guaranteed to be inside the frame's code block. */ - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { pc = get_frame_address_in_block (frame); + pc_p = 1; } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ERROR) { if (ex.error != NOT_AVAILABLE_ERROR) throw_exception (ex); } - else + END_CATCH + + if (pc_p) { struct compunit_symtab *cust = find_pc_compunit_symtab (pc); diff --git a/gdb/symtab.c b/gdb/symtab.c index aebe2d9..634cf97 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -5500,21 +5500,21 @@ default_make_symbol_completion_list_break_on (const char *text, enum type_code code) { struct cleanup *back_to; - volatile struct gdb_exception except; return_val = NULL; back_to = make_cleanup (do_free_completion_list, &return_val); - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { default_make_symbol_completion_list_break_on_1 (text, word, break_on, code); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { if (except.error != MAX_COMPLETIONS_REACHED_ERROR) throw_exception (except); } + END_CATCH discard_cleanups (back_to); return return_val; diff --git a/gdb/target.c b/gdb/target.c index d66560a..af94f48 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -814,9 +814,8 @@ target_translate_tls_address (struct objfile *objfile, CORE_ADDR offset) if (gdbarch_fetch_tls_load_module_address_p (target_gdbarch ())) { ptid_t ptid = inferior_ptid; - volatile struct gdb_exception ex; - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { CORE_ADDR lm_addr; @@ -829,7 +828,7 @@ target_translate_tls_address (struct objfile *objfile, CORE_ADDR offset) } /* If an error occurred, print TLS related messages here. Otherwise, throw the error to some higher catcher. */ - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ALL) { int objfile_is_library = (objfile->flags & OBJF_SHARED); @@ -878,6 +877,7 @@ target_translate_tls_address (struct objfile *objfile, CORE_ADDR offset) break; } } + END_CATCH } /* It wouldn't be wrong here to try a gdbarch method, too; finding TLS is an ABI-specific thing. But we don't do that yet. */ @@ -1465,7 +1465,6 @@ quit_force (char *args, int from_tty) { int exit_code = 0; struct qt_args qt; - volatile struct gdb_exception ex; /* An optional expression may be used to cause gdb to terminate with the value of that expression. */ @@ -1484,40 +1483,52 @@ quit_force (char *args, int from_tty) /* We want to handle any quit errors and exit regardless. */ /* Get out of tfind mode, and kill or detach all inferiors. */ - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { disconnect_tracing (); iterate_over_inferiors (kill_or_detach, &qt); } - if (ex.reason < 0) - exception_print (gdb_stderr, ex); + CATCH (ex, RETURN_MASK_ALL) + { + exception_print (gdb_stderr, ex); + } + END_CATCH /* Give all pushed targets a chance to do minimal cleanup, and pop them all out. */ - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { pop_all_targets (); } - if (ex.reason < 0) - exception_print (gdb_stderr, ex); + CATCH (ex, RETURN_MASK_ALL) + { + exception_print (gdb_stderr, ex); + } + END_CATCH /* Save the history information if it is appropriate to do so. */ - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { if (write_history_p && history_filename && input_from_terminal_p ()) gdb_safe_append_history (); } - if (ex.reason < 0) - exception_print (gdb_stderr, ex); + CATCH (ex, RETURN_MASK_ALL) + { + exception_print (gdb_stderr, ex); + } + END_CATCH /* Do any final cleanups before exiting. */ - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { do_final_cleanups (all_cleanups ()); } - if (ex.reason < 0) - exception_print (gdb_stderr, ex); + CATCH (ex, RETURN_MASK_ALL) + { + exception_print (gdb_stderr, ex); + } + END_CATCH exit (exit_code); } diff --git a/gdb/tracefile-tfile.c b/gdb/tracefile-tfile.c index 3ee7243..9747036 100644 --- a/gdb/tracefile-tfile.c +++ b/gdb/tracefile-tfile.c @@ -378,7 +378,6 @@ tfile_read (gdb_byte *readbuf, int size) static void tfile_open (const char *arg, int from_tty) { - volatile struct gdb_exception ex; char *temp; struct cleanup *old_chain; int flags; @@ -443,7 +442,7 @@ tfile_open (const char *arg, int from_tty) ts->disconnected_tracing = 0; ts->circular_buffer = 0; - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { /* Read through a section of newline-terminated lines that define things like tracepoints. */ @@ -476,12 +475,13 @@ tfile_open (const char *arg, int from_tty) if (trace_regblock_size == 0) error (_("No register block size recorded in trace file")); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ALL) { /* Remove the partially set up target. */ unpush_target (&tfile_ops); throw_exception (ex); } + END_CATCH inferior_appeared (current_inferior (), TFILE_PID); inferior_ptid = pid_to_ptid (TFILE_PID); diff --git a/gdb/tui/tui.c b/gdb/tui/tui.c index 0397ee9..9fac06e 100644 --- a/gdb/tui/tui.c +++ b/gdb/tui/tui.c @@ -90,11 +90,10 @@ static Keymap tui_readline_standard_keymap; static int tui_rl_switch_mode (int notused1, int notused2) { - volatile struct gdb_exception ex; /* Don't let exceptions escape. We're in the middle of a readline callback that isn't prepared for that. */ - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { if (tui_active) { @@ -108,13 +107,14 @@ tui_rl_switch_mode (int notused1, int notused2) tui_enable (); } } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ALL) { exception_print (gdb_stderr, ex); if (!tui_active) rl_prep_terminal (0); } + END_CATCH /* Clear the readline in case switching occurred in middle of something. */ diff --git a/gdb/typeprint.c b/gdb/typeprint.c index 234be7f..5a97ace 100644 --- a/gdb/typeprint.c +++ b/gdb/typeprint.c @@ -372,18 +372,20 @@ type_to_string (struct type *type) char *s = NULL; struct ui_file *stb; struct cleanup *old_chain; - volatile struct gdb_exception except; stb = mem_fileopen (); old_chain = make_cleanup_ui_file_delete (stb); - TRY_CATCH (except, RETURN_MASK_ALL) + TRY { type_print (type, "", stb, -1); s = ui_file_xstrdup (stb, NULL); } - if (except.reason < 0) - s = NULL; + CATCH (except, RETURN_MASK_ALL) + { + s = NULL; + } + END_CATCH do_cleanups (old_chain); diff --git a/gdb/valops.c b/gdb/valops.c index b096a51..66c63c1 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -3601,13 +3601,12 @@ value_rtti_indirect_type (struct value *v, int *full, target = coerce_ref (v); else if (TYPE_CODE (type) == TYPE_CODE_PTR) { - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { target = value_ind (v); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { if (except.error == MEMORY_ERROR) { @@ -3618,6 +3617,7 @@ value_rtti_indirect_type (struct value *v, int *full, } throw_exception (except); } + END_CATCH } else return NULL; @@ -3754,12 +3754,15 @@ struct value * value_of_this_silent (const struct language_defn *lang) { struct value *ret = NULL; - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { ret = value_of_this (lang); } + CATCH (except, RETURN_MASK_ERROR) + { + } + END_CATCH return ret; } diff --git a/gdb/valprint.c b/gdb/valprint.c index 29a3473..9a70b2f 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -740,7 +740,6 @@ val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, const struct value_print_options *options, const struct language_defn *language) { - volatile struct gdb_exception except; int ret = 0; struct value_print_options local_opts = *options; struct type *real_type = check_typedef (type); @@ -782,14 +781,17 @@ val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, return; } - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { language->la_val_print (type, valaddr, embedded_offset, address, stream, recurse, val, &local_opts); } - if (except.reason < 0) - fprintf_filtered (stream, _("<error reading variable>")); + CATCH (except, RETURN_MASK_ERROR) + { + fprintf_filtered (stream, _("<error reading variable>")); + } + END_CATCH } /* Check whether the value VAL is printable. Return 1 if it is; diff --git a/gdb/value.c b/gdb/value.c index b9a45ef..cb56849 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -2545,7 +2545,6 @@ show_convenience (char *ignore, int from_tty) get_user_print_options (&opts); for (var = internalvars; var; var = var->next) { - volatile struct gdb_exception ex; if (!varseen) { @@ -2553,15 +2552,19 @@ show_convenience (char *ignore, int from_tty) } printf_filtered (("$%s = "), var->name); - TRY_CATCH (ex, RETURN_MASK_ERROR) + TRY { struct value *val; val = value_of_internalvar (gdbarch, var); value_print (val, gdb_stdout, &opts); } - if (ex.reason < 0) - fprintf_filtered (gdb_stdout, _("<error: %s>"), ex.message); + CATCH (ex, RETURN_MASK_ERROR) + { + fprintf_filtered (gdb_stdout, _("<error: %s>"), ex.message); + } + END_CATCH + printf_filtered (("\n")); } if (!varseen) diff --git a/gdb/varobj.c b/gdb/varobj.c index ce80bc7..b220fd8 100644 --- a/gdb/varobj.c +++ b/gdb/varobj.c @@ -298,7 +298,6 @@ varobj_create (char *objname, const struct block *block; const char *p; struct value *value = NULL; - volatile struct gdb_exception except; CORE_ADDR pc; /* Parse and evaluate the expression, filling in as much of the @@ -338,16 +337,17 @@ varobj_create (char *objname, innermost_block = NULL; /* Wrap the call to parse expression, so we can return a sensible error. */ - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { var->root->exp = parse_exp_1 (&p, pc, block, 0); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { do_cleanups (old_chain); return NULL; } + END_CATCH /* Don't allow variables to be created for types. */ if (var->root->exp->elts[0].opcode == OP_TYPE @@ -388,12 +388,11 @@ varobj_create (char *objname, /* We definitely need to catch errors here. If evaluate_expression succeeds we got the value we wanted. But if it fails, we still go on with a call to evaluate_type(). */ - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { value = evaluate_expression (var->root->exp); } - - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { /* Error getting the value. Try to at least get the right type. */ @@ -401,14 +400,16 @@ varobj_create (char *objname, var->type = value_type (type_only_value); } - else - { - int real_type_found = 0; + END_CATCH - var->type = value_actual_type (value, 0, &real_type_found); - if (real_type_found) - value = value_cast (var->type, value); - } + if (value != NULL) + { + int real_type_found = 0; + + var->type = value_actual_type (value, 0, &real_type_found); + if (real_type_found) + value = value_cast (var->type, value); + } /* Set language info */ var->root->lang_ops = var->root->exp->language_defn->la_varobj_ops; @@ -1103,23 +1104,23 @@ varobj_set_value (struct varobj *var, char *expression) struct value *value = NULL; /* Initialize to keep gcc happy. */ int saved_input_radix = input_radix; const char *s = expression; - volatile struct gdb_exception except; gdb_assert (varobj_editable_p (var)); input_radix = 10; /* ALWAYS reset to decimal temporarily. */ exp = parse_exp_1 (&s, 0, 0, 0); - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { value = evaluate_expression (exp); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { /* We cannot proceed without a valid expression. */ xfree (exp); return 0; } + END_CATCH /* All types that are editable must also be changeable. */ gdb_assert (varobj_value_is_changeable_p (var)); @@ -1138,13 +1139,16 @@ varobj_set_value (struct varobj *var, char *expression) /* The new value may be lazy. value_assign, or rather value_contents, will take care of this. */ - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { val = value_assign (var->value, value); } - if (except.reason < 0) - return 0; + CATCH (except, RETURN_MASK_ERROR) + { + return 0; + } + END_CATCH /* If the value has changed, record it, so that next -var-update can report this change. If a variable had a value of '1', we've set it @@ -1395,20 +1399,20 @@ install_new_value (struct varobj *var, struct value *value, int initial) } else { - volatile struct gdb_exception except; - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { value_fetch_lazy (value); } - if (except.reason < 0) + CATCH (except, RETURN_MASK_ERROR) { /* Set the value to NULL, so that for the next -var-update, we don't try to compare the new value with this value, that we couldn't even read. */ value = NULL; } + END_CATCH } } @@ -2369,14 +2373,17 @@ value_of_root_1 (struct varobj **var_handle) if (within_scope) { - volatile struct gdb_exception except; /* We need to catch errors here, because if evaluate expression fails we want to just return NULL. */ - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { new_val = evaluate_expression (var->root->exp); } + CATCH (except, RETURN_MASK_ERROR) + { + } + END_CATCH } do_cleanups (back_to); diff --git a/gdb/xml-support.c b/gdb/xml-support.c index 4306c5c..9756acb 100644 --- a/gdb/xml-support.c +++ b/gdb/xml-support.c @@ -313,22 +313,22 @@ gdb_xml_start_element_wrapper (void *data, const XML_Char *name, const XML_Char **attrs) { struct gdb_xml_parser *parser = data; - volatile struct gdb_exception ex; if (parser->error.reason < 0) return; - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { gdb_xml_start_element (data, name, attrs); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ALL) { parser->error = ex; #ifdef HAVE_XML_STOPPARSER XML_StopParser (parser->expat_parser, XML_FALSE); #endif } + END_CATCH } /* Handle the end of an element. DATA is our local XML parser, and @@ -396,22 +396,22 @@ static void gdb_xml_end_element_wrapper (void *data, const XML_Char *name) { struct gdb_xml_parser *parser = data; - volatile struct gdb_exception ex; if (parser->error.reason < 0) return; - TRY_CATCH (ex, RETURN_MASK_ALL) + TRY { gdb_xml_end_element (data, name); } - if (ex.reason < 0) + CATCH (ex, RETURN_MASK_ALL) { parser->error = ex; #ifdef HAVE_XML_STOPPARSER XML_StopParser (parser->expat_parser, XML_FALSE); #endif } + END_CATCH } /* Free a parser and all its associated state. */ |