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>
* 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. */
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);
}
}

View File

@ -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<char> 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<char>
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.
@ -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<char> 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<char> 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
{

View File

@ -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

View File

@ -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. */

View File

@ -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.

View File

@ -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. */