diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/Make-lang.in | 3 | ||||
-rw-r--r-- | gcc/rust/backend/rust-constexpr.cc | 96 | ||||
-rw-r--r-- | gcc/rust/expand/rust-macro-builtins.cc | 25 | ||||
-rw-r--r-- | gcc/rust/expand/rust-macro-builtins.h | 47 | ||||
-rw-r--r-- | gcc/rust/util/rust-hir-map.cc | 22 |
5 files changed, 97 insertions, 96 deletions
diff --git a/gcc/rust/Make-lang.in b/gcc/rust/Make-lang.in index 024fe23..58dbc09 100644 --- a/gcc/rust/Make-lang.in +++ b/gcc/rust/Make-lang.in @@ -331,8 +331,7 @@ CFLAGS-rust/rust-lex.o += $(RUST_INCLUDES) CFLAGS-rust/rust-parse.o += $(RUST_INCLUDES) CFLAGS-rust/rust-session-manager.o += $(RUST_INCLUDES) -# TODO: possibly find a way to ensure C++11 compilation level here? -RUST_CXXFLAGS = -std=c++11 -Wno-unused-parameter -Werror=overloaded-virtual +RUST_CXXFLAGS = $(CXXFLAGS) # build all rust/lex files in rust folder, add cross-folder includes rust/%.o: rust/lex/%.cc diff --git a/gcc/rust/backend/rust-constexpr.cc b/gcc/rust/backend/rust-constexpr.cc index 790a8e9..21e8bed 100644 --- a/gcc/rust/backend/rust-constexpr.cc +++ b/gcc/rust/backend/rust-constexpr.cc @@ -3658,49 +3658,48 @@ eval_call_expression (const constexpr_ctx *ctx, tree t, bool lval, whose constructor we are processing. Add the initializer to the vector and return true to indicate success. */ -static bool -build_anon_member_initialization (tree member, tree init, - vec<constructor_elt, va_gc> **vec_outer) -{ - /* MEMBER presents the relevant fields from the inside out, but we need - to build up the initializer from the outside in so that we can reuse - previously built CONSTRUCTORs if this is, say, the second field in an - anonymous struct. So we use a vec as a stack. */ - auto_vec<tree, 2> fields; - do - { - fields.safe_push (TREE_OPERAND (member, 1)); - member = TREE_OPERAND (member, 0); - } - while (ANON_AGGR_TYPE_P (TREE_TYPE (member)) - && TREE_CODE (member) == COMPONENT_REF); - - /* VEC has the constructor elements vector for the context of FIELD. - If FIELD is an anonymous aggregate, we will push inside it. */ - vec<constructor_elt, va_gc> **vec = vec_outer; - tree field; - while (field = fields.pop (), ANON_AGGR_TYPE_P (TREE_TYPE (field))) - { - tree ctor; - /* If there is already an outer constructor entry for the anonymous - aggregate FIELD, use it; otherwise, insert one. */ - if (vec_safe_is_empty (*vec) || (*vec)->last ().index != field) - { - ctor = build_constructor (TREE_TYPE (field), NULL); - CONSTRUCTOR_APPEND_ELT (*vec, field, ctor); - } - else - ctor = (*vec)->last ().value; - vec = &CONSTRUCTOR_ELTS (ctor); - } - - /* Now we're at the innermost field, the one that isn't an anonymous - aggregate. Add its initializer to the CONSTRUCTOR and we're done. */ - gcc_assert (fields.is_empty ()); - CONSTRUCTOR_APPEND_ELT (*vec, field, init); - - return true; -} +// static bool +// build_anon_member_initialization (tree member, tree init, +// vec<constructor_elt, va_gc> **vec_outer) +// { +// /* MEMBER presents the relevant fields from the inside out, but we need +// to build up the initializer from the outside in so that we can reuse +// previously built CONSTRUCTORs if this is, say, the second field in an +// anonymous struct. So we use a vec as a stack. */ +// auto_vec<tree, 2> fields; +// do +// { +// fields.safe_push (TREE_OPERAND (member, 1)); +// member = TREE_OPERAND (member, 0); +// } while (ANON_AGGR_TYPE_P (TREE_TYPE (member)) +// && TREE_CODE (member) == COMPONENT_REF); +// +// /* VEC has the constructor elements vector for the context of FIELD. +// If FIELD is an anonymous aggregate, we will push inside it. */ +// vec<constructor_elt, va_gc> **vec = vec_outer; +// tree field; +// while (field = fields.pop (), ANON_AGGR_TYPE_P (TREE_TYPE (field))) +// { +// tree ctor; +// /* If there is already an outer constructor entry for the anonymous +// aggregate FIELD, use it; otherwise, insert one. */ +// if (vec_safe_is_empty (*vec) || (*vec)->last ().index != field) +// { +// ctor = build_constructor (TREE_TYPE (field), NULL); +// CONSTRUCTOR_APPEND_ELT (*vec, field, ctor); +// } +// else +// ctor = (*vec)->last ().value; +// vec = &CONSTRUCTOR_ELTS (ctor); +// } +// +// /* Now we're at the innermost field, the one that isn't an anonymous +// aggregate. Add its initializer to the CONSTRUCTOR and we're done. */ +// gcc_assert (fields.is_empty ()); +// CONSTRUCTOR_APPEND_ELT (*vec, field, init); +// +// return true; +// } ///* V is a vector of constructor elements built up for the base and member // initializers of a constructor for TYPE. They need to be in increasing @@ -3750,7 +3749,7 @@ build_anon_member_initialization (tree member, tree init, static bool build_data_member_initialization (tree t, vec<constructor_elt, va_gc> **vec) { - tree member, init; + tree member; if (TREE_CODE (t) == CLEANUP_POINT_EXPR) t = TREE_OPERAND (t, 0); if (TREE_CODE (t) == EXPR_STMT) @@ -3835,7 +3834,8 @@ build_data_member_initialization (tree t, vec<constructor_elt, va_gc> **vec) member = TREE_OPERAND (member, 1); else if (ANON_AGGR_TYPE_P (TREE_TYPE (aggr))) /* Initializing a member of an anonymous union. */ - return build_anon_member_initialization (member, init, vec); + rust_sorry_at (Location (), "cannot handle value initialization yet"); + // return build_anon_member_initialization (member, init, vec); else /* We're initializing a vtable pointer in a base. Leave it as COMPONENT_REF so we remember the path to get to the vfield. */ @@ -3845,9 +3845,11 @@ build_data_member_initialization (tree t, vec<constructor_elt, va_gc> **vec) /* Value-initialization can produce multiple initializers for the same field; use the last one. */ if (!vec_safe_is_empty (*vec) && (*vec)->last ().index == member) - (*vec)->last ().value = init; + rust_sorry_at (Location (), "cannot handle value initialization yet"); + // (*vec)->last ().value = init; else - CONSTRUCTOR_APPEND_ELT (*vec, member, init); + rust_sorry_at (Location (), "cannot handle value initialization yet"); + // CONSTRUCTOR_APPEND_ELT (*vec, member, init); return true; } diff --git a/gcc/rust/expand/rust-macro-builtins.cc b/gcc/rust/expand/rust-macro-builtins.cc index 14322d0..a00b5ed 100644 --- a/gcc/rust/expand/rust-macro-builtins.cc +++ b/gcc/rust/expand/rust-macro-builtins.cc @@ -265,7 +265,7 @@ load_file_bytes (const char *filename) } // namespace AST::Fragment -MacroBuiltin::assert (Location invoc_locus, AST::MacroInvocData &invoc) +MacroBuiltin::assert_handler (Location invoc_locus, AST::MacroInvocData &invoc) { rust_debug ("assert!() called"); @@ -273,7 +273,7 @@ MacroBuiltin::assert (Location invoc_locus, AST::MacroInvocData &invoc) } AST::Fragment -MacroBuiltin::file (Location invoc_locus, AST::MacroInvocData &invoc) +MacroBuiltin::file_handler (Location invoc_locus, AST::MacroInvocData &invoc) { auto current_file = Session::get_instance ().linemap->location_file (invoc_locus); @@ -283,7 +283,7 @@ MacroBuiltin::file (Location invoc_locus, AST::MacroInvocData &invoc) } AST::Fragment -MacroBuiltin::column (Location invoc_locus, AST::MacroInvocData &invoc) +MacroBuiltin::column_handler (Location invoc_locus, AST::MacroInvocData &invoc) { auto current_column = Session::get_instance ().linemap->location_to_column (invoc_locus); @@ -300,7 +300,8 @@ MacroBuiltin::column (Location invoc_locus, AST::MacroInvocData &invoc) &'static [u8; N]. */ AST::Fragment -MacroBuiltin::include_bytes (Location invoc_locus, AST::MacroInvocData &invoc) +MacroBuiltin::include_bytes_handler (Location invoc_locus, + AST::MacroInvocData &invoc) { /* Get target filename from the macro invocation, which is treated as a path relative to the include!-ing file (currently being compiled). */ @@ -343,7 +344,8 @@ MacroBuiltin::include_bytes (Location invoc_locus, AST::MacroInvocData &invoc) expression of type &'static str. */ AST::Fragment -MacroBuiltin::include_str (Location invoc_locus, AST::MacroInvocData &invoc) +MacroBuiltin::include_str_handler (Location invoc_locus, + AST::MacroInvocData &invoc) { /* Get target filename from the macro invocation, which is treated as a path relative to the include!-ing file (currently being compiled). */ @@ -368,7 +370,8 @@ MacroBuiltin::include_str (Location invoc_locus, AST::MacroInvocData &invoc) /* Expand builtin macro compile_error!("error"), which forces a compile error during the compile time. */ AST::Fragment -MacroBuiltin::compile_error (Location invoc_locus, AST::MacroInvocData &invoc) +MacroBuiltin::compile_error_handler (Location invoc_locus, + AST::MacroInvocData &invoc) { auto lit_expr = parse_single_string_literal (invoc.get_delim_tok_tree (), invoc_locus, @@ -386,7 +389,7 @@ MacroBuiltin::compile_error (Location invoc_locus, AST::MacroInvocData &invoc) into a string with no delimiter. */ AST::Fragment -MacroBuiltin::concat (Location invoc_locus, AST::MacroInvocData &invoc) +MacroBuiltin::concat_handler (Location invoc_locus, AST::MacroInvocData &invoc) { auto invoc_token_tree = invoc.get_delim_tok_tree (); MacroInvocLexer lex (invoc_token_tree.to_token_stream ()); @@ -437,7 +440,7 @@ MacroBuiltin::concat (Location invoc_locus, AST::MacroInvocData &invoc) compile time. */ AST::Fragment -MacroBuiltin::env (Location invoc_locus, AST::MacroInvocData &invoc) +MacroBuiltin::env_handler (Location invoc_locus, AST::MacroInvocData &invoc) { auto invoc_token_tree = invoc.get_delim_tok_tree (); MacroInvocLexer lex (invoc_token_tree.to_token_stream ()); @@ -495,7 +498,7 @@ MacroBuiltin::env (Location invoc_locus, AST::MacroInvocData &invoc) } AST::Fragment -MacroBuiltin::cfg (Location invoc_locus, AST::MacroInvocData &invoc) +MacroBuiltin::cfg_handler (Location invoc_locus, AST::MacroInvocData &invoc) { // only parse if not already parsed if (!invoc.is_parsed ()) @@ -534,7 +537,7 @@ MacroBuiltin::cfg (Location invoc_locus, AST::MacroInvocData &invoc) scope compile time. */ AST::Fragment -MacroBuiltin::include (Location invoc_locus, AST::MacroInvocData &invoc) +MacroBuiltin::include_handler (Location invoc_locus, AST::MacroInvocData &invoc) { /* Get target filename from the macro invocation, which is treated as a path relative to the include!-ing file (currently being compiled). */ @@ -588,7 +591,7 @@ MacroBuiltin::include (Location invoc_locus, AST::MacroInvocData &invoc) } AST::Fragment -MacroBuiltin::line (Location invoc_locus, AST::MacroInvocData &invoc) +MacroBuiltin::line_handler (Location invoc_locus, AST::MacroInvocData &invoc) { auto current_line = Session::get_instance ().linemap->location_to_line (invoc_locus); diff --git a/gcc/rust/expand/rust-macro-builtins.h b/gcc/rust/expand/rust-macro-builtins.h index 79305e4..0f4b464 100644 --- a/gcc/rust/expand/rust-macro-builtins.h +++ b/gcc/rust/expand/rust-macro-builtins.h @@ -60,45 +60,42 @@ * of the `Mappings` class. */ -/* If assert is defined as a macro this file will not parse, so undefine this - before continuing. */ -// TODO: Rename all functions here `*_handler` -#ifdef assert -#undef assert -#endif - namespace Rust { class MacroBuiltin { public: - static AST::Fragment assert (Location invoc_locus, - AST::MacroInvocData &invoc); + static AST::Fragment assert_handler (Location invoc_locus, + AST::MacroInvocData &invoc); - static AST::Fragment file (Location invoc_locus, AST::MacroInvocData &invoc); + static AST::Fragment file_handler (Location invoc_locus, + AST::MacroInvocData &invoc); - static AST::Fragment column (Location invoc_locus, - AST::MacroInvocData &invoc); + static AST::Fragment column_handler (Location invoc_locus, + AST::MacroInvocData &invoc); - static AST::Fragment include_bytes (Location invoc_locus, - AST::MacroInvocData &invoc); + static AST::Fragment include_bytes_handler (Location invoc_locus, + AST::MacroInvocData &invoc); - static AST::Fragment include_str (Location invoc_locus, - AST::MacroInvocData &invoc); + static AST::Fragment include_str_handler (Location invoc_locus, + AST::MacroInvocData &invoc); - static AST::Fragment compile_error (Location invoc_locus, - AST::MacroInvocData &invoc); + static AST::Fragment compile_error_handler (Location invoc_locus, + AST::MacroInvocData &invoc); - static AST::Fragment concat (Location invoc_locus, - AST::MacroInvocData &invoc); + static AST::Fragment concat_handler (Location invoc_locus, + AST::MacroInvocData &invoc); - static AST::Fragment env (Location invoc_locus, AST::MacroInvocData &invoc); + static AST::Fragment env_handler (Location invoc_locus, + AST::MacroInvocData &invoc); - static AST::Fragment cfg (Location invoc_locus, AST::MacroInvocData &invoc); + static AST::Fragment cfg_handler (Location invoc_locus, + AST::MacroInvocData &invoc); - static AST::Fragment include (Location invoc_locus, - AST::MacroInvocData &invoc); + static AST::Fragment include_handler (Location invoc_locus, + AST::MacroInvocData &invoc); - static AST::Fragment line (Location invoc_locus, AST::MacroInvocData &invoc); + static AST::Fragment line_handler (Location invoc_locus, + AST::MacroInvocData &invoc); }; } // namespace Rust diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc index a3073c0..2364b13 100644 --- a/gcc/rust/util/rust-hir-map.cc +++ b/gcc/rust/util/rust-hir-map.cc @@ -843,17 +843,17 @@ Mappings::insert_macro_def (AST::MacroRulesDefinition *macro) static std::map< std::string, std::function<AST::Fragment (Location, AST::MacroInvocData &)>> builtin_macros = { - {"assert", MacroBuiltin::assert}, - {"file", MacroBuiltin::file}, - {"line", MacroBuiltin::line}, - {"column", MacroBuiltin::column}, - {"include_bytes", MacroBuiltin::include_bytes}, - {"include_str", MacroBuiltin::include_str}, - {"compile_error", MacroBuiltin::compile_error}, - {"concat", MacroBuiltin::concat}, - {"env", MacroBuiltin::env}, - {"cfg", MacroBuiltin::cfg}, - {"include", MacroBuiltin::include}, + {"assert", MacroBuiltin::assert_handler}, + {"file", MacroBuiltin::file_handler}, + {"line", MacroBuiltin::line_handler}, + {"column", MacroBuiltin::column_handler}, + {"include_bytes", MacroBuiltin::include_bytes_handler}, + {"include_str", MacroBuiltin::include_str_handler}, + {"compile_error", MacroBuiltin::compile_error_handler}, + {"concat", MacroBuiltin::concat_handler}, + {"env", MacroBuiltin::env_handler}, + {"cfg", MacroBuiltin::cfg_handler}, + {"include", MacroBuiltin::include_handler}, }; auto outer_attrs = macro->get_outer_attrs (); |