Commit graph

197396 commits

Author SHA1 Message Date
Philip Herron
88415d33bb gccrs: Add GCC Rust front-end Make-lang.in
This is the Makefile for our front-end.

	gcc/rust/
	* Make-lang.in: New.
2022-12-13 14:00:07 +01:00
Philip Herron
5e7d199739 gccrs: Add lang.opt
We have some Rust-specific language options. Note that -fwrapv is
enabled by default in the code. We are trying to respect options such as
-Wunused-result which we get by porting over C++'s no-discard for Rust's
must-use attribute, so we have enabled these by default directly here.

	gcc/rust/
	* lang.opt: New.
2022-12-13 14:00:07 +01:00
Philip Herron
ab1e0db43c gccrs: Add lang-spec.h
This specifies the extensions of the Rust language.

	gcc/rust/
	* lang-specs.h: New.
2022-12-13 14:00:07 +01:00
Philip Herron
ea34614225 gccrs: Compiler proper interface kicks off the pipeline
This is a wrapper to get out of C land in the rust-lang.cc and into our
class hierarchy for the rust front-end. We expect that the front-end only
support one source file input as the expansion pass will attempt to resolve
that relative pass and parse accordingly.

The main missing piece here is that we are using saw_errors() to return
early which is unnecessary but as our error handling has been improving
over time we will start to take advantage of error node in our type system
as well as error_mark_node from GCC. The caveat being that our lints/checks
expect no errors and will throw an assertion.

	gcc/rust/
	* rust-lang.cc: New.
	* rust-session-manager.cc: New.
	* rust-session-manager.h: New.
2022-12-13 14:00:07 +01:00
Philip Herron
bba14a0790 gccrs: Add compiler driver
Our compiler driver is fairly simple so far. The key piece to enforce is
that a compilation unit in Rust is the whole crate, so the process for
compiling Rust means pointing the compiler at the main entry point such as
src/lib.rs or src/main.rs where the expansion pass takes over loading the
other source files to include them in the crate.

	gcc/rust/
	* rustspec.cc: New.
2022-12-13 14:00:07 +01:00
Philip Herron
fe6264fa28 gccrs: These are wrappers ported from reusing gccgo
The wrappers over linemap and location will eventually disappear here but
served as a useful starting point for us. We have wrappers over the
diagnostics system which we might be able to get rid of as well.

	gcc/rust/
	* rust-diagnostics.cc: New.
	* rust-diagnostics.h: New.
	* rust-gcc-diagnostics.cc: New.
	* rust-linemap.cc: New.
	* rust-linemap.h: New.
	* rust-location.h: New.
	* rust-system.h: New.
2022-12-13 14:00:07 +01:00
Philip Herron
cfbda2f78b gccrs: Add HIR to GCC GENERIC lowering entry point
This patch contains the entry point and utilities used for the lowering
of HIR nodes to `tree`s. It also contains a constant evaluator, ported
over from the C++ frontend.

	gcc/rust/
	* backend/rust-compile-context.cc: New.
	* backend/rust-compile-context.h: New.
	* backend/rust-compile.cc: New.
	* backend/rust-compile.h: New.
	* backend/rust-constexpr.cc: New.
	* backend/rust-constexpr.h: New.

Co-authored-by: David Faust <david.faust@oracle.com>
Co-authored-by: Faisal Abbas <90.abbasfaisal@gmail.com>
Signed-off-by: Faisal Abbas <90.abbasfaisal@gmail.com>
2022-12-13 14:00:07 +01:00
Philip Herron
019b2f1558 gccrs: Add HIR to GCC GENERIC lowering for all nodes
This patch implements the lowering mentioned in the previous patch for all HIR nodes.

	gcc/rust/
	* backend/rust-compile-block.cc: New.
	* backend/rust-compile-block.h: New.
	* backend/rust-compile-expr.cc: New.
	* backend/rust-compile-expr.h: New.
	* backend/rust-compile-extern.h: New.
	* backend/rust-compile-fnparam.cc: New.
	* backend/rust-compile-fnparam.h: New.
	* backend/rust-compile-implitem.cc: New.
	* backend/rust-compile-implitem.h: New.
	* backend/rust-compile-intrinsic.cc: New.
	* backend/rust-compile-intrinsic.h: New.
	* backend/rust-compile-item.cc: New.
	* backend/rust-compile-item.h: New.
	* backend/rust-compile-pattern.cc: New.
	* backend/rust-compile-pattern.h: New.
	* backend/rust-compile-resolve-path.cc: New.
	* backend/rust-compile-resolve-path.h: New.
	* backend/rust-compile-stmt.cc: New.
	* backend/rust-compile-stmt.h: New.
	* backend/rust-compile-struct-field-expr.cc: New.
	* backend/rust-compile-struct-field-expr.h: New.
	* backend/rust-compile-type.cc: New.
	* backend/rust-compile-type.h: New.
	* backend/rust-compile-var-decl.h: New.

Co-authored-by: David Faust <david.faust@oracle.com>
2022-12-13 14:00:07 +01:00
Philip Herron
15f04af347 gccrs: Add base for HIR to GCC GENERIC lowering
This pass walks the HIR crate and turns them into GCC `tree`s. We do not have
any Rust specific tree's. We are slowly removing the backend abstraction
which was ported over from gccgo in favour of using `tree`s directly.

	gcc/rust/
	* backend/rust-builtins.h: New.
	* backend/rust-compile-base.cc: New.
	* backend/rust-compile-base.h: New.
	* backend/rust-mangle.cc: New.
	* backend/rust-mangle.h: New.
	* backend/rust-tree.cc: New.
	* backend/rust-tree.h: New.
	* rust-backend.h: New.
	* rust-gcc.cc: New.

Co-authored-by: David Faust <david.faust@oracle.com>
2022-12-13 14:00:07 +01:00
Philip Herron
509e4c32c6 gccrs: Add metadata output pass
Extern crates statements to tell the front-end to look for another library.
The mechanism here is heavily inspired from gccgo, so when we compile a
library for example we invoke:

  gccrs -g -O2 -frust-crate=mylib -c src/lib.rs -o src/mylib.o

All going well this object file will now contain extra data inside
.rust-export section inside the object file which will be preserved inside
archives and shared objects. When we have another application which uses
this library 'mylib'.

  extern crate mylib;
  use mylib::foo;

  fn main() {
    foo();
  }

We compile using:

  gcc -g -O2 -frust-crate=test -c src/main.rs -o src/main.o

When the extern crate line is hit the front-end will look for mylib.o,
libmylib.a, mylib.rox. If it finds a raw object file it will read the
.rust-export section directly from the object for the public metadata
such as public functions, types constants etc. If it fails to find an
object it might find .rox which is the objdump of the .rust-export to a
raw file, it might even find libmylib.a and read the export directly out
of the archive file reusing code from gccgo to do so.

The full compiler pipeline is reused here, so the metatadata is actually
just real rust code. The benifit here is that Rust supports exporting,
macros and generics so this requires the name-resolution and type info
all to be generated and inserted into the apropriate context classes. Since
the metadata is real rust code it means we can reuse the full pipeline to
generate the code as necessary. So for the simple case of a public struct
we simply emit the AST dump of this struct directly into the metadata. If
its a non-generic public function we emit and extern rust abi block for
that function. If its a trait we can simply emit the trait with the public
memebers. Generics are more complicated since we need to emit the function
fully for it to be compiled correctly this still needs tests to be added.
The hardest part is non generic impl blocks which is still a WIP.

To finally link the two crates together you run:

  gcc -g -O2 -o rust-program.exe src/main.o src/mylib.o

	gcc/rust/
	* metadata/rust-export-metadata.cc: New.
	* metadata/rust-export-metadata.h: New.
	* metadata/rust-extern-crate.cc: New.
	* metadata/rust-extern-crate.h: New.
	* metadata/rust-import-archive.cc: New.
	* metadata/rust-imports.cc: New.
	* metadata/rust-imports.h: New.
	* rust-object-export.cc: New.
	* rust-object-export.h: New.
2022-12-13 14:00:06 +01:00
Philip Herron
4d67468d1d gccrs: Add unused variable scan
This is a simple walk_tree which acts on the monomorphized code by walking
the compiled translation unit of functions.

	gcc/rust/
	* checks/lints/rust-lint-unused-var.cc: New.
	* checks/lints/rust-lint-unused-var.h: New.
2022-12-13 14:00:06 +01:00
Thomas Young
520b52b24e gccrs: Add dead code scan on HIR
In order to find dead code we use a depth first search and keep liveness
variables, after type resolution. In this case, if a function is unused
and it calls another function the 2nd function is now unused since the
caller is not used etc. The algorithm is a depth first search.

	gcc/rust/
	* checks/lints/rust-lint-marklive-base.h: New.
	* checks/lints/rust-lint-marklive.cc: New.
	* checks/lints/rust-lint-marklive.h: New.
	* checks/lints/rust-lint-scan-deadcode.h: New.
2022-12-13 14:00:06 +01:00
Arthur Cohen
ca246e573f gccrs: Add privacy checks
This pass is responsible for resolving the privacy of items and verifying
that access to these items is performed within the limits of that privacy.
By default, items in Rust are private and only public to the current
module and its submodules. However, the user can annotate an item with
various qualifiers such as `pub` to publicly expose an item. Furthermore,
a module path can be given to `pub` to restrict an item's privacy to a
certain module: These paths need to be resolved and later on checked by
the privacy error reporter.

	gcc/rust/
	* checks/errors/privacy/rust-privacy-check.cc: New.
	* checks/errors/privacy/rust-privacy-check.h: New.
	* checks/errors/privacy/rust-privacy-common.h: New.
	* checks/errors/privacy/rust-privacy-ctx.cc: New.
	* checks/errors/privacy/rust-privacy-ctx.h: New.
	* checks/errors/privacy/rust-privacy-reporter.cc: New.
	* checks/errors/privacy/rust-privacy-reporter.h: New.
	* checks/errors/privacy/rust-pub-restricted-visitor.cc: New.
	* checks/errors/privacy/rust-pub-restricted-visitor.h: New.
	* checks/errors/privacy/rust-reachability.cc: New.
	* checks/errors/privacy/rust-reachability.h: New.
	* checks/errors/privacy/rust-visibility-resolver.cc: New.
	* checks/errors/privacy/rust-visibility-resolver.h: New.
2022-12-13 14:00:06 +01:00
Arthur Cohen
5215235f01 gccrs: Add const checker
Similarly to the unsafe checker, constant evaluation can only be performed
in a few contexts and include restrictions on the Rust language. Should
the user fail to uphold those conditions, errors will be reported and the
compilation pipeline interrupted.

These contexts are as follow:

- Array type length expressions
- Array repeat length expressions
- Constants
- Statics
- Enum discriminants
- Const generic arguments

In these contexts, the user is restricted to calling only functions marked
as `const` or perform arithmetic operations only on certain types, among
other restrictions.

	gcc/rust/
	* checks/errors/rust-const-checker.cc: New.
	* checks/errors/rust-const-checker.h: New.
2022-12-13 14:00:06 +01:00
Arthur Cohen
b1b35204d8 gccrs: Add unsafe checks for Rust
The UnsafeChecker visitor verifies that unsafe actions are only performed
in unsafe contexts. Otherwise, an error should be reported to the user and
the compilation pipeline should be halted. These contexts, which include
unsafe blocks or unsafe functions, are allowed to perform more actions
than regular safe Rust code. These actions currently include:

- Dereferencing raw pointers
- Calls to unsafe functions
- Use of inline assembly
- Use of mutable static
- Use of extern static
- Access to a union's field
- Call to functions with #[target(feature)] attribute
- Initializing type with rustc_layout_scalar_valid_range attribute
- Mutation of layout constrained field
- Borrow of layout constrained field

	gcc/rust/
	* checks/errors/rust-unsafe-checker.cc: New.
	* checks/errors/rust-unsafe-checker.h: New.
2022-12-13 14:00:06 +01:00
Philip Herron
06688fe40a gccrs: Add remaining type system transformations
This patch implements multiple transformation performed on the HIR
during type-resolution such as type coercion, casts, auto-dereferencement.

	gcc/rust/
	* typecheck/rust-autoderef.cc: New.
	* typecheck/rust-autoderef.h: New.
	* typecheck/rust-casts.cc: New.
	* typecheck/rust-casts.h: New.
	* typecheck/rust-coercion.cc: New.
	* typecheck/rust-coercion.h: New.
	* typecheck/rust-hir-dot-operator.cc: New.
	* typecheck/rust-hir-dot-operator.h: New.
	* typecheck/rust-hir-inherent-impl-overlap.h: New.
	* typecheck/rust-hir-path-probe.h: New.
	* typecheck/rust-hir-trait-ref.h: New.
	* typecheck/rust-hir-type-bounds.h: New.
	* typecheck/rust-substitution-mapper.cc: New.
	* typecheck/rust-substitution-mapper.h: New.
	* typecheck/rust-tycheck-dump.h: New.
	* typecheck/rust-tyctx.cc: New.
	* typecheck/rust-tyty-bounds.cc: New.
	* typecheck/rust-tyty-call.cc: New.
	* typecheck/rust-tyty-call.h: New.
	* typecheck/rust-tyty-cmp.h: New.
	* typecheck/rust-tyty-rules.h: New.
2022-12-13 14:00:06 +01:00
Philip Herron
24393cb68f gccrs: Add Rust type information
Contains abstractions over Rust's types, used when performing the
HIR's type-resolution.

	gcc/rust/
	* typecheck/rust-tyty.cc: New.
	* typecheck/rust-tyty.h: New.
2022-12-13 14:00:06 +01:00
Philip Herron
c6c3db2176 gccrs: Add type resolution and trait solving pass
This serves to handle parts of the Rust type-system. Namely, the type
resolution (similar to type-checking) and the trait solving algorithms
(which ensure Rust's type contracts are upheld throughout the codebase).

	gcc/rust/
	* typecheck/rust-hir-trait-resolve.cc: New.
	* typecheck/rust-hir-trait-resolve.h: New.
	* typecheck/rust-hir-type-check-base.cc: New.
	* typecheck/rust-hir-type-check-base.h: New.
	* typecheck/rust-hir-type-check-enumitem.cc: New.
	* typecheck/rust-hir-type-check-enumitem.h: New.
	* typecheck/rust-hir-type-check-expr.cc: New.
	* typecheck/rust-hir-type-check-expr.h: New.
	* typecheck/rust-hir-type-check-implitem.cc: New.
	* typecheck/rust-hir-type-check-implitem.h: New.
	* typecheck/rust-hir-type-check-item.cc: New.
	* typecheck/rust-hir-type-check-item.h: New.
	* typecheck/rust-hir-type-check-path.cc: New.
	* typecheck/rust-hir-type-check-pattern.cc: New.
	* typecheck/rust-hir-type-check-pattern.h: New.
	* typecheck/rust-hir-type-check-stmt.cc: New.
	* typecheck/rust-hir-type-check-stmt.h: New.
	* typecheck/rust-hir-type-check-struct-field.h: New.
	* typecheck/rust-hir-type-check-struct.cc: New.
	* typecheck/rust-hir-type-check-toplevel.cc: New.
	* typecheck/rust-hir-type-check-toplevel.h: New.
	* typecheck/rust-hir-type-check-type.cc: New.
	* typecheck/rust-hir-type-check-type.h: New.
	* typecheck/rust-hir-type-check-util.cc: New.
	* typecheck/rust-hir-type-check-util.h: New.
	* typecheck/rust-hir-type-check.cc: New.
	* typecheck/rust-hir-type-check.h: New.
	* typecheck/rust-tyty-visitor.h: New.
2022-12-13 14:00:06 +01:00
Philip Herron
9ce37e7206 gccrs: Add helpers mappings canonical path and lang items
These are various helper classes used in the compiler pipeline.

	gcc/rust/
	* util/rust-canonical-path.h: New.
	* util/rust-common.h: New.
	* util/rust-hir-map.cc: New.
	* util/rust-hir-map.h: New.
	* util/rust-identifier.h: New.
	* util/rust-lang-item.h: New.
	* util/rust-mapping-common.h: New.
	* util/rust-stacked-contexts.h: New.
2022-12-13 14:00:05 +01:00
Arthur Cohen
2e7fc8780e gccrs: Add attributes checker
The attribute checker is responsible for checking the validity of various
attributes including built-in ones. It is currently unfinished and will
receive some modifications, as well as become the host of some existing
code in the compiler which needs to be refactored. One of its
responsibilities is to make sure that arguments given to built-in
attributes are correct, or contain the correct type of information. This
visitor also checks that an attribute is allowed to be used in the current
particular context.

	gcc/rust/
	* util/rust-attributes.cc: New.
	* util/rust-attributes.h: New.
2022-12-13 14:00:05 +01:00
Arthur Cohen
9a4fee5f57 gccrs: Add implementation of Optional
This adds an Optional<T> class to improve error handling.

	gcc/rust/
	* util/rust-optional-test.cc: New.
	* util/rust-optional.h: New.
2022-12-13 14:00:05 +01:00
Arthur Cohen
eb10bc5225 gccrs: Add Base62 implementation
Used for V0 symbol mangling scheme which is still in development.

	gcc/rust/
	* util/rust-base62.cc: New.
	* util/rust-base62.h: New.
2022-12-13 14:00:05 +01:00
Philip Herron
15b0278905 gccrs: Add Rust ABI enum helpers
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-13 14:00:05 +01:00
Philip Herron
c7f8347e83 gccrs: Add port of FNV hash used during legacy symbol mangling
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-13 14:00:05 +01:00
Philip Herron
b32b1b1576 gccrs: Add wrapper for make_unique
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-13 14:00:05 +01:00
Philip Herron
7999cf327d gccrs: Add AST to HIR lowering pass
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-13 14:00:05 +01:00
Philip Herron
7641eaead4 gccrs: Add HIR definitions and visitor framework
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-13 14:00:04 +01:00
Philip Herron
8ad1d56d68 gccrs: Add declarations for Rust HIR
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-13 14:00:04 +01:00
Philip Herron
85a8fe00f8 gccrs: Add name resolution pass to the Rust front-end
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-13 14:00:04 +01:00
Arthur Cohen
1841081a8a gccrs: Add expansion pass for the Rust front-end
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-13 14:00:04 +01:00
Joel Phillips
32c8fb0eea gccrs: Add Parser for Rust front-end pt.2
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-13 14:00:04 +01:00
Joel Phillips
35e4f3b4af gccrs: Add Parser for Rust front-end pt.1
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-13 14:00:04 +01:00
Joel Phillips
18f6990f84 gccrs: Add Lexer for Rust front-end
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-13 14:00:04 +01:00
Joel Phillips
5b981e9c74 gccrs: Add Rust AST visitors
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-13 14:00:04 +01:00
Joel Phillips
d588754c82 gccrs: Add full definitions of Rust AST data structures
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-13 14:00:04 +01:00
Joel Phillips
438ae944fa gccrs: Add definitions of Rust Items in AST data structures
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-13 14:00:03 +01:00
Joel Phillips
6b35ae12ce gccrs: Add Rust front-end base AST data structures
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-13 14:00:03 +01:00
Philip Herron
dc4171edb3 gccrs: Add gcc-check-target check-rust
This allows us to invoke the rust testsuite.

	* Makefile.def: Add Rust language.
	* Makefile.in: Regenerate via autogen.
2022-12-13 14:00:03 +01:00
Philip Herron
5a56869d6e gccrs: Add execution test cases
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-13 14:00:03 +01:00
Philip Herron
97705b4459 gccrs: Add general compilation test cases
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-13 14:00:03 +01:00
Philip Herron
f60df7e620 gccrs: Add link cases testsuite
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-13 14:00:03 +01:00
Philip Herron
4b8f3005af gccrs: Add Debug info testsuite
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-13 14:00:03 +01:00
Philip Herron
b772a504ef gccrs: Add necessary hooks for a Rust front-end testsuite
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-13 14:00:02 +01:00
Tom Tromey
dd950cbbb9 Use DW_ATE_UTF for the Rust 'char' type
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-13 14:00:02 +01:00
Richard Biener
b4fddbe959 tree-optimization/108076 - if-conversion and forced labels
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-13 11:39:59 +01:00
Jakub Jelinek
0a43f7b1a7 libsanitizer: Fix up libbacktrace build after r13-4547 [PR108072]
The r13-4547 commit added new non-static function to libbacktrace:
backtrace_uncompress_zstd but for the libsanitizer use we need to
rename it, so that it is in __asan_* namespace and doesn't clash
with other copies of libbacktrace.

2022-12-13  Jakub Jelinek  <jakub@redhat.com>

libsanitizer/
	PR sanitizer/108072
	* libbacktrace/backtrace-rename.h (backtrace_uncompress_zstd): Define.
2022-12-13 10:30:36 +01:00
Haochen Gui
8ad0a7df89 rs6000: enable cbranchcc4
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-13 16:51:10 +08:00
Haochen Gui
99cce60d0b optabs: make prepare_cmp_insn goto fail when cbranchcc4 checks unsatisfied
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-13 16:32:15 +08:00
GCC Administrator
1728c537b4 Daily bump. 2022-12-13 00:18:07 +00:00
Jason Merrill
77ebee2bd0 Revert "c++: build initializer_list<string> in a loop [PR105838]"
This patch broke a couple of different patterns; reverting while I work on a
fix.

	PR c++/108701

This reverts commit bd0485f20f.
2022-12-12 17:46:31 -05:00