diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2023-09-04 13:22:21 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-16 19:09:30 +0100 |
commit | ce7688d7b0c0b4940adb2b08908df5b2b0ca702e (patch) | |
tree | c1070193ff133fced657dfc2d83c5495553240fe /gcc | |
parent | 32dcd3ec99186a3fe6c01d36029a519a6cd6e109 (diff) | |
download | gcc-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.cc | 47 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile-base.h | 12 |
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); |