Use std::string and unique_xmalloc_ptr in compile/ code

Change various things in the compile/ code to use std::string or
unique_xmalloc_ptr as appropriate.  This allows the removal of some
cleanups.

ChangeLog
2017-09-03  Tom Tromey  <tom@tromey.com>

	* 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.
This commit is contained in:
Tom Tromey 2017-08-14 00:03:02 -06:00
parent 18e9961f02
commit 8f84fb0ee8
7 changed files with 56 additions and 54 deletions

View File

@ -1,3 +1,22 @@
2017-09-03 Tom Tromey <tom@tromey.com>
* 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 <tom@tromey.com> 2017-09-03 Tom Tromey <tom@tromey.com>
* utils.c (perror_string): Return a std::string. * utils.c (perror_string): Return a std::string.

View File

@ -58,10 +58,10 @@ c_get_mode_for_size (int size)
/* See compile-internal.h. */ /* See compile-internal.h. */
char * std::string
c_get_range_decl_name (const struct dynamic_prop *prop) 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]) if (registers_used[i])
{ {
struct type *regtype = check_typedef (register_type (gdbarch, i)); struct type *regtype = check_typedef (register_type (gdbarch, i));
char *regname = compile_register_name_mangled (gdbarch, i); std::string regname = compile_register_name_mangled (gdbarch, i);
struct cleanup *cleanups = make_cleanup (xfree, regname);
seen = 1; seen = 1;
@ -282,7 +281,8 @@ generate_register_struct (struct ui_file *stream, struct gdbarch *gdbarch,
switch (TYPE_CODE (regtype)) switch (TYPE_CODE (regtype))
{ {
case TYPE_CODE_PTR: case TYPE_CODE_PTR:
fprintf_filtered (stream, "__gdb_uintptr %s", regname); fprintf_filtered (stream, "__gdb_uintptr %s",
regname.c_str ());
break; break;
case TYPE_CODE_INT: case TYPE_CODE_INT:
@ -297,7 +297,7 @@ generate_register_struct (struct ui_file *stream, struct gdbarch *gdbarch,
fprintf_unfiltered (stream, fprintf_unfiltered (stream,
"int %s" "int %s"
" __attribute__ ((__mode__(__%s__)))", " __attribute__ ((__mode__(__%s__)))",
regname, regname.c_str (),
mode); mode);
break; break;
} }
@ -310,12 +310,10 @@ generate_register_struct (struct ui_file *stream, struct gdbarch *gdbarch,
" unsigned char %s[%d]" " unsigned char %s[%d]"
" __attribute__((__aligned__(" " __attribute__((__aligned__("
"__BIGGEST_ALIGNMENT__)))", "__BIGGEST_ALIGNMENT__)))",
regname, regname.c_str (),
TYPE_LENGTH (regtype)); TYPE_LENGTH (regtype));
} }
fputs_unfiltered (";\n", stream); fputs_unfiltered (";\n", stream);
do_cleanups (cleanups);
} }
} }

View File

@ -107,7 +107,6 @@ error_symbol_once (struct compile_c_instance *context,
{ {
struct symbol_error search; struct symbol_error search;
struct symbol_error *err; struct symbol_error *err;
char *message;
if (context->symbol_err_map == NULL) if (context->symbol_err_map == NULL)
return; return;
@ -117,10 +116,9 @@ error_symbol_once (struct compile_c_instance *context,
if (err == NULL || err->message == NULL) if (err == NULL || err->message == NULL)
return; return;
message = err->message; gdb::unique_xmalloc_ptr<char> message (err->message);
err->message = NULL; err->message = NULL;
make_cleanup (xfree, message); error (_("%s"), message.get ());
error (_("%s"), message);
} }
@ -128,10 +126,11 @@ error_symbol_once (struct compile_c_instance *context,
/* Compute the name of the pointer representing a local symbol's /* Compute the name of the pointer representing a local symbol's
address. */ address. */
static char * static gdb::unique_xmalloc_ptr<char>
symbol_substitution_name (struct symbol *sym) symbol_substitution_name (struct symbol *sym)
{ {
return concat ("__", SYMBOL_NATURAL_NAME (sym), "_ptr", (char *) NULL); return gdb::unique_xmalloc_ptr<char>
(concat ("__", SYMBOL_NATURAL_NAME (sym), "_ptr", (char *) NULL));
} }
/* Convert a given symbol, SYM, to the compiler's representation. /* 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; gcc_decl decl;
enum gcc_c_symbol_kind kind; enum gcc_c_symbol_kind kind;
CORE_ADDR addr = 0; CORE_ADDR addr = 0;
char *symbol_name = NULL; gdb::unique_xmalloc_ptr<char> symbol_name;
switch (SYMBOL_CLASS (sym.symbol)) switch (SYMBOL_CLASS (sym.symbol))
{ {
@ -290,13 +289,11 @@ convert_one_symbol (struct compile_c_instance *context,
SYMBOL_NATURAL_NAME (sym.symbol), SYMBOL_NATURAL_NAME (sym.symbol),
kind, kind,
sym_type, sym_type,
symbol_name, addr, symbol_name.get (), addr,
filename, line); filename, line);
C_CTX (context)->c_ops->bind (C_CTX (context), decl, is_global); 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) || TYPE_HIGH_BOUND_KIND (type) == PROP_LOCLIST)
{ {
const struct dynamic_prop *prop = &TYPE_RANGE_DATA (type)->high; const struct dynamic_prop *prop = &TYPE_RANGE_DATA (type)->high;
char *name = c_get_range_decl_name (prop); std::string name = c_get_range_decl_name (prop);
struct cleanup *cleanup = make_cleanup (xfree, name);
dwarf2_compile_property_to_c (stream, name, dwarf2_compile_property_to_c (stream, name.c_str (),
gdbarch, registers_used, gdbarch, registers_used,
prop, pc, sym); prop, pc, sym);
do_cleanups (cleanup);
} }
} }
break; break;
@ -663,8 +658,8 @@ generate_c_for_for_one_variable (struct compile_c_instance *compiler,
if (SYMBOL_COMPUTED_OPS (sym) != NULL) if (SYMBOL_COMPUTED_OPS (sym) != NULL)
{ {
char *generated_name = symbol_substitution_name (sym); gdb::unique_xmalloc_ptr<char> generated_name
struct cleanup *cleanup = make_cleanup (xfree, generated_name); = symbol_substitution_name (sym);
/* We need to emit to a temporary buffer in case an error /* We need to emit to a temporary buffer in case an error
occurs in the middle. */ occurs in the middle. */
string_file local_file; 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, SYMBOL_COMPUTED_OPS (sym)->generate_c_location (sym, local_file,
gdbarch, gdbarch,
registers_used, registers_used,
pc, generated_name); pc,
generated_name.get ());
stream.write (local_file.c_str (), local_file.size ()); stream.write (local_file.c_str (), local_file.size ());
do_cleanups (cleanup);
} }
else else
{ {

View File

@ -123,18 +123,17 @@ convert_array (struct compile_c_instance *context, struct type *type)
|| TYPE_HIGH_BOUND_KIND (range) == PROP_LOCLIST) || TYPE_HIGH_BOUND_KIND (range) == PROP_LOCLIST)
{ {
gcc_type result; gcc_type result;
char *upper_bound;
if (TYPE_VECTOR (type)) if (TYPE_VECTOR (type))
return C_CTX (context)->c_ops->error (C_CTX (context), return C_CTX (context)->c_ops->error (C_CTX (context),
_("variably-sized vector type" _("variably-sized vector type"
" is not supported")); " 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), result = C_CTX (context)->c_ops->build_vla_array_type (C_CTX (context),
element_type, element_type,
upper_bound); upper_bound.c_str ());
xfree (upper_bound);
return result; return result;
} }
else else

View File

@ -95,11 +95,10 @@ struct compile_c_instance
/* Call gdbarch_register_name (GDBARCH, REGNUM) and convert its result /* Call gdbarch_register_name (GDBARCH, REGNUM) and convert its result
to a form suitable for the compiler source. The register names to a form suitable for the compiler source. The register names
should not clash with inferior defined macros. Returned pointer is should not clash with inferior defined macros. */
never NULL. Returned pointer needs to be deallocated by xfree. */
extern char *compile_register_name_mangled (struct gdbarch *gdbarch, extern std::string compile_register_name_mangled (struct gdbarch *gdbarch,
int regnum); int regnum);
/* Convert compiler source register name to register number of /* Convert compiler source register name to register number of
GDBARCH. Returned value is always >= 0, function throws an error 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); extern const char *c_get_mode_for_size (int size);
/* Given a dynamic property, return an xmallocd name that is used to /* Given a dynamic property, return a name that is used to represent
represent its size. The result must be freed by the caller. The its size. The contents of the resulting string will be the same
contents of the resulting string will be the same each time for each time for each call with the same argument. */
each call with the same argument. */
struct dynamic_prop; 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 /* Type used to hold and pass around the source and object file names
to use for compilation. */ to use for compilation. */

View File

@ -515,15 +515,12 @@ pushf_register_address (int indent, string_file &stream,
unsigned char *registers_used, unsigned char *registers_used,
struct gdbarch *gdbarch, int regnum) struct gdbarch *gdbarch, int regnum)
{ {
char *regname = compile_register_name_mangled (gdbarch, regnum); std::string regname = compile_register_name_mangled (gdbarch, regnum);
struct cleanup *cleanups = make_cleanup (xfree, regname);
registers_used[regnum] = 1; registers_used[regnum] = 1;
pushf (indent, stream, pushf (indent, stream,
"(" GCC_UINTPTR ") &" COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s", "(" GCC_UINTPTR ") &" COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s",
regname); regname.c_str ());
do_cleanups (cleanups);
} }
/* Emit code that pushes a register's value on the stack. /* 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, unsigned char *registers_used,
struct gdbarch *gdbarch, int regnum, uint64_t offset) struct gdbarch *gdbarch, int regnum, uint64_t offset)
{ {
char *regname = compile_register_name_mangled (gdbarch, regnum); std::string regname = compile_register_name_mangled (gdbarch, regnum);
struct cleanup *cleanups = make_cleanup (xfree, regname);
registers_used[regnum] = 1; registers_used[regnum] = 1;
if (offset == 0) if (offset == 0)
pushf (indent, stream, COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s", pushf (indent, stream, COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s",
regname); regname.c_str ());
else else
pushf (indent, stream, pushf (indent, stream,
COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s + (" GCC_UINTPTR ") %s", COMPILE_I_SIMPLE_REGISTER_ARG_NAME "->%s + (" GCC_UINTPTR ") %s",
regname, hex_string (offset)); regname.c_str (), hex_string (offset));
do_cleanups (cleanups);
} }
/* Compile a DWARF expression to C code. /* Compile a DWARF expression to C code.

View File

@ -648,12 +648,12 @@ eval_compile_command (struct command_line *cmd, const char *cmd_string,
/* See compile/compile-internal.h. */ /* See compile/compile-internal.h. */
char * std::string
compile_register_name_mangled (struct gdbarch *gdbarch, int regnum) compile_register_name_mangled (struct gdbarch *gdbarch, int regnum)
{ {
const char *regname = gdbarch_register_name (gdbarch, regnum); const char *regname = gdbarch_register_name (gdbarch, regnum);
return xstrprintf ("__%s", regname); return string_printf ("__%s", regname);
} }
/* See compile/compile-internal.h. */ /* See compile/compile-internal.h. */