]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: proc_macro: Add is_available callback
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Wed, 26 Jul 2023 14:48:37 +0000 (16:48 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:56:01 +0000 (18:56 +0100)
Add a callback from gcc to determine wether the bridge is available or
not.

gcc/rust/ChangeLog:

* expand/rust-proc-macro.cc (available): Add symbol
registration.
(load_macros_array): Likewise.

libgrust/ChangeLog:

* libproc_macro/proc_macro.cc (not_available): Add a
function to express bridge unavailability.
* libproc_macro/proc_macro.h (not_available): Likewise.
* libproc_macro/registration.h: Add symbol type.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
gcc/rust/expand/rust-proc-macro.cc
libgrust/libproc_macro/proc_macro.cc
libgrust/libproc_macro/proc_macro.h
libgrust/libproc_macro/registration.h

index 7843ead441222a6ece92eb47de50cc6881ab2b30..b6cfe2543941b6cb369632f27dc819e4a6f6028d 100644 (file)
@@ -56,6 +56,12 @@ static_assert (
               ProcMacro::from_str_function_t>::value,
   "Registration callback signature not synced, check proc macro internals.");
 
+static bool
+available ()
+{
+  return true;
+}
+
 template <typename Symbol, typename Callback>
 bool
 register_callback (void *handle, Symbol, std::string symbol_name,
@@ -95,6 +101,9 @@ load_macros_array (std::string path)
   if (!REGISTER_CALLBACK (handle, __gccrs_proc_macro_from_str_fn,
                          tokenstream_from_string))
     return nullptr;
+  if (!REGISTER_CALLBACK (handle, __gccrs_proc_macro_is_available_fn,
+                         available))
+    return nullptr;
 
   // FIXME: Add CrateStableId handling, right now all versions may be loaded,
   // even incompatible ones.
index a40469197217ac5496a9ca770f050b99a4d47466..1e9e3fdfaedac0ec41699920ac70fe4d679aee1c 100644 (file)
@@ -49,6 +49,14 @@ Procmacro::make_bang (const char *name, BangMacro macro)
   return {BANG, payload};
 }
 
+bool
+not_available ()
+{
+  return false;
+}
+
 } // namespace ProcMacro
 
 ProcMacro::from_str_function_t __gccrs_proc_macro_from_str_fn = nullptr;
+ProcMacro::is_available_function_t __gccrs_proc_macro_is_available_fn
+  = ProcMacro::not_available;
index 80dd28216afa1595a6f29abb848a8718eab1e889..0b3ec3c4d55b5873c750564c34ba88258ca56c66 100644 (file)
@@ -99,6 +99,9 @@ struct ProcmacroArray
   Procmacro *macros;
 };
 
+bool
+not_available ();
+
 } // namespace ProcMacro
 
 #endif /* ! PROC_MACRO_H */
index 5cefc37de1115a504c92bdefab5d43603d315f4f..76688632ced2a5eb691fc63fc659dadfd692b946 100644 (file)
 namespace ProcMacro {
 
 using from_str_function_t = ProcMacro::TokenStream (*) (std::string &, bool &);
+using is_available_function_t = bool (*) ();
 
 } // namespace ProcMacro
 
 extern "C" ProcMacro::from_str_function_t __gccrs_proc_macro_from_str_fn;
+extern "C" ProcMacro::is_available_function_t
+  __gccrs_proc_macro_is_available_fn;
 
 #endif /* !REGISTRATION_H */