Use a dedicated safe wrapper for LLVMRustGetHostCPUName

This commit is contained in:
Zalathar 2024-11-02 11:44:15 +11:00
parent 36040aacc2
commit 0fa86f9660
3 changed files with 23 additions and 15 deletions

View File

@ -2204,7 +2204,7 @@ pub fn LLVMRustGetTargetFeature(
Desc: &mut *const c_char,
);
pub fn LLVMRustGetHostCPUName(len: *mut usize) -> *const c_char;
pub fn LLVMRustGetHostCPUName(LenOut: &mut size_t) -> *const u8;
// This function makes copies of pointed to data, so the data's lifetime may end after this
// function returns.

View File

@ -476,23 +476,31 @@ pub(crate) fn print(req: &PrintRequest, mut out: &mut String, sess: &Session) {
}
}
fn handle_native(name: &str) -> &str {
if name != "native" {
return name;
}
unsafe {
let mut len = 0;
/// Returns the host CPU name, according to LLVM.
fn get_host_cpu_name() -> &'static str {
let mut len = 0;
// SAFETY: The underlying C++ global function returns a `StringRef` that
// isn't tied to any particular backing buffer, so it must be 'static.
let slice: &'static [u8] = unsafe {
let ptr = llvm::LLVMRustGetHostCPUName(&mut len);
str::from_utf8(slice::from_raw_parts(ptr as *const u8, len)).unwrap()
assert!(!ptr.is_null());
slice::from_raw_parts(ptr, len)
};
str::from_utf8(slice).expect("host CPU name should be UTF-8")
}
/// If the given string is `"native"`, returns the host CPU name according to
/// LLVM. Otherwise, the string is returned as-is.
fn handle_native(cpu_name: &str) -> &str {
match cpu_name {
"native" => get_host_cpu_name(),
_ => cpu_name,
}
}
pub(crate) fn target_cpu(sess: &Session) -> &str {
match sess.opts.cg.target_cpu {
Some(ref name) => handle_native(name),
None => handle_native(sess.target.cpu.as_ref()),
}
let cpu_name = sess.opts.cg.target_cpu.as_deref().unwrap_or_else(|| &sess.target.cpu);
handle_native(cpu_name)
}
/// The list of LLVM features computed from CLI flags (`-Ctarget-cpu`, `-Ctarget-feature`,

View File

@ -382,9 +382,9 @@ extern "C" void LLVMRustGetTargetFeature(LLVMTargetMachineRef TM, size_t Index,
*Desc = Feat.Desc;
}
extern "C" const char *LLVMRustGetHostCPUName(size_t *len) {
extern "C" const char *LLVMRustGetHostCPUName(size_t *OutLen) {
StringRef Name = sys::getHostCPUName();
*len = Name.size();
*OutLen = Name.size();
return Name.data();
}