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 <iomanip>. Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
This commit is contained in:
parent
150403984d
commit
9e30e140be
3 changed files with 19 additions and 3 deletions
|
@ -14,12 +14,14 @@
|
|||
// 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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Add table
Reference in a new issue