Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 //===- unittest/IceParseInstsTest.cpp - test instruction errors -----------===// | 1 //===- unittest/IceParseInstsTest.cpp - test instruction errors -----------===// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 | 9 |
| 10 #include "llvm/ADT/STLExtras.h" | 10 #include "llvm/ADT/STLExtras.h" |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 35 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | 35 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, |
| 36 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | 36 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
| 37 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | 37 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
| 38 // Note: 100 is a bad value index in next line. | 38 // Note: 100 is a bad value index in next line. |
| 39 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, | 39 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, |
| 40 3, naclbitc::FUNC_CODE_INST_RET, Terminator, | 40 3, naclbitc::FUNC_CODE_INST_RET, Terminator, |
| 41 0, naclbitc::BLK_CODE_EXIT, Terminator, | 41 0, naclbitc::BLK_CODE_EXIT, Terminator, |
| 42 0, naclbitc::BLK_CODE_EXIT, Terminator | 42 0, naclbitc::BLK_CODE_EXIT, Terminator |
| 43 }; | 43 }; |
| 44 | 44 |
| 45 | |
| 46 // Show bitcode objdump for BitcodeRecords. | 45 // Show bitcode objdump for BitcodeRecords. |
| 47 NaClObjDumpMunger DumpMunger(BitcodeRecords, | 46 NaClObjDumpMunger DumpMunger(BitcodeRecords, |
| 48 array_lengthof(BitcodeRecords), Terminator); | 47 array_lengthof(BitcodeRecords), Terminator); |
| 49 EXPECT_FALSE(DumpMunger.runTestForAssembly("Nonexistent call arg")); | 48 EXPECT_FALSE(DumpMunger.runTestForAssembly("Nonexistent call arg")); |
| 50 EXPECT_EQ( | 49 EXPECT_EQ( |
| 51 "module { // BlockID = 8\n" | 50 "module { // BlockID = 8\n" |
| 52 " types { // BlockID = 17\n" | 51 " types { // BlockID = 17\n" |
| 53 " count 3;\n" | 52 " count 3;\n" |
| 54 " @t0 = i32;\n" | 53 " @t0 = i32;\n" |
| 55 " @t1 = void;\n" | 54 " @t1 = void;\n" |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 69 | 68 |
| 70 // Show that we get appropriate error when parsing in Subzero. | 69 // Show that we get appropriate error when parsing in Subzero. |
| 71 IceTest::SubzeroBitcodeMunger Munger( | 70 IceTest::SubzeroBitcodeMunger Munger( |
| 72 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 71 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
| 73 EXPECT_FALSE(Munger.runTest("Nonexistent call arg")); | 72 EXPECT_FALSE(Munger.runTest("Nonexistent call arg")); |
| 74 EXPECT_EQ( | 73 EXPECT_EQ( |
| 75 "Error: (66:4) Invalid function record: <34 0 4 2 100>\n", | 74 "Error: (66:4) Invalid function record: <34 0 4 2 100>\n", |
| 76 Munger.getTestResults()); | 75 Munger.getTestResults()); |
| 77 } | 76 } |
| 78 | 77 |
| 78 /// Test how we recognize alignments in alloca instructions. | |
| 79 TEST(IceParseInstsTests, AllocaAlignment) { | |
| 80 const uint64_t BitcodeRecords[] = { | |
| 81 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | |
| 82 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | |
| 83 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, | |
| 84 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | |
| 85 3, naclbitc::TYPE_CODE_VOID, Terminator, | |
| 86 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator, | |
| 87 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator, | |
| 88 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
| 89 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | |
| 90 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | |
| 91 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | |
| 92 // Note: alignment stored as 0 or log2(Alignment)+1. | |
| 93 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, 1, Terminator, | |
| 94 3, naclbitc::FUNC_CODE_INST_RET, Terminator, | |
| 95 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
| 96 0, naclbitc::BLK_CODE_EXIT, Terminator}; | |
| 97 | |
| 98 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA | |
| 99 | |
| 100 // Show text when alignment is 1. | |
| 101 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), | |
| 102 Terminator); | |
| 103 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 1")); | |
| 104 EXPECT_EQ("module { // BlockID = 8\n" | |
| 105 " types { // BlockID = 17\n" | |
| 106 " count 4;\n" | |
| 107 " @t0 = i32;\n" | |
| 108 " @t1 = void;\n" | |
| 109 " @t2 = void (i32);\n" | |
| 110 " @t3 = i8;\n" | |
| 111 " }\n" | |
| 112 " define external void @f0(i32);\n" | |
| 113 " function void @f0(i32 %p0) { // BlockID = 12\n" | |
| 114 " blocks 1;\n" | |
| 115 " %b0:\n" | |
| 116 " %v0 = alloca i8, i32 %p0, align 1;\n" | |
| 117 " ret void;\n" | |
| 118 " }\n" | |
| 119 "}\n", | |
| 120 DumpMunger.getTestResults()); | |
| 121 | |
| 122 // Show that we can handle alignment of 1. | |
| 123 IceTest::SubzeroBitcodeMunger Munger( | |
| 124 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | |
| 125 EXPECT_TRUE(Munger.runTest("Good alloca alignment 1")); | |
| 126 | |
| 127 // Show what happens when changing alignment to 0. | |
| 128 const uint64_t Align0[] = { | |
| 129 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 130 // Note: alignment stored as 0 or log2(Alignment)+1. | |
| 131 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, 0, Terminator, | |
| 132 }; | |
| 133 EXPECT_TRUE(Munger.runTest("Good alloca alignment 0", Align0, | |
| 134 array_lengthof(Align0))); | |
| 135 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 0", Align0, | |
| 136 array_lengthof(Align0))); | |
| 137 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", | |
| 138 DumpMunger.getLinesWithSubstring("alloca")); | |
| 139 | |
| 140 // Show what happens when changing alignment to 2**30. | |
| 141 const uint64_t Align30[] = { | |
| 142 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 143 // Note: alignment stored as 0 or log2(Alignment)+1. | |
|
jvoung (off chromium)
2015/01/12 18:10:06
Nit: probably don't need to repeat the note about
Karl
2015/01/14 22:03:07
Done.
| |
| 144 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, 31, Terminator, | |
| 145 }; | |
| 146 EXPECT_FALSE(Munger.runTest("Bad alloca alignment 30", Align30, | |
| 147 array_lengthof(Align30))); | |
| 148 EXPECT_EQ("Error: (62:4) Invalid function record: <19 1 31>\n", | |
| 149 Munger.getTestResults()); | |
| 150 | |
| 151 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad alloca alignment 30", Align30, | |
| 152 array_lengthof(Align30))); | |
| 153 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", | |
| 154 DumpMunger.getLinesWithSubstring("alloca")); | |
| 155 EXPECT_EQ( | |
| 156 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", | |
| 157 DumpMunger.getLinesWithSubstring("Error")); | |
| 158 | |
| 159 // Show what happens when changing alignment to 2**29. | |
| 160 const uint64_t Align29[] = { | |
| 161 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 162 // Note: alignment stored as 0 or log2(Alignment)+1. | |
| 163 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, 30, Terminator, | |
| 164 }; | |
| 165 EXPECT_TRUE(Munger.runTest("Good alloca alignment 29", Align29, | |
| 166 array_lengthof(Align29))); | |
| 167 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 29", Align29, | |
| 168 array_lengthof(Align29))); | |
| 169 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 536870912;\n", | |
| 170 DumpMunger.getLinesWithSubstring("alloca")); | |
| 171 } | |
| 172 | |
| 173 // Test how we recognize alignments in load i32 instructions. | |
| 174 TEST(IceParseInstsTests, LoadI32Alignment) { | |
| 175 const uint64_t BitcodeRecords[] = { | |
| 176 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | |
| 177 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | |
| 178 3, naclbitc::TYPE_CODE_NUMENTRY, 2, Terminator, | |
| 179 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | |
| 180 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 0, Terminator, | |
| 181 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
| 182 3, naclbitc::MODULE_CODE_FUNCTION, 1, 0, 0, 0, Terminator, | |
| 183 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | |
| 184 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | |
| 185 // Note: alignment stored as 0 or log2(Alignment)+1. | |
| 186 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 1, 0, Terminator, | |
| 187 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | |
| 188 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
| 189 0, naclbitc::BLK_CODE_EXIT, Terminator}; | |
| 190 | |
| 191 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD | |
| 192 | |
| 193 // Show text when alignment is 1. | |
| 194 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), | |
| 195 Terminator); | |
| 196 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load i32 alignment 1")); | |
| 197 EXPECT_EQ("module { // BlockID = 8\n" | |
| 198 " types { // BlockID = 17\n" | |
| 199 " count 2;\n" | |
| 200 " @t0 = i32;\n" | |
| 201 " @t1 = i32 (i32);\n" | |
| 202 " }\n" | |
| 203 " define external i32 @f0(i32);\n" | |
| 204 " function i32 @f0(i32 %p0) { // BlockID = 12\n" | |
| 205 " blocks 1;\n" | |
| 206 " %b0:\n" | |
| 207 " %v0 = load i32* %p0, align 1;\n" | |
| 208 " ret i32 %v0;\n" | |
| 209 " }\n" | |
| 210 "}\n", | |
| 211 DumpMunger.getTestResults()); | |
| 212 IceTest::SubzeroBitcodeMunger Munger( | |
| 213 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | |
| 214 EXPECT_TRUE(Munger.runTest("Good load i32 alignment 1")); | |
| 215 | |
| 216 // Show what happens when changing alignment to 0. | |
| 217 const uint64_t Align0[] = { | |
| 218 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 219 // Note: alignment stored as 0 or log2(Alignment)+1. | |
| 220 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 0, 0, Terminator, | |
| 221 }; | |
| 222 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 0", Align0, | |
| 223 array_lengthof(Align0))); | |
| 224 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 0 0>\n", | |
| 225 Munger.getTestResults()); | |
| 226 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 0", Align0, | |
| 227 array_lengthof(Align0))); | |
| 228 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" | |
| 229 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | |
| 230 DumpMunger.getLinesWithSubstring("load")); | |
| 231 | |
| 232 // Show what happens when changing alignment to 4. | |
| 233 const uint64_t Align4[] = { | |
| 234 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 235 // Note: alignment stored as 0 or log2(Alignment)+1. | |
| 236 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 3, 0, Terminator, | |
| 237 }; | |
| 238 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 4", Align4, | |
| 239 array_lengthof(Align4))); | |
| 240 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 3 0>\n", | |
| 241 Munger.getTestResults()); | |
| 242 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 4", Align4, | |
| 243 array_lengthof(Align4))); | |
| 244 EXPECT_EQ(" %v0 = load i32* %p0, align 4;\n" | |
| 245 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | |
| 246 DumpMunger.getLinesWithSubstring("load")); | |
| 247 | |
| 248 // Show what happens when changing alignment to 2**29. | |
| 249 const uint64_t Align29[] = { | |
| 250 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 251 // Note: alignment stored as 0 or log2(Alignment)+1. | |
| 252 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 30, 0, Terminator, | |
| 253 }; | |
| 254 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 29", Align29, | |
| 255 array_lengthof(Align29))); | |
| 256 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 30 0>\n", | |
| 257 Munger.getTestResults()); | |
| 258 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 29", | |
| 259 Align29, array_lengthof(Align29))); | |
| 260 EXPECT_EQ(" %v0 = load i32* %p0, align 536870912;\n" | |
| 261 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | |
| 262 DumpMunger.getLinesWithSubstring("load")); | |
| 263 | |
| 264 // Show what happens when changing alignment to 2**30. | |
| 265 const uint64_t Align30[] = { | |
| 266 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 267 // Note: alignment stored as 0 or log2(Alignment)+1. | |
| 268 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 31, 0, Terminator, | |
| 269 }; | |
| 270 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 30", Align30, | |
| 271 array_lengthof(Align30))); | |
| 272 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 31 0>\n", | |
| 273 Munger.getTestResults()); | |
| 274 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 30", | |
| 275 Align30, array_lengthof(Align30))); | |
| 276 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" | |
| 277 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | |
| 278 DumpMunger.getLinesWithSubstring("load")); | |
| 279 } | |
| 280 | |
| 281 // Test how we recognize alignments in load float instructions. | |
| 282 TEST(IceParseInstsTests, LoadFloatAlignment) { | |
| 283 const uint64_t BitcodeRecords[] = { | |
| 284 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | |
| 285 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | |
| 286 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, | |
| 287 3, naclbitc::TYPE_CODE_FLOAT, Terminator, | |
| 288 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | |
| 289 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 1, Terminator, | |
| 290 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
| 291 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | |
| 292 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | |
| 293 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | |
| 294 // Note: alignment stored as 0 or log2(Alignment)+1. | |
| 295 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 1, 0, Terminator, | |
| 296 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | |
| 297 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
| 298 0, naclbitc::BLK_CODE_EXIT, Terminator}; | |
| 299 | |
| 300 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_LOAD | |
| 301 | |
| 302 // Show text when alignment is 1. | |
| 303 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), | |
| 304 Terminator); | |
| 305 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 1")); | |
| 306 EXPECT_EQ("module { // BlockID = 8\n" | |
| 307 " types { // BlockID = 17\n" | |
| 308 " count 3;\n" | |
| 309 " @t0 = float;\n" | |
| 310 " @t1 = i32;\n" | |
| 311 " @t2 = float (i32);\n" | |
| 312 " }\n" | |
| 313 " define external float @f0(i32);\n" | |
| 314 " function float @f0(i32 %p0) { // BlockID = 12\n" | |
| 315 " blocks 1;\n" | |
| 316 " %b0:\n" | |
| 317 " %v0 = load float* %p0, align 1;\n" | |
| 318 " ret float %v0;\n" | |
| 319 " }\n" | |
| 320 "}\n", | |
| 321 DumpMunger.getTestResults()); | |
| 322 IceTest::SubzeroBitcodeMunger Munger( | |
| 323 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | |
| 324 EXPECT_TRUE(Munger.runTest("Good load float alignment 1")); | |
| 325 | |
| 326 // Show what happens when changing alignment to 0. | |
| 327 const uint64_t Align0[] = { | |
| 328 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 329 // Note: alignment stored as 0 or log2(Alignment)+1. | |
| 330 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 0, 0, Terminator, | |
| 331 }; | |
| 332 EXPECT_FALSE(Munger.runTest("Bad load float alignment 0", Align0, | |
| 333 array_lengthof(Align0))); | |
| 334 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 0 0>\n", | |
| 335 Munger.getTestResults()); | |
| 336 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 0", | |
| 337 Align0, array_lengthof(Align0))); | |
| 338 EXPECT_EQ(" %v0 = load float* %p0, align 0;\n" | |
| 339 "Error(58:4): load: Illegal alignment for float. Expects: 4\n", | |
| 340 DumpMunger.getLinesWithSubstring("load")); | |
| 341 | |
| 342 // Show what happens when changing alignment to 4. | |
| 343 const uint64_t Align4[] = { | |
| 344 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 345 // Note: alignment stored as 0 or log2(Alignment)+1. | |
| 346 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 3, 0, Terminator, | |
| 347 }; | |
| 348 EXPECT_TRUE(Munger.runTest("Good load float alignment 4", Align4, | |
| 349 array_lengthof(Align4))); | |
| 350 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 4", | |
| 351 Align4, array_lengthof(Align4))); | |
| 352 EXPECT_EQ(" %v0 = load float* %p0, align 4;\n", | |
| 353 DumpMunger.getLinesWithSubstring("load")); | |
| 354 | |
| 355 // Show what happens when changing alignment to 2**29. | |
| 356 const uint64_t Align29[] = { | |
| 357 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 358 // Note: alignment stored as 0 or log2(Alignment)+1. | |
| 359 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 30, 0, Terminator, | |
| 360 }; | |
| 361 EXPECT_FALSE(Munger.runTest("Bad load float alignment 29", Align29, | |
| 362 array_lengthof(Align29))); | |
| 363 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 30 0>\n", | |
| 364 Munger.getTestResults()); | |
| 365 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 29", | |
| 366 Align29, array_lengthof(Align29))); | |
| 367 EXPECT_EQ(" %v0 = load float* %p0, align 536870912;\n" | |
| 368 "Error(58:4): load: Illegal alignment for float. Expects: 4\n", | |
| 369 DumpMunger.getLinesWithSubstring("load")); | |
| 370 | |
| 371 // Show what happens when changing alignment to 2**30. | |
| 372 const uint64_t Align30[] = { | |
| 373 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 374 // Note: alignment stored as 0 or log2(Alignment)+1. | |
| 375 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 31, 0, Terminator, | |
| 376 }; | |
| 377 EXPECT_FALSE(Munger.runTest("Bad load float alignment 30", Align30, | |
| 378 array_lengthof(Align30))); | |
| 379 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 31 0>\n", | |
| 380 Munger.getTestResults()); | |
| 381 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 30", | |
| 382 Align30, array_lengthof(Align30))); | |
| 383 EXPECT_EQ(" %v0 = load float* %p0, align 0;\n" | |
| 384 "Error(58:4): load: Illegal alignment for float. Expects: 4\n", | |
| 385 DumpMunger.getLinesWithSubstring("load")); | |
| 386 } | |
| 387 | |
| 388 // Test how we recognize alignments in store instructions. | |
| 389 TEST(NaClParseInstsTests, StoreAlignment) { | |
| 390 const uint64_t BitcodeRecords[] = { | |
| 391 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | |
| 392 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | |
| 393 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, | |
| 394 3, naclbitc::TYPE_CODE_FLOAT, Terminator, | |
| 395 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | |
| 396 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 1, 0, Terminator, | |
| 397 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
| 398 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | |
| 399 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | |
| 400 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | |
| 401 // Note: alignment stored as 0 or log2(Alignment)+1. | |
| 402 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 1, Terminator, | |
| 403 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | |
| 404 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
| 405 0, naclbitc::BLK_CODE_EXIT, Terminator}; | |
| 406 | |
| 407 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_LOAD | |
|
jvoung (off chromium)
2015/01/12 18:10:06
STORE
Karl
2015/01/14 22:03:07
Done.
| |
| 408 | |
| 409 // Show text when alignment is 1. | |
| 410 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), | |
| 411 Terminator); | |
| 412 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good Store Alignment 1")); | |
| 413 EXPECT_EQ("module { // BlockID = 8\n" | |
| 414 " types { // BlockID = 17\n" | |
| 415 " count 3;\n" | |
| 416 " @t0 = float;\n" | |
| 417 " @t1 = i32;\n" | |
| 418 " @t2 = float (i32, float);\n" | |
| 419 " }\n" | |
| 420 " define external float @f0(i32, float);\n" | |
| 421 " function float @f0(i32 %p0, float %p1) { // BlockID = 12\n" | |
| 422 " blocks 1;\n" | |
| 423 " %b0:\n" | |
| 424 " store float %p1, float* %p0, align 1;\n" | |
| 425 " ret float %p1;\n" | |
| 426 " }\n" | |
| 427 "}\n", | |
| 428 DumpMunger.getTestResults()); | |
| 429 IceTest::SubzeroBitcodeMunger Munger( | |
| 430 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | |
| 431 EXPECT_TRUE(Munger.runTest("Good store alignment")); | |
| 432 | |
| 433 // Show what happens when changing alignment to 0. | |
| 434 const uint64_t Align0[] = { | |
| 435 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 436 // Note: alignment stored as 0 or log2(Alignment)+1. | |
| 437 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 0, Terminator, | |
| 438 }; | |
| 439 EXPECT_FALSE( | |
| 440 Munger.runTest("Bad store alignment 0", Align0, array_lengthof(Align0))); | |
| 441 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 0>\n", | |
| 442 Munger.getTestResults()); | |
| 443 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 0", Align0, | |
| 444 array_lengthof(Align0))); | |
| 445 EXPECT_EQ(" store float %p1, float* %p0, align 0;\n" | |
| 446 "Error(62:4): store: Illegal alignment for float. Expects: 4\n", | |
| 447 DumpMunger.getLinesWithSubstring("store")); | |
| 448 | |
| 449 // Show what happens when changing alignment to 4. | |
| 450 const uint64_t Align4[] = { | |
| 451 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 452 // Note: alignment stored as 0 or log2(Alignment)+1. | |
| 453 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 3, Terminator, | |
| 454 }; | |
| 455 EXPECT_TRUE( | |
| 456 Munger.runTest("Bad store alignment 4", Align4, array_lengthof(Align4))); | |
| 457 EXPECT_TRUE(DumpMunger.runTestForAssembly("Bad store alignment 4", Align4, | |
|
jvoung (off chromium)
2015/01/12 18:10:06
Shouldn't be "Bad" if it returns true
Karl
2015/01/14 22:03:07
Done.
| |
| 458 array_lengthof(Align4))); | |
| 459 | |
| 460 // Show what happens when changing alignment to 8. | |
| 461 const uint64_t Align8[] = { | |
| 462 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 463 // Note: alignment stored as 0 or log2(Alignment)+1. | |
| 464 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 4, Terminator, | |
| 465 }; | |
| 466 EXPECT_FALSE( | |
| 467 Munger.runTest("Bad store alignment 8", Align8, array_lengthof(Align8))); | |
| 468 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 4>\n", | |
| 469 Munger.getTestResults()); | |
| 470 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 8", Align8, | |
| 471 array_lengthof(Align8))); | |
| 472 EXPECT_EQ(" store float %p1, float* %p0, align 8;\n" | |
| 473 "Error(62:4): store: Illegal alignment for float. Expects: 4\n", | |
|
jvoung (off chromium)
2015/01/12 18:10:06
I guess technically 4 or 1 =)
Karl
2015/01/14 22:03:08
Acknowledged.
This problem needs to be fixed in L
| |
| 474 DumpMunger.getLinesWithSubstring("store")); | |
| 475 | |
| 476 // Show what happens when changing alignment to 2**29. | |
| 477 const uint64_t Align29[] = { | |
| 478 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 479 // Note: alignment stored as 0 or log2(Alignment)+1. | |
| 480 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 30, Terminator, | |
| 481 }; | |
| 482 EXPECT_FALSE(Munger.runTest("Bad store alignment 29", Align29, | |
| 483 array_lengthof(Align29))); | |
| 484 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 30>\n", | |
| 485 Munger.getTestResults()); | |
| 486 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 29", Align29, | |
| 487 array_lengthof(Align29))); | |
| 488 EXPECT_EQ(" store float %p1, float* %p0, align 536870912;\n" | |
| 489 "Error(62:4): store: Illegal alignment for float. Expects: 4\n", | |
| 490 DumpMunger.getLinesWithSubstring("store")); | |
| 491 | |
| 492 // Show what happens when changing alignment to 2**30. | |
| 493 const uint64_t Align30[] = { | |
| 494 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 495 // Note: alignment stored as 0 or log2(Alignment)+1. | |
| 496 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 31, Terminator, | |
| 497 }; | |
| 498 EXPECT_FALSE(Munger.runTest("Bad store alignment 30", Align30, | |
| 499 array_lengthof(Align30))); | |
| 500 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 31>\n", | |
| 501 Munger.getTestResults()); | |
| 502 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad Store alignment 30", Align30, | |
| 503 array_lengthof(Align30))); | |
| 504 EXPECT_EQ(" store float %p1, float* %p0, align 0;\n" | |
| 505 "Error(62:4): store: Illegal alignment for float. Expects: 4\n", | |
| 506 DumpMunger.getLinesWithSubstring("store")); | |
| 507 } | |
| 508 | |
| 79 } // end of anonymous namespace | 509 } // end of anonymous namespace |
| OLD | NEW |