]> git.lizzy.rs Git - rust.git/commitdiff
Replace llvm intrinsics with runtime trap
authorbjorn3 <bjorn3@users.noreply.github.com>
Sun, 28 Jul 2019 07:54:57 +0000 (09:54 +0200)
committerbjorn3 <bjorn3@users.noreply.github.com>
Mon, 29 Jul 2019 09:03:55 +0000 (11:03 +0200)
src/abi.rs
src/lib.rs
src/llvm_intrinsics.rs [new file with mode: 0644]

index 92872a14359ae31b01fdf06d0dac89873bbb57ed..0fa546f50e538d3832356ee649abdcb8ecbb6a31 100644 (file)
@@ -643,6 +643,11 @@ pub fn codegen_terminator_call<'a, 'tcx: 'a>(
         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);
index fb23522738df649e2f0120c908c78ff0610e69c1..cdaabcf9a390326cc28b3f690ce7ca4855323d97 100644 (file)
@@ -40,6 +40,7 @@
 mod driver;
 mod intrinsics;
 mod linkage;
+mod llvm_intrinsics;
 mod main_shim;
 mod metadata;
 mod pretty_clif;
diff --git a/src/llvm_intrinsics.rs b/src/llvm_intrinsics.rs
new file mode 100644 (file)
index 0000000..63627c4
--- /dev/null
@@ -0,0 +1,21 @@
+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.");
+    }
+}