aboutsummaryrefslogtreecommitdiff
path: root/gcc
AgeCommit message (Collapse)AuthorFilesLines
2022-12-13gccrs: Add Rust ABI enum helpersPhilip Herron2-0/+117
This is a simple helper over an enum of possible ABI options in Rust. gcc/rust/ * util/rust-abi.cc: New. * util/rust-abi.h: New.
2022-12-13gccrs: Add port of FNV hash used during legacy symbol manglingPhilip Herron1-0/+95
This hash was ported from the Go runtime, as we needed a hash for the legacy symbol mangling system. All symbols in Rust contain a hash of some metadata for uniqueness on generic functions. gcc/rust/ * util/fnv-hash.h: New.
2022-12-13gccrs: Add wrapper for make_uniquePhilip Herron1-0/+35
This is a wrapper for make_unique. We can likely get rid of this, as there are other implementations available, or simply keep using the unique_ptr constructor. gcc/rust/ * util/rust-make-unique.h: New.
2022-12-13gccrs: Add AST to HIR lowering passPhilip Herron18-0/+6577
This performs the lowering of the AST to HIR. The interesting piece here is that we desugar much of the AST as mentioned in the previous pass, but crucially, we also strip out all code that is "marked-for-strip" which failed cfg-expansion from the expansion pass. After this, the HIR includes all code required to compile for this crate. gcc/rust/ * hir/rust-ast-lower-base.cc: New. * hir/rust-ast-lower-base.h: New. * hir/rust-ast-lower-block.h: New. * hir/rust-ast-lower-enumitem.h: New. * hir/rust-ast-lower-expr.h: New. * hir/rust-ast-lower-extern.h: New. * hir/rust-ast-lower-implitem.h: New. * hir/rust-ast-lower-item.cc: New. * hir/rust-ast-lower-item.h: New. * hir/rust-ast-lower-pattern.cc: New. * hir/rust-ast-lower-pattern.h: New. * hir/rust-ast-lower-stmt.h: New. * hir/rust-ast-lower-struct-field-expr.h: New. * hir/rust-ast-lower-type.h: New. * hir/rust-ast-lower.cc: New. * hir/rust-ast-lower.h: New. * hir/rust-hir-dump.cc: New. * hir/rust-hir-dump.h: New.
2022-12-13gccrs: Add HIR definitions and visitor frameworkPhilip Herron5-0/+6968
This patch implements the classes mentioned in the previous HIR patch, as well as a set of visitor frameworks used in handling that HIR. gcc/rust/ * hir/tree/rust-hir-full-decls.h: New. * hir/tree/rust-hir-full-test.cc: New. * hir/tree/rust-hir-full.h: New. * hir/tree/rust-hir-visitor.h: New. * hir/tree/rust-hir.h: New.
2022-12-13gccrs: Add declarations for Rust HIRPhilip Herron6-0/+10903
This patch contains the declarations needed for our second intermediate representation, which we will refer to as an HIR. This gives the front-end a chance to desugar much of the AST, such as: - Removing distinction between functions and methods - Removing Macros - Removing IdentifierExprs - Removing duplicate attribute structures gcc/rust/ * hir/tree/rust-hir-expr.h: New. * hir/tree/rust-hir-item.h: New. * hir/tree/rust-hir-path.h: New. * hir/tree/rust-hir-pattern.h: New. * hir/tree/rust-hir-stmt.h: New. * hir/tree/rust-hir-type.h: New.
2022-12-13gccrs: Add name resolution pass to the Rust front-endPhilip Herron23-0/+6772
The name resolution is split into two phases, one toplevel pass which scans the whole "Crate" which iterates all items and nested items in modules to generate a context class full of CanonicalPath items. It also generates a hierarchy of parent->child and child->parent relationships using the AST NodeId for PathResolution in the second phase. The second phase drills into each item like functions and creates a stack of canonical paths for variables etc so that we can store information in a side table of usage variable 'a' resolves to NodeId '123' which refers to the NodeId of the "let a;" statement. gcc/rust/ * resolve/rust-ast-resolve-base.cc: New. * resolve/rust-ast-resolve-base.h: New. * resolve/rust-ast-resolve-expr.cc: New. * resolve/rust-ast-resolve-expr.h: New. * resolve/rust-ast-resolve-implitem.h: New. * resolve/rust-ast-resolve-item.cc: New. * resolve/rust-ast-resolve-item.h: New. * resolve/rust-ast-resolve-path.cc: New. * resolve/rust-ast-resolve-path.h: New. * resolve/rust-ast-resolve-pattern.cc: New. * resolve/rust-ast-resolve-pattern.h: New. * resolve/rust-ast-resolve-stmt.cc: New. * resolve/rust-ast-resolve-stmt.h: New. * resolve/rust-ast-resolve-struct-expr-field.cc: New. * resolve/rust-ast-resolve-struct-expr-field.h: New. * resolve/rust-ast-resolve-toplevel.h: New. * resolve/rust-ast-resolve-type.cc: New. * resolve/rust-ast-resolve-type.h: New. * resolve/rust-ast-resolve.cc: New. * resolve/rust-ast-resolve.h: New. * resolve/rust-ast-verify-assignee.h: New. * resolve/rust-name-resolver.cc: New. * resolve/rust-name-resolver.h: New.
2022-12-13gccrs: Add expansion pass for the Rust front-endArthur Cohen10-0/+6228
The expansion pass is responsible for two actions on our AST: 1. Expanding macro calls 2. Performing conditional compilation Calls to macros should be checked and expanded into an AST fragment based on the context they've been called in. This is similar to token substitution, with a lot of intricacies and checks being performed. A single invocation can result in an AST fragment containing multiple statements or multiple expressions, which need to be handled as well. Furthermore, Rust macros can contain repetitions relying on Kleine operators, similar to regular expression patterns, that also need to be expanded properly. Finally, Rust code can be hidden behind `cfg` directives, which allow the user to perform conditional compilation. If a `cfg` predicate is not met, the expression or statement it refers to should be marked for strip and removed from the AST. gcc/rust/ * expand/rust-attribute-visitor.cc: New. * expand/rust-attribute-visitor.h: New. * expand/rust-macro-builtins.cc: New. * expand/rust-macro-builtins.h: New. * expand/rust-macro-expand.cc: New. * expand/rust-macro-expand.h: New. * expand/rust-macro-invoc-lexer.cc: New. * expand/rust-macro-invoc-lexer.h: New. * expand/rust-macro-substitute-ctx.cc: New. * expand/rust-macro-substitute-ctx.h: New. Co-authored-by: Philip Herron <philip.herron@embecosm.com> Co-authored-by: Joel Phillips <simplytheother@gmail.com> Signed-off-by: Joel Phillips <simplytheother@gmail.com>
2022-12-13gccrs: Add Parser for Rust front-end pt.2Joel Phillips1-0/+8032
This patch contains the second half of the templated Rust parser. gcc/rust/ * parse/rust-parse-impl.h: New, second half. Co-authored-by: Philip Herron <philip.herron@embecosm.com> Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com> Signed-off-by: Joel Phillips <simplytheother@gmail.com>
2022-12-13gccrs: Add Parser for Rust front-end pt.1Joel Phillips5-0/+8143
This is a Pratt-style parser for Rust that implements all of the AST. The rust-parser-impl.h is the implementation of the parser as a template, allowing it to be given ManagedTokenSource and avoid virtual calls. The downside is it takes time to compile when used. see: https://en.wikipedia.org/wiki/Operator-precedence_parser#Pratt_parsing This patch contains the first half of the templated parser, so as to not lose patches in the mailing list archives. gcc/rust/ * parse/rust-cfg-parser.cc: New. * parse/rust-cfg-parser.h: New. * parse/rust-parse-impl.h: New. * parse/rust-parse.cc: New. * parse/rust-parse.h: New. Co-authored-by: Philip Herron <philip.herron@embecosm.com> Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com> Signed-off-by: Joel Phillips <simplytheother@gmail.com>
2022-12-13gccrs: Add Lexer for Rust front-endJoel Phillips6-0/+3831
The lexer is referred to as a ManagedTokenSource within the parser. This lexer does not currently support Unicode, but serves as a starting point to do so. gcc/rust/ * lex/rust-codepoint.h: New. * lex/rust-lex.cc: New. * lex/rust-lex.h: New. * lex/rust-token.cc: New. * lex/rust-token.h: New. * rust-buffered-queue.h: New. Co-authored-by: Philip Herron <philip.herron@embecosm.com> Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com> Co-authored-by: Mark Wielaard <mark@klomp.org> Signed-off-by: Joel Phillips <simplytheother@gmail.com>
2022-12-13gccrs: Add Rust AST visitorsJoel Phillips4-0/+1818
This patch contains the basic framework of our AST visitors, as well as one aimed at pretty-printing and exporting these AST nodes. gcc/rust/ * ast/rust-ast-dump.cc: New. * ast/rust-ast-dump.h: New. * ast/rust-ast-visitor.h: New. * ast/rust-cond-compilation.h: New. Co-authored-by: Philip Herron <philip.herron@embecosm.com> Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com> Signed-off-by: Joel Phillips <simplytheother@gmail.com>
2022-12-13gccrs: Add full definitions of Rust AST data structuresJoel Phillips6-0/+9782
This adds the proper definitions of our AST nodes split across multiple files for clarity gcc/rust/ * ast/rust-expr.h: New. * ast/rust-macro.h: New. * ast/rust-path.h: New. * ast/rust-pattern.h: New. * ast/rust-stmt.h: New. * ast/rust-type.h: New. Co-authored-by: Philip Herron <philip.herron@embecosm.com> Signed-off-by: Joel Phillips <simplytheother@gmail.com>
2022-12-13gccrs: Add definitions of Rust Items in AST data structuresJoel Phillips1-0/+4382
This adds the proper definitions of our AST Item nodes. gcc/rust/ * ast/rust-item.h: New. Co-authored-by: Philip Herron <philip.herron@embecosm.com> Signed-off-by: Joel Phillips <simplytheother@gmail.com>
2022-12-13gccrs: Add Rust front-end base AST data structuresJoel Phillips5-0/+8193
This is a full C++11 class hierarchy representing the Rust AST. We do not allow dynamic_cast and so the main mechanism to work with the AST is by using the visitor interface. Slowly we are adding TREE_CODE style node types to the AST which will allow for more ways to work with the AST but for now this is it. See: https://doc.rust-lang.org/reference/items.html gcc/rust/ * ast/rust-ast-full-decls.h: New. * ast/rust-ast-full-test.cc: New. * ast/rust-ast-full.h: New. * ast/rust-ast.h: New. * operator.h: New. Co-authored-by: Philip Herron <philip.herron@embecosm.com> Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com> Signed-off-by: Joel Phillips <simplytheother@gmail.com>
2022-12-13gccrs: Add execution test casesPhilip Herron123-0/+4631
This is similar to the compile/torture/*.rs test cases, but all of these are dg-execute testcases. They are compiled, linked and executed by default. These testcases are also compiled with the matrix of torture options. The only caveat here is that gccrs does not currently support the main shim, so we have a C-style main function here returning zero which is not proper Rust code. gcc/testsuite/ * rust/execute/torture/block_expr1.rs: New. * rust/execute/torture/builtin_macro_cfg.rs: New. * rust/execute/torture/builtin_macro_concat.rs: New. * rust/execute/torture/builtin_macro_env.rs: New. * rust/execute/torture/builtin_macro_include_bytes.rs: New. * rust/execute/torture/builtin_macro_include_str.rs: New. * rust/execute/torture/builtin_macro_line.rs: New. * rust/execute/torture/builtin_macros1.rs: New. * rust/execute/torture/builtin_macros3.rs: New. * rust/execute/torture/cfg1.rs: New. * rust/execute/torture/cfg2.rs: New. * rust/execute/torture/cfg3.rs: New. * rust/execute/torture/cfg4.rs: New. * rust/execute/torture/cfg5.rs: New. * rust/execute/torture/coercion1.rs: New. * rust/execute/torture/coercion2.rs: New. * rust/execute/torture/const_fold1.rs: New. * rust/execute/torture/const_fold2.rs: New. * rust/execute/torture/copy_nonoverlapping1.rs: New. * rust/execute/torture/empty_main.rs: New. * rust/execute/torture/execute.exp: New. * rust/execute/torture/exit_error.rs: New. * rust/execute/torture/extern_mod4.rs: New. * rust/execute/torture/func1.rs: New. * rust/execute/torture/helloworld1.rs: New. * rust/execute/torture/helloworld2.rs: New. * rust/execute/torture/include.txt: New. * rust/execute/torture/index1.rs: New. * rust/execute/torture/issue-1120.rs: New. * rust/execute/torture/issue-1133.rs: New. * rust/execute/torture/issue-1198.rs: New. * rust/execute/torture/issue-1231.rs: New. * rust/execute/torture/issue-1232.rs: New. * rust/execute/torture/issue-1249.rs: New. * rust/execute/torture/issue-1436.rs: New. * rust/execute/torture/issue-1496.rs: New. * rust/execute/torture/issue-647.rs: New. * rust/execute/torture/issue-845.rs: New. * rust/execute/torture/issue-851.rs: New. * rust/execute/torture/issue-858.rs: New. * rust/execute/torture/issue-976.rs: New. * rust/execute/torture/issue-995.rs: New. * rust/execute/torture/macros1.rs: New. * rust/execute/torture/macros10.rs: New. * rust/execute/torture/macros11.rs: New. * rust/execute/torture/macros12.rs: New. * rust/execute/torture/macros13.rs: New. * rust/execute/torture/macros14.rs: New. * rust/execute/torture/macros16.rs: New. * rust/execute/torture/macros17.rs: New. * rust/execute/torture/macros18.rs: New. * rust/execute/torture/macros19.rs: New. * rust/execute/torture/macros2.rs: New. * rust/execute/torture/macros20.rs: New. * rust/execute/torture/macros21.rs: New. * rust/execute/torture/macros22.rs: New. * rust/execute/torture/macros23.rs: New. * rust/execute/torture/macros24.rs: New. * rust/execute/torture/macros25.rs: New. * rust/execute/torture/macros26.rs: New. * rust/execute/torture/macros27.rs: New. * rust/execute/torture/macros28.rs: New. * rust/execute/torture/macros29.rs: New. * rust/execute/torture/macros3.rs: New. * rust/execute/torture/macros30.rs: New. * rust/execute/torture/macros31.rs: New. * rust/execute/torture/macros4.rs: New. * rust/execute/torture/macros5.rs: New. * rust/execute/torture/macros6.rs: New. * rust/execute/torture/macros7.rs: New. * rust/execute/torture/macros8.rs: New. * rust/execute/torture/macros9.rs: New. * rust/execute/torture/match1.rs: New. * rust/execute/torture/match2.rs: New. * rust/execute/torture/match3.rs: New. * rust/execute/torture/match_bool1.rs: New. * rust/execute/torture/match_byte1.rs: New. * rust/execute/torture/match_char1.rs: New. * rust/execute/torture/match_int1.rs: New. * rust/execute/torture/match_loop1.rs: New. * rust/execute/torture/match_range1.rs: New. * rust/execute/torture/match_range2.rs: New. * rust/execute/torture/match_tuple1.rs: New. * rust/execute/torture/method1.rs: New. * rust/execute/torture/method2.rs: New. * rust/execute/torture/method3.rs: New. * rust/execute/torture/method4.rs: New. * rust/execute/torture/mod1.rs: New. * rust/execute/torture/modules/mod.rs: New. * rust/execute/torture/operator_overload_1.rs: New. * rust/execute/torture/operator_overload_10.rs: New. * rust/execute/torture/operator_overload_11.rs: New. * rust/execute/torture/operator_overload_12.rs: New. * rust/execute/torture/operator_overload_2.rs: New. * rust/execute/torture/operator_overload_3.rs: New. * rust/execute/torture/operator_overload_4.rs: New. * rust/execute/torture/operator_overload_5.rs: New. * rust/execute/torture/operator_overload_6.rs: New. * rust/execute/torture/operator_overload_7.rs: New. * rust/execute/torture/operator_overload_8.rs: New. * rust/execute/torture/operator_overload_9.rs: New. * rust/execute/torture/slice-magic.rs: New. * rust/execute/torture/slice-magic2.rs: New. * rust/execute/torture/slice1.rs: New. * rust/execute/torture/str-layout1.rs: New. * rust/execute/torture/str-zero.rs: New. * rust/execute/torture/trait1.rs: New. * rust/execute/torture/trait10.rs: New. * rust/execute/torture/trait11.rs: New. * rust/execute/torture/trait12.rs: New. * rust/execute/torture/trait13.rs: New. * rust/execute/torture/trait2.rs: New. * rust/execute/torture/trait3.rs: New. * rust/execute/torture/trait4.rs: New. * rust/execute/torture/trait5.rs: New. * rust/execute/torture/trait6.rs: New. * rust/execute/torture/trait7.rs: New. * rust/execute/torture/trait8.rs: New. * rust/execute/torture/trait9.rs: New. * rust/execute/torture/transmute1.rs: New. * rust/execute/torture/wrapping_op1.rs: New. * rust/execute/torture/wrapping_op2.rs: New. * rust/execute/xfail/macro1.rs: New. Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com> Co-authored-by: Thomas Schwinge <thomas@codesourcery.com> Co-authored-by: Mark Wielaard <mark@klomp.org> Co-authored-by: Marc Poulhiès <dkm@kataplop.net>
2022-12-13gccrs: Add general compilation test casesPhilip Herron531-0/+7556
This suite of tests has two sections: compile/*.rs and compile/torture/*.rs. The first section is comprised entirely of dg-compile tests, containing a mixture of dg-warning and dg-error annotations and some with no annotations, ensuring the creation of resulting asm output. The second section is the same, but has tests which are ran with the full torture options, for coverage of test cases that may have an issue with a specific optimization level. gcc/testsuite/ * rust/compile/abi-options1.rs: New. * rust/compile/array3.rs: New. * rust/compile/array_empty_list.rs: New. * rust/compile/arrays1.rs: New. * rust/compile/arrays2.rs: New. * rust/compile/attr-mismatch-crate-name.rs: New. * rust/compile/attr_cold.rs: New. * rust/compile/attr_deprecated.rs: New. * rust/compile/attr_deprecated_2.rs: New. * rust/compile/bad-crate-name.rs: New. * rust/compile/bad=file-name.rs: New. * rust/compile/bad_as_bool_char.rs: New. * rust/compile/bad_file_name.txt.rs: New. * rust/compile/bad_inner_doc.rs: New. * rust/compile/bad_pub_enumitems.rs: New. * rust/compile/bad_stmt_enums.rs: New. * rust/compile/bad_toplevel_enums.rs: New. * rust/compile/bad_tuple_index.rs: New. * rust/compile/bad_type1.rs: New. * rust/compile/bad_type2.rs: New. * rust/compile/break1.rs: New. * rust/compile/break2.rs: New. * rust/compile/builtin_macro_compile_error.rs: New. * rust/compile/builtin_macro_concat.rs: New. * rust/compile/builtin_macro_env.rs: New. * rust/compile/builtin_macro_include_bytes.rs: New. * rust/compile/builtin_macro_include_str.rs: New. * rust/compile/builtin_macro_not_found.rs: New. * rust/compile/bytecharstring.rs: New. * rust/compile/canonical_paths1.rs: New. * rust/compile/cast1.rs: New. * rust/compile/cfg1.rs: New. * rust/compile/cfg2.rs: New. * rust/compile/cfg3.rs: New. * rust/compile/cfg4.rs: New. * rust/compile/cfg5.rs: New. * rust/compile/compile.exp: New. * rust/compile/complex-path1.rs: New. * rust/compile/const-issue1440.rs: New. * rust/compile/const1.rs: New. * rust/compile/const2.rs: New. * rust/compile/const3.rs: New. * rust/compile/const_generics_1.rs: New. * rust/compile/const_generics_2.rs: New. * rust/compile/const_generics_3.rs: New. * rust/compile/const_generics_4.rs: New. * rust/compile/const_generics_5.rs: New. * rust/compile/const_generics_6.rs: New. * rust/compile/continue1.rs: New. * rust/compile/deadcode_err1.rs: New. * rust/compile/deadcode_err2.rs: New. * rust/compile/debug-diagnostics-default.rs: New. * rust/compile/debug-diagnostics-off.rs: New. * rust/compile/debug-diagnostics-on.rs: New. * rust/compile/doc_isolated_cr_block_comment.rs: New. * rust/compile/doc_isolated_cr_inner_block_comment.rs: New. * rust/compile/doc_isolated_cr_inner_line_comment.rs: New. * rust/compile/doc_isolated_cr_line_comment.rs: New. * rust/compile/dup_fields.rs: New. * rust/compile/empty_comment_before_match.rs: New. * rust/compile/expected_type_args2.rs: New. * rust/compile/expected_type_args3.rs: New. * rust/compile/func1.rs: New. * rust/compile/func2.rs: New. * rust/compile/func3.rs: New. * rust/compile/func4.rs: New. * rust/compile/func5.rs: New. * rust/compile/generic-default1.rs: New. * rust/compile/generics1.rs: New. * rust/compile/generics10.rs: New. * rust/compile/generics11.rs: New. * rust/compile/generics12.rs: New. * rust/compile/generics13.rs: New. * rust/compile/generics2.rs: New. * rust/compile/generics3.rs: New. * rust/compile/generics4.rs: New. * rust/compile/generics5.rs: New. * rust/compile/generics6.rs: New. * rust/compile/generics7.rs: New. * rust/compile/generics8.rs: New. * rust/compile/generics9.rs: New. * rust/compile/implicit_returns_err1.rs: New. * rust/compile/implicit_returns_err2.rs: New. * rust/compile/implicit_returns_err3.rs: New. * rust/compile/implicit_returns_err4.rs: New. * rust/compile/infer-crate-name.rs: New. * rust/compile/inline_1.rs: New. * rust/compile/inline_2.rs: New. * rust/compile/issue-1005.rs: New. * rust/compile/issue-1019.rs: New. * rust/compile/issue-1023.rs: New. * rust/compile/issue-1031.rs: New. * rust/compile/issue-1034.rs: New. * rust/compile/issue-1089.rs: New. * rust/compile/issue-1128.rs: New. * rust/compile/issue-1129-1.rs: New. * rust/compile/issue-1129-2.rs: New. * rust/compile/issue-1130.rs: New. * rust/compile/issue-1131.rs: New. * rust/compile/issue-1152.rs: New. * rust/compile/issue-1165.rs: New. * rust/compile/issue-1173.rs: New. * rust/compile/issue-1226.rs: New. * rust/compile/issue-1234.rs: New. * rust/compile/issue-1235.rs: New. * rust/compile/issue-1237.rs: New. * rust/compile/issue-1251.rs: New. * rust/compile/issue-1271.rs: New. * rust/compile/issue-1289.rs: New. * rust/compile/issue-1323-1.rs: New. * rust/compile/issue-1323-2.rs: New. * rust/compile/issue-1383.rs: New. * rust/compile/issue-1393.rs: New. * rust/compile/issue-1447.rs: New. * rust/compile/issue-407-2.rs: New. * rust/compile/issue-407.rs: New. * rust/compile/issue-557.rs: New. * rust/compile/issue-635-1.rs: New. * rust/compile/issue-635-2.rs: New. * rust/compile/lookup_err1.rs: New. * rust/compile/macro-issue1053-2.rs: New. * rust/compile/macro-issue1053.rs: New. * rust/compile/macro-issue1224.rs: New. * rust/compile/macro-issue1233.rs: New. * rust/compile/macro-issue1395-2.rs: New. * rust/compile/macro-issue1395.rs: New. * rust/compile/macro-issue1400-2.rs: New. * rust/compile/macro-issue1400.rs: New. * rust/compile/macro1.rs: New. * rust/compile/macro10.rs: New. * rust/compile/macro11.rs: New. * rust/compile/macro12.rs: New. * rust/compile/macro13.rs: New. * rust/compile/macro14.rs: New. * rust/compile/macro15.rs: New. * rust/compile/macro16.rs: New. * rust/compile/macro17.rs: New. * rust/compile/macro18.rs: New. * rust/compile/macro19.rs: New. * rust/compile/macro2.rs: New. * rust/compile/macro20.rs: New. * rust/compile/macro21.rs: New. * rust/compile/macro22.rs: New. * rust/compile/macro23.rs: New. * rust/compile/macro25.rs: New. * rust/compile/macro26.rs: New. * rust/compile/macro27.rs: New. * rust/compile/macro28.rs: New. * rust/compile/macro29.rs: New. * rust/compile/macro3.rs: New. * rust/compile/macro30.rs: New. * rust/compile/macro31.rs: New. * rust/compile/macro32.rs: New. * rust/compile/macro33.rs: New. * rust/compile/macro34.rs: New. * rust/compile/macro35.rs: New. * rust/compile/macro36.rs: New. * rust/compile/macro37.rs: New. * rust/compile/macro38.rs: New. * rust/compile/macro39.rs: New. * rust/compile/macro4.rs: New. * rust/compile/macro40.rs: New. * rust/compile/macro41.rs: New. * rust/compile/macro42.rs: New. * rust/compile/macro5.rs: New. * rust/compile/macro6.rs: New. * rust/compile/macro7.rs: New. * rust/compile/macro8.rs: New. * rust/compile/macro9.rs: New. * rust/compile/macro_return.rs: New. * rust/compile/match1.rs: New. * rust/compile/match2.rs: New. * rust/compile/match3.rs: New. * rust/compile/match4.rs: New. * rust/compile/match5.rs: New. * rust/compile/match6.rs: New. * rust/compile/match7.rs: New. * rust/compile/method1.rs: New. * rust/compile/method2.rs: New. * rust/compile/mismatch-crate-name.rs: New. * rust/compile/missing_middle/both_path.rs: New. * rust/compile/missing_middle/explicit.not.rs: New. * rust/compile/missing_middle/inner_path.rs: New. * rust/compile/missing_middle/other.rs: New. * rust/compile/missing_middle/outer_path.rs: New. * rust/compile/missing_middle/sub/mod.rs: New. * rust/compile/missing_return1.rs: New. * rust/compile/mod_missing_middle.rs: New. * rust/compile/never_type_err1.rs: New. * rust/compile/privacy1.rs: New. * rust/compile/privacy2.rs: New. * rust/compile/privacy3.rs: New. * rust/compile/privacy4.rs: New. * rust/compile/privacy5.rs: New. * rust/compile/privacy6.rs: New. * rust/compile/pub_restricted_1.rs: New. * rust/compile/pub_restricted_2.rs: New. * rust/compile/pub_restricted_3.rs: New. * rust/compile/raw_identifiers_bad_keywords.rs: New. * rust/compile/raw_identifiers_underscore.rs: New. * rust/compile/redef_error1.rs: New. * rust/compile/redef_error2.rs: New. * rust/compile/redef_error3.rs: New. * rust/compile/redef_error4.rs: New. * rust/compile/redef_error5.rs: New. * rust/compile/redef_error6.rs: New. * rust/compile/reference1.rs: New. * rust/compile/self-path1.rs: New. * rust/compile/self-path2.rs: New. * rust/compile/shadow1.rs: New. * rust/compile/specify-crate-name.rs: New. * rust/compile/static_var1.rs: New. * rust/compile/stmt_with_block_err1.rs: New. * rust/compile/struct_align1.rs: New. * rust/compile/struct_align2.rs: New. * rust/compile/struct_init1.rs: New. * rust/compile/struct_pack1.rs: New. * rust/compile/struct_pack2.rs: New. * rust/compile/syntax-only.rs: New. * rust/compile/test_mod.rs: New. * rust/compile/torture/all_doc_comment_line_blocks.rs: New. * rust/compile/torture/all_doc_comment_line_blocks_crlf.rs: New. * rust/compile/torture/arithmetic_expressions1.rs: New. * rust/compile/torture/array_const_fold_1.rs: New. * rust/compile/torture/array_const_fold_2.rs: New. * rust/compile/torture/array_function.rs: New. * rust/compile/torture/array_type_infer.rs: New. * rust/compile/torture/array_zero_length.rs: New. * rust/compile/torture/arrays1.rs: New. * rust/compile/torture/arrays2.rs: New. * rust/compile/torture/arrays3.rs: New. * rust/compile/torture/arrays4.rs: New. * rust/compile/torture/arrays5.rs: New. * rust/compile/torture/arrays6.rs: New. * rust/compile/torture/arrays_index1.rs: New. * rust/compile/torture/arrays_index2.rs: New. * rust/compile/torture/arrays_index3.rs: New. * rust/compile/torture/as_bool_char.rs: New. * rust/compile/torture/associated_types1.rs: New. * rust/compile/torture/autoderef1.rs: New. * rust/compile/torture/block_expr1.rs: New. * rust/compile/torture/block_expr2.rs: New. * rust/compile/torture/block_expr3.rs: New. * rust/compile/torture/block_expr4.rs: New. * rust/compile/torture/block_expr5.rs: New. * rust/compile/torture/block_expr_parser_bug.rs: New. * rust/compile/torture/bom.rs: New. * rust/compile/torture/bom_comment.rs: New. * rust/compile/torture/bom_shebang.rs: New. * rust/compile/torture/bom_whitespace.rs: New. * rust/compile/torture/bools_eq.rs: New. * rust/compile/torture/borrow1.rs: New. * rust/compile/torture/borrow_function.rs: New. * rust/compile/torture/break_function.rs: New. * rust/compile/torture/byte_char_str.rs: New. * rust/compile/torture/byte_str.rs: New. * rust/compile/torture/cast1.rs: New. * rust/compile/torture/cast2.rs: New. * rust/compile/torture/cast3.rs: New. * rust/compile/torture/cfg_attr.rs: New. * rust/compile/torture/char1.rs: New. * rust/compile/torture/check-doc-attr-string.rs: New. * rust/compile/torture/coercion1.rs: New. * rust/compile/torture/coercion2.rs: New. * rust/compile/torture/comparison_expr1.rs: New. * rust/compile/torture/compile.exp: New. * rust/compile/torture/compound_assignment_expr1.rs: New. * rust/compile/torture/conditional.rs: New. * rust/compile/torture/constant1.rs: New. * rust/compile/torture/constant2.rs: New. * rust/compile/torture/constant3.rs: New. * rust/compile/torture/deadcode1.rs: New. * rust/compile/torture/deadcode2.rs: New. * rust/compile/torture/deref1.rs: New. * rust/compile/torture/deref_function.rs: New. * rust/compile/torture/doc_comment.rs: New. * rust/compile/torture/enum1.rs: New. * rust/compile/torture/extern_mod1.rs: New. * rust/compile/torture/extern_mod2.rs: New. * rust/compile/torture/float1.rs: New. * rust/compile/torture/float_types.rs: New. * rust/compile/torture/forward_decl_1.rs: New. * rust/compile/torture/forward_decl_2.rs: New. * rust/compile/torture/forward_decl_3-unsafe.rs: New. * rust/compile/torture/forward_decl_3.rs: New. * rust/compile/torture/forward_decl_4.rs: New. * rust/compile/torture/forward_decl_5.rs: New. * rust/compile/torture/func1.rs: New. * rust/compile/torture/func2.rs: New. * rust/compile/torture/function_reference1.rs: New. * rust/compile/torture/function_reference2.rs: New. * rust/compile/torture/function_reference3.rs: New. * rust/compile/torture/function_reference4.rs: New. * rust/compile/torture/generics1.rs: New. * rust/compile/torture/generics10.rs: New. * rust/compile/torture/generics11.rs: New. * rust/compile/torture/generics12.rs: New. * rust/compile/torture/generics13.rs: New. * rust/compile/torture/generics14.rs: New. * rust/compile/torture/generics15.rs: New. * rust/compile/torture/generics16.rs: New. * rust/compile/torture/generics17.rs: New. * rust/compile/torture/generics18.rs: New. * rust/compile/torture/generics19.rs: New. * rust/compile/torture/generics2.rs: New. * rust/compile/torture/generics20.rs: New. * rust/compile/torture/generics21.rs: New. * rust/compile/torture/generics22.rs: New. * rust/compile/torture/generics23.rs: New. * rust/compile/torture/generics24.rs: New. * rust/compile/torture/generics25.rs: New. * rust/compile/torture/generics26.rs: New. * rust/compile/torture/generics27.rs: New. * rust/compile/torture/generics28.rs: New. * rust/compile/torture/generics29.rs: New. * rust/compile/torture/generics3.rs: New. * rust/compile/torture/generics30.rs: New. * rust/compile/torture/generics31.rs: New. * rust/compile/torture/generics32.rs: New. * rust/compile/torture/generics4.rs: New. * rust/compile/torture/generics5.rs: New. * rust/compile/torture/generics6.rs: New. * rust/compile/torture/generics7.rs: New. * rust/compile/torture/generics8.rs: New. * rust/compile/torture/generics9.rs: New. * rust/compile/torture/grouped_expr_function.rs: New. * rust/compile/torture/identifier-missing-impl-1.rs: New. * rust/compile/torture/if.rs: New. * rust/compile/torture/if_elif.rs: New. * rust/compile/torture/if_elif_else_expr1.rs: New. * rust/compile/torture/if_else.rs: New. * rust/compile/torture/ifunaryexpr.rs: New. * rust/compile/torture/impl_block1.rs: New. * rust/compile/torture/impl_block2.rs: New. * rust/compile/torture/impl_block3.rs: New. * rust/compile/torture/impl_block_unused.rs: New. * rust/compile/torture/implicit_returns1.rs: New. * rust/compile/torture/infer_type1.rs: New. * rust/compile/torture/inner_attributes.rs: New. * rust/compile/torture/integer_inference_var1.rs: New. * rust/compile/torture/integer_inference_var2.rs: New. * rust/compile/torture/integer_inference_var3.rs: New. * rust/compile/torture/integer_inference_var4.rs: New. * rust/compile/torture/integer_inference_var5.rs: New. * rust/compile/torture/integer_types.rs: New. * rust/compile/torture/intrinsics-1.rs: New. * rust/compile/torture/intrinsics-2.rs: New. * rust/compile/torture/isolated_cr_block_comment.rs: New. * rust/compile/torture/isolated_cr_line_comment.rs: New. * rust/compile/torture/issue-1024.rs: New. * rust/compile/torture/issue-1075.rs: New. * rust/compile/torture/issue-1432.rs: New. * rust/compile/torture/issue-1434.rs: New. * rust/compile/torture/issue-368.rs: New. * rust/compile/torture/issue-808.rs: New. * rust/compile/torture/issue-862.rs: New. * rust/compile/torture/issue-893-2.rs: New. * rust/compile/torture/issue-893.rs: New. * rust/compile/torture/lazybooleanexpr_function.rs: New. * rust/compile/torture/lifetime1.rs: New. * rust/compile/torture/literals1.rs: New. * rust/compile/torture/loop1.rs: New. * rust/compile/torture/loop2.rs: New. * rust/compile/torture/loop3.rs: New. * rust/compile/torture/loop4.rs: New. * rust/compile/torture/loop5.rs: New. * rust/compile/torture/loop6.rs: New. * rust/compile/torture/loop7.rs: New. * rust/compile/torture/macro-issue1403.rs: New. * rust/compile/torture/macro-issue1426.rs: New. * rust/compile/torture/macro_as_expr.rs: New. * rust/compile/torture/match1.rs: New. * rust/compile/torture/methods1.rs: New. * rust/compile/torture/methods2.rs: New. * rust/compile/torture/methods3.rs: New. * rust/compile/torture/mod-nameresolve.rs: New. * rust/compile/torture/mod1.rs: New. * rust/compile/torture/mod2.rs: New. * rust/compile/torture/mod3.rs: New. * rust/compile/torture/modules/mod.rs: New. * rust/compile/torture/modules/valid_path.rs: New. * rust/compile/torture/must_use1.rs: New. * rust/compile/torture/must_use2.rs: New. * rust/compile/torture/name_resolve1.rs: New. * rust/compile/torture/negation_function.rs: New. * rust/compile/torture/nested_fn1.rs: New. * rust/compile/torture/nested_fn2.rs: New. * rust/compile/torture/nested_struct1.rs: New. * rust/compile/torture/never_type1.rs: New. * rust/compile/torture/not_shebang.rs: New. * rust/compile/torture/not_shebang_block_comment.rs: New. * rust/compile/torture/not_shebang_comment.rs: New. * rust/compile/torture/not_shebang_multiline_comment.rs: New. * rust/compile/torture/not_shebang_spaces.rs: New. * rust/compile/torture/parameter_usage1.rs: New. * rust/compile/torture/parens1.rs: New. * rust/compile/torture/pointer1.rs: New. * rust/compile/torture/primconsts.rs: New. * rust/compile/torture/prims_struct_eq.rs: New. * rust/compile/torture/range-lang-item1.rs: New. * rust/compile/torture/raw_identifiers.rs: New. * rust/compile/torture/raw_identifiers_keywords.rs: New. * rust/compile/torture/recursive_fn1.rs: New. * rust/compile/torture/return_function.rs: New. * rust/compile/torture/scoping1.rs: New. * rust/compile/torture/self_type1.rs: New. * rust/compile/torture/shadow1.rs: New. * rust/compile/torture/shadow2.rs: New. * rust/compile/torture/shebang.rs: New. * rust/compile/torture/shebang_plus_attr.rs: New. * rust/compile/torture/shebang_plus_attr2.rs: New. * rust/compile/torture/static_function.rs: New. * rust/compile/torture/static_var1.rs: New. * rust/compile/torture/stmt_with_block1.rs: New. * rust/compile/torture/str1.rs: New. * rust/compile/torture/struct_access1.rs: New. * rust/compile/torture/struct_base_init_1.rs: New. * rust/compile/torture/struct_decl.rs: New. * rust/compile/torture/struct_init.rs: New. * rust/compile/torture/struct_init_10.rs: New. * rust/compile/torture/struct_init_11.rs: New. * rust/compile/torture/struct_init_2.rs: New. * rust/compile/torture/struct_init_3.rs: New. * rust/compile/torture/struct_init_4.rs: New. * rust/compile/torture/struct_init_5.rs: New. * rust/compile/torture/struct_init_6.rs: New. * rust/compile/torture/struct_init_7.rs: New. * rust/compile/torture/struct_init_8.rs: New. * rust/compile/torture/struct_init_9.rs: New. * rust/compile/torture/top_attr.rs: New. * rust/compile/torture/traits1.rs: New. * rust/compile/torture/traits10.rs: New. * rust/compile/torture/traits11.rs: New. * rust/compile/torture/traits12.rs: New. * rust/compile/torture/traits13.rs: New. * rust/compile/torture/traits14.rs: New. * rust/compile/torture/traits15.rs: New. * rust/compile/torture/traits16.rs: New. * rust/compile/torture/traits17.rs: New. * rust/compile/torture/traits18.rs: New. * rust/compile/torture/traits19.rs: New. * rust/compile/torture/traits2.rs: New. * rust/compile/torture/traits3.rs: New. * rust/compile/torture/traits4.rs: New. * rust/compile/torture/traits5.rs: New. * rust/compile/torture/traits6.rs: New. * rust/compile/torture/traits7.rs: New. * rust/compile/torture/traits8.rs: New. * rust/compile/torture/traits9.rs: New. * rust/compile/torture/transmute-size-check-1.rs: New. * rust/compile/torture/transmute1.rs: New. * rust/compile/torture/tuple1.rs: New. * rust/compile/torture/tuple2.rs: New. * rust/compile/torture/tuple3.rs: New. * rust/compile/torture/tuple_enum_variants.rs: New. * rust/compile/torture/tuple_field_access.rs: New. * rust/compile/torture/tuple_function.rs: New. * rust/compile/torture/tuple_index.rs: New. * rust/compile/torture/tuple_struct1.rs: New. * rust/compile/torture/tuple_struct2.rs: New. * rust/compile/torture/tuple_struct_unit.rs: New. * rust/compile/torture/tuple_struct_unused.rs: New. * rust/compile/torture/type-alias1.rs: New. * rust/compile/torture/type-alias2.rs: New. * rust/compile/torture/type_infer1.rs: New. * rust/compile/torture/type_infer2.rs: New. * rust/compile/torture/type_infer3.rs: New. * rust/compile/torture/type_infer4.rs: New. * rust/compile/torture/type_infer5.rs: New. * rust/compile/torture/type_infer6.rs: New. * rust/compile/torture/unary_operators.rs: New. * rust/compile/torture/undended-string-1.rs: New. * rust/compile/torture/undended-string-2.rs: New. * rust/compile/torture/underscore_id.rs: New. * rust/compile/torture/union.rs: New. * rust/compile/torture/union_union.rs: New. * rust/compile/torture/unit_type1.rs: New. * rust/compile/torture/unit_type2.rs: New. * rust/compile/torture/unit_type3.rs: New. * rust/compile/torture/unit_type4.rs: New. * rust/compile/torture/unit_type5.rs: New. * rust/compile/torture/unsafe1.rs: New. * rust/compile/torture/unsafe2.rs: New. * rust/compile/torture/unsafe3.rs: New. * rust/compile/torture/unsafe4.rs: New. * rust/compile/torture/unused.rs: New. * rust/compile/torture/unused1.rs: New. * rust/compile/torture/unused_struct.rs: New. * rust/compile/torture/unused_struct_field.rs: New. * rust/compile/torture/usize1.rs: New. * rust/compile/torture/very-broken-attr-string.rs: New. * rust/compile/torture/while_function.rs: New. * rust/compile/traits1.rs: New. * rust/compile/traits10.rs: New. * rust/compile/traits11.rs: New. * rust/compile/traits12.rs: New. * rust/compile/traits2.rs: New. * rust/compile/traits3.rs: New. * rust/compile/traits4.rs: New. * rust/compile/traits5.rs: New. * rust/compile/traits6.rs: New. * rust/compile/traits7.rs: New. * rust/compile/traits8.rs: New. * rust/compile/traits9.rs: New. * rust/compile/tuple1.rs: New. * rust/compile/tuple_struct1.rs: New. * rust/compile/tuple_struct2.rs: New. * rust/compile/tuple_struct3.rs: New. * rust/compile/type-alias1.rs: New. * rust/compile/type-bindings1.rs: New. * rust/compile/unary_negation.rs: New. * rust/compile/unary_not.rs: New. * rust/compile/unconstrained_type_param.rs: New. * rust/compile/unicode_escape.rs: New. * rust/compile/unsafe1.rs: New. * rust/compile/unsafe10.rs: New. * rust/compile/unsafe2.rs: New. * rust/compile/unsafe3.rs: New. * rust/compile/unsafe4.rs: New. * rust/compile/unsafe5.rs: New. * rust/compile/unsafe6.rs: New. * rust/compile/unsafe7.rs: New. * rust/compile/unsafe8.rs: New. * rust/compile/unsafe9.rs: New. * rust/compile/unterminated_c_comment.rs: New. * rust/compile/use_1.rs: New. * rust/compile/usize1.rs: New. * rust/compile/xfail/lifetime_param.rs: New. * rust/compile/xfail/struct_field_vis.rs: New. * rust/compile/xfail/xfail.exp: New. Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com> Co-authored-by: Thomas Schwinge <thomas@codesourcery.com> Co-authored-by: Mark Wielaard <mark@klomp.org> Co-authored-by: Marc Poulhiès <dkm@kataplop.net>
2022-12-13gccrs: Add link cases testsuitePhilip Herron7-0/+218
This testsuite is heavily inspired from the LTO testsuite that uses a pattern where each file is compiled to an object file and finally linked together. Since Rust does not have headers/prototypes, we rely on the ordering here so that all files numbered greater than zero get compiled to object files first. This leaves the _0 file free to test the 'extern crate' and 'use' keywords to force testing of the compiler to read metadata from the other 'crates'. gcc/testsuite/ * rust/link/generic_function_0.rs: New. * rust/link/generic_function_1.rs: New. * rust/link/link.exp: New. * rust/link/simple_function_0.rs: New. * rust/link/simple_function_1.rs: New. * rust/link/trait_import_0.rs: New. * rust/link/trait_import_1.rs: New.
2022-12-13gccrs: Add Debug info testsuitePhilip Herron9-0/+116
This testsuite is specifically about testcases which scan the asm debug info for results. gcc/testsuite/ * rust/debug/chartype.rs: New. * rust/debug/custom_link_section.rs: New. * rust/debug/debug.exp: New. * rust/debug/i8u8.rs: New. * rust/debug/lang.rs: New. * rust/debug/no_mangle.rs: New. * rust/debug/oldlang.rs: New. * rust/debug/tuple.rs: New. * rust/debug/win64-abi.rs: New. Co-authored-by: Tom Tromey <tom@tromey.com> Co-authored-by: Mark Wielaard <mark@klomp.org> Co-authored-by: Marc Poulhiès <dkm@kataplop.net>
2022-12-13gccrs: Add necessary hooks for a Rust front-end testsuitePhilip Herron2-0/+235
This copies over code from other front-end testsuites to enable testing for the rust front-end specifically. gcc/testsuite/ * lib/rust-dg.exp: New. * lib/rust.exp: New. Co-authored-by: Marc Poulhiès <dkm@kataplop.net> Co-authored-by: Thomas Schwinge <thomas@codesourcery.com>
2022-12-13Use DW_ATE_UTF for the Rust 'char' typeTom Tromey1-1/+18
The Rust 'char' type should use the DWARF DW_ATE_UTF encoding. gcc/ * dwarf2out.cc (is_rust): New. (base_type_die): Use DW_ATE_UTF for the Rust 'char' type. (gen_compile_unit_die): Handle "GNU Rust". Co-authored-by: Mark Wielaard <mark@klomp.org> Co-authored-by: Marc Poulhiès <dkm@kataplop.net>
2022-12-13tree-optimization/108076 - if-conversion and forced labelsRichard Biener2-2/+29
When doing if-conversion we simply throw away labels without checking whether they are possibly targets of non-local gotos or have their address taken. The following rectifies this and refuses to if-convert such loops. PR tree-optimization/108076 * tree-if-conv.cc (if_convertible_loop_p_1): Reject blocks with non-local or forced labels that we later remove labels from. * gcc.dg/torture/pr108076.c: New testcase.
2022-12-13rs6000: enable cbranchcc4Haochen Gui3-0/+36
This patch enables "have_cbranchcc4" on rs6000 by defining a "cbranchcc4" expander. "have_cbrnachcc4" is a flag in ifcvt.cc to indicate if branching by CC bits is valid or not. With this flag enabled, some branches can be optimized to conditional moves. 2022-12-07 Haochen Gui <guihaoc@linux.ibm.com> gcc/ * config/rs6000/rs6000.md (cbranchcc4): New expander. gcc/testsuite * gcc.target/powerpc/cbranchcc4-1.c: New. * gcc.target/powerpc/cbranchcc4-2.c: New.
2022-12-13optabs: make prepare_cmp_insn goto fail when cbranchcc4 checks unsatisfiedHaochen Gui1-4/+8
prepare_cmp_insn is a help function to generate comparison rtx. It should not assume that cbranchcc4 exists and all sub-CC modes are supported on a target. When the check fails, it could go to fail and return a NULL rtx as its callers check the return value for CCmode. The test case (gcc.target/powerpc/cbranchcc4-1.c) which covers failure path will be committed with an rs6000 specific patch. 2022-12-05 Haochen Gui <guihaoc@linux.ibm.com> gcc/ * optabs.cc (prepare_cmp_insn): Return a NULL rtx other than assertion failure when targets don't have cbranch optab or predicate check fails.
2022-12-13Daily bump.GCC Administrator6-1/+161
2022-12-12Revert "c++: build initializer_list<string> in a loop [PR105838]"Jason Merrill5-48/+8
This patch broke a couple of different patterns; reverting while I work on a fix. PR c++/108701 This reverts commit bd0485f20f4794f9787237706a6308473a8e9415.
2022-12-12Rebuilt gcc/config.in and gcc/configure.Gaius Mulley2-8/+8
Last commit forgot to rerun autoreconf and aclocal within the gcc subdirectory. gcc/ChangeLog: * config.in: (Rebuilt). * configure: (Rebuilt). Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2022-12-12libgo: bump major versionIan Lance Taylor1-1/+1
PR go/108057 The current version is the same as for the previous GCC release, but there have been minor changes like new type descriptors that make it impossible to run Go programs built with the previous GCC release with the current libgo. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/456976
2022-12-12Fortran: improve checking of assumed-size array spec [PR102180]Harald Anlauf2-3/+35
gcc/fortran/ChangeLog: PR fortran/102180 * array.cc (match_array_element_spec): Add check for bad assumed-implied-spec. (gfc_match_array_spec): Reorder logic so that the first bad array element spec may trigger an error. gcc/testsuite/ChangeLog: PR fortran/102180 * gfortran.dg/pr102180.f90: New test.
2022-12-12d: Fix undefined reference to nested lambda in template (PR108055)Iain Buclaw5-5/+84
Sometimes, nested lambdas of templated functions get no code generation due to them being marked as instantianted outside of all modules being compiled in the current compilation unit. This despite enclosing template instances being marked as instantiated inside the current compilation unit. To fix, all enclosing templates are now checked in `function_defined_in_root_p'. Because of this change, `function_needs_inline_definition_p' has also been fixed up to only check whether the regular function definition itself is to be emitted in the current compilation unit. PR d/108055 gcc/d/ChangeLog: * decl.cc (function_defined_in_root_p): Check all enclosing template instances for definition in a root module. (function_needs_inline_definition_p): Replace call to function_defined_in_root_p with test for outer module `isRoot'. gcc/testsuite/ChangeLog: * gdc.dg/torture/imports/pr108055conv.d: New. * gdc.dg/torture/imports/pr108055spec.d: New. * gdc.dg/torture/imports/pr108055write.d: New. * gdc.dg/torture/pr108055.d: New test.
2022-12-12Python3 detected in gcc/configure.ac, python3 modules install.texi.Gaius Mulley5-498/+114
This patch fixes three problems. Firstly python3 is now detected via a re-exp match python3 --version. Secondly python3 modules are described in doc/install.texi and modula-2 documentation dependency upon python3 is mentioned. Thirdly bug fixes for --enable-generated-files-in-srcdir with the modula-2 front end are made to Make-lang.in. gcc/ChangeLog: * gcc/aclocal.m4: Rebuilt. * gcc/configure: Rebuilt. * gcc/configure.ac (HAVE_PYTHON): Use ACX_CHECK_PROG_VER and re-exp to detect Python3. * doc/install.texi (GM2): New prerequisite item added. (Python3 modules) New item added. * m2/Make-lang.in: Bugfixes for --enable-generated-files-in-srcdir. Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2022-12-12AArch64: Enable TARGET_CONST_ANCHORWilco Dijkstra3-1/+70
Enable TARGET_CONST_ANCHOR to allow complex constants to be created via immediate add/sub. Use a 24-bit range as that enables a 3 or 4-instruction immediate to be replaced by 2 add/sub instructions. Fix the costing of add/sub to support 24-bit and 12-bit shifted immediates. The generated code for the testcase is now the same or better than LLVM. It also results in a small codesize reduction on SPEC. gcc/ * config/aarch64/aarch64.cc (aarch64_rtx_costs): Add correct costs for 24-bit and 12-bit shifted immediate add/sub. (TARGET_CONST_ANCHOR): Define. * config/aarch64/predicates.md (aarch64_pluslong_immediate): Fix range check. gcc/testsuite/ * gcc.target/aarch64/movk_3.c: New test.
2022-12-12middle-end: simplify complex if expressions where comparisons are inverse of ↵Tamar Christina3-0/+198
one another. This optimizes the following sequence ((a < b) & c) | ((a >= b) & d) into (a < b ? c : d) & 1 for scalar and on vector we can omit the & 1. Also recognizes (-(a < b) & c) | (-(a >= b) & d) into a < b ? c : d This changes the code generation from zoo2: cmp w0, w1 cset w0, lt cset w1, ge and w0, w0, w2 and w1, w1, w3 orr w0, w0, w1 ret into cmp w0, w1 csel w0, w2, w3, lt and w0, w0, 1 ret and significantly reduces the number of selects we have to do in the vector code. gcc/ChangeLog: * match.pd: Add new rule. gcc/testsuite/ChangeLog: * gcc.target/aarch64/if-compare_1.c: New test. * gcc.target/aarch64/if-compare_2.c: New test.
2022-12-12AArch64: Fix vector re-interpretation between partial SIMD modesTamar Christina1-4/+6
While writing a patch series I started getting incorrect codegen out from VEC_PERM on partial struct types. It turns out that this was happening because the TARGET_CAN_CHANGE_MODE_CLASS implementation has a slight bug in it. The hook only checked for SIMD to Partial but never Partial to SIMD. This resulted in incorrect subregs to be generated from the fallback code in VEC_PERM_EXPR expansions. I have unfortunately not been able to trigger it using a standalone testcase as the mid-end optimizes away the permute every time I try to describe a permute that would result in the bug. The patch now rejects any conversion of partial SIMD struct types, unless they are both partial structures of the same number of registers or one is a SIMD type who's size is less than 8 bytes. gcc/ChangeLog: * config/aarch64/aarch64.cc (aarch64_can_change_mode_class): Restrict conversions between partial struct types properly.
2022-12-12AArch64: Support new tbranch optab.Tamar Christina3-8/+122
This implements the new tbranch optab for AArch64. we cannot emit one big RTL for the final instruction immediately. The reason that all comparisons in the AArch64 backend expand to separate CC compares, and separate testing of the operands is for ifcvt. The separate CC compare is needed so ifcvt can produce csel, cset etc from the compares. Unlike say combine, ifcvt can not do recog on a parallel with a clobber. Should we emit the instruction directly then ifcvt will not be able to say, make a csel, because we have no patterns which handle zero_extract and compare. (unlike combine ifcvt cannot transform the extract into an AND). While you could provide various patterns for this (and I did try) you end up with broken patterns because you can't add the clobber to the CC register. If you do, ifcvt recog fails. i.e. int f1 (int x) { if (x & 1) return 1; return x; } We lose csel here. Secondly the reason the compare with an explicit CC mode is needed is so that ifcvt can transform the operation into a version that doesn't require the flags to be set. But it only does so if it know the explicit usage of the CC reg. For instance int foo (int a, int b) { return ((a & (1 << 25)) ? 5 : 4); } Doesn't require a comparison, the optimal form is: foo(int, int): ubfx x0, x0, 25, 1 add w0, w0, 4 ret and no compare is actually needed. If you represent the instruction using an ANDS instead of a zero_extract then you get close, but you end up with an ands followed by an add, which is a slower operation. gcc/ChangeLog: * config/aarch64/aarch64.md (*tb<optab><mode>1): Rename to... (*tb<optab><ALLI:mode><GPI:mode>1): ... this. (tbranch_<code><mode>4): New. * config/aarch64/iterators.md(ZEROM, zerom): New. gcc/testsuite/ChangeLog: * gcc.target/aarch64/tbz_1.c: New test.
2022-12-12middle-end: Add new tbranch optab to add support for bit-test-and-branch ↵Tamar Christina7-25/+159
operations This adds a new test-and-branch optab that can be used to do a conditional test of a bit and branch. This is similar to the cbranch optab but instead can test any arbitrary bit inside the register. This patch recognizes boolean comparisons and single bit mask tests. gcc/ChangeLog: * dojump.cc (do_jump): Pass along value. (do_jump_by_parts_greater_rtx): Likewise. (do_jump_by_parts_zero_rtx): Likewise. (do_jump_by_parts_equality_rtx): Likewise. (do_compare_rtx_and_jump): Likewise. (do_compare_and_jump): Likewise. * dojump.h (do_compare_rtx_and_jump): New. * optabs.cc (emit_cmp_and_jump_insn_1): Refactor to take optab to check. (validate_test_and_branch): New. (emit_cmp_and_jump_insns): Optiobally take a value, and when value is supplied then check if it's suitable for tbranch. * optabs.def (tbranch_eq$a4, tbranch_ne$a4): New. * doc/md.texi (tbranch_@var{op}@var{mode}4): Document it. * optabs.h (emit_cmp_and_jump_insns): New. * tree.h (tree_zero_one_valued_p): New.
2022-12-12aarch64: Make existing V2HF be usable.Tamar Christina5-45/+90
The backend has an existing V2HFmode that is used by pairwise operations. This mode was however never made fully functional. Amongst other things it was never declared as a vector type which made it unusable from the mid-end. It's also lacking an implementation for load/stores so reload ICEs if this mode is every used. This finishes the implementation by providing the above. Note that I have created a new iterator VHSDF_P instead of extending VHSDF because the previous iterator is used in far more things than just load/stores. It's also used for instance in intrinsics and extending this would force me to provide support for mangling the type while we never expose it through intrinsics. gcc/ChangeLog: * config/aarch64/aarch64-simd.md (*aarch64_simd_movv2hf): New. (mov<mode>, movmisalign<mode>, aarch64_dup_lane<mode>, aarch64_store_lane0<mode>, aarch64_simd_vec_set<mode>, @aarch64_simd_vec_copy_lane<mode>, vec_set<mode>, reduc_<optab>_scal_<mode>, reduc_<fmaxmin>_scal_<mode>, aarch64_reduc_<optab>_internal<mode>, aarch64_get_lane<mode>, vec_init<mode><Vel>, vec_extract<mode><Vel>): Support V2HF. (aarch64_simd_dupv2hf): New. * config/aarch64/aarch64.cc (aarch64_classify_vector_mode): Add E_V2HFmode. * config/aarch64/iterators.md (VHSDF_P): New. (V2F, VMOVE, nunits, Vtype, Vmtype, Vetype, stype, VEL, Vel, q, vp): Add V2HF. * config/arm/types.md (neon_fp_reduc_add_h): New. gcc/testsuite/ChangeLog: * gcc.target/aarch64/sve/slp_1.c: Update testcase.
2022-12-12aarch64: Add __ARM_FEATURE_PAUTH and __ARM_FEATURE_BTI ACLE definesKyrylo Tkachov4-0/+27
Recent ACLE additions specified the __ARM_FEATURE_PAUTH and __ARM_FEATURE_BTI macros [1] that the compiler should define when the pointer authentication and BTI instructions are available (and don't act as NOPs). We've received requests to enable them in GCC for aarch64, similar to clang [2]. It's a fairly simple patch and should be non-intrusive at this stage. Pointer authentication has its own "pauth" feature flag, whereas BTI depends on an architecture level of Armv8.5-a or later. Bootstrapped and tested on aarch64-none-linux-gnu. [1] https://github.com/ARM-software/acle/blob/main/main/acle.md#pointer-authentication [2] https://reviews.llvm.org/rG7d40baa82b1f272f68de63f3c4f68d970bdcd6ed gcc/ChangeLog: * config/aarch64/aarch64-c.cc (aarch64_update_cpp_builtins): Define __ARM_FEATURE_PAUTH and __ARM_FEATURE_BTI when appropriate. * config/aarch64/aarch64.h (TARGET_BTI): Define. gcc/testsuite/ChangeLog: * gcc.target/aarch64/acle/bti_def.c: New test. * gcc.target/aarch64/acle/pauth_def.c: New test.
2022-12-12Revert parts of ADDR_EXPR/CONSTRUCTOR treatment change in match.pdRichard Biener3-23/+28
This reverts the part that substitutes from the definition of an SSA name to the capture, thus ADDR_EXPR@0 eventually yielding &y_1->a[i_2] instead of _3. That's because I didn't think of how to deal with substituting @0 in the result pattern. So the following re-instantiates the SSA def CONSTRUCTOR handling and in the ADDR_EXPR helpers used by match.pd handles SSA names defined to ADDR_EXPRs transparently. * genmatch.cc (dt_simplify::gen): Revert last change. * match.pd: Revert simplification of CONSTUCTOR leaf handling. (&x cmp SSA_NAME): Handle ADDR_EXPR in SSA defs. * fold-const.cc (split_address_to_core_and_offset): Handle ADDR_EXPRs in SSA defs. (address_compare): Likewise.
2022-12-12tree-optimization/89317 - another pattern for &p->x != p + 4Richard Biener3-11/+19
As seen in the original testcase for PR89317 we are missing comparison simplification patterns for &p->x != p + 4. Fixed by making an existing one apply. To make the pattern apply during CCP we need to simplify ccp_fold to not use GENERIC folding of conditions but also use GIMPLE folding. PR tree-optimization/89317 * tree-ssa-ccp.cc (ccp_fold): Handle GIMPLE_COND via gimple_fold_stmt_to_constant_1. * match.pd (&a != &a + c): Apply to pointer_plus with non-ADDR_EXPR base as well. * gcc.dg/tree-ssa/pr89317.c: Amend.
2022-12-12Daily bump.GCC Administrator5-1/+81
2022-12-11Fortran: fix ICE on bad use of statement function [PR107995]Steve Kargl2-0/+16
gcc/fortran/ChangeLog: PR fortran/107995 * interface.cc (gfc_check_dummy_characteristics): Reject statement function dummy arguments. gcc/testsuite/ChangeLog: PR fortran/107995 * gfortran.dg/pr107995.f90: New test.
2022-12-11d: Fix internal compiler error: in visit, at d/imports.cc:72 (PR108050)Iain Buclaw6-2/+34
The visitor for lowering IMPORTED_DECLs did not have an override for dealing with importing OverloadSet symbols. This has now been implemented in the code generator. PR d/108050 gcc/d/ChangeLog: * decl.cc (DeclVisitor::visit (Import *)): Handle build_import_decl returning a TREE_LIST. * imports.cc (ImportVisitor::visit (OverloadSet *)): New override. gcc/testsuite/ChangeLog: * gdc.dg/imports/pr108050/mod1.d: New. * gdc.dg/imports/pr108050/mod2.d: New. * gdc.dg/imports/pr108050/package.d: New. * gdc.dg/pr108050.d: New test.
2022-12-11d: Merge upstream dmd, druntime c8ae4adb2e, phobos 792c8b7c1.Iain Buclaw105-1230/+1903
D front-end changes: - Import dmd v2.101.0. - Deprecate the ability to call `__traits(getAttributes)' on overload sets. - Deprecate non-empty `for' statement increment clause with no effect. - Array literals assigned to `scope' array variables can now be allocated on the stack. D runtime changes: - Import druntime v2.101.0. Phobos changes: - Import phobos v2.101.0. gcc/d/ChangeLog: * dmd/MERGE: Merge upstream dmd c8ae4adb2e. * typeinfo.cc (check_typeinfo_type): Update for new front-end interface. (TypeInfoVisitor::visit (TypeInfoStructDeclaration *)): Remove warning that toHash() must be declared 'nothrow @safe`. libphobos/ChangeLog: * libdruntime/MERGE: Merge upstream druntime c8ae4adb2e. * src/MERGE: Merge upstream phobos 792c8b7c1.
2022-12-11Remove ServerSocket.def and ServerSocket.modGaius Mulley2-167/+0
Remove the two source files. gcc/m2/ChangeLog: * gm2-libs-iso/ServerSocket.def: Remove file. * gm2-libs-iso/ServerSocket.mod: Remove file. Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2022-12-11Remove incomplete ServerSocket module.Gaius Mulley2-16/+237
Final (hopeful) tidying up before the merge. Remove the incomplete additional module as it is not part of the ISO standard and it could return when complete during the next stage1. ChangeLog: * configure: Rebuilt. gcc/ChangeLog: * configure: Rebuilt. gcc/m2/ChangeLog: * gm2-libs-iso/ServerSocket.def: Removed. * gm2-libs-iso/ServerSocket.mod: Removed. libgm2/ChangeLog: * Makefile.in: Rebuilt. * configure: Rebuilt. * libm2cor/Makefile.in: Rebuilt. * libm2iso/Makefile.am (M2DEFS): Remove ServerSocket.def. (M2MODS) Remove ServerSocket.mod. * libm2iso/Makefile.in: Rebuilt. * libm2log/Makefile.in: Rebuilt. * libm2min/Makefile.in: Rebuilt. * libm2pim/Makefile.in: Rebuilt. Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
2022-12-11d: Expand bsr intrinsic as `clz(arg) ^ (argsize - 1)'Iain Buclaw1-11/+6
As well as removing unnecessary casts, this results in less temporaries being generated during the initial gimple lowering pass. Otherwise the code generated is identical to the former intrinsic expansion. gcc/d/ChangeLog: * intrinsics.cc (expand_intrinsic_bsf): Fix comment. (expand_intrinsic_bsr): Use BIT_XOR_EXPR instead of MINUS_EXPR.
2022-12-11tree-optimization/89317 - missed folding of (p + 4) - &p->dRichard Biener2-0/+24
The PR notices we fail to simplify a_4 = &x_3(D)->data; b_5 = x_3(D) + 16; _1 = b_5 - a_4; together with the enabler handling ADDR_EXPR leafs in separate stmts in match.pd the suggested patterns work. PR tree-optimization/89317 * match.pd ((p + b) - &p->c -> b - offsetof(c)): New patterns. * gcc.dg/tree-ssa/pr89317.c: New testcase.
2022-12-11Treat ADDR_EXPR and CONSTRUCTOR as GIMPLE/GENERIC magicallyRichard Biener4-15/+31
The following allows to match ADDR_EXPR for both the invariant &a.b case as well as the &p->d case in a separate definition transparently. This also allows to remove the hack we employ for CONSTRUCTOR which we handle for example with (match vec_same_elem_p CONSTRUCTOR@0 (if (TREE_CODE (@0) == SSA_NAME && uniform_vector_p (gimple_assign_rhs1 (SSA_NAME_DEF_STMT (@0)))))) Note CONSTUCTORs always appear as separate definition in GIMPLE, but I continue to play safe and ADDR_EXPRs are now matched in both places where previously ADDR_EXPR@0 would have missed the &p->x case. This is a prerequesite for the PR89317 fix. * genmatch.cc (dt_node::gen_kids): Handle ADDR_EXPR in both the GENERIC and GIMPLE op position. (dt_simplify::gen): Capture both GENERIC and GIMPLE op position for ADDR_EXPR and CONSTRUCTOR. * match.pd: Simplify CONSTRUCTOR leaf handling. * gcc.dg/tree-ssa/forwprop-3.c: Adjust. * g++.dg/tree-ssa/pr31146-2.C: Likewise.
2022-12-11tree-optimization/106904 - bogus -Wstringopt-overflow with vectorsRichard Biener4-5/+50
The following avoids CSE of &ps->wp to &ps->wp.hwnd confusing -Wstringopt-overflow by making sure to produce addresses to the biggest container from vectorization. For this I introduce strip_zero_offset_components which turns &ps->wp.hwnd into &(*ps) and use that to base the vector data references on. That will also work for addresses with variable components, alternatively emitting pointer arithmetic via calling get_inner_reference and gimplifying that would be possible but likely more intrusive. This is by no means a complete fix for all of those issues (avoiding ADDR_EXPRs in favor of pointer arithmetic might be). Other passes will have similar issues. In theory that might now cause false negatives. PR tree-optimization/106904 * tree.h (strip_zero_offset_components): Declare. * tree.cc (strip_zero_offset_components): Define. * tree-vect-data-refs.cc (vect_create_addr_base_for_vector_ref): Strip zero offset components before building the address. * gcc.dg/Wstringop-overflow-pr106904.c: New testcase.