diff options
author | M V V S Manoj Kumar <mvvsmanojkumar@gmail.com> | 2023-03-16 11:03:57 +0530 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-16 18:37:16 +0100 |
commit | 0a0006806086f9c5b68dc82253ebbf5fe264330e (patch) | |
tree | c13a5c63c4c8697ed233a65a003bab6aca893254 /gcc | |
parent | b90dc2bdd23127ab998f352eaa592d7d052d8d64 (diff) | |
download | gcc-0a0006806086f9c5b68dc82253ebbf5fe264330e.zip gcc-0a0006806086f9c5b68dc82253ebbf5fe264330e.tar.gz gcc-0a0006806086f9c5b68dc82253ebbf5fe264330e.tar.bz2 |
gccrs: Added HIR::InlineAsm node
Fixes Issue #1568
Added HIR node HIR::InlineAsm similar to the one found in rustc. In this
I also changed the defination of the AST::InlineAsm node, so that we can
reuse many of it's data members in the HIR::InlineAsm node.
gcc/rust/ChangeLog:
* ast/rust-ast-full-decls.h (enum class): Added declaration.
(struct AnonConst): Added declaration.
(struct InlineAsmRegOrRegClass): Added declaration.
(struct InlineAsmOperand): Added declaration.
(struct InlineAsmPlaceHolder): Added declaration.
(struct InlineAsmTemplatePiece): Added declaration.
(struct TupleClobber): Added declaration.
(struct TupleTemplateStr): Added declaration.
* ast/rust-expr.h (class InlineAsm): Defined all it's data members outside.
(enum class InlineAsmOptions): Converted this to a enum class so we could use it in the HIR.
(struct AnonConst): Defined it independent of the AST::InlineAsm node.
(struct InlineAsmRegOrRegClass): Defined it independent of the AST::InlineAsm node.
(struct InlineAsmOperand): Defined it independent of the AST::InlineAsm node.
(struct InlineAsmPlaceHolder): Defined it independent of the AST::InlineAsm node.
(struct InlineAsmTemplatePiece): Defined it independent of the AST::InlineAsm node.
(struct TupleClobber): Defined it independent of the AST::InlineAsm node.
(struct TupleTemplateStr): Defined it independent of the AST::InlineAsm node.
* hir/tree/rust-hir-expr.h (class InlineAsmReg): Added defination.
(class InlineAsmRegClass): Added defination.
(struct InlineAsmRegOrRegClass): Added defination.
(class InlineAsm): Added defination.
* hir/tree/rust-hir-full-decls.h (class InlineAsmReg): Added declaration.
(class InlineAsmRegClass): Added declaration.
(struct InlineAsmRegOrRegClass): Added declaration.
(class InlineAsm): Added declaration.
Signed-off-by: M V V S Manoj Kumar <mvvsmanojkumar@gmail.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/ast/rust-ast-full-decls.h | 8 | ||||
-rw-r--r-- | gcc/rust/ast/rust-expr.h | 207 | ||||
-rw-r--r-- | gcc/rust/hir/tree/rust-hir-expr.h | 88 | ||||
-rw-r--r-- | gcc/rust/hir/tree/rust-hir-full-decls.h | 4 |
4 files changed, 204 insertions, 103 deletions
diff --git a/gcc/rust/ast/rust-ast-full-decls.h b/gcc/rust/ast/rust-ast-full-decls.h index bd59c52..de0f12b 100644 --- a/gcc/rust/ast/rust-ast-full-decls.h +++ b/gcc/rust/ast/rust-ast-full-decls.h @@ -145,6 +145,14 @@ struct MatchCase; class MatchExpr; class AwaitExpr; class AsyncBlockExpr; +enum class InlineAsmOptions; +struct AnonConst; +struct InlineAsmRegOrRegClass; +struct InlineAsmOperand; +struct InlineAsmPlaceHolder; +struct InlineAsmTemplatePiece; +struct TupleClobber; +struct TupleTemplateStr; class InlineAsm; // rust-stmt.h diff --git a/gcc/rust/ast/rust-expr.h b/gcc/rust/ast/rust-expr.h index c43baf3..8f30965 100644 --- a/gcc/rust/ast/rust-expr.h +++ b/gcc/rust/ast/rust-expr.h @@ -4413,135 +4413,135 @@ protected: } }; -// Inline Assembly Node -class InlineAsm : public ExprWithoutBlock +// Inline-assembly specific options +enum class InlineAsmOptions +{ + PURE = 1 << 0, + NOMEM = 1 << 1, + READONLY = 1 << 2, + PRESERVES_FLAGS = 1 << 3, + NORETURN = 1 << 4, + NOSTACK = 1 << 5, + ATT_SYNTAX = 1 << 6, + RAW = 1 << 7, + MAY_UNWIND = 1 << 8, +}; + +struct AnonConst { - // Inline-assembly specific options - enum InlineAsmOptions - { - PURE = 1 << 0, - NOMEM = 1 << 1, - READONLY = 1 << 2, - PRESERVES_FLAGS = 1 << 3, - NORETURN = 1 << 4, - NOSTACK = 1 << 5, - ATT_SYNTAX = 1 << 6, - RAW = 1 << 7, - MAY_UNWIND = 1 << 8, + NodeId id; + std::unique_ptr<Expr> value; +}; + +struct InlineAsmRegOrRegClass +{ + enum Type + { + Reg, + RegClass, }; - struct AnonConst + struct Reg { - NodeId id; - std::unique_ptr<Expr> value; + std::string Symbol; }; - struct InlineAsmRegOrRegClass + struct RegClass { - enum Type - { - Reg, - RegClass, - }; + std::string Symbol; + }; - struct Reg - { - std::string Symbol; - }; + Identifier name; + Location locus; +}; - struct RegClass - { - std::string Symbol; - }; +struct InlineAsmOperand +{ + enum RegisterType + { + In, + Out, + InOut, + SplitInOut, + Const, + Sym, + }; - Identifier name; - Location locus; + struct In + { + InlineAsmRegOrRegClass reg; + std::unique_ptr<Expr> expr; + }; + + struct Out + { + InlineAsmRegOrRegClass reg; + bool late; + std::unique_ptr<Expr> expr; // can be null }; - struct InlineAsmOperand - { - enum RegisterType - { - In, - Out, - InOut, - SplitInOut, - Const, - Sym, - }; - - struct In - { - InlineAsmRegOrRegClass reg; - std::unique_ptr<Expr> expr; - }; - - struct Out - { - InlineAsmRegOrRegClass reg; - bool late; - std::unique_ptr<Expr> expr; // can be null - }; - - struct InOut - { - InlineAsmRegOrRegClass reg; - bool late; - std::unique_ptr<Expr> expr; // this can't be null - }; - - struct SplitInOut - { - InlineAsmRegOrRegClass reg; - bool late; - std::unique_ptr<Expr> in_expr; - std::unique_ptr<Expr> out_expr; // could be null - }; - - struct Const - { - AnonConst anon_const; - }; - - struct Sym - { - std::unique_ptr<Expr> sym; - }; - Location locus; + struct InOut + { + InlineAsmRegOrRegClass reg; + bool late; + std::unique_ptr<Expr> expr; // this can't be null }; - struct InlineAsmPlaceHolder + struct SplitInOut { - size_t operand_idx; - char modifier; // can be null - Location locus; + InlineAsmRegOrRegClass reg; + bool late; + std::unique_ptr<Expr> in_expr; + std::unique_ptr<Expr> out_expr; // could be null }; - struct InlineAsmTemplatePiece + struct Const { - bool is_placeholder; - union - { - std::string string; - InlineAsmPlaceHolder placeholder; - }; + AnonConst anon_const; }; - struct TupleClobber + struct Sym { - // as gccrs still doesen't contain a symbol class I have put them as strings - std::string symbol; - Location loc; + std::unique_ptr<Expr> sym; }; + Location locus; +}; + +struct InlineAsmPlaceHolder +{ + size_t operand_idx; + char modifier; // can be null + Location locus; +}; - struct TupleTemplateStr +struct InlineAsmTemplatePiece +{ + bool is_placeholder; + union { - // as gccrs still doesen't contain a symbol class I have put them as strings - std::string symbol; - std::string optional_symbol; - Location loc; + std::string string; + InlineAsmPlaceHolder placeholder; }; +}; +struct TupleClobber +{ + // as gccrs still doesen't contain a symbol class I have put them as strings + std::string symbol; + Location loc; +}; + +struct TupleTemplateStr +{ + // as gccrs still doesen't contain a symbol class I have put them as strings + std::string symbol; + std::string optional_symbol; + Location loc; +}; + +// Inline Assembly Node +class InlineAsm : public ExprWithoutBlock +{ public: std::vector<InlineAsmTemplatePiece> template_; std::vector<TupleTemplateStr> template_strs; @@ -4550,6 +4550,7 @@ public: InlineAsmOptions options; std::vector<Location> line_spans; }; + } // namespace AST } // namespace Rust diff --git a/gcc/rust/hir/tree/rust-hir-expr.h b/gcc/rust/hir/tree/rust-hir-expr.h index 47b9897..ba9d0aa 100644 --- a/gcc/rust/hir/tree/rust-hir-expr.h +++ b/gcc/rust/hir/tree/rust-hir-expr.h @@ -3889,6 +3889,94 @@ private: Location locus; }; +class InlineAsmReg +{ + enum Kind + { + X86, + Arm, + AArch64, + RiscV, + Nvptx, + PowerPC, + Hexagon, + Mips, + S390x, + SpirV, + Wasm, + Bpf, + Avr, + Msp430, + // Placeholder for invalid register constraints for the current target + Err, + }; + + // this placeholder is to be removed when the definations + // of the above enums are made in a later PR/patch. + std::string placeholder; +}; + +class InlineAsmRegClass +{ + enum Type + { + X86, + Arm, + AArch64, + RiscV, + Nvptx, + PowerPC, + Hexagon, + Mips, + S390x, + SpirV, + Wasm, + Bpf, + Avr, + Msp430, + // Placeholder for invalid register constraints for the current target + Err, + }; + + // this placeholder is to be removed when the definations + // of the above enums are made in a later PR/patch. + std::string placeholder; +}; + +struct InlineAsmRegOrRegClass +{ + enum Type + { + Reg, // links to struct Register + RegClass, // links to struct RegisterClass + }; + + struct Register + { + InlineAsmReg Reg; + }; + + struct RegisterClass + { + InlineAsmRegClass RegClass; + }; + + Identifier name; + Location locus; +}; + +// Inline Assembly Node +class InlineAsm : public ExprWithoutBlock +{ + NodeId id; + +public: + std::vector<AST::InlineAsmTemplatePiece> template_; + std::vector<AST::TupleTemplateStr> template_strs; + std::vector<AST::InlineAsmOperand> operands; + AST::InlineAsmOptions options; + std::vector<Location> line_spans; +}; } // namespace HIR } // namespace Rust diff --git a/gcc/rust/hir/tree/rust-hir-full-decls.h b/gcc/rust/hir/tree/rust-hir-full-decls.h index d628c52..3d3c29e7 100644 --- a/gcc/rust/hir/tree/rust-hir-full-decls.h +++ b/gcc/rust/hir/tree/rust-hir-full-decls.h @@ -124,6 +124,10 @@ struct MatchCase; class MatchExpr; class AwaitExpr; class AsyncBlockExpr; +class InlineAsmReg; +class InlineAsmRegClass; +struct InlineAsmRegOrRegClass; +class InlineAsm; // rust-stmt.h class EmptyStmt; |