From f19c48e7a83ad146f461adfdf1b4288eabbecbc8 Mon Sep 17 00:00:00 2001 From: kxxt Date: Sun, 28 Jan 2024 18:38:41 +0800 Subject: Set target-abi module flag for RISC-V targets Fixes cross-language LTO on RISC-V targets (Fixes #121924) --- compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp') diff --git a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp index 8ec1f5a99e7..8d43fe6052a 100644 --- a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp +++ b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp @@ -817,7 +817,7 @@ extern "C" uint32_t LLVMRustVersionMinor() { return LLVM_VERSION_MINOR; } extern "C" uint32_t LLVMRustVersionMajor() { return LLVM_VERSION_MAJOR; } -extern "C" void LLVMRustAddModuleFlag( +extern "C" void LLVMRustAddModuleFlagU32( LLVMModuleRef M, Module::ModFlagBehavior MergeBehavior, const char *Name, @@ -825,6 +825,15 @@ extern "C" void LLVMRustAddModuleFlag( unwrap(M)->addModuleFlag(MergeBehavior, Name, Value); } +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)); +} + extern "C" bool LLVMRustHasModuleFlag(LLVMModuleRef M, const char *Name, size_t Len) { return unwrap(M)->getModuleFlag(StringRef(Name, Len)) != nullptr; -- cgit 1.4.1-3-g733a5 From 33db20978e8157f53ca24fce1c54a7b5e07159cf Mon Sep 17 00:00:00 2001 From: Levi Zim Date: Tue, 9 Apr 2024 14:47:06 +0800 Subject: Pass value and valueLen to create a StringRef Instead of creating a cstring. Co-authored-by: LoveSy --- compiler/rustc_codegen_llvm/src/context.rs | 12 +++++------- compiler/rustc_codegen_llvm/src/llvm/ffi.rs | 1 + compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp | 7 ++++--- 3 files changed, 10 insertions(+), 10 deletions(-) (limited to 'compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp') 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, -- cgit 1.4.1-3-g733a5