From: Pierre-Emmanuel Patry Date: Wed, 4 Oct 2023 10:01:44 +0000 (+0200) Subject: gccrs: Change proc macro entrypoint X-Git-Tag: basepoints/gcc-15~2039 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9e30e140bea608267bfe74f80fbf59989e6877b4;p=thirdparty%2Fgcc.git gccrs: Change proc macro entrypoint Change proc macro entrypoint from a fixed constant declaration to a proper generation from the stable crate id. Although the stable crate id is not in use yet, the mechanism to handle it is. gcc/rust/ChangeLog: * expand/rust-proc-macro.cc (CustomDeriveProcMacro::CustomDeriveProcMacro): Remove constant string declaration. (load_macros_array): Add call to the new generation function. (generate_proc_macro_decls_symbol): Add a new function to generate the entrypoint symbol name from the stable crate id. (PROC_MACRO_DECLS_FMT_ARGS): New macro to keep formats arguments in sync between each call. * expand/rust-proc-macro.h (generate_proc_macro_decls_symbol): Add function prototype. * rust-system.h: Include . Signed-off-by: Pierre-Emmanuel Patry --- diff --git a/gcc/rust/expand/rust-proc-macro.cc b/gcc/rust/expand/rust-proc-macro.cc index 2fdfcb20b19b..e8618485b71d 100644 --- a/gcc/rust/expand/rust-proc-macro.cc +++ b/gcc/rust/expand/rust-proc-macro.cc @@ -14,12 +14,14 @@ // along with GCC; see the file COPYING3. If not see // . +#include "rust-system.h" #include "rust-diagnostics.h" #include "rust-proc-macro.h" #include "rust-session-manager.h" #include "rust-lex.h" #include "rust-token-converter.h" #include "rust-attributes.h" + #ifndef _WIN32 #include #endif @@ -45,8 +47,6 @@ CustomDeriveProcMacro::CustomDeriveProcMacro (ProcMacro::CustomDerive macro) macro (macro.macro) {} -const std::string PROC_MACRO_DECL_PREFIX = "__gccrs_proc_macro_decls_"; - namespace { ProcMacro::Literal @@ -150,8 +150,10 @@ load_macros_array (std::string path) // FIXME: Add CrateStableId handling, right now all versions may be loaded, // even incompatible ones. + auto symbol_name = generate_proc_macro_decls_symbol (0 /* FIXME */); + return *reinterpret_cast ( - dlsym (handle, PROC_MACRO_DECL_PREFIX.c_str ())); + dlsym (handle, symbol_name.c_str ())); #else rust_sorry_at (UNDEF_LOCATION, "Procedural macros are not yet supported on windows host"); @@ -175,4 +177,14 @@ load_macros (std::string path) array->macros + array->length); } +std::string +generate_proc_macro_decls_symbol (std::uint32_t stable_crate_id) +{ + std::ostringstream stream; + stream << "__gccrs_proc_macro_decls_" << std::setfill ('0') << std::hex + << std::setw (8) << stable_crate_id << "__"; + + return stream.str (); +} + } // namespace Rust diff --git a/gcc/rust/expand/rust-proc-macro.h b/gcc/rust/expand/rust-proc-macro.h index d994ed9bf5e0..6ffaaf6c099f 100644 --- a/gcc/rust/expand/rust-proc-macro.h +++ b/gcc/rust/expand/rust-proc-macro.h @@ -85,6 +85,9 @@ public: const std::vector load_macros (std::string path); +std::string +generate_proc_macro_decls_symbol (std::uint32_t stable_crate_id); + } // namespace Rust #endif /* ! RUST_PROC_MACRO_H */ diff --git a/gcc/rust/rust-system.h b/gcc/rust/rust-system.h index 5d08411063fe..88d6c1095e61 100644 --- a/gcc/rust/rust-system.h +++ b/gcc/rust/rust-system.h @@ -54,6 +54,7 @@ * before the macro magic of safe-ctype.h, which is included by * system.h. */ #include +#include #include "system.h" #include "ansidecl.h"