Teach llvm backend how to fall back to default bodies

This commit is contained in:
Oli Scherer 2024-01-31 20:39:59 +00:00
parent a51b61a8b6
commit bd14c7b8e5
2 changed files with 6 additions and 14 deletions

View File

@ -396,9 +396,7 @@ pub(crate) fn codegen_terminator_call<'tcx>(
source_info, source_info,
) { ) {
Ok(()) => return, Ok(()) => return,
// Unimplemented intrinsics must have a fallback body. The fallback body is obtained Err(instance) => Some(instance),
// by converting the `InstanceDef::Intrinsic` to an `InstanceDef::Item`.
Err(()) => Some(Instance::new(instance.def_id(), instance.args)),
} }
} }
InstanceDef::DropGlue(_, None) => { InstanceDef::DropGlue(_, None) => {

View File

@ -268,7 +268,7 @@ pub(crate) fn codegen_intrinsic_call<'tcx>(
destination: CPlace<'tcx>, destination: CPlace<'tcx>,
target: Option<BasicBlock>, target: Option<BasicBlock>,
source_info: mir::SourceInfo, source_info: mir::SourceInfo,
) -> Result<(), ()> { ) -> Result<(), Instance<'tcx>> {
let intrinsic = fx.tcx.item_name(instance.def_id()); let intrinsic = fx.tcx.item_name(instance.def_id());
let instance_args = instance.args; let instance_args = instance.args;
@ -431,7 +431,7 @@ fn codegen_regular_intrinsic_call<'tcx>(
ret: CPlace<'tcx>, ret: CPlace<'tcx>,
destination: Option<BasicBlock>, destination: Option<BasicBlock>,
source_info: mir::SourceInfo, source_info: mir::SourceInfo,
) -> Result<(), ()> { ) -> Result<(), Instance<'tcx>> {
assert_eq!(generic_args, instance.args); assert_eq!(generic_args, instance.args);
let usize_layout = fx.layout_of(fx.tcx.types.usize); let usize_layout = fx.layout_of(fx.tcx.types.usize);
@ -1229,14 +1229,6 @@ fn codegen_regular_intrinsic_call<'tcx>(
ret.write_cvalue(fx, CValue::by_val(cmp, ret.layout())); ret.write_cvalue(fx, CValue::by_val(cmp, ret.layout()));
} }
sym::const_allocate => {
intrinsic_args!(fx, args => (_size, _align); intrinsic);
// returns a null pointer at runtime.
let null = fx.bcx.ins().iconst(fx.pointer_type, 0);
ret.write_cvalue(fx, CValue::by_val(null, ret.layout()));
}
sym::const_deallocate => { sym::const_deallocate => {
intrinsic_args!(fx, args => (_ptr, _size, _align); intrinsic); intrinsic_args!(fx, args => (_ptr, _size, _align); intrinsic);
// nop at runtime. // nop at runtime.
@ -1257,7 +1249,9 @@ fn codegen_regular_intrinsic_call<'tcx>(
); );
} }
_ => return Err(()), // Unimplemented intrinsics must have a fallback body. The fallback body is obtained
// by converting the `InstanceDef::Intrinsic` to an `InstanceDef::Item`.
_ => return Err(Instance::new(instance.def_id(), instance.args)),
} }
let ret_block = fx.get_block(destination.unwrap()); let ret_block = fx.get_block(destination.unwrap());