+2018-08-10 Keith Seitz <keiths@redhat.com>
+
+ * compile/compile-c-support.c (c_compute_program): Use
+ unique_xmalloc_ptr to eliminate cleanup.
+ * compile/compile-c-symbols.c (generate_c_for_variable_locations):
+ Return a unique_xmalloc_ptr and eliminate cleanup.
+ * compile/compile-internal.h (generate_c_for_variable_locations):
+ Return unique_xmalloc_ptr and update description.
+
2018-08-10 Alan Hayward <alan.hayward@arm.com>
* corelow.c (core_target::get_core_register_section): Rename
and the user's code may only refer to globals. */
if (inst->scope != COMPILE_I_RAW_SCOPE)
{
- unsigned char *registers_used;
int i;
/* Generate the code to compute variable locations, but do it
before generating the function header, so we can define the
register struct before the function body. This requires a
temporary stream. */
- registers_used = generate_c_for_variable_locations (context,
- var_stream, gdbarch,
- expr_block, expr_pc);
- make_cleanup (xfree, registers_used);
+ gdb::unique_xmalloc_ptr<unsigned char> registers_used
+ = generate_c_for_variable_locations (context, var_stream, gdbarch,
+ expr_block, expr_pc);
buf.puts ("typedef unsigned int"
" __attribute__ ((__mode__(__pointer__)))"
mode, mode);
}
- generate_register_struct (&buf, gdbarch, registers_used);
+ generate_register_struct (&buf, gdbarch, registers_used.get ());
}
add_code_header (inst->scope, &buf);
/* See compile-internal.h. */
-unsigned char *
+gdb::unique_xmalloc_ptr<unsigned char>
generate_c_for_variable_locations (struct compile_c_instance *compiler,
string_file &stream,
struct gdbarch *gdbarch,
const struct block *block,
CORE_ADDR pc)
{
- struct cleanup *outer;
const struct block *static_block = block_static_block (block);
- unsigned char *registers_used;
/* If we're already in the static or global block, there is nothing
to write. */
if (static_block == NULL || block == static_block)
return NULL;
- registers_used = XCNEWVEC (unsigned char, gdbarch_num_regs (gdbarch));
- outer = make_cleanup (xfree, registers_used);
+ gdb::unique_xmalloc_ptr<unsigned char> registers_used
+ (XCNEWVEC (unsigned char, gdbarch_num_regs (gdbarch)));
/* Ensure that a given name is only entered once. This reflects the
reality of shadowing. */
{
if (!symbol_seen (symhash.get (), sym))
generate_c_for_for_one_variable (compiler, stream, gdbarch,
- registers_used, pc, sym);
+ registers_used.get (), pc, sym);
}
/* If we just finished the outermost block of a function, we're
block = BLOCK_SUPERBLOCK (block);
}
- discard_cleanups (outer);
return registers_used;
}
extern struct compile_instance *new_compile_instance (struct gcc_c_context *fe);
/* Emit code to compute the address for all the local variables in
- scope at PC in BLOCK. Returns a malloc'd vector, indexed by gdb
- register number, where each element indicates if the corresponding
- register is needed to compute a local variable. */
+ scope at PC in BLOCK. Returns a vector, indexed by gdb register
+ number, where each element indicates if the corresponding register
+ is needed to compute a local variable. */
-extern unsigned char *generate_c_for_variable_locations
+extern gdb::unique_xmalloc_ptr<unsigned char>
+ generate_c_for_variable_locations
(struct compile_c_instance *compiler,
string_file &stream,
struct gdbarch *gdbarch,