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.
This commit is contained in:
Tom Tromey
2024-02-26 10:19:07 -07:00
parent 9069d69398
commit 7f032bbedf
7 changed files with 12 additions and 8 deletions

View File

@@ -81,7 +81,7 @@ struct addrmap_mutable;
/* Fixed address maps. */ /* Fixed address maps. */
struct addrmap_fixed : public addrmap, struct addrmap_fixed : public addrmap,
public allocate_on_obstack public allocate_on_obstack<addrmap_fixed>
{ {
public: public:

View File

@@ -31,7 +31,7 @@
C++ files, namely using declarations and the current namespace in C++ files, namely using declarations and the current namespace in
scope. */ scope. */
struct block_namespace_info : public allocate_on_obstack struct block_namespace_info : public allocate_on_obstack<block_namespace_info>
{ {
const char *scope = nullptr; const char *scope = nullptr;
struct using_direct *using_decl = nullptr; struct using_direct *using_decl = nullptr;

View File

@@ -105,7 +105,7 @@ struct blockranges
This implies that within the body of one function This implies that within the body of one function
the blocks appear in the order of a depth-first tree walk. */ 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. */ /* Return this block's start address. */
CORE_ADDR start () const CORE_ADDR start () const

View File

@@ -104,7 +104,7 @@ extern bool language_requires_canonicalization (enum language lang);
This is an "open" class and the members are all directly This is an "open" class and the members are all directly
accessible. It is read-only after the index has been fully read accessible. It is read-only after the index has been fully read
and processed. */ 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_entry (sect_offset die_offset_, enum dwarf_tag tag_,
cooked_index_flag flags_, cooked_index_flag flags_,

View File

@@ -211,7 +211,7 @@ struct variant_part;
control other variant parts as well. This struct corresponds to control other variant parts as well. This struct corresponds to
DW_TAG_variant in DWARF. */ DW_TAG_variant in DWARF. */
struct variant : allocate_on_obstack struct variant : allocate_on_obstack<variant>
{ {
/* * The discriminant ranges for this variant. */ /* * The discriminant ranges for this variant. */
gdb::array_view<discriminant_range> discriminants; 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 and holds an array of variants. This struct corresponds to
DW_TAG_variant_part in DWARF. */ 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 /* * 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 an index into the type's array of fields. If this is -1, there

View File

@@ -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. */ /* 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 () symbol ()
/* Class-initialization of bitfields is only allowed in C++20. */ /* Class-initialization of bitfields is only allowed in C++20. */

View File

@@ -133,14 +133,18 @@ struct auto_obstack : obstack
{ obstack_free (this, obstack_base (this)); } { 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 struct allocate_on_obstack
{ {
allocate_on_obstack () = default; allocate_on_obstack () = default;
void* operator new (size_t size, struct obstack *obstack) void* operator new (size_t size, struct obstack *obstack)
{ {
static_assert (IsFreeable<T>::value);
return obstack_alloc (obstack, size); return obstack_alloc (obstack, size);
} }