aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/backend/rust-tree.h
diff options
context:
space:
mode:
authorFaisal Abbas <90.abbasfaisal@gmail.com>2022-07-16 17:01:47 +0100
committerPhilip Herron <philip.herron@embecosm.com>2022-08-25 12:40:24 +0100
commit7c13a2e5873f5919c00b5f37b6db52af8d0f7300 (patch)
treeb62ac124ec3048924b4bcb50fa81278955be3426 /gcc/rust/backend/rust-tree.h
parenta5b583d021a4cbbfafecc28445709afe32cdd1c8 (diff)
downloadgcc-7c13a2e5873f5919c00b5f37b6db52af8d0f7300.zip
gcc-7c13a2e5873f5919c00b5f37b6db52af8d0f7300.tar.gz
gcc-7c13a2e5873f5919c00b5f37b6db52af8d0f7300.tar.bz2
gccrs const folding port: start porting cxx_eval_array_reference()
Following functions are ported in this changeset: - array_index_cmp - unshare_constructor - find_array_ctor_elt - reduced_constant_expression_p - verify_constant - diag_array_subscript - get_array_or_vector_nelts - eval_and_check_array_index - extract_string_elt - free_constructor - cv_unqualified - make_tree_vector - release_tree_vector - vec_safe_push Following structs, classes and enums are ported in this changeset: - releasing_vec Signed-off-by: Faisal Abbas <90.abbasfaisal@gmail.com>
Diffstat (limited to 'gcc/rust/backend/rust-tree.h')
-rw-r--r--gcc/rust/backend/rust-tree.h53
1 files changed, 53 insertions, 0 deletions
diff --git a/gcc/rust/backend/rust-tree.h b/gcc/rust/backend/rust-tree.h
index b838e40..b93e936 100644
--- a/gcc/rust/backend/rust-tree.h
+++ b/gcc/rust/backend/rust-tree.h
@@ -2009,6 +2009,59 @@ gnu_vector_type_p (const_tree type)
return TREE_CODE (type) == VECTOR_TYPE && !TYPE_INDIVISIBLE_P (type);
}
+extern vec<tree, va_gc> *
+make_tree_vector (void);
+
+extern void
+release_tree_vector (vec<tree, va_gc> *);
+
+/* Simplified unique_ptr clone to release a tree vec on exit. */
+
+class releasing_vec
+{
+public:
+ typedef vec<tree, va_gc> vec_t;
+
+ releasing_vec (vec_t *v) : v (v) {}
+ releasing_vec () : v (make_tree_vector ()) {}
+
+ /* Copy ops are deliberately declared but not defined,
+ copies must always be elided. */
+ releasing_vec (const releasing_vec &);
+ releasing_vec &operator= (const releasing_vec &);
+
+ vec_t &operator* () const { return *v; }
+ vec_t *operator-> () const { return v; }
+ vec_t *get () const { return v; }
+ operator vec_t * () const { return v; }
+ vec_t **operator& () { return &v; }
+
+ /* Breaks pointer/value consistency for convenience. This takes ptrdiff_t
+ rather than unsigned to avoid ambiguity with the built-in operator[]
+ (bootstrap/91828). */
+ tree &operator[] (ptrdiff_t i) const { return (*v)[i]; }
+
+ tree *begin () { return ::begin (v); }
+ tree *end () { return ::end (v); }
+
+ void release ()
+ {
+ release_tree_vector (v);
+ v = NULL;
+ }
+
+ ~releasing_vec () { release_tree_vector (v); }
+
+private:
+ vec_t *v;
+};
+
+inline tree *
+vec_safe_push (releasing_vec &r, const tree &t CXX_MEM_STAT_INFO)
+{
+ return vec_safe_push (*&r, t PASS_MEM_STAT);
+}
+
} // namespace Rust
#endif // RUST_TREE