]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Change proc macro entrypoint
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Wed, 4 Oct 2023 10:01:44 +0000 (12:01 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 18:09:32 +0000 (19:09 +0100)
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 <iomanip>.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
gcc/rust/expand/rust-proc-macro.cc
gcc/rust/expand/rust-proc-macro.h
gcc/rust/rust-system.h

index 2fdfcb20b19b9e5ef26851d23897da68b482a0df..e8618485b71dabe27858b7cfa3f9bbcfca3e6447 100644 (file)
 // along with GCC; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
+#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 <dlfcn.h>
 #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<const ProcMacro::ProcmacroArray **> (
-    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
index d994ed9bf5e080bd91d9586b19a1566e2f81ad2c..6ffaaf6c099f7447484bbb5a6acc0f6d2b2870ab 100644 (file)
@@ -85,6 +85,9 @@ public:
 const std::vector<ProcMacro::Procmacro>
 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 */
index 5d08411063fed2e5e477fffb201e44113ef17d0f..88d6c1095e6115d61700767408104a7d9b946a1d 100644 (file)
@@ -54,6 +54,7 @@
  * before the macro magic of safe-ctype.h, which is included by
  * system.h. */
 #include <iostream>
+#include <iomanip>
 
 #include "system.h"
 #include "ansidecl.h"