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 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 49 // Show bitcode objdump for BitcodeRecords. | 49 // Show bitcode objdump for BitcodeRecords. |
| 50 NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords)); | 50 NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords)); |
| 51 EXPECT_FALSE(DumpMunger.runTest()); | 51 EXPECT_FALSE(DumpMunger.runTest()); |
| 52 EXPECT_EQ(" 66:4| 3: <34, 0, 4, 2, 100> | call void @f0(i32 " | 52 EXPECT_EQ(" 66:4| 3: <34, 0, 4, 2, 100> | call void @f0(i32 " |
| 53 "%p0, i32 @f0);\n" | 53 "%p0, i32 @f0);\n" |
| 54 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n", | 54 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n", |
| 55 DumpMunger.getLinesWithSubstring("66:4")); | 55 DumpMunger.getLinesWithSubstring("66:4")); |
| 56 | 56 |
| 57 // Show that we get appropriate error when parsing in Subzero. | 57 // Show that we get appropriate error when parsing in Subzero. |
| 58 IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); | 58 IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); |
| 59 EXPECT_FALSE(Munger.runTest()); | 59 EXPECT_FALSE(Munger.runTest()); |
|
Karl
2015/06/11 19:58:54
Why not add an (optional) flag to runTest() in (un
John
2015/06/11 20:42:09
There was precedent to doing this (e.g., lines 52-
| |
| 60 EXPECT_EQ("Error(66:4): Invalid function record: <34 0 4 2 100>\n", | 60 EXPECT_EQ("\t.type\t__Sz_block_profile_info,@object\n" |
|
Jim Stichnoth
2015/06/11 19:07:14
Can you factor this string into a const char *, or
John
2015/06/11 20:42:09
Not easily. EXPECT_EQ expands to another another m
| |
| 61 "\t.section\t.rodata,\"a\",@progbits\n" | |
| 62 "\t.globl\t__Sz_block_profile_info\n" | |
| 63 "\t.align\t8" | |
| 64 "\n__Sz_block_profile_info:\n" | |
| 65 "\t.zero\t8\n" | |
| 66 "\t.size\t__Sz_block_profile_info, 8\n" | |
| 67 "Error(66:4): Invalid function record: <34 0 4 2 100>\n", | |
| 61 Munger.getTestResults()); | 68 Munger.getTestResults()); |
| 62 | 69 |
| 63 // Show that we generate a fatal error when not allowing error recovery. | 70 // Show that we generate a fatal error when not allowing error recovery. |
| 64 Munger.Flags.setAllowErrorRecovery(false); | 71 Munger.Flags.setAllowErrorRecovery(false); |
| 65 EXPECT_DEATH(Munger.runTest(), ".*ERROR: Unable to continue.*"); | 72 EXPECT_DEATH(Munger.runTest(), ".*ERROR: Unable to continue.*"); |
| 66 } | 73 } |
| 67 | 74 |
| 68 /// Test how we recognize alignments in alloca instructions. | 75 /// Test how we recognize alignments in alloca instructions. |
| 69 TEST(IceParseInstsTests, AllocaAlignment) { | 76 TEST(IceParseInstsTests, AllocaAlignment) { |
| 70 const uint64_t BitcodeRecords[] = { | 77 const uint64_t BitcodeRecords[] = { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 106 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align0))); | 113 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align0))); |
| 107 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", | 114 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", |
| 108 DumpMunger.getLinesWithSubstring("alloca")); | 115 DumpMunger.getLinesWithSubstring("alloca")); |
| 109 | 116 |
| 110 // Show what happens when changing alignment to 2**30. | 117 // Show what happens when changing alignment to 2**30. |
| 111 const uint64_t Align30[] = { | 118 const uint64_t Align30[] = { |
| 112 ReplaceIndex, NaClMungedBitcode::Replace, | 119 ReplaceIndex, NaClMungedBitcode::Replace, |
| 113 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, | 120 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, |
| 114 }; | 121 }; |
| 115 EXPECT_FALSE(Munger.runTest(ARRAY(Align30))); | 122 EXPECT_FALSE(Munger.runTest(ARRAY(Align30))); |
| 116 EXPECT_EQ("Error(62:4): Invalid function record: <19 1 31>\n", | 123 EXPECT_EQ("\t.type\t__Sz_block_profile_info,@object\n" |
| 124 "\t.section\t.rodata,\"a\",@progbits\n" | |
| 125 "\t.globl\t__Sz_block_profile_info\n" | |
| 126 "\t.align\t8" | |
| 127 "\n__Sz_block_profile_info:\n" | |
| 128 "\t.zero\t8\n" | |
| 129 "\t.size\t__Sz_block_profile_info, 8\n" | |
| 130 "Error(62:4): Invalid function record: <19 1 31>\n", | |
| 117 Munger.getTestResults()); | 131 Munger.getTestResults()); |
| 118 | 132 |
| 119 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); | 133 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); |
| 120 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", | 134 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", |
| 121 DumpMunger.getLinesWithSubstring("alloca")); | 135 DumpMunger.getLinesWithSubstring("alloca")); |
| 122 EXPECT_EQ( | 136 EXPECT_EQ( |
| 123 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", | 137 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", |
| 124 DumpMunger.getLinesWithSubstring("Error")); | 138 DumpMunger.getLinesWithSubstring("Error")); |
| 125 | 139 |
| 126 // Show what happens when changing alignment to 2**29. | 140 // Show what happens when changing alignment to 2**29. |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 161 DumpMunger.getLinesWithSubstring("58:4")); | 175 DumpMunger.getLinesWithSubstring("58:4")); |
| 162 IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); | 176 IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); |
| 163 EXPECT_TRUE(Munger.runTest()); | 177 EXPECT_TRUE(Munger.runTest()); |
| 164 | 178 |
| 165 // Show what happens when changing alignment to 0. | 179 // Show what happens when changing alignment to 0. |
| 166 const uint64_t Align0[] = { | 180 const uint64_t Align0[] = { |
| 167 ReplaceIndex, NaClMungedBitcode::Replace, | 181 ReplaceIndex, NaClMungedBitcode::Replace, |
| 168 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, | 182 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, |
| 169 }; | 183 }; |
| 170 EXPECT_FALSE(Munger.runTest(ARRAY(Align0))); | 184 EXPECT_FALSE(Munger.runTest(ARRAY(Align0))); |
| 171 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 0 0>\n", | 185 EXPECT_EQ("\t.type\t__Sz_block_profile_info,@object\n" |
| 186 "\t.section\t.rodata,\"a\",@progbits\n" | |
| 187 "\t.globl\t__Sz_block_profile_info\n" | |
| 188 "\t.align\t8" | |
| 189 "\n__Sz_block_profile_info:\n" | |
| 190 "\t.zero\t8\n" | |
| 191 "\t.size\t__Sz_block_profile_info, 8\n" | |
| 192 "Error(58:4): Invalid function record: <20 1 0 0>\n", | |
| 172 Munger.getTestResults()); | 193 Munger.getTestResults()); |
| 173 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0))); | 194 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0))); |
| 174 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" | 195 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" |
| 175 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 196 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 176 DumpMunger.getLinesWithSubstring("load")); | 197 DumpMunger.getLinesWithSubstring("load")); |
| 177 | 198 |
| 178 // Show what happens when changing alignment to 4. | 199 // Show what happens when changing alignment to 4. |
| 179 const uint64_t Align4[] = { | 200 const uint64_t Align4[] = { |
| 180 ReplaceIndex, NaClMungedBitcode::Replace, | 201 ReplaceIndex, NaClMungedBitcode::Replace, |
| 181 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, | 202 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, |
| 182 }; | 203 }; |
| 183 EXPECT_FALSE(Munger.runTest(ARRAY(Align4))); | 204 EXPECT_FALSE(Munger.runTest(ARRAY(Align4))); |
| 184 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 3 0>\n", | 205 EXPECT_EQ("\t.type\t__Sz_block_profile_info,@object\n" |
| 206 "\t.section\t.rodata,\"a\",@progbits\n" | |
| 207 "\t.globl\t__Sz_block_profile_info\n" | |
| 208 "\t.align\t8" | |
| 209 "\n__Sz_block_profile_info:\n" | |
| 210 "\t.zero\t8\n" | |
| 211 "\t.size\t__Sz_block_profile_info, 8\n" | |
| 212 "Error(58:4): Invalid function record: <20 1 3 0>\n", | |
| 185 Munger.getTestResults()); | 213 Munger.getTestResults()); |
| 186 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align4))); | 214 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align4))); |
| 187 EXPECT_EQ(" %v0 = load i32* %p0, align 4;\n" | 215 EXPECT_EQ(" %v0 = load i32* %p0, align 4;\n" |
| 188 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 216 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 189 DumpMunger.getLinesWithSubstring("load")); | 217 DumpMunger.getLinesWithSubstring("load")); |
| 190 | 218 |
| 191 // Show what happens when changing alignment to 2**29. | 219 // Show what happens when changing alignment to 2**29. |
| 192 const uint64_t Align29[] = { | 220 const uint64_t Align29[] = { |
| 193 ReplaceIndex, NaClMungedBitcode::Replace, | 221 ReplaceIndex, NaClMungedBitcode::Replace, |
| 194 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, | 222 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, |
| 195 }; | 223 }; |
| 196 EXPECT_FALSE(Munger.runTest(ARRAY(Align29))); | 224 EXPECT_FALSE(Munger.runTest(ARRAY(Align29))); |
| 197 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 30 0>\n", | 225 EXPECT_EQ("\t.type\t__Sz_block_profile_info,@object\n" |
| 226 "\t.section\t.rodata,\"a\",@progbits\n" | |
| 227 "\t.globl\t__Sz_block_profile_info\n" | |
| 228 "\t.align\t8" | |
| 229 "\n__Sz_block_profile_info:\n" | |
| 230 "\t.zero\t8\n" | |
| 231 "\t.size\t__Sz_block_profile_info, 8\n" | |
| 232 "Error(58:4): Invalid function record: <20 1 30 0>\n", | |
| 198 Munger.getTestResults()); | 233 Munger.getTestResults()); |
| 199 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29))); | 234 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29))); |
| 200 EXPECT_EQ(" %v0 = load i32* %p0, align 536870912;\n" | 235 EXPECT_EQ(" %v0 = load i32* %p0, align 536870912;\n" |
| 201 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 236 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 202 DumpMunger.getLinesWithSubstring("load")); | 237 DumpMunger.getLinesWithSubstring("load")); |
| 203 | 238 |
| 204 // Show what happens when changing alignment to 2**30. | 239 // Show what happens when changing alignment to 2**30. |
| 205 const uint64_t Align30[] = { | 240 const uint64_t Align30[] = { |
| 206 ReplaceIndex, NaClMungedBitcode::Replace, | 241 ReplaceIndex, NaClMungedBitcode::Replace, |
| 207 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, | 242 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, |
| 208 }; | 243 }; |
| 209 EXPECT_FALSE(Munger.runTest(ARRAY(Align30))); | 244 EXPECT_FALSE(Munger.runTest(ARRAY(Align30))); |
| 210 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 31 0>\n", | 245 EXPECT_EQ("\t.type\t__Sz_block_profile_info,@object\n" |
| 246 "\t.section\t.rodata,\"a\",@progbits\n" | |
| 247 "\t.globl\t__Sz_block_profile_info\n" | |
| 248 "\t.align\t8" | |
| 249 "\n__Sz_block_profile_info:\n" | |
| 250 "\t.zero\t8\n" | |
| 251 "\t.size\t__Sz_block_profile_info, 8\n" | |
| 252 "Error(58:4): Invalid function record: <20 1 31 0>\n", | |
| 211 Munger.getTestResults()); | 253 Munger.getTestResults()); |
| 212 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); | 254 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); |
| 213 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" | 255 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" |
| 214 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 256 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
| 215 DumpMunger.getLinesWithSubstring("load")); | 257 DumpMunger.getLinesWithSubstring("load")); |
| 216 } | 258 } |
| 217 | 259 |
| 218 // Test how we recognize alignments in load float instructions. | 260 // Test how we recognize alignments in load float instructions. |
| 219 TEST(IceParseInstsTests, LoadFloatAlignment) { | 261 TEST(IceParseInstsTests, LoadFloatAlignment) { |
| 220 const uint64_t BitcodeRecords[] = { | 262 const uint64_t BitcodeRecords[] = { |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 243 DumpMunger.getLinesWithSubstring("58:4")); | 285 DumpMunger.getLinesWithSubstring("58:4")); |
| 244 IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); | 286 IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); |
| 245 EXPECT_TRUE(Munger.runTest()); | 287 EXPECT_TRUE(Munger.runTest()); |
| 246 | 288 |
| 247 // Show what happens when changing alignment to 0. | 289 // Show what happens when changing alignment to 0. |
| 248 const uint64_t Align0[] = { | 290 const uint64_t Align0[] = { |
| 249 ReplaceIndex, NaClMungedBitcode::Replace, | 291 ReplaceIndex, NaClMungedBitcode::Replace, |
| 250 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, | 292 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, |
| 251 }; | 293 }; |
| 252 EXPECT_FALSE(Munger.runTest(ARRAY(Align0))); | 294 EXPECT_FALSE(Munger.runTest(ARRAY(Align0))); |
| 253 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 0 0>\n", | 295 EXPECT_EQ("\t.type\t__Sz_block_profile_info,@object\n" |
| 296 "\t.section\t.rodata,\"a\",@progbits\n" | |
| 297 "\t.globl\t__Sz_block_profile_info\n" | |
| 298 "\t.align\t8" | |
| 299 "\n__Sz_block_profile_info:\n" | |
| 300 "\t.zero\t8\n" | |
| 301 "\t.size\t__Sz_block_profile_info, 8\n" | |
| 302 "Error(58:4): Invalid function record: <20 1 0 0>\n", | |
| 254 Munger.getTestResults()); | 303 Munger.getTestResults()); |
| 255 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0))); | 304 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0))); |
| 256 EXPECT_EQ( | 305 EXPECT_EQ( |
| 257 " %v0 = load float* %p0, align 0;\n" | 306 " %v0 = load float* %p0, align 0;\n" |
| 258 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", | 307 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
| 259 DumpMunger.getLinesWithSubstring("load")); | 308 DumpMunger.getLinesWithSubstring("load")); |
| 260 | 309 |
| 261 // Show what happens when changing alignment to 4. | 310 // Show what happens when changing alignment to 4. |
| 262 const uint64_t Align4[] = { | 311 const uint64_t Align4[] = { |
| 263 ReplaceIndex, NaClMungedBitcode::Replace, | 312 ReplaceIndex, NaClMungedBitcode::Replace, |
| 264 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, | 313 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, |
| 265 }; | 314 }; |
| 266 EXPECT_TRUE(Munger.runTest(ARRAY(Align4))); | 315 EXPECT_TRUE(Munger.runTest(ARRAY(Align4))); |
| 267 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align4))); | 316 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align4))); |
| 268 EXPECT_EQ(" %v0 = load float* %p0, align 4;\n", | 317 EXPECT_EQ(" %v0 = load float* %p0, align 4;\n", |
| 269 DumpMunger.getLinesWithSubstring("load")); | 318 DumpMunger.getLinesWithSubstring("load")); |
| 270 | 319 |
| 271 const uint64_t Align29[] = { | 320 const uint64_t Align29[] = { |
| 272 ReplaceIndex, NaClMungedBitcode::Replace, | 321 ReplaceIndex, NaClMungedBitcode::Replace, |
| 273 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, | 322 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, |
| 274 }; | 323 }; |
| 275 EXPECT_FALSE(Munger.runTest(ARRAY(Align29))); | 324 EXPECT_FALSE(Munger.runTest(ARRAY(Align29))); |
| 276 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 30 0>\n", | 325 EXPECT_EQ("\t.type\t__Sz_block_profile_info,@object\n" |
| 326 "\t.section\t.rodata,\"a\",@progbits\n" | |
| 327 "\t.globl\t__Sz_block_profile_info\n" | |
| 328 "\t.align\t8" | |
| 329 "\n__Sz_block_profile_info:\n" | |
| 330 "\t.zero\t8\n" | |
| 331 "\t.size\t__Sz_block_profile_info, 8\n" | |
| 332 "Error(58:4): Invalid function record: <20 1 30 0>\n", | |
| 277 Munger.getTestResults()); | 333 Munger.getTestResults()); |
| 278 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29))); | 334 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29))); |
| 279 EXPECT_EQ( | 335 EXPECT_EQ( |
| 280 " %v0 = load float* %p0, align 536870912;\n" | 336 " %v0 = load float* %p0, align 536870912;\n" |
| 281 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", | 337 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
| 282 DumpMunger.getLinesWithSubstring("load")); | 338 DumpMunger.getLinesWithSubstring("load")); |
| 283 | 339 |
| 284 // Show what happens when changing alignment to 2**30. | 340 // Show what happens when changing alignment to 2**30. |
| 285 const uint64_t Align30[] = { | 341 const uint64_t Align30[] = { |
| 286 ReplaceIndex, NaClMungedBitcode::Replace, | 342 ReplaceIndex, NaClMungedBitcode::Replace, |
| 287 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, | 343 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, |
| 288 }; | 344 }; |
| 289 EXPECT_FALSE(Munger.runTest(ARRAY(Align30))); | 345 EXPECT_FALSE(Munger.runTest(ARRAY(Align30))); |
| 290 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 31 0>\n", | 346 EXPECT_EQ("\t.type\t__Sz_block_profile_info,@object\n" |
| 347 "\t.section\t.rodata,\"a\",@progbits\n" | |
| 348 "\t.globl\t__Sz_block_profile_info\n" | |
| 349 "\t.align\t8" | |
| 350 "\n__Sz_block_profile_info:\n" | |
| 351 "\t.zero\t8\n" | |
| 352 "\t.size\t__Sz_block_profile_info, 8\n" | |
| 353 "Error(58:4): Invalid function record: <20 1 31 0>\n", | |
| 291 Munger.getTestResults()); | 354 Munger.getTestResults()); |
| 292 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); | 355 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); |
| 293 EXPECT_EQ( | 356 EXPECT_EQ( |
| 294 " %v0 = load float* %p0, align 0;\n" | 357 " %v0 = load float* %p0, align 0;\n" |
| 295 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", | 358 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
| 296 DumpMunger.getLinesWithSubstring("load")); | 359 DumpMunger.getLinesWithSubstring("load")); |
| 297 } | 360 } |
| 298 | 361 |
| 299 // Test how we recognize alignments in store instructions. | 362 // Test how we recognize alignments in store instructions. |
| 300 TEST(NaClParseInstsTests, StoreAlignment) { | 363 TEST(NaClParseInstsTests, StoreAlignment) { |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 326 IceTest::SubzeroBitcodeMunger Munger( | 389 IceTest::SubzeroBitcodeMunger Munger( |
| 327 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 390 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
| 328 EXPECT_TRUE(Munger.runTest()); | 391 EXPECT_TRUE(Munger.runTest()); |
| 329 | 392 |
| 330 // Show what happens when changing alignment to 0. | 393 // Show what happens when changing alignment to 0. |
| 331 const uint64_t Align0[] = { | 394 const uint64_t Align0[] = { |
| 332 ReplaceIndex, NaClMungedBitcode::Replace, | 395 ReplaceIndex, NaClMungedBitcode::Replace, |
| 333 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, | 396 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, |
| 334 }; | 397 }; |
| 335 EXPECT_FALSE(Munger.runTest(ARRAY(Align0))); | 398 EXPECT_FALSE(Munger.runTest(ARRAY(Align0))); |
| 336 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 0>\n", | 399 EXPECT_EQ("\t.type\t__Sz_block_profile_info,@object\n" |
| 400 "\t.section\t.rodata,\"a\",@progbits\n" | |
| 401 "\t.globl\t__Sz_block_profile_info\n" | |
| 402 "\t.align\t8" | |
| 403 "\n__Sz_block_profile_info:\n" | |
| 404 "\t.zero\t8\n" | |
| 405 "\t.size\t__Sz_block_profile_info, 8\n" | |
| 406 "Error(62:4): Invalid function record: <24 2 1 0>\n", | |
| 337 Munger.getTestResults()); | 407 Munger.getTestResults()); |
| 338 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0))); | 408 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0))); |
| 339 EXPECT_EQ( | 409 EXPECT_EQ( |
| 340 " store float %p1, float* %p0, align 0;\n" | 410 " store float %p1, float* %p0, align 0;\n" |
| 341 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 411 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 342 DumpMunger.getLinesWithSubstring("store")); | 412 DumpMunger.getLinesWithSubstring("store")); |
| 343 | 413 |
| 344 // Show what happens when changing alignment to 4. | 414 // Show what happens when changing alignment to 4. |
| 345 const uint64_t Align4[] = { | 415 const uint64_t Align4[] = { |
| 346 ReplaceIndex, NaClMungedBitcode::Replace, | 416 ReplaceIndex, NaClMungedBitcode::Replace, |
| 347 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(2), Terminator, | 417 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(2), Terminator, |
| 348 }; | 418 }; |
| 349 EXPECT_TRUE(Munger.runTest(ARRAY(Align4))); | 419 EXPECT_TRUE(Munger.runTest(ARRAY(Align4))); |
| 350 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align4))); | 420 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align4))); |
| 351 | 421 |
| 352 // Show what happens when changing alignment to 8. | 422 // Show what happens when changing alignment to 8. |
| 353 const uint64_t Align8[] = { | 423 const uint64_t Align8[] = { |
| 354 ReplaceIndex, NaClMungedBitcode::Replace, | 424 ReplaceIndex, NaClMungedBitcode::Replace, |
| 355 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(3), Terminator, | 425 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(3), Terminator, |
| 356 }; | 426 }; |
| 357 EXPECT_FALSE(Munger.runTest(ARRAY(Align8))); | 427 EXPECT_FALSE(Munger.runTest(ARRAY(Align8))); |
| 358 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 4>\n", | 428 EXPECT_EQ("\t.type\t__Sz_block_profile_info,@object\n" |
| 429 "\t.section\t.rodata,\"a\",@progbits\n" | |
| 430 "\t.globl\t__Sz_block_profile_info\n" | |
| 431 "\t.align\t8" | |
| 432 "\n__Sz_block_profile_info:\n" | |
| 433 "\t.zero\t8\n" | |
| 434 "\t.size\t__Sz_block_profile_info, 8\n" | |
| 435 "Error(62:4): Invalid function record: <24 2 1 4>\n", | |
| 359 Munger.getTestResults()); | 436 Munger.getTestResults()); |
| 360 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align8))); | 437 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align8))); |
| 361 EXPECT_EQ( | 438 EXPECT_EQ( |
| 362 " store float %p1, float* %p0, align 8;\n" | 439 " store float %p1, float* %p0, align 8;\n" |
| 363 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 440 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 364 DumpMunger.getLinesWithSubstring("store")); | 441 DumpMunger.getLinesWithSubstring("store")); |
| 365 | 442 |
| 366 // Show what happens when changing alignment to 2**29. | 443 // Show what happens when changing alignment to 2**29. |
| 367 const uint64_t Align29[] = { | 444 const uint64_t Align29[] = { |
| 368 ReplaceIndex, NaClMungedBitcode::Replace, | 445 ReplaceIndex, NaClMungedBitcode::Replace, |
| 369 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(29), Terminator, | 446 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(29), Terminator, |
| 370 }; | 447 }; |
| 371 EXPECT_FALSE(Munger.runTest(ARRAY(Align29))); | 448 EXPECT_FALSE(Munger.runTest(ARRAY(Align29))); |
| 372 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 30>\n", | 449 EXPECT_EQ("\t.type\t__Sz_block_profile_info,@object\n" |
| 450 "\t.section\t.rodata,\"a\",@progbits\n" | |
| 451 "\t.globl\t__Sz_block_profile_info\n" | |
| 452 "\t.align\t8" | |
| 453 "\n__Sz_block_profile_info:\n" | |
| 454 "\t.zero\t8\n" | |
| 455 "\t.size\t__Sz_block_profile_info, 8\n" | |
| 456 "Error(62:4): Invalid function record: <24 2 1 30>\n", | |
| 373 Munger.getTestResults()); | 457 Munger.getTestResults()); |
| 374 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29))); | 458 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29))); |
| 375 EXPECT_EQ( | 459 EXPECT_EQ( |
| 376 " store float %p1, float* %p0, align 536870912;\n" | 460 " store float %p1, float* %p0, align 536870912;\n" |
| 377 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 461 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 378 DumpMunger.getLinesWithSubstring("store")); | 462 DumpMunger.getLinesWithSubstring("store")); |
| 379 | 463 |
| 380 const uint64_t Align30[] = { | 464 const uint64_t Align30[] = { |
| 381 ReplaceIndex, NaClMungedBitcode::Replace, | 465 ReplaceIndex, NaClMungedBitcode::Replace, |
| 382 // Note: alignment stored as 0 or log2(Alignment)+1. | 466 // Note: alignment stored as 0 or log2(Alignment)+1. |
| 383 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, | 467 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, |
| 384 }; | 468 }; |
| 385 EXPECT_FALSE(Munger.runTest(ARRAY(Align30))); | 469 EXPECT_FALSE(Munger.runTest(ARRAY(Align30))); |
| 386 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 31>\n", | 470 EXPECT_EQ("\t.type\t__Sz_block_profile_info,@object\n" |
| 471 "\t.section\t.rodata,\"a\",@progbits\n" | |
| 472 "\t.globl\t__Sz_block_profile_info\n" | |
| 473 "\t.align\t8" | |
| 474 "\n__Sz_block_profile_info:\n" | |
| 475 "\t.zero\t8\n" | |
| 476 "\t.size\t__Sz_block_profile_info, 8\n" | |
| 477 "Error(62:4): Invalid function record: <24 2 1 31>\n", | |
| 387 Munger.getTestResults()); | 478 Munger.getTestResults()); |
| 388 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); | 479 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); |
| 389 EXPECT_EQ( | 480 EXPECT_EQ( |
| 390 " store float %p1, float* %p0, align 0;\n" | 481 " store float %p1, float* %p0, align 0;\n" |
| 391 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 482 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
| 392 DumpMunger.getLinesWithSubstring("store")); | 483 DumpMunger.getLinesWithSubstring("store")); |
| 393 } | 484 } |
| 394 | 485 |
| 395 } // end of anonymous namespace | 486 } // end of anonymous namespace |
| OLD | NEW |