Fix gdb.threads/multiple-step-overs.exp fails on arm
[binutils-gdb.git] / gdb / break-catch-throw.c
index 927176f9613944ffa8255bc66ead3adf386f06e3..1ba505b6e49071c0752763e28c04c2d5624b5ec6 100644 (file)
@@ -35,6 +35,7 @@
 #include "cp-abi.h"
 #include "gdb_regex.h"
 #include "cp-support.h"
+#include "location.h"
 
 /* Enums for exception-handling support.  */
 enum exception_event_kind
@@ -210,25 +211,33 @@ re_set_exception_catchpoint (struct breakpoint *self)
   struct symtabs_and_lines sals_end = {0};
   struct cleanup *cleanup;
   enum exception_event_kind kind = classify_exception_breakpoint (self);
+  struct event_location *location;
 
   /* We first try to use the probe interface.  */
   TRY
     {
-      char *spec = ASTRDUP (exception_functions[kind].probe);
-
-      sals = parse_probes (&spec, NULL);
+      location
+       = new_probe_location (exception_functions[kind].probe);
+      cleanup = make_cleanup_delete_event_location (location);
+      sals = parse_probes (location, NULL);
+      do_cleanups (cleanup);
     }
 
   CATCH (e, RETURN_MASK_ERROR)
     {
-
       /* Using the probe interface failed.  Let's fallback to the normal
         catchpoint mode.  */
       TRY
        {
-         char *spec = ASTRDUP (exception_functions[kind].function);
-
-         self->ops->decode_location (self, &spec, &sals);
+         struct explicit_location explicit_loc;
+
+         initialize_explicit_location (&explicit_loc);
+         explicit_loc.function_name
+           = ASTRDUP (exception_functions[kind].function);
+         location = new_explicit_location (&explicit_loc);
+         cleanup = make_cleanup_delete_event_location (location);
+         self->ops->decode_location (self, location, &sals);
+         do_cleanups (cleanup);
        }
       CATCH (ex, RETURN_MASK_ERROR)
        {