diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5b593a678d9..6e4f3940506 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,22 @@ +2017-09-03 Tom Tromey + + * compile/compile.c (compile_register_name_mangled): Return + std::string. + * compile/compile-loc2c.c (pushf_register_address): Update. + (pushf_register): Update. + * compile/compile-c-types.c (convert_array): Update. + * compile/compile-c-symbols.c (generate_vla_size): Update. + (error_symbol_once): Use a gdb::unique_xmalloc_ptr. + (symbol_substitution_name): Return a gdb::unique_xmalloc_ptr. + (convert_one_symbol): Update. + (generate_c_for_for_one_variable): Update. + * compile/compile-c-support.c (c_get_range_decl_name): Return a + std::string. + (generate_register_struct): Update. + * compile/compile-internal.h (c_get_range_decl_name): Return a + std::string. + (compile_register_name_mangled): Return std::string. + 2017-09-03 Tom Tromey * utils.c (perror_string): Return a std::string. diff --git a/gdb/compile/compile-c-support.c b/gdb/compile/compile-c-support.c index 3bec28c271f..6f759abb541 100644 --- a/gdb/compile/compile-c-support.c +++ b/gdb/compile/compile-c-support.c @@ -58,10 +58,10 @@ c_get_mode_for_size (int size) /* See compile-internal.h. */ -char * +std::string c_get_range_decl_name (const struct dynamic_prop *prop) { - return xstrprintf ("__gdb_prop_%s", host_address_to_string (prop)); + return string_printf ("__gdb_prop_%s", host_address_to_string (prop)); } @@ -263,8 +263,7 @@ generate_register_struct (struct ui_file *stream, struct gdbarch *gdbarch, if (registers_used[i]) { struct type *regtype = check_typedef (register_type (gdbarch, i)); - char *regname = compile_register_name_mangled (gdbarch, i); - struct cleanup *cleanups = make_cleanup (xfree, regname); + std::string regname = compile_register_name_mangled (gdbarch, i); seen = 1; @@ -282,7 +281,8 @@ generate_register_struct (struct ui_file *stream, struct gdbarch *gdbarch, switch (TYPE_CODE (regtype)) { case TYPE_CODE_PTR: - fprintf_filtered (stream, "__gdb_uintptr %s", regname); + fprintf_filtered (stream, "__gdb_uintptr %s", + regname.c_str ()); break; case TYPE_CODE_INT: @@ -297,7 +297,7 @@ generate_register_struct (struct ui_file *stream, struct gdbarch *gdbarch, fprintf_unfiltered (stream, "int %s" " __attribute__ ((__mode__(__%s__)))", - regname, + regname.c_str (), mode); break; } @@ -310,12 +310,10 @@ generate_register_struct (struct ui_file *stream, struct gdbarch *gdbarch, " unsigned char %s[%d]" " __attribute__((__aligned__(" "__BIGGEST_ALIGNMENT__)))", - regname, + regname.c_str (), TYPE_LENGTH (regtype)); } fputs_unfiltered (";\n", stream); - - do_cleanups (cleanups); } } diff --git a/gdb/compile/compile-c-symbols.c b/gdb/compile/compile-c-symbols.c index 15e1d6de8c4..1cdea852ea3 100644 --- a/gdb/compile/compile-c-symbols.c +++ b/gdb/compile/compile-c-symbols.c @@ -107,7 +107,6 @@ error_symbol_once (struct compile_c_instance *context, { struct symbol_error search; struct symbol_error *err; - char *message; if (context->symbol_err_map == NULL) return; @@ -117,10 +116,9 @@ error_symbol_once (struct compile_c_instance *context, if (err == NULL || err->message == NULL) return; - message = err->message; + gdb::unique_xmalloc_ptr message (err->message); err->message = NULL; - make_cleanup (xfree, message); - error (_("%s"), message); + error (_("%s"), message.get ()); } @@ -128,10 +126,11 @@ error_symbol_once (struct compile_c_instance *context, /* Compute the name of the pointer representing a local symbol's address. */ -static char * +static gdb::unique_xmalloc_ptr symbol_substitution_name (struct symbol *sym) { - return concat ("__", SYMBOL_NATURAL_NAME (sym), "_ptr", (char *) NULL); + return gdb::unique_xmalloc_ptr + (concat ("__", SYMBOL_NATURAL_NAME (sym), "_ptr", (char *) NULL)); } /* Convert a given symbol, SYM, to the compiler's representation. @@ -170,7 +169,7 @@ convert_one_symbol (struct compile_c_instance *context, gcc_decl decl; enum gcc_c_symbol_kind kind; CORE_ADDR addr = 0; - char *symbol_name = NULL; + gdb::unique_xmalloc_ptr symbol_name; switch (SYMBOL_CLASS (sym.symbol)) { @@ -290,13 +289,11 @@ convert_one_symbol (struct compile_c_instance *context, SYMBOL_NATURAL_NAME (sym.symbol), kind, sym_type, - symbol_name, addr, + symbol_name.get (), addr, filename, line); C_CTX (context)->c_ops->bind (C_CTX (context), decl, is_global); } - - xfree (symbol_name); } } @@ -604,13 +601,11 @@ generate_vla_size (struct compile_c_instance *compiler, || TYPE_HIGH_BOUND_KIND (type) == PROP_LOCLIST) { const struct dynamic_prop *prop = &TYPE_RANGE_DATA (type)->high; - char *name = c_get_range_decl_name (prop); - struct cleanup *cleanup = make_cleanup (xfree, name); + std::string name = c_get_range_decl_name (prop); - dwarf2_compile_property_to_c (stream, name, + dwarf2_compile_property_to_c (stream, name.c_str (), gdbarch, registers_used, prop, pc, sym); - do_cleanups (cleanup); } } break; @@ -663,8 +658,8 @@ generate_c_for_for_one_variable (struct compile_c_instance *compiler, if (SYMBOL_COMPUTED_OPS (sym) != NULL) { - char *generated_name = symbol_substitution_name (sym); - struct cleanup *cleanup = make_cleanup (xfree, generated_name); + gdb::unique_xmalloc_ptr generated_name + = symbol_substitution_name (sym); /* We need to emit to a temporary buffer in case an error occurs in the middle. */ string_file local_file; @@ -672,10 +667,9 @@ generate_c_for_for_one_variable (struct compile_c_instance *compiler, SYMBOL_COMPUTED_OPS (sym)->generate_c_location (sym, local_file, gdbarch, registers_used, - pc, generated_name); + pc, + generated_name.get ()); stream.write (local_file.c_str (), local_file.size ()); - - do_cleanups (cleanup); } else { diff --git a/gdb/compile/compile-c-types.c b/gdb/compile/compile-c-types.c index 22aee78deea..dc6391c8b5b 100644 --- a/gdb/compile/compile-c-types.c +++ b/gdb/compile/compile-c-types.c @@ -123,18 +123,17 @@ convert_array (struct compile_c_instance *context, struct type *type) || TYPE_HIGH_BOUND_KIND (range) == PROP_LOCLIST) { gcc_type result; - char *upper_bound; if (TYPE_VECTOR (type)) return C_CTX (context)->c_ops->error (C_CTX (context), _("variably-sized vector type" " is not supported")); - upper_bound = c_get_range_decl_name (&TYPE_RANGE_DATA (range)->high); + std::string upper_bound + = c_get_range_decl_name (&TYPE_RANGE_DATA (range)->high); result = C_CTX (context)->c_ops->build_vla_array_type (C_CTX (context), element_type, - upper_bound); - xfree (upper_bound); + upper_bound.c_str ()); return result; } else diff --git a/gdb/compile/compile-internal.h b/gdb/compile/compile-internal.h index 0c53f8c4432..091e654497f 100644 --- a/gdb/compile/compile-internal.h +++ b/gdb/compile/compile-internal.h @@ -95,11 +95,10 @@ struct compile_c_instance /* Call gdbarch_register_name (GDBARCH, REGNUM) and convert its result to a form suitable for the compiler source. The register names - should not clash with inferior defined macros. Returned pointer is - never NULL. Returned pointer needs to be deallocated by xfree. */ + should not clash with inferior defined macros. */ -extern char *compile_register_name_mangled (struct gdbarch *gdbarch, - int regnum); +extern std::string compile_register_name_mangled (struct gdbarch *gdbarch, + int regnum); /* Convert compiler source register name to register number of GDBARCH. Returned value is always >= 0, function throws an error @@ -144,13 +143,12 @@ extern unsigned char *generate_c_for_variable_locations extern const char *c_get_mode_for_size (int size); -/* Given a dynamic property, return an xmallocd name that is used to - represent its size. The result must be freed by the caller. The - contents of the resulting string will be the same each time for - each call with the same argument. */ +/* Given a dynamic property, return a name that is used to represent + its size. The contents of the resulting string will be the same + each time for each call with the same argument. */ struct dynamic_prop; -extern char *c_get_range_decl_name (const struct dynamic_prop *prop); +extern std::string c_get_range_decl_name (const struct dynamic_prop *prop); /* Type used to hold and pass around the source and object file names to use for compilation. */ diff --git a/gdb/compile/compile-loc2c.c b/gdb/compile/compile-loc2c.c index ead100324d5..7ec6f67cdf1 100644 --- a/gdb/compile/compile-loc2c.c +++ b/gdb/compile/compile-loc2c.c @@ -515,15 +515,12 @@ pushf_register_address (int indent, string_file &stream, unsigned char *registers_used, struct gdbarch *gdbarch, int regnum) { - char *regname = compile_register_name_mangled (gdbarch, regnum); - struct cleanup *cleanups = make_cleanup (xfree, regname); + std::string regname = compile_register_name_mangled (gdbarch, regnum); registers_used[regnum] = 1; pushf (indent, stream, "(" GCC_UINTPTR ") &" COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s", - regname); - - do_cleanups (cleanups); + regname.c_str ()); } /* Emit code that pushes a register's value on the stack. @@ -536,19 +533,16 @@ pushf_register (int indent, string_file &stream, unsigned char *registers_used, struct gdbarch *gdbarch, int regnum, uint64_t offset) { - char *regname = compile_register_name_mangled (gdbarch, regnum); - struct cleanup *cleanups = make_cleanup (xfree, regname); + std::string regname = compile_register_name_mangled (gdbarch, regnum); registers_used[regnum] = 1; if (offset == 0) pushf (indent, stream, COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s", - regname); + regname.c_str ()); else pushf (indent, stream, COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s + (" GCC_UINTPTR ") %s", - regname, hex_string (offset)); - - do_cleanups (cleanups); + regname.c_str (), hex_string (offset)); } /* Compile a DWARF expression to C code. diff --git a/gdb/compile/compile.c b/gdb/compile/compile.c index bbb31f11c0d..e4865d07232 100644 --- a/gdb/compile/compile.c +++ b/gdb/compile/compile.c @@ -648,12 +648,12 @@ eval_compile_command (struct command_line *cmd, const char *cmd_string, /* See compile/compile-internal.h. */ -char * +std::string compile_register_name_mangled (struct gdbarch *gdbarch, int regnum) { const char *regname = gdbarch_register_name (gdbarch, regnum); - return xstrprintf ("__%s", regname); + return string_printf ("__%s", regname); } /* See compile/compile-internal.h. */