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