@@ -320,7 +320,7 @@ block_range_cache::block_range_cache ()
bitmap_obstack_initialize (&m_bitmaps);
m_ssa_ranges.create (0);
m_ssa_ranges.safe_grow_cleared (num_ssa_names);
- m_range_allocator = new vrange_allocator;
+ m_range_allocator = new obstack_vrange_allocator;
}
// Remove any m_block_caches which have been created.
@@ -478,7 +478,7 @@ block_range_cache::dump (FILE *f, basic_block bb, bool print_varying)
ssa_global_cache::ssa_global_cache ()
{
m_tab.create (0);
- m_range_allocator = new vrange_allocator;
+ m_range_allocator = new obstack_vrange_allocator;
}
// Deconstruct a global cache.
@@ -47,7 +47,7 @@ private:
int m_max_edges;
hash_map<edge, irange *> *m_edge_table;
- vrange_allocator m_range_allocator;
+ obstack_vrange_allocator m_range_allocator;
};
// If there is a range control statement at the end of block BB, return it.
@@ -78,7 +78,7 @@ private:
bitmap m_seen;
bitmap_obstack m_bitmaps;
struct obstack m_list_obstack;
- vrange_allocator m_range_allocator;
+ obstack_vrange_allocator m_range_allocator;
};
#endif // GCC_GIMPLE_RANGE_SIDE_H
@@ -903,39 +903,54 @@ vrp_val_min (const_tree type)
class vrange_allocator
{
public:
- vrange_allocator ();
- ~vrange_allocator ();
+ vrange_allocator () { }
+ virtual ~vrange_allocator () { }
// Allocate a range of TYPE.
vrange *alloc_vrange (tree type);
// Allocate a memory block of BYTES.
- void *alloc (unsigned bytes);
+ virtual void *alloc (unsigned bytes) = 0;
+ virtual void free (void *p) = 0;
// Return a clone of SRC.
template <typename T> T *clone (const T &src);
private:
irange *alloc_irange (unsigned pairs);
- DISABLE_COPY_AND_ASSIGN (vrange_allocator);
- struct obstack m_obstack;
+ void operator= (const vrange_allocator &) = delete;
};
-inline
-vrange_allocator::vrange_allocator ()
+class obstack_vrange_allocator : public vrange_allocator
{
- obstack_init (&m_obstack);
-}
-
-inline
-vrange_allocator::~vrange_allocator ()
-{
- obstack_free (&m_obstack, NULL);
-}
-
-// Provide a hunk of memory from the obstack.
+public:
+ obstack_vrange_allocator ()
+ {
+ obstack_init (&m_obstack);
+ }
+ virtual ~obstack_vrange_allocator () final override
+ {
+ obstack_free (&m_obstack, NULL);
+ }
+ virtual void *alloc (unsigned bytes) final override
+ {
+ return obstack_alloc (&m_obstack, bytes);
+ }
+ virtual void free (void *) final override { }
+private:
+ obstack m_obstack;
+};
-inline void *
-vrange_allocator::alloc (unsigned bytes)
+class ggc_vrange_allocator : public vrange_allocator
{
- return obstack_alloc (&m_obstack, bytes);
-}
+public:
+ ggc_vrange_allocator () { }
+ virtual ~ggc_vrange_allocator () final override { }
+ virtual void *alloc (unsigned bytes) final override
+ {
+ return ggc_internal_alloc (bytes);
+ }
+ virtual void free (void *p) final override
+ {
+ return ggc_free (p);
+ }
+};
// Return a new range to hold ranges of TYPE. The newly allocated
// range is initialized to VR_UNDEFINED.