about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_codegen_llvm/src/context.rs12
-rw-r--r--compiler/rustc_codegen_llvm/src/llvm/ffi.rs1
-rw-r--r--compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp7
3 files changed, 10 insertions, 10 deletions
diff --git a/compiler/rustc_codegen_llvm/src/context.rs b/compiler/rustc_codegen_llvm/src/context.rs
index c31bc669f4d..d32baa6dc02 100644
--- a/compiler/rustc_codegen_llvm/src/context.rs
+++ b/compiler/rustc_codegen_llvm/src/context.rs
@@ -35,7 +35,6 @@ use libc::c_uint;
 use std::borrow::Borrow;
 use std::cell::{Cell, RefCell};
 use std::ffi::CStr;
-use std::ffi::CString;
 use std::str;
 
 /// There is one `CodegenCx` per compilation unit. Each one has its own LLVM
@@ -332,15 +331,14 @@ pub unsafe fn create_module<'ll>(
     // correctly setting target-abi for the LTO object
     // FIXME: https://github.com/llvm/llvm-project/issues/50591
     // If llvm_abiname is empty, emit nothing.
-    if matches!(sess.target.arch.as_ref(), "riscv32" | "riscv64")
-        && !sess.target.options.llvm_abiname.is_empty()
-    {
-        let llvm_abiname = CString::new(sess.target.options.llvm_abiname.as_ref()).unwrap();
+    let llvm_abiname = &sess.target.options.llvm_abiname;
+    if matches!(sess.target.arch.as_ref(), "riscv32" | "riscv64") && !llvm_abiname.is_empty() {
         llvm::LLVMRustAddModuleFlagString(
             llmod,
             llvm::LLVMModFlagBehavior::Error,
-            c"target-abi".as_ptr() as *const _,
-            llvm_abiname.as_ptr() as *const _,
+            c"target-abi".as_ptr(),
+            llvm_abiname.as_ptr().cast(),
+            llvm_abiname.len(),
         );
     }
 
diff --git a/compiler/rustc_codegen_llvm/src/llvm/ffi.rs b/compiler/rustc_codegen_llvm/src/llvm/ffi.rs
index 7aa9a9547dc..5509baaa3e9 100644
--- a/compiler/rustc_codegen_llvm/src/llvm/ffi.rs
+++ b/compiler/rustc_codegen_llvm/src/llvm/ffi.rs
@@ -1813,6 +1813,7 @@ extern "C" {
         merge_behavior: LLVMModFlagBehavior,
         name: *const c_char,
         value: *const c_char,
+        value_len: size_t,
     );
 
     pub fn LLVMRustHasModuleFlag(M: &Module, name: *const c_char, len: size_t) -> bool;
diff --git a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp
index 8d43fe6052a..db3c0386b94 100644
--- a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp
+++ b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp
@@ -829,9 +829,10 @@ extern "C" void LLVMRustAddModuleFlagString(
     LLVMModuleRef M,
     Module::ModFlagBehavior MergeBehavior,
     const char *Name,
-    const char *Value) {
-  llvm::LLVMContext &Ctx = unwrap(M)->getContext();
-  unwrap(M)->addModuleFlag(MergeBehavior, Name, llvm::MDString::get(Ctx, Value));
+    const char *Value,
+    size_t ValueLen) {
+  unwrap(M)->addModuleFlag(MergeBehavior, Name,
+    MDString::get(unwrap(M)->getContext(), StringRef(Value, ValueLen)));
 }
 
 extern "C" bool LLVMRustHasModuleFlag(LLVMModuleRef M, const char *Name,