Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(356)

Side by Side Diff: unittest/IceParseInstsTest.cpp

Issue 916313004: Fix subzero translator to use new API for reporting errors. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Merged into master. Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tests_lit/parse_errs/nacl-fake-intrinsic.ll ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « tests_lit/parse_errs/nacl-fake-intrinsic.ll ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698