From: Pierre-Emmanuel Patry Date: Mon, 4 Sep 2023 11:22:21 +0000 (+0200) Subject: gccrs: Make proc macro definition cdecl X-Git-Tag: basepoints/gcc-15~2047 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ce7688d7b0c0b4940adb2b08908df5b2b0ca702e;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/rust/backend/rust-compile-base.cc b/gcc/rust/backend/rust-compile-base.cc index 1c1c5e90afa7..46313048c7af 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 8f64f6c3ccee..56b29a7d3689 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);