about summary refs log tree commit diff
path: root/compiler/rustc_codegen_llvm/src/consts.rs
diff options
context:
space:
mode:
authorOli Scherer <github333195615777966@oli-obk.de>2025-01-31 10:45:42 +0000
committerOli Scherer <github333195615777966@oli-obk.de>2025-02-01 22:39:38 +0000
commitb89263605a0e4c584f9fee40390cf224596420f3 (patch)
tree5b327c065e642b4e27a3b3ab9139ff52a990dc81 /compiler/rustc_codegen_llvm/src/consts.rs
parent5e5567993d8ee5f8b260cebe96f1714d134d1d96 (diff)
downloadrust-b89263605a0e4c584f9fee40390cf224596420f3.tar.gz
rust-b89263605a0e4c584f9fee40390cf224596420f3.zip
Explain why we retroactively change a static initializer to have a different type
Diffstat (limited to 'compiler/rustc_codegen_llvm/src/consts.rs')
-rw-r--r--compiler/rustc_codegen_llvm/src/consts.rs10
1 files changed, 8 insertions, 2 deletions
diff --git a/compiler/rustc_codegen_llvm/src/consts.rs b/compiler/rustc_codegen_llvm/src/consts.rs
index c7114480d8b..ca3813af191 100644
--- a/compiler/rustc_codegen_llvm/src/consts.rs
+++ b/compiler/rustc_codegen_llvm/src/consts.rs
@@ -384,8 +384,14 @@ impl<'ll> CodegenCx<'ll, '_> {
             let g = if val_llty == llty {
                 g
             } else {
-                // If we created the global with the wrong type,
-                // correct the type.
+                // codegen_static_initializer creates the global value just from the
+                // `Allocation` data by generating one big struct value that is just
+                // all the bytes and pointers after each other. This will almost never
+                // match the type that the static was declared with. Unfortunately
+                // we can't just LLVMConstBitCast our way out of it because that has very
+                // specific rules on what can be cast. So instead of adding a new way to
+                // generate static initializers that match the static's type, we picked
+                // the easier option and retroactively change the type of the static item itself.
                 let name = llvm::get_value_name(g).to_vec();
                 llvm::set_value_name(g, b"");