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