| 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 | 
|  |