gallivm: abort when trying to use non-existing intrinsic
authorRoland Scheidegger <sroland@vmware.com>
Fri, 21 Dec 2018 01:41:31 +0000 (02:41 +0100)
committerRoland Scheidegger <sroland@vmware.com>
Fri, 21 Dec 2018 16:37:00 +0000 (17:37 +0100)
Whenever llvm removes an intrinsic (we're using), we're hitting segfaults
due to llvm doing calls to address 0 in the jitted code instead.
However, Jose figured out we can actually detect this with
LLVMGetIntrinsicID(), so use this to abort, so we don't have to wonder
what got broken. (Of course, someone still needs to fix the code to
no longer use this intrinsic.)

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_intr.c

index 74ed16f33f0e5dae13a9587cbe36e236a9a0c6b8..cf1f058ff387965f9665ed6e6bbf412a2d663bf7 100644 (file)
@@ -241,6 +241,16 @@ lp_build_intrinsic(LLVMBuilderRef builder,
 
       function = lp_declare_intrinsic(module, name, ret_type, arg_types, num_args);
 
+      /*
+       * If llvm removes an intrinsic we use, we'll hit this abort (rather
+       * than a call to address zero in the jited code).
+       */
+      if (LLVMGetIntrinsicID(function) == 0) {
+         _debug_printf("llvm (version 0x%x) found no intrinsic for %s, going to crash...\n",
+                HAVE_LLVM, name);
+         abort();
+      }
+
       if (!set_callsite_attrs)
          lp_add_func_attributes(function, attr_mask);