Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 //===- llvm/unittest/Bitcode/NaClParseInstsTest.cpp ----------------------===// | 1 //===- llvm/unittest/Bitcode/NaClParseInstsTest.cpp ----------------------===// |
| 2 // Tests parser for PNaCl bitcode instructions. | 2 // Tests parser for PNaCl bitcode instructions. |
| 3 // | 3 // |
| 4 // The LLVM Compiler Infrastructure | 4 // The LLVM Compiler Infrastructure |
| 5 // | 5 // |
| 6 // This file is distributed under the University of Illinois Open Source | 6 // This file is distributed under the University of Illinois Open Source |
| 7 // License. See LICENSE.TXT for details. | 7 // License. See LICENSE.TXT for details. |
| 8 // | 8 // |
| 9 //===----------------------------------------------------------------------===// | 9 //===----------------------------------------------------------------------===// |
| 10 | 10 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 72 | 72 |
| 73 NaClParseBitcodeMunger Munger(BitcodeRecords, | 73 NaClParseBitcodeMunger Munger(BitcodeRecords, |
| 74 array_lengthof(BitcodeRecords), Terminator); | 74 array_lengthof(BitcodeRecords), Terminator); |
| 75 EXPECT_FALSE(Munger.runTest("Nonexistant call arg", true)); | 75 EXPECT_FALSE(Munger.runTest("Nonexistant call arg", true)); |
| 76 EXPECT_EQ( | 76 EXPECT_EQ( |
| 77 "Error: Invalid call argument: Index 1\n" | 77 "Error: Invalid call argument: Index 1\n" |
| 78 "Error: Invalid value in record\n", | 78 "Error: Invalid value in record\n", |
| 79 Munger.getTestResults()); | 79 Munger.getTestResults()); |
| 80 } | 80 } |
| 81 | 81 |
| 82 /// Tests if we recognize when alignment gets too large. | |
|
jvoung (off chromium)
2014/12/16 23:24:39
nit: maybe change Alloc - >"Alloca" to be a bit mo
Karl
2014/12/17 20:52:38
Done.
| |
| 83 TEST(NaClParseInstsTests, BadAllocInstAlignment) { | |
| 84 const uint64_t BitcodeRecords[] = { | |
| 85 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | |
| 86 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | |
| 87 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, | |
| 88 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | |
| 89 3, naclbitc::TYPE_CODE_VOID, Terminator, | |
| 90 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator, | |
| 91 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator, | |
| 92 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
| 93 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | |
| 94 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | |
| 95 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | |
| 96 // Note: alignment stored as Log32_32(Alignment)+1. | |
| 97 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, 1, Terminator, | |
| 98 3, naclbitc::FUNC_CODE_INST_RET, Terminator, | |
| 99 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
| 100 0, naclbitc::BLK_CODE_EXIT, Terminator | |
| 101 }; | |
| 102 | |
| 103 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA | |
| 104 | |
| 105 // Show text of base input. | |
| 106 NaClObjDumpMunger DumpMunger(BitcodeRecords, | |
| 107 array_lengthof(BitcodeRecords), Terminator); | |
| 108 EXPECT_TRUE(DumpMunger.runTestForAssembly("BadAllocInstAlignment")); | |
| 109 EXPECT_EQ( | |
| 110 "module { // BlockID = 8\n" | |
| 111 " types { // BlockID = 17\n" | |
| 112 " count 4;\n" | |
| 113 " @t0 = i32;\n" | |
| 114 " @t1 = void;\n" | |
| 115 " @t2 = void (i32);\n" | |
| 116 " @t3 = i8;\n" | |
| 117 " }\n" | |
| 118 " define external void @f0(i32);\n" | |
| 119 " function void @f0(i32 %p0) { // BlockID = 12\n" | |
| 120 " blocks 1;\n" | |
| 121 " %b0:\n" | |
| 122 " %v0 = alloca i8, i32 %p0, align 1;\n" | |
| 123 " ret void;\n" | |
| 124 " }\n" | |
| 125 "}\n", | |
| 126 DumpMunger.getTestResults()); | |
| 127 | |
| 128 NaClParseBitcodeMunger Munger(BitcodeRecords, | |
| 129 array_lengthof(BitcodeRecords), Terminator); | |
| 130 EXPECT_TRUE(Munger.runTest("BadAllocInstAlignment", true)); | |
| 131 EXPECT_EQ( | |
| 132 "Successful parse!\n", | |
| 133 Munger.getTestResults()); | |
| 134 | |
| 135 // Show what happens when changing alignment to 30. | |
|
jvoung (off chromium)
2014/12/16 23:24:39
"to 30" -> "to 2**30" ?
Karl
2014/12/17 20:52:38
Done.
| |
| 136 const uint64_t Align30[] = { | |
| 137 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 138 // Note: alignment stored as Log32_32(Alignment)+1. | |
|
jvoung (off chromium)
2014/12/16 23:24:39
I don't quite know what Log32_32 means. Do you mea
Karl
2014/12/17 20:52:38
Done.
| |
| 139 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, 31, Terminator, | |
| 140 }; | |
| 141 EXPECT_FALSE(Munger.runTest( | |
| 142 "BadAllocInstAlignment-30", Align30, array_lengthof(Align30), true)); | |
| 143 EXPECT_EQ( | |
| 144 "Error: Alignment can't be greater than 2**29. Found: 2**30\n" | |
| 145 "Error: Invalid value in record\n", | |
| 146 Munger.getTestResults()); | |
| 147 | |
| 148 // Show what happens when changing alignment to 29. | |
| 149 const uint64_t Align29[] = { | |
| 150 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 151 // Note: alignment stored as Log32_32(Alignment)+1. | |
| 152 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, 30, Terminator, | |
| 153 }; | |
| 154 EXPECT_TRUE(Munger.runTest( | |
| 155 "BadAllocInstAlignment-29", Align29, array_lengthof(Align29), true)); | |
| 156 EXPECT_EQ( | |
| 157 "Successful parse!\n", | |
| 158 Munger.getTestResults()); | |
| 159 EXPECT_TRUE(DumpMunger.runTestForAssembly( | |
| 160 "BadAllocInstAlignment-29", Align29, array_lengthof(Align29))); | |
| 161 EXPECT_EQ( | |
| 162 " %v0 = alloca i8, i32 %p0, align 536870912;\n", | |
| 163 DumpMunger.getLinesWithSubstring("alloca")); | |
| 164 } | |
| 165 | |
| 166 TEST(NaClParseInstsTests, BadLoadAlignment) { | |
| 167 const uint64_t BitcodeRecords[] = { | |
| 168 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | |
| 169 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | |
| 170 3, naclbitc::TYPE_CODE_NUMENTRY, 2, Terminator, | |
| 171 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | |
| 172 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 0, Terminator, | |
| 173 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
| 174 3, naclbitc::MODULE_CODE_FUNCTION, 1, 0, 0, 0, Terminator, | |
| 175 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | |
| 176 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | |
| 177 // Note: alignment stored as Log32_32(Alignment)+1. | |
| 178 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 1, 0, Terminator, | |
| 179 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | |
| 180 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
| 181 0, naclbitc::BLK_CODE_EXIT, Terminator | |
| 182 }; | |
| 183 | |
| 184 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD | |
| 185 | |
| 186 // Note: i32 can only have alignment of 1. | |
| 187 // Show text of base input. | |
| 188 NaClObjDumpMunger DumpMunger(BitcodeRecords, | |
| 189 array_lengthof(BitcodeRecords), Terminator); | |
| 190 EXPECT_TRUE(DumpMunger.runTestForAssembly("BadLoadAlignment")); | |
| 191 EXPECT_EQ( | |
| 192 "module { // BlockID = 8\n" | |
| 193 " types { // BlockID = 17\n" | |
| 194 " count 2;\n" | |
| 195 " @t0 = i32;\n" | |
| 196 " @t1 = i32 (i32);\n" | |
| 197 " }\n" | |
| 198 " define external i32 @f0(i32);\n" | |
| 199 " function i32 @f0(i32 %p0) { // BlockID = 12\n" | |
| 200 " blocks 1;\n" | |
| 201 " %b0:\n" | |
| 202 " %v0 = load i32* %p0, align 1;\n" | |
| 203 " ret i32 %v0;\n" | |
| 204 " }\n" | |
| 205 "}\n", | |
| 206 DumpMunger.getTestResults()); | |
| 207 | |
| 208 // Show what happens when changing alignment to 4. | |
| 209 const uint64_t Align4[] = { | |
| 210 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 211 // Note: alignment stored as Log32_32(Alignment)+1. | |
| 212 3, naclbitc::FUNC_CODE_INST_LOAD, 1, 3, 0, Terminator, | |
| 213 }; | |
| 214 NaClParseBitcodeMunger Munger(BitcodeRecords, | |
| 215 array_lengthof(BitcodeRecords), Terminator); | |
| 216 EXPECT_FALSE(Munger.runTest( | |
| 217 "BadLoadAlignment", Align4, array_lengthof(Align4), true)); | |
| 218 EXPECT_EQ( | |
| 219 "Error: Invalid alignment for load of type i32: 4\n" | |
| 220 "Error: Invalid value in record\n", | |
| 221 Munger.getTestResults()); | |
| 222 } | |
| 223 | |
| 224 TEST(NaClParseInstsTests, BadStoreAlignment) { | |
| 225 const uint64_t BitcodeRecords[] = { | |
| 226 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | |
| 227 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | |
| 228 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, | |
| 229 3, naclbitc::TYPE_CODE_FLOAT, Terminator, | |
| 230 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | |
| 231 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 1, 0, Terminator, | |
| 232 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
| 233 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | |
| 234 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | |
| 235 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | |
| 236 // Note: alignment stored as Log32_32(Alignment)+1. | |
| 237 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 1, Terminator, | |
| 238 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | |
| 239 0, naclbitc::BLK_CODE_EXIT, Terminator, | |
| 240 0, naclbitc::BLK_CODE_EXIT, Terminator | |
| 241 }; | |
| 242 | |
| 243 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_LOAD | |
| 244 | |
| 245 // Note: float can only have alignment of 1 and 4. | |
| 246 // Show text of base input. | |
| 247 NaClObjDumpMunger DumpMunger(BitcodeRecords, | |
| 248 array_lengthof(BitcodeRecords), Terminator); | |
| 249 EXPECT_TRUE(DumpMunger.runTestForAssembly("BadStoreAlignment")); | |
| 250 EXPECT_EQ( | |
| 251 "module { // BlockID = 8\n" | |
| 252 " types { // BlockID = 17\n" | |
| 253 " count 3;\n" | |
| 254 " @t0 = float;\n" | |
| 255 " @t1 = i32;\n" | |
| 256 " @t2 = float (i32, float);\n" | |
| 257 " }\n" | |
| 258 " define external float @f0(i32, float);\n" | |
| 259 " function float @f0(i32 %p0, float %p1) { // BlockID = 12\n" | |
| 260 " blocks 1;\n" | |
| 261 " %b0:\n" | |
| 262 " store float %p1, float* %p0, align 1;\n" | |
| 263 " ret float %p1;\n" | |
| 264 " }\n" | |
| 265 "}\n", | |
| 266 DumpMunger.getTestResults()); | |
| 267 | |
| 268 // Show what happens when changing alignment to 2. | |
| 269 const uint64_t Align2[] = { | |
| 270 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 271 // Note: alignment stored as Log32_32(Alignment)+1. | |
| 272 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 2, Terminator, | |
| 273 }; | |
| 274 NaClParseBitcodeMunger Munger(BitcodeRecords, | |
| 275 array_lengthof(BitcodeRecords), Terminator); | |
| 276 EXPECT_FALSE(Munger.runTest( | |
| 277 "BadStoreAlignment-2", Align2, array_lengthof(Align2), true)); | |
| 278 EXPECT_EQ( | |
| 279 "Error: Invalid alignment for store of type float: 2\n" | |
| 280 "Error: Invalid value in record\n", | |
| 281 Munger.getTestResults()); | |
| 282 | |
| 283 // Show what happens when changing alignment to 4. | |
| 284 const uint64_t Align4[] = { | |
| 285 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 286 // Note: alignment stored as Log32_32(Alignment)+1. | |
| 287 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 3, Terminator, | |
| 288 }; | |
| 289 EXPECT_TRUE(Munger.runTest( | |
| 290 "BadStoreAlignment-4", Align4, array_lengthof(Align4), true)); | |
| 291 EXPECT_EQ( | |
| 292 "Successful parse!\n", | |
| 293 Munger.getTestResults()); | |
| 294 EXPECT_TRUE(DumpMunger.runTestForAssembly( | |
| 295 "BadStoreAlignment-4", Align4, array_lengthof(Align4))); | |
| 296 EXPECT_EQ( | |
| 297 " store float %p1, float* %p0, align 4;\n", | |
| 298 DumpMunger.getLinesWithSubstring("store")); | |
| 299 | |
| 300 // Show what happens when changing alignment to 8. | |
| 301 const uint64_t Align8[] = { | |
| 302 ReplaceIndex, NaClBitcodeMunger::Replace, | |
| 303 // Note: alignment stored as Log32_32(Alignment)+1. | |
| 304 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, 4, Terminator, | |
| 305 }; | |
| 306 EXPECT_FALSE(Munger.runTest( | |
| 307 "BadStoreAlignment-8", Align8, array_lengthof(Align8), true)); | |
| 308 EXPECT_EQ( | |
| 309 "Error: Invalid alignment for store of type float: 8\n" | |
| 310 "Error: Invalid value in record\n", | |
| 311 Munger.getTestResults()); | |
| 312 } | |
| 313 | |
| 82 } // end of anonamous namespace. | 314 } // end of anonamous namespace. |
| OLD | NEW |