Normalize TRY_CATCH exception handling block
authorPedro Alves <palves@redhat.com>
Sat, 7 Mar 2015 14:50:04 +0000 (14:50 +0000)
committerPedro Alves <palves@redhat.com>
Sat, 7 Mar 2015 14:56:43 +0000 (14:56 +0000)
commit7556d4a4f6c3181204e9575c08c661a632cafb5d
tree52bea387366e8dc0a141318bde5d9a8825337d70
parentf873665f447ee4e36883e3122a4e35c2cd049045
Normalize TRY_CATCH exception handling block

This normalizes some exception catch blocks that check for ex.reason
to look like this:

~~~
  volatile gdb_exception ex;

  TRY_CATCH (ex, RETURN_MASK_ALL)
    {
      ...
    }
  if (ex.reason < 0)
    {
      ...
    }
~~~

This is a preparation step for running a script that converts all
TRY_CATCH uses to look like this instead:

~~~
  TRY
    {
      ...
    }
  CATCH (ex, RETURN_MASK_ALL)
    {
      ...
    }
  END_CATCH
~~~

The motivation for that change is being able to reimplent TRY/CATCH in
terms of C++ try/catch.

This commit makes it so that:

 - no condition other than ex.reason < 0 is checked in the if
   predicate

 - there's no "else" block to check whether no exception was caught

 - there's no code between the TRY_CATCH (TRY) block and the
   'if (ex.reason < 0)' block (CATCH).

 - the exception object is no longer referred to outside the if/catch
   block.  Note the local volatile exception objects that are
   currently defined inside functions that use TRY_CATCH will
   disappear.  In cases it's more convenient to still refer to the
   exception outside the catch block, a new non-volatile local is
   added and copy to that object is made within the catch block.

The following patches should make this all clearer.

gdb/ChangeLog:
2015-03-07  Pedro Alves  <palves@redhat.com>

* amd64-tdep.c (amd64_frame_cache, amd64_sigtramp_frame_cache)
(amd64_epilogue_frame_cache): Normal exception handling code.
* break-catch-throw.c (check_status_exception_catchpoint)
(re_set_exception_catchpoint): Ditto.
* cli/cli-interp.c (safe_execute_command):
* cli/cli-script.c (script_from_file): Ditto.
* compile/compile-c-symbols.c (generate_c_for_for_one_variable):
Ditto.
* compile/compile-object-run.c (compile_object_run): Ditto.
* cp-abi.c (baseclass_offset): Ditto.
* cp-valprint.c (cp_print_value): Ditto.
* exceptions.c (catch_exceptions_with_msg):
* frame-unwind.c (frame_unwind_try_unwinder): Ditto.
* frame.c (get_frame_address_in_block_if_available): Ditto.
* i386-tdep.c (i386_frame_cache, i386_epilogue_frame_cache)
(i386_sigtramp_frame_cache): Ditto.
* infcmd.c (post_create_inferior): Ditto.
* linespec.c (parse_linespec, find_linespec_symbols):
* p-valprint.c (pascal_object_print_value): Ditto.
* parse.c (parse_expression_for_completion): Ditto.
* python/py-finishbreakpoint.c (bpfinishpy_init): Ditto.
* remote.c (remote_get_noisy_reply): Ditto.
* s390-linux-tdep.c (s390_frame_unwind_cache): Ditto.
* solib-svr4.c (solib_svr4_r_map): Ditto.
22 files changed:
gdb/ChangeLog
gdb/amd64-tdep.c
gdb/break-catch-throw.c
gdb/cli/cli-interp.c
gdb/cli/cli-script.c
gdb/compile/compile-c-symbols.c
gdb/compile/compile-object-run.c
gdb/cp-abi.c
gdb/cp-valprint.c
gdb/exceptions.c
gdb/frame-unwind.c
gdb/frame.c
gdb/i386-tdep.c
gdb/infcmd.c
gdb/linespec.c
gdb/p-valprint.c
gdb/parse.c
gdb/python/py-finishbreakpoint.c
gdb/remote.c
gdb/rs6000-tdep.c
gdb/s390-linux-tdep.c
gdb/solib-svr4.c