Add llvm.type.checked.load intrinsic
Add the intrinsic declare {i8*, i1} @llvm.type.checked.load(i8* %ptr, i32 %offset, metadata %type) This is used in the VFE optimization when lowering loading functions from vtables to LLVM IR. The `metadata` is used to map the function to all vtables this function could belong to. This ensures that functions from vtables that might be used somewhere won't get removed.
This commit is contained in:
parent
d55787a155
commit
e1c1d0f8c2
6 changed files with 88 additions and 18 deletions
|
@ -406,6 +406,16 @@ impl<'ll, 'tcx> IntrinsicCallMethods<'tcx> for Builder<'_, 'll, 'tcx> {
|
|||
self.call_intrinsic("llvm.type.test", &[bitcast, typeid])
|
||||
}
|
||||
|
||||
fn type_checked_load(
|
||||
&mut self,
|
||||
llvtable: &'ll Value,
|
||||
vtable_byte_offset: u64,
|
||||
typeid: &'ll Value,
|
||||
) -> Self::Value {
|
||||
let vtable_byte_offset = self.const_i32(vtable_byte_offset as i32);
|
||||
self.call_intrinsic("llvm.type.checked.load", &[llvtable, vtable_byte_offset, typeid])
|
||||
}
|
||||
|
||||
fn va_start(&mut self, va_list: &'ll Value) -> &'ll Value {
|
||||
self.call_intrinsic("llvm.va_start", &[va_list])
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue