+2018-02-16 Yao Qi <yao.qi@linaro.org>
+
+ * block.c (block_namespace_info): Inherit allocate_on_obstack.
+ (block_initialize_namespace): Use new.
+ * dwarf2read.c (dwarf2_per_objfile): Inherit allocate_on_obstack.
+ (dwarf2_free_objfile): Use delete.
+ * gdbtypes.c (type_pair): Inherit allocate_on_obstack.
+ (copy_type_recursive): Use new.
+ * gdb_obstack.h (allocate_on_obstack): New.
+
2018-02-15 Yao Qi <yao.qi@linaro.org>
PR gdb/22849
C++ files, namely using declarations and the current namespace in
scope. */
-struct block_namespace_info
+struct block_namespace_info : public allocate_on_obstack
{
- const char *scope;
- struct using_direct *using_decl;
+ const char *scope = nullptr;
+ struct using_direct *using_decl = nullptr;
};
static void block_initialize_namespace (struct block *block,
block_initialize_namespace (struct block *block, struct obstack *obstack)
{
if (BLOCK_NAMESPACE (block) == NULL)
- {
- BLOCK_NAMESPACE (block) = XOBNEW (obstack, struct block_namespace_info);
- BLOCK_NAMESPACE (block)->scope = NULL;
- BLOCK_NAMESPACE (block)->using_decl = NULL;
- }
+ BLOCK_NAMESPACE (block) = new (obstack) struct block_namespace_info ();
}
/* Return the static block associated to BLOCK. Return NULL if block
/* Collection of data recorded per objfile.
This hangs off of dwarf2_objfile_data_key. */
-struct dwarf2_per_objfile
+struct dwarf2_per_objfile : public allocate_on_obstack
{
/* Construct a dwarf2_per_objfile for OBJFILE. NAMES points to the
dwarf2 section names, or is NULL if the standard ELF names are
if (dwarf2_per_objfile == NULL)
{
/* Initialize per-objfile state. */
- struct dwarf2_per_objfile *data
- = XOBNEW (&objfile->objfile_obstack, struct dwarf2_per_objfile);
-
- dwarf2_per_objfile = new (data) struct dwarf2_per_objfile (objfile, names);
+ dwarf2_per_objfile
+ = new (&objfile->objfile_obstack) struct dwarf2_per_objfile (objfile,
+ names);
set_dwarf2_per_objfile (objfile, dwarf2_per_objfile);
}
return (!dwarf2_per_objfile->info.is_virtual
struct dwarf2_per_objfile *dwarf2_per_objfile
= get_dwarf2_per_objfile (objfile);
- if (dwarf2_per_objfile == NULL)
- return;
-
- dwarf2_per_objfile->~dwarf2_per_objfile ();
+ delete dwarf2_per_objfile;
}
/* A set of CU "per_cu" pointer, DIE offset, and GDB type pointer.
{ obstack_free (this, obstack_base (this)); }
};
+/* Objects are allocated on obstack instead of heap. */
+
+struct allocate_on_obstack
+{
+ allocate_on_obstack () = default;
+
+ void* operator new (size_t size, struct obstack *obstack)
+ {
+ return obstack_alloc (obstack, size);
+ }
+
+ void* operator new[] (size_t size, struct obstack *obstack)
+ {
+ return obstack_alloc (obstack, size);
+ }
+
+ void operator delete (void *memory) {}
+ void operator delete[] (void *memory) {}
+};
+
#endif
/* Trivial helpers for the libiberty hash table, for mapping one
type to another. */
-struct type_pair
+struct type_pair : public allocate_on_obstack
{
- struct type *old, *newobj;
+ type_pair (struct type *old_, struct type *newobj_)
+ : old (old_), newobj (newobj_)
+ {}
+
+ struct type * const old, * const newobj;
};
static hashval_t
struct type *type,
htab_t copied_types)
{
- struct type_pair *stored, pair;
void **slot;
struct type *new_type;
if it did, the type might disappear unexpectedly. */
gdb_assert (TYPE_OBJFILE (type) == objfile);
- pair.old = type;
+ struct type_pair pair (type, nullptr);
+
slot = htab_find_slot (copied_types, &pair, INSERT);
if (*slot != NULL)
return ((struct type_pair *) *slot)->newobj;
/* We must add the new type to the hash table immediately, in case
we encounter this type again during a recursive call below. */
- stored = XOBNEW (&objfile->objfile_obstack, struct type_pair);
- stored->old = type;
- stored->newobj = new_type;
+ struct type_pair *stored
+ = new (&objfile->objfile_obstack) struct type_pair (type, new_type);
+
*slot = stored;
/* Copy the common fields of types. For the main type, we simply