diff options
author | Faisal Abbas <90.abbasfaisal@gmail.com> | 2022-07-16 17:01:47 +0100 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2022-08-25 12:40:24 +0100 |
commit | 7c13a2e5873f5919c00b5f37b6db52af8d0f7300 (patch) | |
tree | b62ac124ec3048924b4bcb50fa81278955be3426 /gcc/rust/backend/rust-tree.h | |
parent | a5b583d021a4cbbfafecc28445709afe32cdd1c8 (diff) | |
download | gcc-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.h | 53 |
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 |