let instance =
ty::Instance::resolve(fx.tcx, ty::ParamEnv::reveal_all(), def_id, substs).unwrap();
+ if fx.tcx.symbol_name(instance).as_str().starts_with("llvm.") {
+ crate::llvm_intrinsics::codegen_llvm_intrinsic_call(fx, &fx.tcx.symbol_name(instance).as_str(), substs, args, destination);
+ return;
+ }
+
match instance.def {
InstanceDef::Intrinsic(_) => {
crate::intrinsics::codegen_intrinsic_call(fx, def_id, substs, args, destination);
--- /dev/null
+use crate::prelude::*;
+
+use rustc::ty::subst::SubstsRef;
+
+pub fn codegen_llvm_intrinsic_call<'a, 'tcx: 'a>(
+ fx: &mut FunctionCx<'a, 'tcx, impl Backend>,
+ intrinsic: &str,
+ substs: SubstsRef<'tcx>,
+ args: Vec<CValue<'tcx>>,
+ destination: Option<(CPlace<'tcx>, BasicBlock)>,
+) {
+ fx.tcx.sess.warn(&format!("unsupported llvm intrinsic {}; replacing with trap", intrinsic));
+ crate::trap::trap_unimplemented(fx, intrinsic);
+
+ if let Some((_, dest)) = destination {
+ let ret_ebb = fx.get_ebb(dest);
+ fx.bcx.ins().jump(ret_ebb, &[]);
+ } else {
+ trap_unreachable(fx, "[corruption] Diverging intrinsic returned.");
+ }
+}