diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2023-07-11 14:41:33 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-16 18:55:56 +0100 |
commit | bee12555414e19c9cbeaf3b7550f9f93e939e392 (patch) | |
tree | 8334b62cb040f36fdc0531744320d2c03493b34d /libgrust | |
parent | dcba437a8223ca1a88a59e8286fb3565bd07b445 (diff) |
gccrs: proc_macro: Add from string implementation
Add a callback registration function into the proc macro library so the
compiler can register it's own lexing/parsing functions on load.
gcc/rust/ChangeLog:
* expand/rust-proc-macro.cc (tokenstream_from_string): Add a
function that creates a tokenstream from a given string.
(load_macros_array): Add call to registration function.
libgrust/ChangeLog:
* libproc_macro/proc_macro.cc (proc_macro_register_from_str):
Add registration function.
* libproc_macro/proc_macro.h (proc_macro_register_from_str):
Add registration function prototype.
* libproc_macro/tokenstream.cc (TokenStream::make_tokenstream):
Add a new constructor from a string that uses the registered
callback.
(TokenStream__from_string): Add call to new constructor.
* libproc_macro/tokenstream.h: Add registration
declaration.
* libproc_macro/registration.h: New file.
Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Diffstat (limited to 'libgrust')
-rw-r--r-- | libgrust/libproc_macro/proc_macro.cc | 2 | ||||
-rw-r--r-- | libgrust/libproc_macro/proc_macro.h | 4 | ||||
-rw-r--r-- | libgrust/libproc_macro/registration.h | 37 | ||||
-rw-r--r-- | libgrust/libproc_macro/tokenstream.cc | 14 | ||||
-rw-r--r-- | libgrust/libproc_macro/tokenstream.h | 2 |
5 files changed, 57 insertions, 2 deletions
diff --git a/libgrust/libproc_macro/proc_macro.cc b/libgrust/libproc_macro/proc_macro.cc index 2e50f0afb01..effe7178b89 100644 --- a/libgrust/libproc_macro/proc_macro.cc +++ b/libgrust/libproc_macro/proc_macro.cc @@ -50,3 +50,5 @@ Procmacro::make_bang (const char *name, BangMacro macro) } } // namespace ProcMacro + +ProcMacro::from_str_function_t __gccrs_pm_callback_from_str_fn = nullptr; diff --git a/libgrust/libproc_macro/proc_macro.h b/libgrust/libproc_macro/proc_macro.h index 673f7a932f1..80dd28216af 100644 --- a/libgrust/libproc_macro/proc_macro.h +++ b/libgrust/libproc_macro/proc_macro.h @@ -30,6 +30,7 @@ #include "group.h" #include "punct.h" #include "ident.h" +#include "registration.h" namespace ProcMacro { @@ -61,6 +62,9 @@ struct Bang const char *name; BangMacro macro; }; + +void +proc_macro_register_from_str (ProcMacro::from_str_function_t fn); } enum ProcmacroTag diff --git a/libgrust/libproc_macro/registration.h b/libgrust/libproc_macro/registration.h new file mode 100644 index 00000000000..bba69b1e9bc --- /dev/null +++ b/libgrust/libproc_macro/registration.h @@ -0,0 +1,37 @@ +// Copyright (C) 2023 Free Software Foundation, Inc. +// +// This file is part of the GNU Proc Macro Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// Under Section 7 of GPL version 3, you are granted additional +// permissions described in the GCC Runtime Library Exception, version +// 3.1, as published by the Free Software Foundation. + +// You should have received a copy of the GNU General Public License and +// a copy of the GCC Runtime Library Exception along with this program; +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +// <http://www.gnu.org/licenses/>. + +#ifndef REGISTRATION_H +#define REGISTRATION_H + +#include <string> +#include "tokenstream.h" + +namespace ProcMacro { + +using from_str_function_t = ProcMacro::TokenStream (*) (std::string &, bool &); + +} // namespace ProcMacro + +extern "C" ProcMacro::from_str_function_t __gccrs_pm_callback_from_str_fn; + +#endif /* !REGISTRATION_H */ diff --git a/libgrust/libproc_macro/tokenstream.cc b/libgrust/libproc_macro/tokenstream.cc index d1116fff7ee..c3502f1c7b7 100644 --- a/libgrust/libproc_macro/tokenstream.cc +++ b/libgrust/libproc_macro/tokenstream.cc @@ -22,6 +22,7 @@ #include "tokenstream.h" #include "tokentree.h" +#include "registration.h" #include <cstring> @@ -45,6 +46,12 @@ TokenStream::make_tokenstream (std::uint64_t capacity) return {data, 0, capacity}; } +TokenStream +TokenStream::make_tokenstream (std::string &source, bool &has_error) +{ + return __gccrs_pm_callback_from_str_fn (source, has_error); +} + void TokenStream::grow (std::uint64_t delta) { @@ -99,8 +106,11 @@ extern "C" bool TokenStream__from_string (unsigned char *str, std::uint64_t len, TokenStream *ts) { - // FIXME: Implement using parser ? - return false; + bool result; + auto source = std::string (reinterpret_cast<const char *> (str), len); + + *ts = TokenStream::make_tokenstream (source, result); + return result; } extern "C" TokenStream diff --git a/libgrust/libproc_macro/tokenstream.h b/libgrust/libproc_macro/tokenstream.h index 2c2231d5cda..8b2432b9a68 100644 --- a/libgrust/libproc_macro/tokenstream.h +++ b/libgrust/libproc_macro/tokenstream.h @@ -25,6 +25,7 @@ #include <cstdint> #include <vector> +#include <string> namespace ProcMacro { struct TokenTree; @@ -43,6 +44,7 @@ public: static TokenStream make_tokenstream (std::vector<TokenTree> vec); static TokenStream make_tokenstream (std::uint64_t capacity = 1); + static TokenStream make_tokenstream (std::string &str, bool &has_error); static void drop (TokenStream *stream); }; |