mirror of
https://gcc.gnu.org/git/gcc.git
synced 2026-02-22 20:01:22 -05:00
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:
committed by
Philip Herron
parent
16c0f9c7fb
commit
b71fd2afa8
@@ -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
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user