X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fdtrace-probe.c;h=528378231cd6cdb67b8022debafb5e17a3bc6df9;hb=e379e5f385f874adb0b414f917adb1fc50e20de9;hp=527e0f0cd57a2f8f6a2b3d4e652c56f536073ab2;hpb=0747795c085d3b2a35da6bb474f32c58ce1b70c8;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/dtrace-probe.c b/gdb/dtrace-probe.c index 527e0f0cd5..528378231c 100644 --- a/gdb/dtrace-probe.c +++ b/gdb/dtrace-probe.c @@ -21,7 +21,6 @@ #include "defs.h" #include "probe.h" -#include "common/vec.h" #include "elf-bfd.h" #include "gdbtypes.h" #include "obstack.h" @@ -81,7 +80,7 @@ public: bool is_linespec (const char **linespecp) const override; /* See probe.h. */ - void get_probes (std::vector *probesp, + void get_probes (std::vector> *probesp, struct objfile *objfile) const override; /* See probe.h. */ @@ -122,7 +121,7 @@ public: CORE_ADDR get_relocated_address (struct objfile *objfile) override; /* See probe.h. */ - unsigned get_argument_count (struct frame_info *frame) override; + unsigned get_argument_count (struct gdbarch *gdbarch) override; /* See probe.h. */ bool can_evaluate_arguments () const override; @@ -152,7 +151,7 @@ public: struct dtrace_probe_arg *get_arg_by_number (unsigned n, struct gdbarch *gdbarch); - /* Build the GDB internal expressiosn that, once evaluated, will + /* Build the GDB internal expression that, once evaluated, will calculate the values of the arguments of the probe. */ void build_arg_exprs (struct gdbarch *gdbarch); @@ -380,7 +379,7 @@ struct dtrace_dof_probe static void dtrace_process_dof_probe (struct objfile *objfile, struct gdbarch *gdbarch, - std::vector *probesp, + std::vector> *probesp, struct dtrace_dof_hdr *dof, struct dtrace_dof_probe *probe, struct dtrace_dof_provider *provider, @@ -484,15 +483,14 @@ dtrace_process_dof_probe (struct objfile *objfile, int'. */ struct type *type = builtin_type (gdbarch)->builtin_long; - TRY + try { expr = parse_expression_with_language (type_str.c_str (), language_c); } - CATCH (ex, RETURN_MASK_ERROR) + catch (const gdb_exception_error &ex) { } - END_CATCH if (expr != NULL && expr.get ()->elts[0].opcode == OP_TYPE) type = expr.get ()->elts[1].type; @@ -508,7 +506,7 @@ dtrace_process_dof_probe (struct objfile *objfile, std::move (enablers_copy)); /* Successfully created probe. */ - probesp->push_back (ret); + probesp->emplace_back (ret); } } @@ -519,7 +517,8 @@ dtrace_process_dof_probe (struct objfile *objfile, static void dtrace_process_dof (asection *sect, struct objfile *objfile, - std::vector *probesp, struct dtrace_dof_hdr *dof) + std::vector> *probesp, + struct dtrace_dof_hdr *dof) { struct gdbarch *gdbarch = get_objfile_arch (objfile); struct dtrace_dof_sect *section; @@ -624,26 +623,25 @@ dtrace_probe::build_arg_exprs (struct gdbarch *gdbarch) value of the argument when executed at the PC of the probe. */ for (dtrace_probe_arg &arg : m_args) { - /* Initialize the expression buffer in the parser state. The - language does not matter, since we are using our own - parser. */ - parser_state pstate (10, current_language, gdbarch); + /* Initialize the expression builder. The language does not + matter, since we are using our own parser. */ + expr_builder builder (current_language, gdbarch); /* The argument value, which is ABI dependent and casted to `long int'. */ - gdbarch_dtrace_parse_probe_argument (gdbarch, &pstate, argc); + gdbarch_dtrace_parse_probe_argument (gdbarch, &builder, argc); /* Casting to the expected type, but only if the type was recognized at probe load time. Otherwise the argument will be evaluated as the long integer passed to the probe. */ if (arg.type != NULL) { - write_exp_elt_opcode (&pstate, UNOP_CAST); - write_exp_elt_type (&pstate, arg.type); - write_exp_elt_opcode (&pstate, UNOP_CAST); + write_exp_elt_opcode (&builder, UNOP_CAST); + write_exp_elt_type (&builder, arg.type); + write_exp_elt_opcode (&builder, UNOP_CAST); } - arg.expr = pstate.release (); + arg.expr = builder.release (); prefixify_expression (arg.expr.get ()); ++argc; } @@ -694,7 +692,7 @@ dtrace_probe::get_relocated_address (struct objfile *objfile) /* Implementation of the get_argument_count method. */ unsigned -dtrace_probe::get_argument_count (struct frame_info *frame) +dtrace_probe::get_argument_count (struct gdbarch *gdbarch) { return m_args.size (); } @@ -835,8 +833,9 @@ dtrace_static_probe_ops::is_linespec (const char **linespecp) const /* Implementation of the get_probes method. */ void -dtrace_static_probe_ops::get_probes (std::vector *probesp, - struct objfile *objfile) const +dtrace_static_probe_ops::get_probes + (std::vector> *probesp, + struct objfile *objfile) const { bfd *abfd = objfile->obfd; asection *sect = NULL; @@ -856,13 +855,14 @@ dtrace_static_probe_ops::get_probes (std::vector *probesp, /* Read the contents of the DOF section and then process it to extract the information of any probe defined into it. */ - if (!bfd_malloc_and_get_section (abfd, sect, &dof)) + if (bfd_malloc_and_get_section (abfd, sect, &dof) && dof != NULL) + dtrace_process_dof (sect, objfile, probesp, + (struct dtrace_dof_hdr *) dof); + else complaint (_("could not obtain the contents of" "section '%s' in objfile `%s'."), sect->name, abfd->filename); - - dtrace_process_dof (sect, objfile, probesp, - (struct dtrace_dof_hdr *) dof); + xfree (dof); } }