Merge "rs2spirv: Fail gracefully when we find a type we cannot handle."
am: 7ed66f107b

Change-Id: I381cb7e9bfa9b670c262487917060353e838caf3
diff --git a/rsov/compiler/ReflectionPass.cpp b/rsov/compiler/ReflectionPass.cpp
index a909241..995c0a5 100644
--- a/rsov/compiler/ReflectionPass.cpp
+++ b/rsov/compiler/ReflectionPass.cpp
@@ -89,13 +89,21 @@
     if (ET->isFloatTy())
       return "float4";
 
-    llvm_unreachable("Unknown vector type");
+    assert(false && "Unknown vector type");
   }
 
-  llvm_unreachable("Unknown type");
+  assert(false && "Unknown type");
+
+  std::string badNameString;
+  raw_string_ostream badNameStream(badNameString);
+  badNameStream << '[';
+  Ty->print(badNameStream);
+  badNameStream << ']';
+  return badNameStream.str();
 }
 
 enum class RSType {
+  rs_bad = -1,
   rs_void,
   rs_uchar,
   rs_int,
@@ -113,7 +121,8 @@
                   .Case("float", RSType::rs_float)
                   .Case("uchar4", RSType::rs_uchar4)
                   .Case("int4", RSType::rs_int4)
-                  .Case("float4", RSType::rs_float4);
+                  .Case("float4", RSType::rs_float4)
+                  .Default(RSType::rs_bad);
   return Ty;
 }
 
diff --git a/rsov/compiler/tests/errors/unsupported_type.ll b/rsov/compiler/tests/errors/unsupported_type.ll
new file mode 100644
index 0000000..50a6aad
--- /dev/null
+++ b/rsov/compiler/tests/errors/unsupported_type.ll
@@ -0,0 +1,34 @@
+; RUN: not rs2spirv_lit_driver.sh %s >%t.out 2>%t.err
+; RUN: FileCheck %s <%t.err
+
+target datalayout = "e-p:32:32-i64:64-v128:64:128-n32-S64"
+target triple = "armv7-none-linux-gnueabi"
+
+; CHECK: LLVM to SPIRV type mapping for type:    [i16] not found
+; CHECK: LLVM to SPIRV type mapping for type:    [i16] not found
+; CHECK: Emitting kernel types failed
+
+; CHECK-NOT: OpFunctionEnd
+
+; Function Attrs: nounwind readnone
+define signext i16 @tSet(i16 signext %v) unnamed_addr #0 {
+  ret i16 %v
+}
+
+attributes #0 = { nounwind readnone }
+
+!llvm.module.flags = !{!0, !1}
+!llvm.ident = !{!2}
+!\23pragma = !{!3, !4}
+!\23rs_export_foreach_name = !{!5, !6}
+!\23rs_export_foreach = !{!7, !8}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{i32 1, !"min_enum_size", i32 4}
+!2 = !{!"Android clang version 3.8.275480  (based on LLVM 3.8.275480)"}
+!3 = !{!"version", !"1"}
+!4 = !{!"java_package_name", !"identity"}
+!5 = !{!"root"}
+!6 = !{!"tSet"}
+!7 = !{!"0"}
+!8 = !{!"35"}
diff --git a/rsov/compiler/tests/errors/unsupported_type.rs b/rsov/compiler/tests/errors/unsupported_type.rs
new file mode 100644
index 0000000..a5af55d
--- /dev/null
+++ b/rsov/compiler/tests/errors/unsupported_type.rs
@@ -0,0 +1,6 @@
+#pragma version(1)
+#pragma rs java_package_name(identity)
+
+#define TYPE short
+
+TYPE RS_KERNEL tSet(TYPE v) { return v; }
diff --git a/rsov/compiler/tests/rs2spirv_lit_driver.sh b/rsov/compiler/tests/rs2spirv_lit_driver.sh
index d084c90..8e23ccb 100755
--- a/rsov/compiler/tests/rs2spirv_lit_driver.sh
+++ b/rsov/compiler/tests/rs2spirv_lit_driver.sh
@@ -29,17 +29,20 @@
 output_folder="driver_out"
 mkdir -p $output_folder
 
-eval llvm-as "$script_path" -o "$output_folder/$script.bc"
+eval llvm-as "$script_path" -o "$output_folder/$script.bc" &&
 eval rs2spirv "$output_folder/$script.bc" -o "$output_folder/$script.rs.spv" \
-              -wo "$output_folder/$script.w.spt"
+              -wo "$output_folder/$script.w.spt" &&
 eval spirv-dis "$output_folder/$script.rs.spv" \
-              --no-color > "$output_folder/$script.rs.spt"
+              --no-color > "$output_folder/$script.rs.spt" &&
 eval rs2spirv -o "$output_folder/$script.spt" -lk "$output_folder/$script.rs.spt" \
-              -lw "$output_folder/$script.w.spt"
+              -lw "$output_folder/$script.w.spt" &&
 eval spirv-as "$output_folder/$script.spt" \
-              -o "$output_folder/$script.spv"
-
-eval spirv-val "$output_folder/$script.spv"
+              -o "$output_folder/$script.spv" &&
+eval spirv-val "$output_folder/$script.spv" &&
 eval cat "$output_folder/$script.spt"
 
+RET=$?
+
 eval rm "$output_folder/$script.*"
+
+exit $RET