X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fbreak-catch-throw.c;h=e9523a6eb86014a207b74ffbfa137ae6799467d3;hb=660df28acfa1b58c978d65d9cb26d37023f791ce;hp=107ac74f5cc62fb0911a4fe385466d7044c3bceb;hpb=30056ea04ae3ecd828e2a06e12e6f174ae6659c9;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/break-catch-throw.c b/gdb/break-catch-throw.c index 107ac74f5c..e9523a6eb8 100644 --- a/gdb/break-catch-throw.c +++ b/gdb/break-catch-throw.c @@ -83,6 +83,14 @@ struct exception_catchpoint : public breakpoint std::unique_ptr pattern; }; +/* See breakpoint.h. */ + +bool +is_exception_catchpoint (breakpoint *bp) +{ + return bp->ops == &gnu_v3_exception_catchpoint_ops; +} + /* A helper function that fetches exception probe arguments. This @@ -98,14 +106,16 @@ fetch_probe_arguments (struct value **arg0, struct value **arg1) unsigned n_args; pc_probe = find_probe_by_pc (pc); - if (pc_probe.prob == NULL - || pc_probe.prob->get_provider () != "libstdcxx" + if (pc_probe.prob == NULL) + error (_("did not find exception probe (does libstdcxx have SDT probes?)")); + + if (pc_probe.prob->get_provider () != "libstdcxx" || (pc_probe.prob->get_name () != "catch" && pc_probe.prob->get_name () != "throw" && pc_probe.prob->get_name () != "rethrow")) error (_("not stopped at a C++ exception catchpoint")); - n_args = pc_probe.prob->get_argument_count (frame); + n_args = pc_probe.prob->get_argument_count (get_frame_arch (frame)); if (n_args < 2) error (_("C++ exception catchpoint has too few arguments")); @@ -227,7 +237,7 @@ print_it_exception_catchpoint (bpstat bs) bp_temp = b->disposition == disp_del; uiout->text (bp_temp ? "Temporary catchpoint " : "Catchpoint "); - uiout->field_int ("bkptno", b->number); + uiout->field_signed ("bkptno", b->number); uiout->text ((kind == EX_EVENT_THROW ? " (exception thrown), " : (kind == EX_EVENT_CATCH ? " (exception caught), " : " (exception rethrown), "))); @@ -249,18 +259,10 @@ print_one_exception_catchpoint (struct breakpoint *b, enum exception_event_kind kind = classify_exception_breakpoint (b); get_user_print_options (&opts); + if (opts.addressprint) - { - annotate_field (4); - if (b->loc == NULL || b->loc->shlib_disabled) - uiout->field_string ("addr", ""); - else - uiout->field_core_addr ("addr", - b->loc->gdbarch, b->loc->address); - } + uiout->field_skip ("addr"); annotate_field (5); - if (b->loc) - *last_loc = b->loc; switch (kind) { @@ -344,6 +346,15 @@ print_recreate_exception_catchpoint (struct breakpoint *b, print_recreate_thread (b, fp); } +/* Implement the "allocate_location" breakpoint_ops method for throw + and catch catchpoints. */ + +static bp_location * +allocate_location_exception_catchpoint (breakpoint *self) +{ + return new bp_location (self, bp_loc_software_breakpoint); +} + static void handle_gnu_v3_exceptions (int tempflag, std::string &&except_rx, const char *cond_string, @@ -361,9 +372,6 @@ handle_gnu_v3_exceptions (int tempflag, std::string &&except_rx, init_catchpoint (cp.get (), get_current_arch (), tempflag, cond_string, &gnu_v3_exception_catchpoint_ops); - /* We need to reset 'type' in order for code in breakpoint.c to do - the right thing. */ - cp->type = bp_breakpoint; cp->kind = ex_event; cp->exception_rx = std::move (except_rx); cp->pattern = std::move (pattern); @@ -521,6 +529,7 @@ initialize_throw_catchpoint_ops (void) ops->print_recreate = print_recreate_exception_catchpoint; ops->print_one_detail = print_one_detail_exception_catchpoint; ops->check_status = check_status_exception_catchpoint; + ops->allocate_location = allocate_location_exception_catchpoint; } void