aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>2023-07-27 16:21:25 +0200
committerP-E-P <32375388+P-E-P@users.noreply.github.com>2023-07-28 09:15:21 +0000
commitfe6ad2e676ee5734856d86cf1dbbc12aef7e5561 (patch)
treeb7844fb216a15b089864aafef98f20f65b6e4157
parent69454e53048e24c80c725f4258d6dfd13f7ed023 (diff)
downloadgcc-fe6ad2e676ee5734856d86cf1dbbc12aef7e5561.zip
gcc-fe6ad2e676ee5734856d86cf1dbbc12aef7e5561.tar.gz
gcc-fe6ad2e676ee5734856d86cf1dbbc12aef7e5561.tar.bz2
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. ChangeLog: * libgrust/libproc_macro/literal.cc (Literal__from_string): Add implementation with call to constructor. (Literal::make_literal): Add new constructor which calls the callback. * libgrust/libproc_macro/literal.h: Add new constructor's prototype. * libgrust/libproc_macro/proc_macro.cc (bridge_is_available): Change symbol name to match convention. * libgrust/libproc_macro/registration.h: Add lit_from_str symbol. * libgrust/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>
-rw-r--r--gcc/rust/expand/rust-proc-macro.cc30
-rw-r--r--libgrust/libproc_macro/literal.cc16
-rw-r--r--libgrust/libproc_macro/literal.h1
-rw-r--r--libgrust/libproc_macro/proc_macro.cc8
-rw-r--r--libgrust/libproc_macro/registration.h9
-rw-r--r--libgrust/libproc_macro/tokenstream.cc2
6 files changed, 52 insertions, 14 deletions
diff --git a/gcc/rust/expand/rust-proc-macro.cc b/gcc/rust/expand/rust-proc-macro.cc
index c664e20..69de989 100644
--- a/gcc/rust/expand/rust-proc-macro.cc
+++ b/gcc/rust/expand/rust-proc-macro.cc
@@ -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;
diff --git a/libgrust/libproc_macro/literal.cc b/libgrust/libproc_macro/literal.cc
index 8e1e0a4..ea09106 100644
--- a/libgrust/libproc_macro/literal.cc
+++ b/libgrust/libproc_macro/literal.cc
@@ -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;
}
}
@@ -50,6 +54,12 @@ Literal::clone () const
}
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)
{
diff --git a/libgrust/libproc_macro/literal.h b/libgrust/libproc_macro/literal.h
index fb8a8b4..37ba089 100644
--- a/libgrust/libproc_macro/literal.h
+++ b/libgrust/libproc_macro/literal.h
@@ -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 = "");
diff --git a/libgrust/libproc_macro/proc_macro.cc b/libgrust/libproc_macro/proc_macro.cc
index 293fc95..0490673 100644
--- a/libgrust/libproc_macro/proc_macro.cc
+++ b/libgrust/libproc_macro/proc_macro.cc
@@ -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;
diff --git a/libgrust/libproc_macro/registration.h b/libgrust/libproc_macro/registration.h
index aba7edd..98e7c13 100644
--- a/libgrust/libproc_macro/registration.h
+++ b/libgrust/libproc_macro/registration.h
@@ -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 */
diff --git a/libgrust/libproc_macro/tokenstream.cc b/libgrust/libproc_macro/tokenstream.cc
index 0f7f1f2..685f284 100644
--- a/libgrust/libproc_macro/tokenstream.cc
+++ b/libgrust/libproc_macro/tokenstream.cc
@@ -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