From: M V V S Manoj Kumar Date: Thu, 16 Mar 2023 05:33:57 +0000 (+0530) Subject: gccrs: Added HIR::InlineAsm node X-Git-Tag: basepoints/gcc-15~2573 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0a0006806086f9c5b68dc82253ebbf5fe264330e;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/rust/ast/rust-ast-full-decls.h b/gcc/rust/ast/rust-ast-full-decls.h index bd59c526ddc3..de0f12b04bc5 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 c43baf3cadec..8f30965b9f7f 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 value; +}; + +struct InlineAsmRegOrRegClass +{ + enum Type + { + Reg, + RegClass, }; - struct AnonConst + struct Reg { - NodeId id; - std::unique_ptr 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; + }; + + struct Out + { + InlineAsmRegOrRegClass reg; + bool late; + std::unique_ptr expr; // can be null }; - struct InlineAsmOperand - { - enum RegisterType - { - In, - Out, - InOut, - SplitInOut, - Const, - Sym, - }; - - struct In - { - InlineAsmRegOrRegClass reg; - std::unique_ptr expr; - }; - - struct Out - { - InlineAsmRegOrRegClass reg; - bool late; - std::unique_ptr expr; // can be null - }; - - struct InOut - { - InlineAsmRegOrRegClass reg; - bool late; - std::unique_ptr expr; // this can't be null - }; - - struct SplitInOut - { - InlineAsmRegOrRegClass reg; - bool late; - std::unique_ptr in_expr; - std::unique_ptr out_expr; // could be null - }; - - struct Const - { - AnonConst anon_const; - }; - - struct Sym - { - std::unique_ptr sym; - }; - Location locus; + struct InOut + { + InlineAsmRegOrRegClass reg; + bool late; + std::unique_ptr 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 in_expr; + std::unique_ptr 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 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 template_; std::vector template_strs; @@ -4550,6 +4550,7 @@ public: InlineAsmOptions options; std::vector 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 47b989757faa..ba9d0aae0df7 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 template_; + std::vector template_strs; + std::vector operands; + AST::InlineAsmOptions options; + std::vector 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 d628c52bbc25..3d3c29e7a7c9 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;