wrap LLVMSetMetadata
This commit is contained in:
parent
b7c5656713
commit
632342a135
@ -678,22 +678,20 @@ fn range_metadata(&mut self, load: &'ll Value, range: WrappingRange) {
|
|||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
let llty = self.cx.val_ty(load);
|
let llty = self.cx.val_ty(load);
|
||||||
let v = [
|
let md = [
|
||||||
llvm::LLVMValueAsMetadata(self.cx.const_uint_big(llty, range.start)),
|
llvm::LLVMValueAsMetadata(self.cx.const_uint_big(llty, range.start)),
|
||||||
llvm::LLVMValueAsMetadata(self.cx.const_uint_big(llty, range.end.wrapping_add(1))),
|
llvm::LLVMValueAsMetadata(self.cx.const_uint_big(llty, range.end.wrapping_add(1))),
|
||||||
];
|
];
|
||||||
|
|
||||||
let md = llvm::LLVMMDNodeInContext2(self.cx.llcx, v.as_ptr(), v.len());
|
let md = llvm::LLVMMDNodeInContext2(self.cx.llcx, md.as_ptr(), md.len());
|
||||||
let md = llvm::LLVMMetadataAsValue(&self.llcx, md);
|
self.set_metadata(load, llvm::MD_range as c_uint, md);
|
||||||
llvm::LLVMSetMetadata(load, llvm::MD_range as c_uint, md);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn nonnull_metadata(&mut self, load: &'ll Value) {
|
fn nonnull_metadata(&mut self, load: &'ll Value) {
|
||||||
unsafe {
|
unsafe {
|
||||||
let md = llvm::LLVMMDNodeInContext2(self.cx.llcx, ptr::null(), 0);
|
let md = llvm::LLVMMDNodeInContext2(self.cx.llcx, ptr::null(), 0);
|
||||||
let md = llvm::LLVMMetadataAsValue(&self.llcx, md);
|
self.set_metadata(load, llvm::MD_nonnull as c_uint, md);
|
||||||
llvm::LLVMSetMetadata(load, llvm::MD_nonnull as c_uint, md);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -742,9 +740,8 @@ fn store_with_flags(
|
|||||||
//
|
//
|
||||||
// [1]: https://llvm.org/docs/LangRef.html#store-instruction
|
// [1]: https://llvm.org/docs/LangRef.html#store-instruction
|
||||||
let one = llvm::LLVMValueAsMetadata(self.cx.const_i32(1));
|
let one = llvm::LLVMValueAsMetadata(self.cx.const_i32(1));
|
||||||
let node = llvm::LLVMMDNodeInContext2(self.cx.llcx, &one, 1);
|
let md = llvm::LLVMMDNodeInContext2(self.cx.llcx, &one, 1);
|
||||||
let node = llvm::LLVMMetadataAsValue(&self.llcx, node);
|
self.set_metadata(store, llvm::MD_nontemporal as c_uint, md);
|
||||||
llvm::LLVMSetMetadata(store, llvm::MD_nontemporal as c_uint, node);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
store
|
store
|
||||||
@ -1209,8 +1206,7 @@ fn atomic_fence(
|
|||||||
fn set_invariant_load(&mut self, load: &'ll Value) {
|
fn set_invariant_load(&mut self, load: &'ll Value) {
|
||||||
unsafe {
|
unsafe {
|
||||||
let md = llvm::LLVMMDNodeInContext2(self.cx.llcx, ptr::null(), 0);
|
let md = llvm::LLVMMDNodeInContext2(self.cx.llcx, ptr::null(), 0);
|
||||||
let md = llvm::LLVMMetadataAsValue(&self.llcx, md);
|
self.set_metadata(load, llvm::MD_invariant_load as c_uint, md);
|
||||||
llvm::LLVMSetMetadata(load, llvm::MD_invariant_load as c_uint, md);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1339,26 +1335,23 @@ fn position_at_start(&mut self, llbb: &'ll BasicBlock) {
|
|||||||
|
|
||||||
fn align_metadata(&mut self, load: &'ll Value, align: Align) {
|
fn align_metadata(&mut self, load: &'ll Value, align: Align) {
|
||||||
unsafe {
|
unsafe {
|
||||||
let v = [llvm::LLVMValueAsMetadata(self.cx.const_u64(align.bytes()))];
|
let md = [llvm::LLVMValueAsMetadata(self.cx.const_u64(align.bytes()))];
|
||||||
let md = llvm::LLVMMDNodeInContext2(self.cx.llcx, v.as_ptr(), v.len());
|
let md = llvm::LLVMMDNodeInContext2(self.cx.llcx, md.as_ptr(), md.len());
|
||||||
let md = llvm::LLVMMetadataAsValue(&self.llcx, md);
|
self.set_metadata(load, llvm::MD_align as c_uint, md);
|
||||||
llvm::LLVMSetMetadata(load, llvm::MD_align as c_uint, md);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn noundef_metadata(&mut self, load: &'ll Value) {
|
fn noundef_metadata(&mut self, load: &'ll Value) {
|
||||||
unsafe {
|
unsafe {
|
||||||
let md = llvm::LLVMMDNodeInContext2(self.cx.llcx, ptr::null(), 0);
|
let md = llvm::LLVMMDNodeInContext2(self.cx.llcx, ptr::null(), 0);
|
||||||
let md = llvm::LLVMMetadataAsValue(&self.llcx, md);
|
self.set_metadata(load, llvm::MD_noundef as c_uint, md);
|
||||||
llvm::LLVMSetMetadata(load, llvm::MD_noundef as c_uint, md);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn set_unpredictable(&mut self, inst: &'ll Value) {
|
pub(crate) fn set_unpredictable(&mut self, inst: &'ll Value) {
|
||||||
unsafe {
|
unsafe {
|
||||||
let md = llvm::LLVMMDNodeInContext2(self.cx.llcx, ptr::null(), 0);
|
let md = llvm::LLVMMDNodeInContext2(self.cx.llcx, ptr::null(), 0);
|
||||||
let md = llvm::LLVMMetadataAsValue(&self.llcx, md);
|
self.set_metadata(inst, llvm::MD_unpredictable as c_uint, md);
|
||||||
llvm::LLVMSetMetadata(inst, llvm::MD_unpredictable as c_uint, md);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use std::borrow::Borrow;
|
use std::borrow::Borrow;
|
||||||
use std::cell::{Cell, RefCell};
|
use std::cell::{Cell, RefCell};
|
||||||
use std::ffi::CStr;
|
use std::ffi::{c_uint, CStr};
|
||||||
use std::str;
|
use std::str;
|
||||||
|
|
||||||
use rustc_codegen_ssa::base::{wants_msvc_seh, wants_wasm_eh};
|
use rustc_codegen_ssa::base::{wants_msvc_seh, wants_wasm_eh};
|
||||||
@ -30,6 +30,7 @@
|
|||||||
use crate::back::write::to_llvm_code_model;
|
use crate::back::write::to_llvm_code_model;
|
||||||
use crate::callee::get_fn;
|
use crate::callee::get_fn;
|
||||||
use crate::debuginfo::metadata::apply_vcall_visibility_metadata;
|
use crate::debuginfo::metadata::apply_vcall_visibility_metadata;
|
||||||
|
use crate::llvm::Metadata;
|
||||||
use crate::type_::Type;
|
use crate::type_::Type;
|
||||||
use crate::value::Value;
|
use crate::value::Value;
|
||||||
use crate::{attributes, coverageinfo, debuginfo, llvm, llvm_util};
|
use crate::{attributes, coverageinfo, debuginfo, llvm, llvm_util};
|
||||||
@ -585,6 +586,14 @@ pub(crate) fn create_used_variable_impl(&self, name: &'static CStr, values: &[&'
|
|||||||
llvm::LLVMSetSection(g, c"llvm.metadata".as_ptr());
|
llvm::LLVMSetSection(g, c"llvm.metadata".as_ptr());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A wrapper for [`llvm::LLVMSetMetadata`], but it takes `Metadata` as a parameter instead of `Value`.
|
||||||
|
pub(crate) fn set_metadata<'a>(&self, val: &'a Value, kind_id: c_uint, md: &'a Metadata) {
|
||||||
|
unsafe {
|
||||||
|
let node = llvm::LLVMMetadataAsValue(&self.llcx, md);
|
||||||
|
llvm::LLVMSetMetadata(val, kind_id, node);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'ll, 'tcx> MiscCodegenMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
impl<'ll, 'tcx> MiscCodegenMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
||||||
|
Loading…
Reference in New Issue
Block a user