[COMMITTED 31/83] gccrs: Make gcc targetm builtins available to the Rust front end
arthur.cohen@opensrcsec.com
arthur.cohen@opensrcsec.com
Wed Sep 16 12:29:50 GMT 2026
From: Yap Zhi Heng <yapzhhg@gmail.com>
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 <yapzhhg@gmail.com>
---
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 d4b072a03e7..9914b6badbb 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 22250fa8905..7819a7c0349 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 ada66a2c7c6..c1f6002e816 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
--
2.50.1
More information about the Gcc-rust
mailing list