[gccrs COMMIT 1/4] gccrs: Make gcc targetm builtins available to the Rust front end
gerris.rs@gmail.com
gerris.rs@gmail.com
Mon Aug 31 13:08:27 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>
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.
Commit on github: https://github.com/Rust-GCC/gccrs/commit/6181e9458573cdc123795d972c171b95bb681b65
The commit has NOT been mentioned in any issue.
The commit has been mentioned in the following pull-request(s):
- https://github.com/Rust-GCC/gccrs/pull/4809
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 881561fdd..e685a4d1e 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 22250fa89..7819a7c03 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 ada66a2c7..c1f6002e8 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
base-commit: bb00634ab27d2510aca4e3319c4e5d6f89d4ae28
--
2.55.0
More information about the Gcc-rust
mailing list