Index: unittest/IceParseInstsTest.cpp |
diff --git a/unittest/IceParseInstsTest.cpp b/unittest/IceParseInstsTest.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..abb536c1048406db36d94c206d62fbc645041858 |
--- /dev/null |
+++ b/unittest/IceParseInstsTest.cpp |
@@ -0,0 +1,79 @@ |
+//===- unittest/IceParseInstsTest.cpp - test instruction errors -----------===// |
+// |
+// The Subzero Code Generator |
+// |
+// This file is distributed under the University of Illinois Open Source |
+// License. See LICENSE.TXT for details. |
+// |
+//===----------------------------------------------------------------------===// |
+ |
+#include "llvm/ADT/STLExtras.h" |
+#include "llvm/Bitcode/NaCl/NaClBitcodeParser.h" |
+#include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h" |
+ |
+#include "BitcodeMunge.h" |
+ |
+#include "gtest/gtest.h" |
+ |
+using namespace llvm; |
+ |
+namespace { |
+ |
+static const uint64_t Terminator = 0x5768798008978675LL; |
+ |
+/// Test how we report a call arg that refers to nonexistent call argument |
+TEST(IceParseInstsTest, NonexistentCallArg) { |
+ const uint64_t BitcodeRecords[] = { |
+ 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
+ 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
+ 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, |
+ 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
+ 3, naclbitc::TYPE_CODE_VOID, Terminator, |
+ 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, 0, Terminator, |
+ 0, naclbitc::BLK_CODE_EXIT, Terminator, |
+ 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 1, 0, Terminator, |
+ 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, |
+ 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
+ 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
+ // Note: 100 is a bad value index in next line. |
+ 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, |
+ 3, naclbitc::FUNC_CODE_INST_RET, Terminator, |
+ 0, naclbitc::BLK_CODE_EXIT, Terminator, |
+ 0, naclbitc::BLK_CODE_EXIT, Terminator |
+ }; |
+ |
+ |
+ // Show bitcode objdump for BitcodeRecords. |
+ NaClObjDumpMunger DumpMunger(BitcodeRecords, |
+ array_lengthof(BitcodeRecords), Terminator); |
+ EXPECT_FALSE(DumpMunger.runTestForAssembly("Nonexistent call arg")); |
+ EXPECT_EQ( |
+ "module { // BlockID = 8\n" |
+ " types { // BlockID = 17\n" |
+ " count 3;\n" |
+ " @t0 = i32;\n" |
+ " @t1 = void;\n" |
+ " @t2 = void (i32, i32);\n" |
+ " }\n" |
+ " declare external void @f0(i32, i32);\n" |
+ " define external void @f1(i32, i32);\n" |
+ " function void @f1(i32 %p0, i32 %p1) { // BlockID = 12\n" |
+ " blocks 1;\n" |
+ " %b0:\n" |
+ " call void @f0(i32 %p0, i32 @f0);\n" |
+ "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n" |
+ " ret void;\n" |
+ " }\n" |
+ "}\n", |
+ DumpMunger.getTestResults()); |
+ |
+ // Show that we get appropriate error when parsing in Subzero. |
+ IceTest::SubzeroBitcodeMunger Munger( |
+ BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
+ EXPECT_FALSE(Munger.runTest("Nonexistent call arg")); |
+ EXPECT_EQ( |
+ "Error: (66:4) Invalid function record: <34 0 4 2 100>\n", |
+ Munger.getTestResults()); |
+} |
+ |
+} // end of anonymous namespace |