aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>2023-09-04 13:22:21 +0200
committerArthur Cohen <arthur.cohen@embecosm.com>2024-01-16 19:09:30 +0100
commitce7688d7b0c0b4940adb2b08908df5b2b0ca702e (patch)
treec1070193ff133fced657dfc2d83c5495553240fe /gcc
parent32dcd3ec99186a3fe6c01d36029a519a6cd6e109 (diff)
downloadgcc-ce7688d7b0c0b4940adb2b08908df5b2b0ca702e.zip
gcc-ce7688d7b0c0b4940adb2b08908df5b2b0ca702e.tar.gz
gcc-ce7688d7b0c0b4940adb2b08908df5b2b0ca702e.tar.bz2
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>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/backend/rust-compile-base.cc47
-rw-r--r--gcc/rust/backend/rust-compile-base.h12
2 files changed, 59 insertions, 0 deletions
diff --git a/gcc/rust/backend/rust-compile-base.cc b/gcc/rust/backend/rust-compile-base.cc
index 1c1c5e9..4631304 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 8f64f6c..56b29a7 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);