Make some "safe" llvm ops actually sound
This commit is contained in:
@@ -1182,7 +1182,7 @@ fn create_msvc_imps(
|
||||
.filter_map(|val| {
|
||||
// Exclude some symbols that we know are not Rust symbols.
|
||||
let name = llvm::get_value_name(val);
|
||||
if ignored(name) { None } else { Some((val, name)) }
|
||||
if ignored(&name) { None } else { Some((val, name)) }
|
||||
})
|
||||
.map(move |(val, name)| {
|
||||
let mut imp_name = prefix.as_bytes().to_vec();
|
||||
|
||||
@@ -306,7 +306,7 @@ fn generate_enzyme_call<'ll>(
|
||||
// add outer_fn name to ad_name to make it unique, in case users apply autodiff to multiple
|
||||
// functions. Unwrap will only panic, if LLVM gave us an invalid string.
|
||||
let name = llvm::get_value_name(outer_fn);
|
||||
let outer_fn_name = std::str::from_utf8(name).unwrap();
|
||||
let outer_fn_name = std::str::from_utf8(&name).unwrap();
|
||||
ad_name.push_str(outer_fn_name);
|
||||
|
||||
// Let us assume the user wrote the following function square:
|
||||
|
||||
@@ -430,7 +430,7 @@ impl<'ll> CodegenCx<'ll, '_> {
|
||||
// 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();
|
||||
let name = llvm::get_value_name(g);
|
||||
llvm::set_value_name(g, b"");
|
||||
|
||||
let linkage = llvm::get_linkage(g);
|
||||
|
||||
@@ -211,7 +211,7 @@ pub(crate) fn SetFunctionCallConv(fn_: &Value, cc: CallConv) {
|
||||
// function.
|
||||
// For more details on COMDAT sections see e.g., https://www.airs.com/blog/archives/52
|
||||
pub(crate) fn SetUniqueComdat(llmod: &Module, val: &Value) {
|
||||
let name_buf = get_value_name(val).to_vec();
|
||||
let name_buf = get_value_name(val);
|
||||
let name =
|
||||
CString::from_vec_with_nul(name_buf).or_else(|buf| CString::new(buf.into_bytes())).unwrap();
|
||||
set_comdat(llmod, val, &name);
|
||||
@@ -319,12 +319,14 @@ pub(crate) fn get_param(llfn: &Value, index: c_uint) -> &Value {
|
||||
}
|
||||
}
|
||||
|
||||
/// Safe wrapper for `LLVMGetValueName2` into a byte slice
|
||||
pub(crate) fn get_value_name(value: &Value) -> &[u8] {
|
||||
/// Safe wrapper for `LLVMGetValueName2`
|
||||
/// Needs to allocate the value, because `set_value_name` will invalidate
|
||||
/// the pointer.
|
||||
pub(crate) fn get_value_name(value: &Value) -> Vec<u8> {
|
||||
unsafe {
|
||||
let mut len = 0;
|
||||
let data = LLVMGetValueName2(value, &mut len);
|
||||
std::slice::from_raw_parts(data.cast(), len)
|
||||
std::slice::from_raw_parts(data.cast(), len).to_vec()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user