https://gcc.gnu.org/g:a0c4d677b3c00d5cbb42d783983fbe927106134f
commit r17-4308-ga0c4d677b3c00d5cbb42d783983fbe927106134f Author: Yap Zhi Heng <[email protected]> Date: Sun Aug 23 15:34:47 2026 +0800 gccrs: Make gcc targetm builtins available to the Rust front end This is part of making LLVM builtins work for gccrs. gcc/rust/ChangeLog: * backend/rust-builtins.h (BuiltinsContext::SetupState): New enum. * backend/rust-builtins.cc (BuiltinsContext::get): Ensure that BuiltinsContext is only initialized once. (BuiltinsContext::BuiltinsContext): Likewise. (BuiltinsContext::setup): Call targetm.init_builtins to make GCC builtins available to the frontend. * rust-gcc.cc (init): Eagerly initialize BuiltinsContext. Signed-Off-By: Yap Zhi Heng <[email protected]> Diff: --- gcc/rust/backend/rust-builtins.cc | 13 ++++++++++++- gcc/rust/backend/rust-builtins.h | 9 +++++++++ gcc/rust/rust-gcc.cc | 3 +++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/gcc/rust/backend/rust-builtins.cc b/gcc/rust/backend/rust-builtins.cc index d4b072a03e7c..9914b6badbb5 100644 --- a/gcc/rust/backend/rust-builtins.cc +++ b/gcc/rust/backend/rust-builtins.cc @@ -29,6 +29,10 @@ BuiltinsContext & BuiltinsContext::get () { static BuiltinsContext instance; + + if (instance.setup_state == SetupState::UNINITIALIZED) + instance.setup (); + return instance; } @@ -44,7 +48,7 @@ BuiltinsContext::lookup_simple_builtin (const std::string &name, tree *builtin) return lookup_gcc_builtin (*to_search, builtin); } -BuiltinsContext::BuiltinsContext () { setup (); } +BuiltinsContext::BuiltinsContext () : setup_state (SetupState::UNINITIALIZED) {} /** * Define a function type according to `builtin-types.def` @@ -358,11 +362,18 @@ BuiltinsContext::register_rust_mappings () void BuiltinsContext::setup () { + rust_assert (setup_state == SetupState::UNINITIALIZED); + setup_state = SetupState::INITIALIZING; + define_builtin_types (); define_builtin_attributes (); define_builtins (); + targetm.init_builtins (); + register_rust_mappings (); + + setup_state = SetupState::READY; } bool diff --git a/gcc/rust/backend/rust-builtins.h b/gcc/rust/backend/rust-builtins.h index 22250fa8905a..7819a7c03491 100644 --- a/gcc/rust/backend/rust-builtins.h +++ b/gcc/rust/backend/rust-builtins.h @@ -166,6 +166,15 @@ private: ATTR_LAST, }; + enum class SetupState + { + UNINITIALIZED, + INITIALIZING, + READY, + }; + + SetupState setup_state; + /** * All builtin types, as defined in `builtin-types.def` * diff --git a/gcc/rust/rust-gcc.cc b/gcc/rust/rust-gcc.cc index ada66a2c7c6b..c1f6002e8163 100644 --- a/gcc/rust/rust-gcc.cc +++ b/gcc/rust/rust-gcc.cc @@ -333,6 +333,9 @@ init () // this->define_builtin (BUILT_IN_ATOMIC_FETCH_OR_1, "__atomic_fetch_or_1", // NULL, // t, 0); + + // eagerly initialize BuiltinsContext + (void) Rust::Compile::BuiltinsContext::get (); } void
