[gcc r14-8092] gccrs: Make proc macro definition cdecl

Arthur Cohen cohenarthur@gcc.gnu.org
Tue Jan 16 18:17:58 GMT 2024


https://gcc.gnu.org/g:ce7688d7b0c0b4940adb2b08908df5b2b0ca702e

commit r14-8092-gce7688d7b0c0b4940adb2b08908df5b2b0ca702e
Author: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Date:   Mon Sep 4 13:22:21 2023 +0200

    gccrs: Make proc macro definition cdecl
    
    We need to make sure proc macros have the C abi in order to be called by
    the compiler with dlopen.
    
    gcc/rust/ChangeLog:
    
            * backend/rust-compile-base.cc (HIRCompileBase::setup_fndecl):
            Add proc macro handlers dispatch.
            (handle_proc_macro_common): Add a function for common behavior
            between all kinds of proc macros.
            * backend/rust-compile-base.h: Add function prototypes.
    
    Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>

Diff:
---
 gcc/rust/backend/rust-compile-base.cc | 47 +++++++++++++++++++++++++++++++++++
 gcc/rust/backend/rust-compile-base.h  | 12 +++++++++
 2 files changed, 59 insertions(+)

diff --git a/gcc/rust/backend/rust-compile-base.cc b/gcc/rust/backend/rust-compile-base.cc
index 1c1c5e90afa..46313048c7a 100644
--- a/gcc/rust/backend/rust-compile-base.cc
+++ b/gcc/rust/backend/rust-compile-base.cc
@@ -83,6 +83,13 @@ HIRCompileBase::setup_fndecl (tree fndecl, bool is_main_entry_point,
 	= attr.get_path ().as_string () == Values::Attributes::NO_MANGLE;
       bool is_deprecated
 	= attr.get_path ().as_string () == Values::Attributes::DEPRECATED;
+      bool is_proc_macro
+	= attr.get_path ().as_string () == Values::Attributes::PROC_MACRO;
+      bool is_proc_macro_attribute
+	= attr.get_path ().as_string ()
+	  == Values::Attributes::PROC_MACRO_ATTRIBUTE;
+      bool is_proc_macro_derive = attr.get_path ().as_string ()
+				  == Values::Attributes::PROC_MACRO_DERIVE;
 
       if (is_inline)
 	{
@@ -108,9 +115,49 @@ HIRCompileBase::setup_fndecl (tree fndecl, bool is_main_entry_point,
 	{
 	  handle_no_mangle_attribute_on_fndecl (fndecl, attr);
 	}
+      else if (is_proc_macro)
+	{
+	  handle_proc_macro_attribute_on_fndecl (fndecl, attr);
+	}
+      else if (is_proc_macro_attribute)
+	{
+	  handle_proc_macro_attribute_attribute_on_fndecl (fndecl, attr);
+	}
+      else if (is_proc_macro_derive)
+	{
+	  handle_proc_macro_derive_attribute_on_fndecl (fndecl, attr);
+	}
     }
 }
 
+static void
+handle_proc_macro_common (tree fndecl, const AST::Attribute &attr)
+{
+  DECL_ATTRIBUTES (fndecl)
+    = tree_cons (get_identifier ("cdecl"), NULL, DECL_ATTRIBUTES (fndecl));
+}
+
+void
+HIRCompileBase::handle_proc_macro_attribute_on_fndecl (
+  tree fndecl, const AST::Attribute &attr)
+{
+  handle_proc_macro_common (fndecl, attr);
+}
+
+void
+HIRCompileBase::handle_proc_macro_attribute_attribute_on_fndecl (
+  tree fndecl, const AST::Attribute &attr)
+{
+  handle_proc_macro_common (fndecl, attr);
+}
+
+void
+HIRCompileBase::handle_proc_macro_derive_attribute_on_fndecl (
+  tree fndecl, const AST::Attribute &attr)
+{
+  handle_proc_macro_common (fndecl, attr);
+}
+
 void
 HIRCompileBase::handle_cold_attribute_on_fndecl (tree fndecl,
 						 const AST::Attribute &attr)
diff --git a/gcc/rust/backend/rust-compile-base.h b/gcc/rust/backend/rust-compile-base.h
index 8f64f6c3cce..56b29a7d368 100644
--- a/gcc/rust/backend/rust-compile-base.h
+++ b/gcc/rust/backend/rust-compile-base.h
@@ -110,6 +110,18 @@ protected:
   static void handle_inline_attribute_on_fndecl (tree fndecl,
 						 const AST::Attribute &attr);
 
+  static void
+  handle_proc_macro_attribute_on_fndecl (tree fndecl,
+					 const AST::Attribute &attr);
+
+  static void
+  handle_proc_macro_attribute_attribute_on_fndecl (tree fndecl,
+						   const AST::Attribute &attr);
+
+  static void
+  handle_proc_macro_derive_attribute_on_fndecl (tree fndecl,
+						const AST::Attribute &attr);
+
   static void handle_cold_attribute_on_fndecl (tree fndecl,
 					       const AST::Attribute &attr);


More information about the Gcc-cvs mailing list