forked from Imagelibrary/binutils-gdb
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:
@@ -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:
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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_,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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. */
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user