[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