diff options
author | Tom Tromey <tromey@adacore.com> | 2024-02-26 10:19:07 -0700 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2024-03-21 12:21:24 -0600 |
commit | 7f032bbedf3e66f6695d4df0d149c2e8033224da (patch) | |
tree | 3e29a70d55d9e9952f81d6f91411e2cee13ac028 | |
parent | 9069d69398649cd9a54e4dcac8548b10ece8a304 (diff) | |
download | binutils-7f032bbedf3e66f6695d4df0d149c2e8033224da.zip binutils-7f032bbedf3e66f6695d4df0d149c2e8033224da.tar.gz binutils-7f032bbedf3e66f6695d4df0d149c2e8033224da.tar.bz2 |
Require trivial destructor in allocate_on_obstack
This patch makes allocate_on_obstack a little bit safer, by enforcing
the rule that objects allocated on an obstack must have a trivial
destructor.
The static assert is done in a method -- doing it inside the class
itself won't work because the class is incomplete at that point.
-rw-r--r-- | gdb/addrmap.h | 2 | ||||
-rw-r--r-- | gdb/block.c | 2 | ||||
-rw-r--r-- | gdb/block.h | 2 | ||||
-rw-r--r-- | gdb/dwarf2/cooked-index.h | 2 | ||||
-rw-r--r-- | gdb/gdbtypes.h | 4 | ||||
-rw-r--r-- | gdb/symtab.h | 2 | ||||
-rw-r--r-- | gdbsupport/gdb_obstack.h | 6 |
7 files changed, 12 insertions, 8 deletions
diff --git a/gdb/addrmap.h b/gdb/addrmap.h index 0d61046..55dea36 100644 --- a/gdb/addrmap.h +++ b/gdb/addrmap.h @@ -81,7 +81,7 @@ struct addrmap_mutable; /* Fixed address maps. */ struct addrmap_fixed : public addrmap, - public allocate_on_obstack + public allocate_on_obstack<addrmap_fixed> { public: diff --git a/gdb/block.c b/gdb/block.c index 079053c..6d0d33f 100644 --- a/gdb/block.c +++ b/gdb/block.c @@ -31,7 +31,7 @@ C++ files, namely using declarations and the current namespace in scope. */ -struct block_namespace_info : public allocate_on_obstack +struct block_namespace_info : public allocate_on_obstack<block_namespace_info> { const char *scope = nullptr; struct using_direct *using_decl = nullptr; diff --git a/gdb/block.h b/gdb/block.h index 4c29f65..ae676c4 100644 --- a/gdb/block.h +++ b/gdb/block.h @@ -105,7 +105,7 @@ struct blockranges This implies that within the body of one function the blocks appear in the order of a depth-first tree walk. */ -struct block : public allocate_on_obstack +struct block : public allocate_on_obstack<block> { /* Return this block's start address. */ CORE_ADDR start () const diff --git a/gdb/dwarf2/cooked-index.h b/gdb/dwarf2/cooked-index.h index 1c8fb8f..e73bd7c 100644 --- a/gdb/dwarf2/cooked-index.h +++ b/gdb/dwarf2/cooked-index.h @@ -104,7 +104,7 @@ extern bool language_requires_canonicalization (enum language lang); This is an "open" class and the members are all directly accessible. It is read-only after the index has been fully read and processed. */ -struct cooked_index_entry : public allocate_on_obstack +struct cooked_index_entry : public allocate_on_obstack<cooked_index_entry> { cooked_index_entry (sect_offset die_offset_, enum dwarf_tag tag_, cooked_index_flag flags_, diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 435a040..f80bd7e 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -211,7 +211,7 @@ struct variant_part; control other variant parts as well. This struct corresponds to DW_TAG_variant in DWARF. */ -struct variant : allocate_on_obstack +struct variant : allocate_on_obstack<variant> { /* * The discriminant ranges for this variant. */ gdb::array_view<discriminant_range> discriminants; @@ -243,7 +243,7 @@ struct variant : allocate_on_obstack and holds an array of variants. This struct corresponds to DW_TAG_variant_part in DWARF. */ -struct variant_part : allocate_on_obstack +struct variant_part : allocate_on_obstack<variant_part> { /* * The index of the discriminant field in the outer type. This is an index into the type's array of fields. If this is -1, there diff --git a/gdb/symtab.h b/gdb/symtab.h index e23eaed..bf9a3cf 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -1244,7 +1244,7 @@ extern gdb::array_view<const struct symbol_impl> symbol_impls; /* This structure is space critical. See space comments at the top. */ -struct symbol : public general_symbol_info, public allocate_on_obstack +struct symbol : public general_symbol_info, public allocate_on_obstack<symbol> { symbol () /* Class-initialization of bitfields is only allowed in C++20. */ diff --git a/gdbsupport/gdb_obstack.h b/gdbsupport/gdb_obstack.h index 20f8886..7b3bb05 100644 --- a/gdbsupport/gdb_obstack.h +++ b/gdbsupport/gdb_obstack.h @@ -133,14 +133,18 @@ struct auto_obstack : obstack { obstack_free (this, obstack_base (this)); } }; -/* Objects are allocated on obstack instead of heap. */ +/* Objects are allocated on obstack instead of heap. This is a mixin + that uses CRTP to ensure that the type in question is trivially + destructible. */ +template<typename T> struct allocate_on_obstack { allocate_on_obstack () = default; void* operator new (size_t size, struct obstack *obstack) { + static_assert (IsFreeable<T>::value); return obstack_alloc (obstack, size); } |