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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
48 // Note: 100 is a bad value index in next line. | 48 // Note: 100 is a bad value index in next line. |
49 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, | 49 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, |
50 3, naclbitc::FUNC_CODE_INST_RET, Terminator, | 50 3, naclbitc::FUNC_CODE_INST_RET, Terminator, |
51 0, naclbitc::BLK_CODE_EXIT, Terminator, | 51 0, naclbitc::BLK_CODE_EXIT, Terminator, |
52 0, naclbitc::BLK_CODE_EXIT, Terminator | 52 0, naclbitc::BLK_CODE_EXIT, Terminator |
53 }; | 53 }; |
54 | 54 |
55 // Show text of base input. | 55 // Show text of base input. |
56 NaClObjDumpMunger DumpMunger(BitcodeRecords, | 56 NaClObjDumpMunger DumpMunger(BitcodeRecords, |
57 array_lengthof(BitcodeRecords), Terminator); | 57 array_lengthof(BitcodeRecords), Terminator); |
58 EXPECT_FALSE(DumpMunger.runTestForAssembly("Nonexistant call arg")); | 58 //EXPECT_FALSE(DumpMunger.runTestForAssembly("Nonexistant call arg")); |
jvoung (off chromium)
2015/02/20 00:12:42
remove commented out version?
Karl
2015/02/20 21:41:17
Done.
| |
59 EXPECT_FALSE(DumpMunger.runTest("Nonexistant call arg")); | |
59 EXPECT_EQ( | 60 EXPECT_EQ( |
60 "module { // BlockID = 8\n" | 61 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " |
61 " types { // BlockID = 17\n" | 62 "88, 69)\n" |
62 " count 3;\n" | 63 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" |
63 " @t0 = i32;\n" | 64 " | 0> |\n" |
64 " @t1 = void;\n" | 65 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" |
65 " @t2 = void (i32, i32);\n" | 66 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n" |
66 " }\n" | 67 " 32:0| 3: <1, 3> | count 3;\n" |
67 " declare external void @f0(i32, i32);\n" | 68 " 34:4| 3: <7, 32> | @t0 = i32;\n" |
68 " define external void @f1(i32, i32);\n" | 69 " 37:6| 3: <2> | @t1 = void;\n" |
69 " function void @f1(i32 %p0, i32 %p1) { // BlockID = 12\n" | 70 " 39:4| 3: <21, 0, 1, 0, 0> | @t2 = void (i32, i32);\n" |
70 " blocks 1;\n" | 71 " 44:2| 0: <65534> | }\n" |
71 " %b0:\n" | 72 " 48:0| 3: <8, 2, 0, 1, 0> | declare external void @f0(i32" |
72 " call void @f0(i32 %p0, i32 @f0);\n" | 73 ", i32);\n" |
74 " 52:6| 3: <8, 2, 0, 0, 0> | define external void @f1(i32," | |
75 " i32);\n" | |
76 " 57:4| 1: <65535, 12, 2> | function void @f1(i32 %p0, " | |
77 "i32 %p1) {\n" | |
78 " | | // BlockID " | |
79 "= 12\n" | |
80 " 64:0| 3: <1, 1> | blocks 1;\n" | |
81 " | | %b0:\n" | |
82 " 66:4| 3: <34, 0, 4, 2, 100> | call void @f0(i32 %p0, i32" | |
83 " @f0);\n" | |
73 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n" | 84 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n" |
74 " ret void;\n" | 85 " 72:6| 3: <10> | ret void;\n" |
75 " }\n" | 86 " 74:4| 0: <65534> | }\n" |
76 "}\n", | 87 " 76:0|0: <65534> |}\n", |
77 DumpMunger.getTestResults()); | 88 DumpMunger.getTestResults()); |
78 | 89 |
79 NaClParseBitcodeMunger Munger(BitcodeRecords, | 90 NaClParseBitcodeMunger Munger(BitcodeRecords, |
80 array_lengthof(BitcodeRecords), Terminator); | 91 array_lengthof(BitcodeRecords), Terminator); |
81 EXPECT_FALSE(Munger.runTest("Nonexistant call arg", true)); | 92 EXPECT_FALSE(Munger.runTest("Nonexistant call arg", true)); |
82 EXPECT_EQ( | 93 EXPECT_EQ( |
83 "Error: (56:6) Invalid call argument: Index 1\n" | 94 "Error: (72:6) Invalid call argument: Index 1\n" |
84 "Error: Invalid value in record\n", | 95 "Error: Invalid value in record\n", |
85 Munger.getTestResults()); | 96 Munger.getTestResults()); |
86 } | 97 } |
87 | 98 |
88 /// Test how we recognize alignments in alloca instructions. | 99 /// Test how we recognize alignments in alloca instructions. |
89 TEST(NaClParseInstsTests, BadAllocaAlignment) { | 100 TEST(NaClParseInstsTests, BadAllocaAlignment) { |
90 const uint64_t BitcodeRecords[] = { | 101 const uint64_t BitcodeRecords[] = { |
91 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 102 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
92 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | 103 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
93 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, | 104 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, |
94 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | 105 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
95 3, naclbitc::TYPE_CODE_VOID, Terminator, | 106 3, naclbitc::TYPE_CODE_VOID, Terminator, |
96 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator, | 107 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator, |
97 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator, | 108 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator, |
98 0, naclbitc::BLK_CODE_EXIT, Terminator, | 109 0, naclbitc::BLK_CODE_EXIT, Terminator, |
99 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | 110 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, |
100 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | 111 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
101 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | 112 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
102 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(0), Terminator, | 113 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(0), Terminator, |
103 3, naclbitc::FUNC_CODE_INST_RET, Terminator, | 114 3, naclbitc::FUNC_CODE_INST_RET, Terminator, |
104 0, naclbitc::BLK_CODE_EXIT, Terminator, | 115 0, naclbitc::BLK_CODE_EXIT, Terminator, |
105 0, naclbitc::BLK_CODE_EXIT, Terminator | 116 0, naclbitc::BLK_CODE_EXIT, Terminator |
106 }; | 117 }; |
107 | 118 |
108 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA | 119 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA |
109 | 120 |
110 // Show text when alignment is 1. | 121 // Show text when alignment is 1. |
111 NaClObjDumpMunger DumpMunger(BitcodeRecords, | 122 NaClObjDumpMunger DumpMunger(BitcodeRecords, |
112 array_lengthof(BitcodeRecords), Terminator); | 123 array_lengthof(BitcodeRecords), Terminator); |
113 EXPECT_TRUE(DumpMunger.runTestForAssembly("BadAllocaAlignment")); | 124 EXPECT_TRUE(DumpMunger.runTest("BadAllocaAlignment")); |
114 EXPECT_EQ( | 125 EXPECT_EQ( |
115 "module { // BlockID = 8\n" | 126 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " |
116 " types { // BlockID = 17\n" | 127 "88, 69)\n" |
117 " count 4;\n" | 128 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" |
118 " @t0 = i32;\n" | 129 " | 0> |\n" |
119 " @t1 = void;\n" | 130 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" |
120 " @t2 = void (i32);\n" | 131 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n" |
121 " @t3 = i8;\n" | 132 " 32:0| 3: <1, 4> | count 4;\n" |
122 " }\n" | 133 " 34:4| 3: <7, 32> | @t0 = i32;\n" |
123 " define external void @f0(i32);\n" | 134 " 37:6| 3: <2> | @t1 = void;\n" |
124 " function void @f0(i32 %p0) { // BlockID = 12\n" | 135 " 39:4| 3: <21, 0, 1, 0> | @t2 = void (i32);\n" |
125 " blocks 1;\n" | 136 " 43:4| 3: <7, 8> | @t3 = i8;\n" |
126 " %b0:\n" | 137 " 46:0| 0: <65534> | }\n" |
127 " %v0 = alloca i8, i32 %p0, align 1;\n" | 138 " 48:0| 3: <8, 2, 0, 0, 0> | define external void @f0(i32" |
128 " ret void;\n" | 139 ");\n" |
129 " }\n" | 140 " 52:6| 1: <65535, 12, 2> | function void @f0(i32 %p0) {" |
130 "}\n", | 141 " \n" |
142 " | | // BlockID " | |
143 "= 12\n" | |
144 " 60:0| 3: <1, 1> | blocks 1;\n" | |
145 " | | %b0:\n" | |
146 " 62:4| 3: <19, 1, 1> | %v0 = alloca i8, i32 %p0, " | |
147 "align 1;\n" | |
148 " 65:6| 3: <10> | ret void;\n" | |
149 " 67:4| 0: <65534> | }\n" | |
150 " 68:0|0: <65534> |}\n", | |
131 DumpMunger.getTestResults()); | 151 DumpMunger.getTestResults()); |
132 NaClParseBitcodeMunger Munger(BitcodeRecords, | 152 NaClParseBitcodeMunger Munger(BitcodeRecords, |
133 array_lengthof(BitcodeRecords), Terminator); | 153 array_lengthof(BitcodeRecords), Terminator); |
134 EXPECT_TRUE(Munger.runTest("BadAllocaAlignment", true)); | 154 EXPECT_TRUE(Munger.runTest("BadAllocaAlignment", true)); |
135 | 155 |
136 // Show what happens when changing alignment to 0. | 156 // Show what happens when changing alignment to 0. |
137 const uint64_t Align0[] = { | 157 const uint64_t Align0[] = { |
138 ReplaceIndex, NaClBitcodeMunger::Replace, | 158 ReplaceIndex, NaClBitcodeMunger::Replace, |
139 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator, | 159 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator, |
140 }; | 160 }; |
141 EXPECT_TRUE(Munger.runTest( | 161 EXPECT_TRUE(Munger.runTest( |
142 "BadAllocaAlignment-0", Align0, array_lengthof(Align0), true)); | 162 "BadAllocaAlignment-0", Align0, array_lengthof(Align0), true)); |
143 EXPECT_TRUE(DumpMunger.runTestForAssembly( | 163 EXPECT_TRUE(DumpMunger.runTestForAssembly( |
144 "BadAllocaAlignment-0", Align0, array_lengthof(Align0))); | 164 "BadAllocaAlignment-0", Align0, array_lengthof(Align0))); |
145 EXPECT_EQ( | 165 EXPECT_EQ( |
146 " %v0 = alloca i8, i32 %p0, align 0;\n", | 166 " %v0 = alloca i8, i32 %p0, align 0;\n", |
147 DumpMunger.getLinesWithSubstring("alloca")); | 167 DumpMunger.getLinesWithSubstring("alloca")); |
148 | 168 |
149 // Show what happens when changing alignment to 2**30. | 169 // Show what happens when changing alignment to 2**30. |
150 const uint64_t Align30[] = { | 170 const uint64_t Align30[] = { |
151 ReplaceIndex, NaClBitcodeMunger::Replace, | 171 ReplaceIndex, NaClBitcodeMunger::Replace, |
152 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, | 172 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, |
153 }; | 173 }; |
154 EXPECT_FALSE(Munger.runTest( | 174 EXPECT_FALSE(Munger.runTest( |
155 "BadAllocaAlignment-30", Align30, array_lengthof(Align30), true)); | 175 "BadAllocaAlignment-30", Align30, array_lengthof(Align30), true)); |
156 EXPECT_EQ( | 176 EXPECT_EQ( |
157 "Error: (49:6) Alignment can't be greater than 2**29. Found: 2**30\n" | 177 "Error: (65:6) Alignment can't be greater than 2**29. Found: 2**30\n" |
158 "Error: Invalid value in record\n", | 178 "Error: Invalid value in record\n", |
159 Munger.getTestResults()); | 179 Munger.getTestResults()); |
160 EXPECT_FALSE(DumpMunger.runTestForAssembly( | 180 EXPECT_FALSE(DumpMunger.runTestForAssembly( |
161 "BadAllocaAlignment-30", Align30, array_lengthof(Align30))); | 181 "BadAllocaAlignment-30", Align30, array_lengthof(Align30))); |
162 EXPECT_EQ( | 182 EXPECT_EQ( |
163 " %v0 = alloca i8, i32 %p0, align 0;\n", | 183 " %v0 = alloca i8, i32 %p0, align 0;\n", |
164 DumpMunger.getLinesWithSubstring("alloca")); | 184 DumpMunger.getLinesWithSubstring("alloca")); |
165 EXPECT_EQ( | 185 EXPECT_EQ( |
166 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", | 186 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", |
167 DumpMunger.getLinesWithSubstring("Error")); | 187 DumpMunger.getLinesWithSubstring("Error")); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
199 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | 219 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, |
200 0, naclbitc::BLK_CODE_EXIT, Terminator, | 220 0, naclbitc::BLK_CODE_EXIT, Terminator, |
201 0, naclbitc::BLK_CODE_EXIT, Terminator | 221 0, naclbitc::BLK_CODE_EXIT, Terminator |
202 }; | 222 }; |
203 | 223 |
204 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD | 224 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD |
205 | 225 |
206 // Show text when alignment is 1. | 226 // Show text when alignment is 1. |
207 NaClObjDumpMunger DumpMunger(BitcodeRecords, | 227 NaClObjDumpMunger DumpMunger(BitcodeRecords, |
208 array_lengthof(BitcodeRecords), Terminator); | 228 array_lengthof(BitcodeRecords), Terminator); |
209 EXPECT_TRUE(DumpMunger.runTestForAssembly("BadLoadAlignment-1")); | 229 EXPECT_TRUE(DumpMunger.runTest("BadLoadAlignment-1")); |
210 EXPECT_EQ( | 230 EXPECT_EQ( |
211 "module { // BlockID = 8\n" | 231 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " |
212 " types { // BlockID = 17\n" | 232 "88, 69)\n" |
213 " count 2;\n" | 233 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" |
214 " @t0 = i32;\n" | 234 " | 0> |\n" |
215 " @t1 = i32 (i32);\n" | 235 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" |
216 " }\n" | 236 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n" |
217 " define external i32 @f0(i32);\n" | 237 " 32:0| 3: <1, 2> | count 2;\n" |
218 " function i32 @f0(i32 %p0) { // BlockID = 12\n" | 238 " 34:4| 3: <7, 32> | @t0 = i32;\n" |
219 " blocks 1;\n" | 239 " 37:6| 3: <21, 0, 0, 0> | @t1 = i32 (i32);\n" |
220 " %b0:\n" | 240 " 41:6| 0: <65534> | }\n" |
221 " %v0 = load i32* %p0, align 1;\n" | 241 " 44:0| 3: <8, 1, 0, 0, 0> | define external i32 @f0(i32" |
222 " ret i32 %v0;\n" | 242 ");\n" |
223 " }\n" | 243 " 48:6| 1: <65535, 12, 2> | function i32 @f0(i32 %p0) {" |
224 "}\n", | 244 " \n" |
245 " | | // BlockID " | |
246 "= 12\n" | |
247 " 56:0| 3: <1, 1> | blocks 1;\n" | |
248 " | | %b0:\n" | |
249 " 58:4| 3: <20, 1, 1, 0> | %v0 = load i32* %p0, " | |
250 "align 1;\n" | |
251 " 62:4| 3: <10, 1> | ret i32 %v0;\n" | |
252 " 65:0| 0: <65534> | }\n" | |
253 " 68:0|0: <65534> |}\n", | |
225 DumpMunger.getTestResults()); | 254 DumpMunger.getTestResults()); |
226 NaClParseBitcodeMunger Munger(BitcodeRecords, | 255 NaClParseBitcodeMunger Munger(BitcodeRecords, |
227 array_lengthof(BitcodeRecords), Terminator); | 256 array_lengthof(BitcodeRecords), Terminator); |
228 EXPECT_TRUE(Munger.runTest("BadLoadAlignment", true)); | 257 EXPECT_TRUE(Munger.runTest("BadLoadAlignment", true)); |
229 | 258 |
230 // Show what happens when changing alignment to 0. | 259 // Show what happens when changing alignment to 0. |
231 const uint64_t Align0[] = { | 260 const uint64_t Align0[] = { |
232 ReplaceIndex, NaClBitcodeMunger::Replace, | 261 ReplaceIndex, NaClBitcodeMunger::Replace, |
233 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, | 262 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, |
234 }; | 263 }; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
274 DumpMunger.getLinesWithSubstring("load")); | 303 DumpMunger.getLinesWithSubstring("load")); |
275 | 304 |
276 // Show what happens when changing alignment to 2**30. | 305 // Show what happens when changing alignment to 2**30. |
277 const uint64_t Align30[] = { | 306 const uint64_t Align30[] = { |
278 ReplaceIndex, NaClBitcodeMunger::Replace, | 307 ReplaceIndex, NaClBitcodeMunger::Replace, |
279 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, | 308 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, |
280 }; | 309 }; |
281 EXPECT_FALSE(Munger.runTest( | 310 EXPECT_FALSE(Munger.runTest( |
282 "BadLoadAlignment-30", Align30, array_lengthof(Align30), true)); | 311 "BadLoadAlignment-30", Align30, array_lengthof(Align30), true)); |
283 EXPECT_EQ( | 312 EXPECT_EQ( |
284 "Error: (46:4) Alignment can't be greater than 2**29. Found: 2**30\n" | 313 "Error: (62:4) Alignment can't be greater than 2**29. Found: 2**30\n" |
285 "Error: Invalid value in record\n", | 314 "Error: Invalid value in record\n", |
286 Munger.getTestResults()); | 315 Munger.getTestResults()); |
287 EXPECT_FALSE(DumpMunger.runTestForAssembly( | 316 EXPECT_FALSE(DumpMunger.runTestForAssembly( |
288 "BadLoadAlignment-30", Align30, array_lengthof(Align30))); | 317 "BadLoadAlignment-30", Align30, array_lengthof(Align30))); |
289 EXPECT_EQ( | 318 EXPECT_EQ( |
290 " %v0 = load i32* %p0, align 0;\n" | 319 " %v0 = load i32* %p0, align 0;\n" |
291 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 320 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
292 DumpMunger.getLinesWithSubstring("load")); | 321 DumpMunger.getLinesWithSubstring("load")); |
293 } | 322 } |
294 | 323 |
(...skipping 14 matching lines...) Expand all Loading... | |
309 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | 338 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, |
310 0, naclbitc::BLK_CODE_EXIT, Terminator, | 339 0, naclbitc::BLK_CODE_EXIT, Terminator, |
311 0, naclbitc::BLK_CODE_EXIT, Terminator | 340 0, naclbitc::BLK_CODE_EXIT, Terminator |
312 }; | 341 }; |
313 | 342 |
314 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_STORE | 343 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_STORE |
315 | 344 |
316 // Show text when alignment is 1. | 345 // Show text when alignment is 1. |
317 NaClObjDumpMunger DumpMunger(BitcodeRecords, | 346 NaClObjDumpMunger DumpMunger(BitcodeRecords, |
318 array_lengthof(BitcodeRecords), Terminator); | 347 array_lengthof(BitcodeRecords), Terminator); |
319 EXPECT_TRUE(DumpMunger.runTestForAssembly("BadStoreAlignment")); | 348 EXPECT_TRUE(DumpMunger.runTest("BadStoreAlignment")); |
320 EXPECT_EQ( | 349 EXPECT_EQ( |
321 "module { // BlockID = 8\n" | 350 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " |
322 " types { // BlockID = 17\n" | 351 "88, 69)\n" |
323 " count 3;\n" | 352 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" |
324 " @t0 = float;\n" | 353 " | 0> |\n" |
325 " @t1 = i32;\n" | 354 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" |
326 " @t2 = float (i32, float);\n" | 355 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n" |
327 " }\n" | 356 " 32:0| 3: <1, 3> | count 3;\n" |
328 " define external float @f0(i32, float);\n" | 357 " 34:4| 3: <3> | @t0 = float;\n" |
329 " function float @f0(i32 %p0, float %p1) { // BlockID = 12\n" | 358 " 36:2| 3: <7, 32> | @t1 = i32;\n" |
330 " blocks 1;\n" | 359 " 39:4| 3: <21, 0, 0, 1, 0> | @t2 = float (i32, float);\n" |
331 " %b0:\n" | 360 " 44:2| 0: <65534> | }\n" |
332 " store float %p1, float* %p0, align 1;\n" | 361 " 48:0| 3: <8, 2, 0, 0, 0> | define external \n" |
333 " ret float %p1;\n" | 362 " | | float @f0(i32, float);\n" |
334 " }\n" | 363 " 52:6| 1: <65535, 12, 2> | function \n" |
335 "}\n", | 364 " | | float @f0(i32 %p0, float " |
365 "%p1) { \n" | |
366 " | | // BlockID " | |
367 "= 12\n" | |
368 " 60:0| 3: <1, 1> | blocks 1;\n" | |
369 " | | %b0:\n" | |
370 " 62:4| 3: <24, 2, 1, 1> | store float %p1, float* " | |
371 "%p0, \n" | |
372 " | | align 1;\n" | |
373 " 66:4| 3: <10, 1> | ret float %p1;\n" | |
374 " 69:0| 0: <65534> | }\n" | |
375 " 72:0|0: <65534> |}\n", | |
336 DumpMunger.getTestResults()); | 376 DumpMunger.getTestResults()); |
337 NaClParseBitcodeMunger Munger(BitcodeRecords, | 377 NaClParseBitcodeMunger Munger(BitcodeRecords, |
338 array_lengthof(BitcodeRecords), Terminator); | 378 array_lengthof(BitcodeRecords), Terminator); |
339 EXPECT_TRUE(Munger.runTest("BadStoreAlignment", true)); | 379 EXPECT_TRUE(Munger.runTest("BadStoreAlignment", true)); |
340 | 380 |
341 // Show what happens when changing alignment to 0. | 381 // Show what happens when changing alignment to 0. |
342 const uint64_t Align0[] = { | 382 const uint64_t Align0[] = { |
343 ReplaceIndex, NaClBitcodeMunger::Replace, | 383 ReplaceIndex, NaClBitcodeMunger::Replace, |
344 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, | 384 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, |
345 }; | 385 }; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
395 DumpMunger.getLinesWithSubstring("store")); | 435 DumpMunger.getLinesWithSubstring("store")); |
396 | 436 |
397 // Show what happens when changing alignment to 2**30. | 437 // Show what happens when changing alignment to 2**30. |
398 const uint64_t Align30[] = { | 438 const uint64_t Align30[] = { |
399 ReplaceIndex, NaClBitcodeMunger::Replace, | 439 ReplaceIndex, NaClBitcodeMunger::Replace, |
400 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, | 440 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, |
401 }; | 441 }; |
402 EXPECT_FALSE(Munger.runTest( | 442 EXPECT_FALSE(Munger.runTest( |
403 "BadStoreAlignment-30", Align30, array_lengthof(Align30), true)); | 443 "BadStoreAlignment-30", Align30, array_lengthof(Align30), true)); |
404 EXPECT_EQ( | 444 EXPECT_EQ( |
405 "Error: (50:4) Alignment can't be greater than 2**29. Found: 2**30\n" | 445 "Error: (66:4) Alignment can't be greater than 2**29. Found: 2**30\n" |
406 "Error: Invalid value in record\n", | 446 "Error: Invalid value in record\n", |
407 Munger.getTestResults()); | 447 Munger.getTestResults()); |
408 EXPECT_FALSE(DumpMunger.runTestForAssembly( | 448 EXPECT_FALSE(DumpMunger.runTestForAssembly( |
409 "BadStoreAlignment-30", Align30, array_lengthof(Align30))); | 449 "BadStoreAlignment-30", Align30, array_lengthof(Align30))); |
410 EXPECT_EQ( | 450 EXPECT_EQ( |
411 " store float %p1, float* %p0, align 0;\n" | 451 " store float %p1, float* %p0, align 0;\n" |
412 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 452 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
413 DumpMunger.getLinesWithSubstring("store")); | 453 DumpMunger.getLinesWithSubstring("store")); |
414 } | 454 } |
415 | 455 |
416 } // end of anonamous namespace. | 456 } // end of anonamous namespace. |
OLD | NEW |