[gcc r14-7566] gccrs: Added HIR::InlineAsm node

Arthur Cohen cohenarthur@gcc.gnu.org
Tue Jan 16 17:41:09 GMT 2024


https://gcc.gnu.org/g:0a0006806086f9c5b68dc82253ebbf5fe264330e

commit r14-7566-g0a0006806086f9c5b68dc82253ebbf5fe264330e
Author: M V V S Manoj Kumar <mvvsmanojkumar@gmail.com>
Date:   Thu Mar 16 11:03:57 2023 +0530

    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>

Diff:
---
 gcc/rust/ast/rust-ast-full-decls.h      |   8 ++
 gcc/rust/ast/rust-expr.h                | 207 ++++++++++++++++----------------
 gcc/rust/hir/tree/rust-hir-expr.h       |  88 ++++++++++++++
 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 bd59c526ddc..de0f12b04bc 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 c43baf3cade..8f30965b9f7 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 47b989757fa..ba9d0aae0df 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 d628c52bbc2..3d3c29e7a7c 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;


More information about the Gcc-cvs mailing list