Eliminate make_cleanup_obstack_free, introduce auto_obstack

This commit eliminates make_cleanup_obstack_free, replacing it with a
new auto_obstack type that inherits obstack to add cdtors.

These changes in the parsers may not be obvious:

 -  obstack_init (&name_obstack);
 -  make_cleanup_obstack_free (&name_obstack);
 +  name_obstack.clear ();

Here, the 'name_obstack' variable is a global.  The change means that
the obstack's contents from a previous parse will stay around until
the next parsing starts.  I.e., memory won't be reclaimed until then.
I don't think that's a problem, these objects don't really grow much
at all.

The other option I tried was to add a separate type that is like
auto_obstack but manages an external obstack, just for those cases.  I
like the current approach better as that other approach adds more
boilerplate and yet another type to learn.

gdb/ChangeLog:
2017-06-27  Pedro Alves  <palves@redhat.com>

	* c-exp.y (name_obstack): Now an auto_obstack.
	(yylex): Use auto_obstack::clear.
	(c_parse): Use auto_obstack::clear instead of reinitializing and
	freeing the obstack.
	* c-lang.c (evaluate_subexp_c): Use auto_obstack.
	* d-exp.y (name_obstack): Now an auto_obstack.
	(yylex): Use auto_obstack::clear.
	(d_parse): Use auto_obstack::clear instead of reinitializing and
	freeing the obstack.
	* dwarf2loc.c (fetch_const_value_from_synthetic_pointer): Use
	auto_obstack.
	* dwarf2read.c (create_addrmap_from_index)
	(dwarf2_build_psymtabs_hard)
	(update_enumeration_type_from_children): Likewise.
	* gdb_obstack.h (auto_obstack): New type.
	* go-exp.y (name_obstack): Now an auto_obstack.
	(build_packaged_name): Use auto_obstack::clear.
	(go_parse): Use auto_obstack::clear instead of reinitializing and
	freeing the obstack.
	* linux-tdep.c (linux_make_mappings_corefile_notes): Use
	auto_obstack.
	* printcmd.c (printf_wide_c_string, ui_printf): Use auto_obstack.
	* rust-exp.y (work_obstack): Now an auto_obstack.
	(rust_parse, rust_lex_tests): Use auto_obstack::clear instead of
	reinitializing and freeing the obstack.
	* utils.c (do_obstack_free, make_cleanup_obstack_free): Delete.
	(host_char_to_target): Use auto_obstack.
	* utils.h (make_cleanup_obstack_free): Delete declaration.
	* valprint.c (generic_emit_char, generic_printstr): Use
	auto_obstack.
This commit is contained in:
Pedro Alves
2017-06-27 11:07:14 +01:00
parent 6806377956
commit 8268c77870
14 changed files with 88 additions and 100 deletions

View File

@ -166,24 +166,6 @@ make_cleanup_fclose (FILE *file)
return make_cleanup (do_fclose_cleanup, file);
}
/* Helper function which does the work for make_cleanup_obstack_free. */
static void
do_obstack_free (void *arg)
{
struct obstack *ob = (struct obstack *) arg;
obstack_free (ob, NULL);
}
/* Return a new cleanup that frees OBSTACK. */
struct cleanup *
make_cleanup_obstack_free (struct obstack *obstack)
{
return make_cleanup (do_obstack_free, obstack);
}
/* Helper function for make_cleanup_ui_out_redirect_pop. */
static void
@ -1277,13 +1259,10 @@ query (const char *ctlstr, ...)
static int
host_char_to_target (struct gdbarch *gdbarch, int c, int *target_c)
{
struct obstack host_data;
char the_char = c;
struct cleanup *cleanups;
int result = 0;
obstack_init (&host_data);
cleanups = make_cleanup_obstack_free (&host_data);
auto_obstack host_data;
convert_between_encodings (target_charset (gdbarch), host_charset (),
(gdb_byte *) &the_char, 1, 1,
@ -1295,7 +1274,6 @@ host_char_to_target (struct gdbarch *gdbarch, int c, int *target_c)
*target_c = *(char *) obstack_base (&host_data);
}
do_cleanups (cleanups);
return result;
}