gccrs: proc_macro: Add literal_from_string callback

The function to get a literal from a string missed an implementation.
It did require a conversion function to achieve it, now that callback
system has been merged this function can be easily implemented.

gcc/rust/ChangeLog:

	* expand/rust-proc-macro.cc (literal_from_string): Add callback
	function.
	(load_macros_array): Likewise.

libgrust/ChangeLog:

	* libproc_macro/literal.cc (Literal__from_string): Add
	implementation with call to constructor.
	(Literal::make_literal): Add new constructor which calls the
	callback.
	* libproc_macro/literal.h: Add new constructor's
	prototype.
	* libproc_macro/proc_macro.cc (bridge_is_available):
	Change symbol name to match convention.
	* libproc_macro/registration.h: Add lit_from_str
	symbol.
	* libproc_macro/tokenstream.cc (TokenStream::make_tokenstream):
	Change symbol name to disambiguate with literal from string.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
This commit is contained in:
Pierre-Emmanuel Patry 2023-07-27 16:21:25 +02:00 committed by Arthur Cohen
parent ff773b9030
commit 0680907b3b
6 changed files with 52 additions and 14 deletions

View File

@ -28,6 +28,22 @@ const std::string PROC_MACRO_DECL_PREFIX = "__gccrs_proc_macro_decls_";
namespace {
ProcMacro::Literal
literal_from_string (const std::string &data, bool &error)
{
Lexer lex (data);
const_TokenPtr output = lex.build_token ();
if (output == nullptr || !output->is_literal ())
{
error = true;
// We should probably rework this
return ProcMacro::Literal::make_usize (0);
}
error = false;
return convert_literal (output);
}
ProcMacro::TokenStream
tokenstream_from_string (std::string &data, bool &lex_error)
{
@ -55,7 +71,12 @@ tokenstream_from_string (std::string &data, bool &lex_error)
static_assert (
std::is_same<decltype (tokenstream_from_string) *,
ProcMacro::from_str_function_t>::value,
ProcMacro::ts_from_str_fn_t>::value,
"Registration callback signature not synced, check proc macro internals.");
static_assert (
std::is_same<decltype (literal_from_string) *,
ProcMacro::lit_from_str_fn_t>::value,
"Registration callback signature not synced, check proc macro internals.");
} // namespace
@ -96,10 +117,13 @@ load_macros_array (std::string path)
return nullptr;
}
if (!REGISTER_CALLBACK (handle, __gccrs_proc_macro_from_str_fn,
if (!REGISTER_CALLBACK (handle, __gccrs_proc_macro_ts_from_str_,
tokenstream_from_string))
return nullptr;
if (!REGISTER_CALLBACK (handle, __gccrs_proc_macro_is_available_fn,
if (!REGISTER_CALLBACK (handle, __gccrs_proc_macro_lit_from_str_,
literal_from_string))
return nullptr;
if (!REGISTER_CALLBACK (handle, __gccrs_proc_macro_is_available_,
ProcMacro::BridgeState::Available))
return nullptr;

View File

@ -24,15 +24,19 @@
#include <cstring>
#include <cstdlib>
#include "registration.h"
namespace ProcMacro {
extern "C" {
bool
Literal__from_string (FFIString str, Literal *lit)
{
// FIXME: implement this function with lexer
std::abort ();
return false;
bool result;
auto source = str.to_string ();
*lit = Literal::make_literal (source, result);
return result;
}
}
@ -49,6 +53,12 @@ Literal::clone () const
return {this->kind, this->text.clone (), this->suffix.clone (), this->span};
}
Literal
Literal::make_literal (const std::string &text, bool &has_error)
{
return __gccrs_proc_macro_lit_from_str_ (text, has_error);
}
Literal
Literal::make_literal (LitKind kind, Span span, const std::string &text,
const std::string &suffix)

View File

@ -77,6 +77,7 @@ public:
Literal clone () const;
bool has_suffix () const { return suffix.len != 0; };
static Literal make_literal (const std::string &text, bool &has_error);
static Literal make_literal (const LitKind kind, Span span,
const std::string &text,
const std::string &suffix = "");

View File

@ -53,12 +53,12 @@ Procmacro::make_bang (const char *name, BangMacro macro)
extern "C" bool
bridge_is_available ()
{
return __gccrs_proc_macro_is_available_fn
== ProcMacro::BridgeState::Available;
return __gccrs_proc_macro_is_available_ == ProcMacro::BridgeState::Available;
}
} // namespace ProcMacro
ProcMacro::from_str_function_t __gccrs_proc_macro_from_str_fn = nullptr;
ProcMacro::BridgeState __gccrs_proc_macro_is_available_fn
ProcMacro::ts_from_str_fn_t __gccrs_proc_macro_ts_from_str_ = nullptr;
ProcMacro::lit_from_str_fn_t __gccrs_proc_macro_lit_from_str_ = nullptr;
ProcMacro::BridgeState __gccrs_proc_macro_is_available_
= ProcMacro::BridgeState::Unavailable;

View File

@ -26,14 +26,17 @@
#include <string>
#include "tokenstream.h"
#include "bridge.h"
#include "literal.h"
namespace ProcMacro {
using from_str_function_t = ProcMacro::TokenStream (*) (std::string &, bool &);
using ts_from_str_fn_t = ProcMacro::TokenStream (*) (std::string &, bool &);
using lit_from_str_fn_t = ProcMacro::Literal (*) (const std::string &, bool &);
} // namespace ProcMacro
extern "C" ProcMacro::from_str_function_t __gccrs_proc_macro_from_str_fn;
extern "C" ProcMacro::BridgeState __gccrs_proc_macro_is_available_fn;
extern "C" ProcMacro::ts_from_str_fn_t __gccrs_proc_macro_ts_from_str_;
extern "C" ProcMacro::lit_from_str_fn_t __gccrs_proc_macro_lit_from_str_;
extern "C" ProcMacro::BridgeState __gccrs_proc_macro_is_available_;
#endif /* !REGISTRATION_H */

View File

@ -49,7 +49,7 @@ TokenStream::make_tokenstream (std::uint64_t capacity)
TokenStream
TokenStream::make_tokenstream (std::string &source, bool &has_error)
{
return __gccrs_proc_macro_from_str_fn (source, has_error);
return __gccrs_proc_macro_ts_from_str_ (source, has_error);
}
void