Karl Schimpf | 2e7daef | 2015-01-09 13:04:13 -0800 | [diff] [blame] | 1 | //===- unittest/IceParseInstsTest.cpp - test instruction errors -----------===// |
| 2 | // |
| 3 | // The Subzero Code Generator |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | |
John Porto | 8eefffa | 2015-06-11 15:14:37 -0700 | [diff] [blame] | 10 | #include <string> |
| 11 | |
Jim Stichnoth | 98da966 | 2015-06-27 06:38:08 -0700 | [diff] [blame] | 12 | #pragma clang diagnostic push |
| 13 | #pragma clang diagnostic ignored "-Wunused-parameter" |
Karl Schimpf | 2e7daef | 2015-01-09 13:04:13 -0800 | [diff] [blame] | 14 | #include "llvm/ADT/STLExtras.h" |
| 15 | #include "llvm/Bitcode/NaCl/NaClBitcodeParser.h" |
| 16 | #include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h" |
Jim Stichnoth | 98da966 | 2015-06-27 06:38:08 -0700 | [diff] [blame] | 17 | #pragma clang diagnostic pop |
Karl Schimpf | 2e7daef | 2015-01-09 13:04:13 -0800 | [diff] [blame] | 18 | |
| 19 | #include "BitcodeMunge.h" |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 20 | #include "unittests/Bitcode/NaClMungeTest.h" |
Karl Schimpf | 2e7daef | 2015-01-09 13:04:13 -0800 | [diff] [blame] | 21 | |
| 22 | using namespace llvm; |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 23 | using namespace naclmungetest; |
Karl Schimpf | 2e7daef | 2015-01-09 13:04:13 -0800 | [diff] [blame] | 24 | |
| 25 | namespace { |
| 26 | |
John Porto | 8eefffa | 2015-06-11 15:14:37 -0700 | [diff] [blame] | 27 | // The ParseError constant is passed to the BitcodeMunger to prevent translation |
| 28 | // when we expect a Parse error. |
| 29 | constexpr bool ParseError = true; |
| 30 | |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 31 | // Note: alignment stored as 0 or log2(Alignment)+1. |
| 32 | uint64_t getEncAlignPower(unsigned Power) { |
| 33 | return Power + 1; |
| 34 | } |
| 35 | uint64_t getEncAlignZero() { return 0; } |
| 36 | |
Karl Schimpf | 2e7daef | 2015-01-09 13:04:13 -0800 | [diff] [blame] | 37 | /// Test how we report a call arg that refers to nonexistent call argument |
| 38 | TEST(IceParseInstsTest, NonexistentCallArg) { |
| 39 | const uint64_t BitcodeRecords[] = { |
| 40 | 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
| 41 | 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
| 42 | 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, |
| 43 | 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
| 44 | 3, naclbitc::TYPE_CODE_VOID, Terminator, |
| 45 | 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, 0, Terminator, |
| 46 | 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 47 | 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 1, 0, Terminator, |
| 48 | 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, |
| 49 | 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
| 50 | 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
Jim Stichnoth | dd842db | 2015-01-27 12:53:53 -0800 | [diff] [blame] | 51 | // Note: 100 is a bad value index in next line. |
Karl Schimpf | 2e7daef | 2015-01-09 13:04:13 -0800 | [diff] [blame] | 52 | 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, |
| 53 | 3, naclbitc::FUNC_CODE_INST_RET, Terminator, |
| 54 | 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 55 | 0, naclbitc::BLK_CODE_EXIT, Terminator |
| 56 | }; |
| 57 | |
Karl Schimpf | 2e7daef | 2015-01-09 13:04:13 -0800 | [diff] [blame] | 58 | // Show bitcode objdump for BitcodeRecords. |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 59 | NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords)); |
| 60 | EXPECT_FALSE(DumpMunger.runTest()); |
Karl Schimpf | 22ed4eb | 2015-03-04 12:17:20 -0800 | [diff] [blame] | 61 | EXPECT_EQ(" 66:4| 3: <34, 0, 4, 2, 100> | call void @f0(i32 " |
| 62 | "%p0, i32 @f0);\n" |
| 63 | "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n", |
| 64 | DumpMunger.getLinesWithSubstring("66:4")); |
Karl Schimpf | 2e7daef | 2015-01-09 13:04:13 -0800 | [diff] [blame] | 65 | |
| 66 | // Show that we get appropriate error when parsing in Subzero. |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 67 | IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); |
John Porto | 8eefffa | 2015-06-11 15:14:37 -0700 | [diff] [blame] | 68 | EXPECT_FALSE(Munger.runTest(ParseError)); |
Karl Schimpf | 22ed4eb | 2015-03-04 12:17:20 -0800 | [diff] [blame] | 69 | EXPECT_EQ("Error(66:4): Invalid function record: <34 0 4 2 100>\n", |
Jim Stichnoth | dd842db | 2015-01-27 12:53:53 -0800 | [diff] [blame] | 70 | Munger.getTestResults()); |
Karl Schimpf | d8b3289 | 2015-04-16 15:47:25 -0700 | [diff] [blame] | 71 | |
| 72 | // Show that we generate a fatal error when not allowing error recovery. |
| 73 | Munger.Flags.setAllowErrorRecovery(false); |
John Porto | 8eefffa | 2015-06-11 15:14:37 -0700 | [diff] [blame] | 74 | EXPECT_DEATH(Munger.runTest(ParseError), ".*ERROR: Unable to continue.*"); |
Karl Schimpf | 2e7daef | 2015-01-09 13:04:13 -0800 | [diff] [blame] | 75 | } |
| 76 | |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 77 | /// Test how we recognize alignments in alloca instructions. |
| 78 | TEST(IceParseInstsTests, AllocaAlignment) { |
| 79 | const uint64_t BitcodeRecords[] = { |
| 80 | 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
| 81 | 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
| 82 | 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, |
| 83 | 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
| 84 | 3, naclbitc::TYPE_CODE_VOID, Terminator, |
| 85 | 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator, |
| 86 | 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator, |
| 87 | 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 88 | 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, |
| 89 | 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
| 90 | 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
| 91 | 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(0), Terminator, |
| 92 | 3, naclbitc::FUNC_CODE_INST_RET, Terminator, |
| 93 | 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 94 | 0, naclbitc::BLK_CODE_EXIT, Terminator}; |
| 95 | |
| 96 | const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA |
| 97 | |
| 98 | // Show text when alignment is 1. |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 99 | NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords)); |
| 100 | EXPECT_TRUE(DumpMunger.runTest()); |
Karl Schimpf | 22ed4eb | 2015-03-04 12:17:20 -0800 | [diff] [blame] | 101 | EXPECT_EQ(" 62:4| 3: <19, 1, 1> | %v0 = alloca i8, i32 " |
| 102 | "%p0, align 1;\n", |
| 103 | DumpMunger.getLinesWithSubstring("62:4")); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 104 | |
| 105 | // Show that we can handle alignment of 1. |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 106 | IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); |
| 107 | EXPECT_TRUE(Munger.runTest()); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 108 | |
| 109 | // Show what happens when changing alignment to 0. |
| 110 | const uint64_t Align0[] = { |
Karl Schimpf | 0e7e412 | 2015-04-30 15:32:04 -0700 | [diff] [blame] | 111 | ReplaceIndex, NaClMungedBitcode::Replace, |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 112 | 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator, |
| 113 | }; |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 114 | EXPECT_TRUE(Munger.runTest(ARRAY(Align0))); |
| 115 | EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align0))); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 116 | EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", |
| 117 | DumpMunger.getLinesWithSubstring("alloca")); |
| 118 | |
| 119 | // Show what happens when changing alignment to 2**30. |
| 120 | const uint64_t Align30[] = { |
Karl Schimpf | 0e7e412 | 2015-04-30 15:32:04 -0700 | [diff] [blame] | 121 | ReplaceIndex, NaClMungedBitcode::Replace, |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 122 | 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, |
| 123 | }; |
John Porto | 8eefffa | 2015-06-11 15:14:37 -0700 | [diff] [blame] | 124 | EXPECT_FALSE(Munger.runTest(ARRAY(Align30), ParseError)); |
Karl Schimpf | 22ed4eb | 2015-03-04 12:17:20 -0800 | [diff] [blame] | 125 | EXPECT_EQ("Error(62:4): Invalid function record: <19 1 31>\n", |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 126 | Munger.getTestResults()); |
| 127 | |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 128 | EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 129 | EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", |
| 130 | DumpMunger.getLinesWithSubstring("alloca")); |
| 131 | EXPECT_EQ( |
| 132 | "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", |
| 133 | DumpMunger.getLinesWithSubstring("Error")); |
| 134 | |
| 135 | // Show what happens when changing alignment to 2**29. |
| 136 | const uint64_t Align29[] = { |
Karl Schimpf | 0e7e412 | 2015-04-30 15:32:04 -0700 | [diff] [blame] | 137 | ReplaceIndex, NaClMungedBitcode::Replace, |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 138 | 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(29), Terminator, |
| 139 | }; |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 140 | EXPECT_TRUE(Munger.runTest(ARRAY(Align29))); |
| 141 | EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align29))); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 142 | EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 536870912;\n", |
| 143 | DumpMunger.getLinesWithSubstring("alloca")); |
| 144 | } |
| 145 | |
| 146 | // Test how we recognize alignments in load i32 instructions. |
| 147 | TEST(IceParseInstsTests, LoadI32Alignment) { |
| 148 | const uint64_t BitcodeRecords[] = { |
| 149 | 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
| 150 | 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
| 151 | 3, naclbitc::TYPE_CODE_NUMENTRY, 2, Terminator, |
| 152 | 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
| 153 | 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 0, Terminator, |
| 154 | 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 155 | 3, naclbitc::MODULE_CODE_FUNCTION, 1, 0, 0, 0, Terminator, |
| 156 | 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
| 157 | 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
| 158 | 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 0, Terminator, |
| 159 | 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, |
| 160 | 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 161 | 0, naclbitc::BLK_CODE_EXIT, Terminator}; |
| 162 | |
| 163 | const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD |
| 164 | |
| 165 | // Show text when alignment is 1. |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 166 | NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords)); |
| 167 | EXPECT_TRUE(DumpMunger.runTest()); |
Karl Schimpf | 22ed4eb | 2015-03-04 12:17:20 -0800 | [diff] [blame] | 168 | EXPECT_EQ(" 58:4| 3: <20, 1, 1, 0> | %v0 = load i32* %p0, " |
| 169 | "align 1;\n", |
| 170 | DumpMunger.getLinesWithSubstring("58:4")); |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 171 | IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); |
| 172 | EXPECT_TRUE(Munger.runTest()); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 173 | |
| 174 | // Show what happens when changing alignment to 0. |
| 175 | const uint64_t Align0[] = { |
Karl Schimpf | 0e7e412 | 2015-04-30 15:32:04 -0700 | [diff] [blame] | 176 | ReplaceIndex, NaClMungedBitcode::Replace, |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 177 | 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, |
| 178 | }; |
John Porto | 8eefffa | 2015-06-11 15:14:37 -0700 | [diff] [blame] | 179 | EXPECT_FALSE(Munger.runTest(ARRAY(Align0), ParseError)); |
Karl Schimpf | 22ed4eb | 2015-03-04 12:17:20 -0800 | [diff] [blame] | 180 | EXPECT_EQ("Error(58:4): Invalid function record: <20 1 0 0>\n", |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 181 | Munger.getTestResults()); |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 182 | EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0))); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 183 | EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" |
| 184 | "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 185 | DumpMunger.getLinesWithSubstring("load")); |
| 186 | |
| 187 | // Show what happens when changing alignment to 4. |
| 188 | const uint64_t Align4[] = { |
Karl Schimpf | 0e7e412 | 2015-04-30 15:32:04 -0700 | [diff] [blame] | 189 | ReplaceIndex, NaClMungedBitcode::Replace, |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 190 | 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, |
| 191 | }; |
John Porto | 8eefffa | 2015-06-11 15:14:37 -0700 | [diff] [blame] | 192 | EXPECT_FALSE(Munger.runTest(ARRAY(Align4), ParseError)); |
Karl Schimpf | 22ed4eb | 2015-03-04 12:17:20 -0800 | [diff] [blame] | 193 | EXPECT_EQ("Error(58:4): Invalid function record: <20 1 3 0>\n", |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 194 | Munger.getTestResults()); |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 195 | EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align4))); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 196 | EXPECT_EQ(" %v0 = load i32* %p0, align 4;\n" |
| 197 | "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 198 | DumpMunger.getLinesWithSubstring("load")); |
| 199 | |
| 200 | // Show what happens when changing alignment to 2**29. |
| 201 | const uint64_t Align29[] = { |
Karl Schimpf | 0e7e412 | 2015-04-30 15:32:04 -0700 | [diff] [blame] | 202 | ReplaceIndex, NaClMungedBitcode::Replace, |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 203 | 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, |
| 204 | }; |
John Porto | 8eefffa | 2015-06-11 15:14:37 -0700 | [diff] [blame] | 205 | EXPECT_FALSE(Munger.runTest(ARRAY(Align29), ParseError)); |
Karl Schimpf | 22ed4eb | 2015-03-04 12:17:20 -0800 | [diff] [blame] | 206 | EXPECT_EQ("Error(58:4): Invalid function record: <20 1 30 0>\n", |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 207 | Munger.getTestResults()); |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 208 | EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29))); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 209 | EXPECT_EQ(" %v0 = load i32* %p0, align 536870912;\n" |
| 210 | "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 211 | DumpMunger.getLinesWithSubstring("load")); |
| 212 | |
| 213 | // Show what happens when changing alignment to 2**30. |
| 214 | const uint64_t Align30[] = { |
Karl Schimpf | 0e7e412 | 2015-04-30 15:32:04 -0700 | [diff] [blame] | 215 | ReplaceIndex, NaClMungedBitcode::Replace, |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 216 | 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, |
| 217 | }; |
John Porto | 8eefffa | 2015-06-11 15:14:37 -0700 | [diff] [blame] | 218 | EXPECT_FALSE(Munger.runTest(ARRAY(Align30), ParseError)); |
Karl Schimpf | 22ed4eb | 2015-03-04 12:17:20 -0800 | [diff] [blame] | 219 | EXPECT_EQ("Error(58:4): Invalid function record: <20 1 31 0>\n", |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 220 | Munger.getTestResults()); |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 221 | EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 222 | EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" |
| 223 | "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 224 | DumpMunger.getLinesWithSubstring("load")); |
| 225 | } |
| 226 | |
| 227 | // Test how we recognize alignments in load float instructions. |
| 228 | TEST(IceParseInstsTests, LoadFloatAlignment) { |
| 229 | const uint64_t BitcodeRecords[] = { |
| 230 | 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
| 231 | 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
| 232 | 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, |
| 233 | 3, naclbitc::TYPE_CODE_FLOAT, Terminator, |
| 234 | 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
| 235 | 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 1, Terminator, |
| 236 | 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 237 | 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, |
| 238 | 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
| 239 | 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
| 240 | 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 0, Terminator, |
| 241 | 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, |
| 242 | 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 243 | 0, naclbitc::BLK_CODE_EXIT, Terminator}; |
| 244 | |
| 245 | const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_LOAD |
| 246 | |
| 247 | // Show text when alignment is 1. |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 248 | NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords)); |
| 249 | EXPECT_TRUE(DumpMunger.runTest()); |
Karl Schimpf | 22ed4eb | 2015-03-04 12:17:20 -0800 | [diff] [blame] | 250 | EXPECT_EQ(" 58:4| 3: <20, 1, 1, 0> | %v0 = load float* " |
| 251 | "%p0, align 1;\n", |
| 252 | DumpMunger.getLinesWithSubstring("58:4")); |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 253 | IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); |
| 254 | EXPECT_TRUE(Munger.runTest()); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 255 | |
| 256 | // Show what happens when changing alignment to 0. |
| 257 | const uint64_t Align0[] = { |
Karl Schimpf | 0e7e412 | 2015-04-30 15:32:04 -0700 | [diff] [blame] | 258 | ReplaceIndex, NaClMungedBitcode::Replace, |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 259 | 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, |
| 260 | }; |
John Porto | 8eefffa | 2015-06-11 15:14:37 -0700 | [diff] [blame] | 261 | EXPECT_FALSE(Munger.runTest(ARRAY(Align0), ParseError)); |
Karl Schimpf | 22ed4eb | 2015-03-04 12:17:20 -0800 | [diff] [blame] | 262 | EXPECT_EQ("Error(58:4): Invalid function record: <20 1 0 0>\n", |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 263 | Munger.getTestResults()); |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 264 | EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0))); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 265 | EXPECT_EQ( |
| 266 | " %v0 = load float* %p0, align 0;\n" |
Jim Stichnoth | dd842db | 2015-01-27 12:53:53 -0800 | [diff] [blame] | 267 | "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
| 268 | DumpMunger.getLinesWithSubstring("load")); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 269 | |
| 270 | // Show what happens when changing alignment to 4. |
| 271 | const uint64_t Align4[] = { |
Karl Schimpf | 0e7e412 | 2015-04-30 15:32:04 -0700 | [diff] [blame] | 272 | ReplaceIndex, NaClMungedBitcode::Replace, |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 273 | 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, |
| 274 | }; |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 275 | EXPECT_TRUE(Munger.runTest(ARRAY(Align4))); |
| 276 | EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align4))); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 277 | EXPECT_EQ(" %v0 = load float* %p0, align 4;\n", |
| 278 | DumpMunger.getLinesWithSubstring("load")); |
| 279 | |
| 280 | const uint64_t Align29[] = { |
Karl Schimpf | 0e7e412 | 2015-04-30 15:32:04 -0700 | [diff] [blame] | 281 | ReplaceIndex, NaClMungedBitcode::Replace, |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 282 | 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, |
| 283 | }; |
John Porto | 8eefffa | 2015-06-11 15:14:37 -0700 | [diff] [blame] | 284 | EXPECT_FALSE(Munger.runTest(ARRAY(Align29), ParseError)); |
Karl Schimpf | 22ed4eb | 2015-03-04 12:17:20 -0800 | [diff] [blame] | 285 | EXPECT_EQ("Error(58:4): Invalid function record: <20 1 30 0>\n", |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 286 | Munger.getTestResults()); |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 287 | EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29))); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 288 | EXPECT_EQ( |
| 289 | " %v0 = load float* %p0, align 536870912;\n" |
Jim Stichnoth | dd842db | 2015-01-27 12:53:53 -0800 | [diff] [blame] | 290 | "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
| 291 | DumpMunger.getLinesWithSubstring("load")); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 292 | |
| 293 | // Show what happens when changing alignment to 2**30. |
| 294 | const uint64_t Align30[] = { |
Karl Schimpf | 0e7e412 | 2015-04-30 15:32:04 -0700 | [diff] [blame] | 295 | ReplaceIndex, NaClMungedBitcode::Replace, |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 296 | 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, |
| 297 | }; |
John Porto | 8eefffa | 2015-06-11 15:14:37 -0700 | [diff] [blame] | 298 | EXPECT_FALSE(Munger.runTest(ARRAY(Align30), ParseError)); |
Karl Schimpf | 22ed4eb | 2015-03-04 12:17:20 -0800 | [diff] [blame] | 299 | EXPECT_EQ("Error(58:4): Invalid function record: <20 1 31 0>\n", |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 300 | Munger.getTestResults()); |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 301 | EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 302 | EXPECT_EQ( |
| 303 | " %v0 = load float* %p0, align 0;\n" |
Jim Stichnoth | dd842db | 2015-01-27 12:53:53 -0800 | [diff] [blame] | 304 | "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
| 305 | DumpMunger.getLinesWithSubstring("load")); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 306 | } |
| 307 | |
| 308 | // Test how we recognize alignments in store instructions. |
| 309 | TEST(NaClParseInstsTests, StoreAlignment) { |
| 310 | const uint64_t BitcodeRecords[] = { |
| 311 | 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
| 312 | 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
| 313 | 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, |
| 314 | 3, naclbitc::TYPE_CODE_FLOAT, Terminator, |
| 315 | 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
| 316 | 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 1, 0, Terminator, |
| 317 | 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 318 | 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, |
| 319 | 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
| 320 | 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
| 321 | 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(0), Terminator, |
| 322 | 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, |
| 323 | 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 324 | 0, naclbitc::BLK_CODE_EXIT, Terminator}; |
| 325 | |
| 326 | const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_STORE |
| 327 | |
| 328 | // Show text when alignment is 1. |
| 329 | NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), |
| 330 | Terminator); |
Karl Schimpf | 22ed4eb | 2015-03-04 12:17:20 -0800 | [diff] [blame] | 331 | EXPECT_TRUE(DumpMunger.runTest("Good Store Alignment 1")); |
| 332 | EXPECT_EQ(" 62:4| 3: <24, 2, 1, 1> | store float %p1, " |
| 333 | "float* %p0, \n", |
| 334 | DumpMunger.getLinesWithSubstring("62:4")); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 335 | IceTest::SubzeroBitcodeMunger Munger( |
| 336 | BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 337 | EXPECT_TRUE(Munger.runTest()); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 338 | |
| 339 | // Show what happens when changing alignment to 0. |
| 340 | const uint64_t Align0[] = { |
Karl Schimpf | 0e7e412 | 2015-04-30 15:32:04 -0700 | [diff] [blame] | 341 | ReplaceIndex, NaClMungedBitcode::Replace, |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 342 | 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, |
| 343 | }; |
John Porto | 8eefffa | 2015-06-11 15:14:37 -0700 | [diff] [blame] | 344 | EXPECT_FALSE(Munger.runTest(ARRAY(Align0), ParseError)); |
Karl Schimpf | 22ed4eb | 2015-03-04 12:17:20 -0800 | [diff] [blame] | 345 | EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 0>\n", |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 346 | Munger.getTestResults()); |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 347 | EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0))); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 348 | EXPECT_EQ( |
| 349 | " store float %p1, float* %p0, align 0;\n" |
| 350 | "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 351 | DumpMunger.getLinesWithSubstring("store")); |
| 352 | |
| 353 | // Show what happens when changing alignment to 4. |
| 354 | const uint64_t Align4[] = { |
Karl Schimpf | 0e7e412 | 2015-04-30 15:32:04 -0700 | [diff] [blame] | 355 | ReplaceIndex, NaClMungedBitcode::Replace, |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 356 | 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(2), Terminator, |
| 357 | }; |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 358 | EXPECT_TRUE(Munger.runTest(ARRAY(Align4))); |
| 359 | EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align4))); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 360 | |
| 361 | // Show what happens when changing alignment to 8. |
| 362 | const uint64_t Align8[] = { |
Karl Schimpf | 0e7e412 | 2015-04-30 15:32:04 -0700 | [diff] [blame] | 363 | ReplaceIndex, NaClMungedBitcode::Replace, |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 364 | 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(3), Terminator, |
| 365 | }; |
John Porto | 8eefffa | 2015-06-11 15:14:37 -0700 | [diff] [blame] | 366 | EXPECT_FALSE(Munger.runTest(ARRAY(Align8), ParseError)); |
Karl Schimpf | 22ed4eb | 2015-03-04 12:17:20 -0800 | [diff] [blame] | 367 | EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 4>\n", |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 368 | Munger.getTestResults()); |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 369 | EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align8))); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 370 | EXPECT_EQ( |
| 371 | " store float %p1, float* %p0, align 8;\n" |
| 372 | "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 373 | DumpMunger.getLinesWithSubstring("store")); |
| 374 | |
| 375 | // Show what happens when changing alignment to 2**29. |
| 376 | const uint64_t Align29[] = { |
Karl Schimpf | 0e7e412 | 2015-04-30 15:32:04 -0700 | [diff] [blame] | 377 | ReplaceIndex, NaClMungedBitcode::Replace, |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 378 | 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(29), Terminator, |
| 379 | }; |
John Porto | 8eefffa | 2015-06-11 15:14:37 -0700 | [diff] [blame] | 380 | EXPECT_FALSE(Munger.runTest(ARRAY(Align29), ParseError)); |
Karl Schimpf | 22ed4eb | 2015-03-04 12:17:20 -0800 | [diff] [blame] | 381 | EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 30>\n", |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 382 | Munger.getTestResults()); |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 383 | EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29))); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 384 | EXPECT_EQ( |
| 385 | " store float %p1, float* %p0, align 536870912;\n" |
| 386 | "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 387 | DumpMunger.getLinesWithSubstring("store")); |
| 388 | |
| 389 | const uint64_t Align30[] = { |
Karl Schimpf | 0e7e412 | 2015-04-30 15:32:04 -0700 | [diff] [blame] | 390 | ReplaceIndex, NaClMungedBitcode::Replace, |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 391 | // Note: alignment stored as 0 or log2(Alignment)+1. |
| 392 | 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, |
| 393 | }; |
John Porto | 8eefffa | 2015-06-11 15:14:37 -0700 | [diff] [blame] | 394 | EXPECT_FALSE(Munger.runTest(ARRAY(Align30), ParseError)); |
Karl Schimpf | 22ed4eb | 2015-03-04 12:17:20 -0800 | [diff] [blame] | 395 | EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 31>\n", |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 396 | Munger.getTestResults()); |
Karl Schimpf | cbb1d3d | 2015-06-08 09:25:15 -0700 | [diff] [blame] | 397 | EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); |
Karl Schimpf | af238b2 | 2015-01-20 12:19:15 -0800 | [diff] [blame] | 398 | EXPECT_EQ( |
| 399 | " store float %p1, float* %p0, align 0;\n" |
| 400 | "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 401 | DumpMunger.getLinesWithSubstring("store")); |
| 402 | } |
| 403 | |
Karl Schimpf | 2e7daef | 2015-01-09 13:04:13 -0800 | [diff] [blame] | 404 | } // end of anonymous namespace |