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.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
This commit is contained in:
Pierre-Emmanuel Patry
2023-10-04 12:01:44 +02:00
committed by Philip Herron
parent 16c0f9c7fb
commit b71fd2afa8
2 changed files with 21 additions and 3 deletions

View File

@@ -45,8 +45,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 +148,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 +175,19 @@ load_macros (std::string path)
array->macros + array->length);
}
std::string
generate_proc_macro_decls_symbol (std::uint32_t stable_crate_id)
{
#define PROC_MACRO_DECLS_FMT_ARGS \
"__gccrs_proc_macro_decls_%08x__", stable_crate_id
// Size could be hardcoded since we know the input size but I elected to
// calculate it everytime so we won't have any desync between code and data.
int size = std::snprintf (nullptr, 0, PROC_MACRO_DECLS_FMT_ARGS);
std::vector<char> buf (size + 1);
std::sprintf (buf.data (), PROC_MACRO_DECLS_FMT_ARGS);
#undef PROC_MACRO_DECLS_FMT_ARGS
return std::string (buf.cbegin (), buf.cend ());
}
} // namespace Rust

View 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 */