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

Side by Side Diff: unittest/IceParseInstsTest.cpp

Issue 877003003: Subzero: Use a "known" version of clang-format. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix wildcards Created 5 years, 10 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
« crosstest/mem_intrin_main.cpp ('K') | « unittest/BitcodeMunge.cpp ('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"
11 #include "llvm/Bitcode/NaCl/NaClBitcodeParser.h" 11 #include "llvm/Bitcode/NaCl/NaClBitcodeParser.h"
12 #include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h" 12 #include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h"
13 13
14 #include "BitcodeMunge.h" 14 #include "BitcodeMunge.h"
15 15
16 #include "gtest/gtest.h" 16 #include "gtest/gtest.h"
17 17
18 using namespace llvm; 18 using namespace llvm;
19 19
20 namespace { 20 namespace {
21 21
22 static const uint64_t Terminator = 0x5768798008978675LL; 22 static const uint64_t Terminator = 0x5768798008978675LL;
23 23
24 // Note: alignment stored as 0 or log2(Alignment)+1. 24 // Note: alignment stored as 0 or log2(Alignment)+1.
25 uint64_t getEncAlignPower(unsigned Power) { 25 uint64_t getEncAlignPower(unsigned Power) { return Power + 1; }
26 return Power + 1;
27 }
28 uint64_t getEncAlignZero() { return 0; } 26 uint64_t getEncAlignZero() { return 0; }
29 27
30 /// Test how we report a call arg that refers to nonexistent call argument 28 /// Test how we report a call arg that refers to nonexistent call argument
31 TEST(IceParseInstsTest, NonexistentCallArg) { 29 TEST(IceParseInstsTest, NonexistentCallArg) {
32 const uint64_t BitcodeRecords[] = { 30 const uint64_t BitcodeRecords[] = {
33 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, 31 1, naclbitc::BLK_CODE_ENTER,
jvoung (off chromium) 2015/01/27 18:08:11 Hmm... these used to be arranged such that each ro
Jim Stichnoth 2015/01/27 19:24:11 Ugh. Reverting the whole file change, and quarant
34 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, 32 naclbitc::MODULE_BLOCK_ID, 2,
35 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, 33 Terminator, 1,
36 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, 34 naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW,
37 3, naclbitc::TYPE_CODE_VOID, Terminator, 35 2, Terminator,
38 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, 0, Terminator, 36 3, naclbitc::TYPE_CODE_NUMENTRY,
39 0, naclbitc::BLK_CODE_EXIT, Terminator, 37 3, Terminator,
40 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 1, 0, Terminator, 38 3, naclbitc::TYPE_CODE_INTEGER,
41 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, 39 32, Terminator,
42 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, 40 3, naclbitc::TYPE_CODE_VOID,
43 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, 41 Terminator, 3,
44 // Note: 100 is a bad value index in next line. 42 naclbitc::TYPE_CODE_FUNCTION, 0,
45 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, 43 1, 0,
46 3, naclbitc::FUNC_CODE_INST_RET, Terminator, 44 0, Terminator,
47 0, naclbitc::BLK_CODE_EXIT, Terminator, 45 0, naclbitc::BLK_CODE_EXIT,
48 0, naclbitc::BLK_CODE_EXIT, Terminator 46 Terminator, 3,
49 }; 47 naclbitc::MODULE_CODE_FUNCTION, 2,
48 0, 1,
49 0, Terminator,
50 3, naclbitc::MODULE_CODE_FUNCTION,
51 2, 0,
52 0, 0,
53 Terminator, 1,
54 naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID,
55 2, Terminator,
56 3, naclbitc::FUNC_CODE_DECLAREBLOCKS,
57 1, Terminator,
58 // Note: 100 is a bad value index in next line.
59 3, naclbitc::FUNC_CODE_INST_CALL,
60 0, 4,
61 2, 100,
62 Terminator, 3,
63 naclbitc::FUNC_CODE_INST_RET, Terminator,
64 0, naclbitc::BLK_CODE_EXIT,
65 Terminator, 0,
66 naclbitc::BLK_CODE_EXIT, Terminator};
50 67
51 // Show bitcode objdump for BitcodeRecords. 68 // Show bitcode objdump for BitcodeRecords.
52 NaClObjDumpMunger DumpMunger(BitcodeRecords, 69 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords),
53 array_lengthof(BitcodeRecords), Terminator); 70 Terminator);
54 EXPECT_FALSE(DumpMunger.runTestForAssembly("Nonexistent call arg")); 71 EXPECT_FALSE(DumpMunger.runTestForAssembly("Nonexistent call arg"));
55 EXPECT_EQ( 72 EXPECT_EQ("module { // BlockID = 8\n"
56 "module { // BlockID = 8\n" 73 " types { // BlockID = 17\n"
57 " types { // BlockID = 17\n" 74 " count 3;\n"
58 " count 3;\n" 75 " @t0 = i32;\n"
59 " @t0 = i32;\n" 76 " @t1 = void;\n"
60 " @t1 = void;\n" 77 " @t2 = void (i32, i32);\n"
61 " @t2 = void (i32, i32);\n" 78 " }\n"
62 " }\n" 79 " declare external void @f0(i32, i32);\n"
63 " declare external void @f0(i32, i32);\n" 80 " define external void @f1(i32, i32);\n"
64 " define external void @f1(i32, i32);\n" 81 " function void @f1(i32 %p0, i32 %p1) { // BlockID = 12\n"
65 " function void @f1(i32 %p0, i32 %p1) { // BlockID = 12\n" 82 " blocks 1;\n"
66 " blocks 1;\n" 83 " %b0:\n"
67 " %b0:\n" 84 " call void @f0(i32 %p0, i32 @f0);\n"
68 " call void @f0(i32 %p0, i32 @f0);\n" 85 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n"
69 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n" 86 " ret void;\n"
70 " ret void;\n" 87 " }\n"
71 " }\n" 88 "}\n",
72 "}\n", 89 DumpMunger.getTestResults());
73 DumpMunger.getTestResults());
74 90
75 // Show that we get appropriate error when parsing in Subzero. 91 // Show that we get appropriate error when parsing in Subzero.
76 IceTest::SubzeroBitcodeMunger Munger( 92 IceTest::SubzeroBitcodeMunger Munger(
77 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); 93 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator);
78 EXPECT_FALSE(Munger.runTest("Nonexistent call arg")); 94 EXPECT_FALSE(Munger.runTest("Nonexistent call arg"));
79 EXPECT_EQ( 95 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", 96 Munger.getTestResults());
81 Munger.getTestResults());
82 } 97 }
83 98
84 /// Test how we recognize alignments in alloca instructions. 99 /// Test how we recognize alignments in alloca instructions.
85 TEST(IceParseInstsTests, AllocaAlignment) { 100 TEST(IceParseInstsTests, AllocaAlignment) {
86 const uint64_t BitcodeRecords[] = { 101 const uint64_t BitcodeRecords[] = {
87 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, 102 1, naclbitc::BLK_CODE_ENTER,
88 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, 103 naclbitc::MODULE_BLOCK_ID, 2,
89 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, 104 Terminator, 1,
90 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, 105 naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW,
91 3, naclbitc::TYPE_CODE_VOID, Terminator, 106 2, Terminator,
92 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator, 107 3, naclbitc::TYPE_CODE_NUMENTRY,
93 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator, 108 4, Terminator,
94 0, naclbitc::BLK_CODE_EXIT, Terminator, 109 3, naclbitc::TYPE_CODE_INTEGER,
95 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, 110 32, Terminator,
96 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, 111 3, naclbitc::TYPE_CODE_VOID,
97 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, 112 Terminator, 3,
98 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(0), Terminator, 113 naclbitc::TYPE_CODE_FUNCTION, 0,
99 3, naclbitc::FUNC_CODE_INST_RET, Terminator, 114 1, 0,
100 0, naclbitc::BLK_CODE_EXIT, Terminator, 115 Terminator, 3,
101 0, naclbitc::BLK_CODE_EXIT, Terminator}; 116 naclbitc::TYPE_CODE_INTEGER, 8,
117 Terminator, 0,
118 naclbitc::BLK_CODE_EXIT, Terminator,
119 3, naclbitc::MODULE_CODE_FUNCTION,
120 2, 0,
121 0, 0,
122 Terminator, 1,
123 naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID,
124 2, Terminator,
125 3, naclbitc::FUNC_CODE_DECLAREBLOCKS,
126 1, Terminator,
127 3, naclbitc::FUNC_CODE_INST_ALLOCA,
128 1, getEncAlignPower(0),
129 Terminator, 3,
130 naclbitc::FUNC_CODE_INST_RET, Terminator,
131 0, naclbitc::BLK_CODE_EXIT,
132 Terminator, 0,
133 naclbitc::BLK_CODE_EXIT, Terminator};
102 134
103 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA 135 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA
104 136
105 // Show text when alignment is 1. 137 // Show text when alignment is 1.
106 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), 138 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords),
107 Terminator); 139 Terminator);
108 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 1")); 140 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 1"));
109 EXPECT_EQ("module { // BlockID = 8\n" 141 EXPECT_EQ("module { // BlockID = 8\n"
110 " types { // BlockID = 17\n" 142 " types { // BlockID = 17\n"
111 " count 4;\n" 143 " count 4;\n"
(...skipping 13 matching lines...) Expand all
125 DumpMunger.getTestResults()); 157 DumpMunger.getTestResults());
126 158
127 // Show that we can handle alignment of 1. 159 // Show that we can handle alignment of 1.
128 IceTest::SubzeroBitcodeMunger Munger( 160 IceTest::SubzeroBitcodeMunger Munger(
129 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); 161 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator);
130 EXPECT_TRUE(Munger.runTest("Good alloca alignment 1")); 162 EXPECT_TRUE(Munger.runTest("Good alloca alignment 1"));
131 163
132 // Show what happens when changing alignment to 0. 164 // Show what happens when changing alignment to 0.
133 const uint64_t Align0[] = { 165 const uint64_t Align0[] = {
134 ReplaceIndex, NaClBitcodeMunger::Replace, 166 ReplaceIndex, NaClBitcodeMunger::Replace,
135 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator, 167 3, naclbitc::FUNC_CODE_INST_ALLOCA,
168 1, getEncAlignZero(),
169 Terminator,
136 }; 170 };
137 EXPECT_TRUE(Munger.runTest("Good alloca alignment 0", Align0, 171 EXPECT_TRUE(Munger.runTest("Good alloca alignment 0", Align0,
138 array_lengthof(Align0))); 172 array_lengthof(Align0)));
139 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 0", Align0, 173 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 0", Align0,
140 array_lengthof(Align0))); 174 array_lengthof(Align0)));
141 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", 175 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n",
142 DumpMunger.getLinesWithSubstring("alloca")); 176 DumpMunger.getLinesWithSubstring("alloca"));
143 177
144 // Show what happens when changing alignment to 2**30. 178 // Show what happens when changing alignment to 2**30.
145 const uint64_t Align30[] = { 179 const uint64_t Align30[] = {
146 ReplaceIndex, NaClBitcodeMunger::Replace, 180 ReplaceIndex, NaClBitcodeMunger::Replace,
147 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, 181 3, naclbitc::FUNC_CODE_INST_ALLOCA,
182 1, getEncAlignPower(30),
183 Terminator,
148 }; 184 };
149 EXPECT_FALSE(Munger.runTest("Bad alloca alignment 30", Align30, 185 EXPECT_FALSE(Munger.runTest("Bad alloca alignment 30", Align30,
150 array_lengthof(Align30))); 186 array_lengthof(Align30)));
151 EXPECT_EQ("Error: (62:4) Invalid function record: <19 1 31>\n", 187 EXPECT_EQ("Error: (62:4) Invalid function record: <19 1 31>\n",
152 Munger.getTestResults()); 188 Munger.getTestResults());
153 189
154 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad alloca alignment 30", Align30, 190 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad alloca alignment 30", Align30,
155 array_lengthof(Align30))); 191 array_lengthof(Align30)));
156 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", 192 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n",
157 DumpMunger.getLinesWithSubstring("alloca")); 193 DumpMunger.getLinesWithSubstring("alloca"));
158 EXPECT_EQ( 194 EXPECT_EQ(
159 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", 195 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n",
160 DumpMunger.getLinesWithSubstring("Error")); 196 DumpMunger.getLinesWithSubstring("Error"));
161 197
162 // Show what happens when changing alignment to 2**29. 198 // Show what happens when changing alignment to 2**29.
163 const uint64_t Align29[] = { 199 const uint64_t Align29[] = {
164 ReplaceIndex, NaClBitcodeMunger::Replace, 200 ReplaceIndex, NaClBitcodeMunger::Replace,
165 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(29), Terminator, 201 3, naclbitc::FUNC_CODE_INST_ALLOCA,
202 1, getEncAlignPower(29),
203 Terminator,
166 }; 204 };
167 EXPECT_TRUE(Munger.runTest("Good alloca alignment 29", Align29, 205 EXPECT_TRUE(Munger.runTest("Good alloca alignment 29", Align29,
168 array_lengthof(Align29))); 206 array_lengthof(Align29)));
169 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 29", Align29, 207 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 29", Align29,
170 array_lengthof(Align29))); 208 array_lengthof(Align29)));
171 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 536870912;\n", 209 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 536870912;\n",
172 DumpMunger.getLinesWithSubstring("alloca")); 210 DumpMunger.getLinesWithSubstring("alloca"));
173 } 211 }
174 212
175 // Test how we recognize alignments in load i32 instructions. 213 // Test how we recognize alignments in load i32 instructions.
176 TEST(IceParseInstsTests, LoadI32Alignment) { 214 TEST(IceParseInstsTests, LoadI32Alignment) {
177 const uint64_t BitcodeRecords[] = { 215 const uint64_t BitcodeRecords[] = {
178 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, 216 1, naclbitc::BLK_CODE_ENTER,
179 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, 217 naclbitc::MODULE_BLOCK_ID, 2,
180 3, naclbitc::TYPE_CODE_NUMENTRY, 2, Terminator, 218 Terminator, 1,
181 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, 219 naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW,
182 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 0, Terminator, 220 2, Terminator,
183 0, naclbitc::BLK_CODE_EXIT, Terminator, 221 3, naclbitc::TYPE_CODE_NUMENTRY,
184 3, naclbitc::MODULE_CODE_FUNCTION, 1, 0, 0, 0, Terminator, 222 2, Terminator,
185 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, 223 3, naclbitc::TYPE_CODE_INTEGER,
186 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, 224 32, Terminator,
187 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 0, Terminator, 225 3, naclbitc::TYPE_CODE_FUNCTION,
188 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, 226 0, 0,
189 0, naclbitc::BLK_CODE_EXIT, Terminator, 227 0, Terminator,
190 0, naclbitc::BLK_CODE_EXIT, Terminator}; 228 0, naclbitc::BLK_CODE_EXIT,
229 Terminator, 3,
230 naclbitc::MODULE_CODE_FUNCTION, 1,
231 0, 0,
232 0, Terminator,
233 1, naclbitc::BLK_CODE_ENTER,
234 naclbitc::FUNCTION_BLOCK_ID, 2,
235 Terminator, 3,
236 naclbitc::FUNC_CODE_DECLAREBLOCKS, 1,
237 Terminator, 3,
238 naclbitc::FUNC_CODE_INST_LOAD, 1,
239 getEncAlignPower(0), 0,
240 Terminator, 3,
241 naclbitc::FUNC_CODE_INST_RET, 1,
242 Terminator, 0,
243 naclbitc::BLK_CODE_EXIT, Terminator,
244 0, naclbitc::BLK_CODE_EXIT,
245 Terminator};
191 246
192 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD 247 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD
193 248
194 // Show text when alignment is 1. 249 // Show text when alignment is 1.
195 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), 250 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords),
196 Terminator); 251 Terminator);
197 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load i32 alignment 1")); 252 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load i32 alignment 1"));
198 EXPECT_EQ("module { // BlockID = 8\n" 253 EXPECT_EQ("module { // BlockID = 8\n"
199 " types { // BlockID = 17\n" 254 " types { // BlockID = 17\n"
200 " count 2;\n" 255 " count 2;\n"
201 " @t0 = i32;\n" 256 " @t0 = i32;\n"
202 " @t1 = i32 (i32);\n" 257 " @t1 = i32 (i32);\n"
203 " }\n" 258 " }\n"
204 " define external i32 @f0(i32);\n" 259 " define external i32 @f0(i32);\n"
205 " function i32 @f0(i32 %p0) { // BlockID = 12\n" 260 " function i32 @f0(i32 %p0) { // BlockID = 12\n"
206 " blocks 1;\n" 261 " blocks 1;\n"
207 " %b0:\n" 262 " %b0:\n"
208 " %v0 = load i32* %p0, align 1;\n" 263 " %v0 = load i32* %p0, align 1;\n"
209 " ret i32 %v0;\n" 264 " ret i32 %v0;\n"
210 " }\n" 265 " }\n"
211 "}\n", 266 "}\n",
212 DumpMunger.getTestResults()); 267 DumpMunger.getTestResults());
213 IceTest::SubzeroBitcodeMunger Munger( 268 IceTest::SubzeroBitcodeMunger Munger(
214 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); 269 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator);
215 EXPECT_TRUE(Munger.runTest("Good load i32 alignment 1")); 270 EXPECT_TRUE(Munger.runTest("Good load i32 alignment 1"));
216 271
217 // Show what happens when changing alignment to 0. 272 // Show what happens when changing alignment to 0.
218 const uint64_t Align0[] = { 273 const uint64_t Align0[] = {
219 ReplaceIndex, NaClBitcodeMunger::Replace, 274 ReplaceIndex, NaClBitcodeMunger::Replace,
220 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, 275 3, naclbitc::FUNC_CODE_INST_LOAD,
276 1, getEncAlignZero(),
277 0, Terminator,
221 }; 278 };
222 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 0", Align0, 279 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 0", Align0,
223 array_lengthof(Align0))); 280 array_lengthof(Align0)));
224 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 0 0>\n", 281 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 0 0>\n",
225 Munger.getTestResults()); 282 Munger.getTestResults());
226 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 0", Align0, 283 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 0", Align0,
227 array_lengthof(Align0))); 284 array_lengthof(Align0)));
228 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" 285 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n"
229 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", 286 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n",
230 DumpMunger.getLinesWithSubstring("load")); 287 DumpMunger.getLinesWithSubstring("load"));
231 288
232 // Show what happens when changing alignment to 4. 289 // Show what happens when changing alignment to 4.
233 const uint64_t Align4[] = { 290 const uint64_t Align4[] = {
234 ReplaceIndex, NaClBitcodeMunger::Replace, 291 ReplaceIndex, NaClBitcodeMunger::Replace,
235 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, 292 3, naclbitc::FUNC_CODE_INST_LOAD,
293 1, getEncAlignPower(2),
294 0, Terminator,
236 }; 295 };
237 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 4", Align4, 296 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 4", Align4,
238 array_lengthof(Align4))); 297 array_lengthof(Align4)));
239 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 3 0>\n", 298 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 3 0>\n",
240 Munger.getTestResults()); 299 Munger.getTestResults());
241 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 4", Align4, 300 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 4", Align4,
242 array_lengthof(Align4))); 301 array_lengthof(Align4)));
243 EXPECT_EQ(" %v0 = load i32* %p0, align 4;\n" 302 EXPECT_EQ(" %v0 = load i32* %p0, align 4;\n"
244 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", 303 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n",
245 DumpMunger.getLinesWithSubstring("load")); 304 DumpMunger.getLinesWithSubstring("load"));
246 305
247 // Show what happens when changing alignment to 2**29. 306 // Show what happens when changing alignment to 2**29.
248 const uint64_t Align29[] = { 307 const uint64_t Align29[] = {
249 ReplaceIndex, NaClBitcodeMunger::Replace, 308 ReplaceIndex, NaClBitcodeMunger::Replace,
250 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, 309 3, naclbitc::FUNC_CODE_INST_LOAD,
310 1, getEncAlignPower(29),
311 0, Terminator,
251 }; 312 };
252 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 29", Align29, 313 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 29", Align29,
253 array_lengthof(Align29))); 314 array_lengthof(Align29)));
254 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 30 0>\n", 315 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 30 0>\n",
255 Munger.getTestResults()); 316 Munger.getTestResults());
256 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 29", 317 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 29",
257 Align29, array_lengthof(Align29))); 318 Align29, array_lengthof(Align29)));
258 EXPECT_EQ(" %v0 = load i32* %p0, align 536870912;\n" 319 EXPECT_EQ(" %v0 = load i32* %p0, align 536870912;\n"
259 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", 320 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n",
260 DumpMunger.getLinesWithSubstring("load")); 321 DumpMunger.getLinesWithSubstring("load"));
261 322
262 // Show what happens when changing alignment to 2**30. 323 // Show what happens when changing alignment to 2**30.
263 const uint64_t Align30[] = { 324 const uint64_t Align30[] = {
264 ReplaceIndex, NaClBitcodeMunger::Replace, 325 ReplaceIndex, NaClBitcodeMunger::Replace,
265 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, 326 3, naclbitc::FUNC_CODE_INST_LOAD,
327 1, getEncAlignPower(30),
328 0, Terminator,
266 }; 329 };
267 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 30", Align30, 330 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 30", Align30,
268 array_lengthof(Align30))); 331 array_lengthof(Align30)));
269 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 31 0>\n", 332 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 31 0>\n",
270 Munger.getTestResults()); 333 Munger.getTestResults());
271 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 30", 334 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 30",
272 Align30, array_lengthof(Align30))); 335 Align30, array_lengthof(Align30)));
273 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" 336 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n"
274 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", 337 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n",
275 DumpMunger.getLinesWithSubstring("load")); 338 DumpMunger.getLinesWithSubstring("load"));
276 } 339 }
277 340
278 // Test how we recognize alignments in load float instructions. 341 // Test how we recognize alignments in load float instructions.
279 TEST(IceParseInstsTests, LoadFloatAlignment) { 342 TEST(IceParseInstsTests, LoadFloatAlignment) {
280 const uint64_t BitcodeRecords[] = { 343 const uint64_t BitcodeRecords[] = {
281 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, 344 1, naclbitc::BLK_CODE_ENTER,
282 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, 345 naclbitc::MODULE_BLOCK_ID, 2,
283 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, 346 Terminator, 1,
284 3, naclbitc::TYPE_CODE_FLOAT, Terminator, 347 naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW,
285 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, 348 2, Terminator,
286 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 1, Terminator, 349 3, naclbitc::TYPE_CODE_NUMENTRY,
287 0, naclbitc::BLK_CODE_EXIT, Terminator, 350 3, Terminator,
288 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, 351 3, naclbitc::TYPE_CODE_FLOAT,
289 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, 352 Terminator, 3,
290 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, 353 naclbitc::TYPE_CODE_INTEGER, 32,
291 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 0, Terminator, 354 Terminator, 3,
292 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, 355 naclbitc::TYPE_CODE_FUNCTION, 0,
293 0, naclbitc::BLK_CODE_EXIT, Terminator, 356 0, 1,
294 0, naclbitc::BLK_CODE_EXIT, Terminator}; 357 Terminator, 0,
358 naclbitc::BLK_CODE_EXIT, Terminator,
359 3, naclbitc::MODULE_CODE_FUNCTION,
360 2, 0,
361 0, 0,
362 Terminator, 1,
363 naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID,
364 2, Terminator,
365 3, naclbitc::FUNC_CODE_DECLAREBLOCKS,
366 1, Terminator,
367 3, naclbitc::FUNC_CODE_INST_LOAD,
368 1, getEncAlignPower(0),
369 0, Terminator,
370 3, naclbitc::FUNC_CODE_INST_RET,
371 1, Terminator,
372 0, naclbitc::BLK_CODE_EXIT,
373 Terminator, 0,
374 naclbitc::BLK_CODE_EXIT, Terminator};
295 375
296 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_LOAD 376 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_LOAD
297 377
298 // Show text when alignment is 1. 378 // Show text when alignment is 1.
299 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), 379 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords),
300 Terminator); 380 Terminator);
301 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 1")); 381 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 1"));
302 EXPECT_EQ("module { // BlockID = 8\n" 382 EXPECT_EQ("module { // BlockID = 8\n"
303 " types { // BlockID = 17\n" 383 " types { // BlockID = 17\n"
304 " count 3;\n" 384 " count 3;\n"
(...skipping 10 matching lines...) Expand all
315 " }\n" 395 " }\n"
316 "}\n", 396 "}\n",
317 DumpMunger.getTestResults()); 397 DumpMunger.getTestResults());
318 IceTest::SubzeroBitcodeMunger Munger( 398 IceTest::SubzeroBitcodeMunger Munger(
319 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); 399 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator);
320 EXPECT_TRUE(Munger.runTest("Good load float alignment 1")); 400 EXPECT_TRUE(Munger.runTest("Good load float alignment 1"));
321 401
322 // Show what happens when changing alignment to 0. 402 // Show what happens when changing alignment to 0.
323 const uint64_t Align0[] = { 403 const uint64_t Align0[] = {
324 ReplaceIndex, NaClBitcodeMunger::Replace, 404 ReplaceIndex, NaClBitcodeMunger::Replace,
325 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, 405 3, naclbitc::FUNC_CODE_INST_LOAD,
406 1, getEncAlignZero(),
407 0, Terminator,
326 }; 408 };
327 EXPECT_FALSE(Munger.runTest("Bad load float alignment 0", Align0, 409 EXPECT_FALSE(Munger.runTest("Bad load float alignment 0", Align0,
328 array_lengthof(Align0))); 410 array_lengthof(Align0)));
329 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 0 0>\n", 411 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 0 0>\n",
330 Munger.getTestResults()); 412 Munger.getTestResults());
331 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 0", 413 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 0",
332 Align0, array_lengthof(Align0))); 414 Align0, array_lengthof(Align0)));
333 EXPECT_EQ( 415 EXPECT_EQ(" %v0 = load float* %p0, align 0;\n"
334 " %v0 = load float* %p0, align 0;\n" 416 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n",
335 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", 417 DumpMunger.getLinesWithSubstring("load"));
336 DumpMunger.getLinesWithSubstring("load"));
337 418
338 // Show what happens when changing alignment to 4. 419 // Show what happens when changing alignment to 4.
339 const uint64_t Align4[] = { 420 const uint64_t Align4[] = {
340 ReplaceIndex, NaClBitcodeMunger::Replace, 421 ReplaceIndex, NaClBitcodeMunger::Replace,
341 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, 422 3, naclbitc::FUNC_CODE_INST_LOAD,
423 1, getEncAlignPower(2),
424 0, Terminator,
342 }; 425 };
343 EXPECT_TRUE(Munger.runTest("Good load float alignment 4", Align4, 426 EXPECT_TRUE(Munger.runTest("Good load float alignment 4", Align4,
344 array_lengthof(Align4))); 427 array_lengthof(Align4)));
345 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 4", 428 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 4",
346 Align4, array_lengthof(Align4))); 429 Align4, array_lengthof(Align4)));
347 EXPECT_EQ(" %v0 = load float* %p0, align 4;\n", 430 EXPECT_EQ(" %v0 = load float* %p0, align 4;\n",
348 DumpMunger.getLinesWithSubstring("load")); 431 DumpMunger.getLinesWithSubstring("load"));
349 432
350 const uint64_t Align29[] = { 433 const uint64_t Align29[] = {
351 ReplaceIndex, NaClBitcodeMunger::Replace, 434 ReplaceIndex, NaClBitcodeMunger::Replace,
352 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, 435 3, naclbitc::FUNC_CODE_INST_LOAD,
436 1, getEncAlignPower(29),
437 0, Terminator,
353 }; 438 };
354 EXPECT_FALSE(Munger.runTest("Bad load float alignment 29", Align29, 439 EXPECT_FALSE(Munger.runTest("Bad load float alignment 29", Align29,
355 array_lengthof(Align29))); 440 array_lengthof(Align29)));
356 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 30 0>\n", 441 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 30 0>\n",
357 Munger.getTestResults()); 442 Munger.getTestResults());
358 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 29", 443 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 29",
359 Align29, array_lengthof(Align29))); 444 Align29, array_lengthof(Align29)));
360 EXPECT_EQ( 445 EXPECT_EQ(" %v0 = load float* %p0, align 536870912;\n"
361 " %v0 = load float* %p0, align 536870912;\n" 446 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n",
362 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", 447 DumpMunger.getLinesWithSubstring("load"));
363 DumpMunger.getLinesWithSubstring("load"));
364 448
365 // Show what happens when changing alignment to 2**30. 449 // Show what happens when changing alignment to 2**30.
366 const uint64_t Align30[] = { 450 const uint64_t Align30[] = {
367 ReplaceIndex, NaClBitcodeMunger::Replace, 451 ReplaceIndex, NaClBitcodeMunger::Replace,
368 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, 452 3, naclbitc::FUNC_CODE_INST_LOAD,
453 1, getEncAlignPower(30),
454 0, Terminator,
369 }; 455 };
370 EXPECT_FALSE(Munger.runTest("Bad load float alignment 30", Align30, 456 EXPECT_FALSE(Munger.runTest("Bad load float alignment 30", Align30,
371 array_lengthof(Align30))); 457 array_lengthof(Align30)));
372 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 31 0>\n", 458 EXPECT_EQ("Error: (58:4) Invalid function record: <20 1 31 0>\n",
373 Munger.getTestResults()); 459 Munger.getTestResults());
374 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 30", 460 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 30",
375 Align30, array_lengthof(Align30))); 461 Align30, array_lengthof(Align30)));
376 EXPECT_EQ( 462 EXPECT_EQ(" %v0 = load float* %p0, align 0;\n"
377 " %v0 = load float* %p0, align 0;\n" 463 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n",
378 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", 464 DumpMunger.getLinesWithSubstring("load"));
379 DumpMunger.getLinesWithSubstring("load"));
380 } 465 }
381 466
382 // Test how we recognize alignments in store instructions. 467 // Test how we recognize alignments in store instructions.
383 TEST(NaClParseInstsTests, StoreAlignment) { 468 TEST(NaClParseInstsTests, StoreAlignment) {
384 const uint64_t BitcodeRecords[] = { 469 const uint64_t BitcodeRecords[] = {
385 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, 470 1, naclbitc::BLK_CODE_ENTER,
386 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, 471 naclbitc::MODULE_BLOCK_ID, 2,
387 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, 472 Terminator, 1,
388 3, naclbitc::TYPE_CODE_FLOAT, Terminator, 473 naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW,
389 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, 474 2, Terminator,
390 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 1, 0, Terminator, 475 3, naclbitc::TYPE_CODE_NUMENTRY,
391 0, naclbitc::BLK_CODE_EXIT, Terminator, 476 3, Terminator,
392 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, 477 3, naclbitc::TYPE_CODE_FLOAT,
393 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, 478 Terminator, 3,
394 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, 479 naclbitc::TYPE_CODE_INTEGER, 32,
395 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(0), Terminator, 480 Terminator, 3,
396 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, 481 naclbitc::TYPE_CODE_FUNCTION, 0,
397 0, naclbitc::BLK_CODE_EXIT, Terminator, 482 0, 1,
398 0, naclbitc::BLK_CODE_EXIT, Terminator}; 483 0, Terminator,
484 0, naclbitc::BLK_CODE_EXIT,
485 Terminator, 3,
486 naclbitc::MODULE_CODE_FUNCTION, 2,
487 0, 0,
488 0, Terminator,
489 1, naclbitc::BLK_CODE_ENTER,
490 naclbitc::FUNCTION_BLOCK_ID, 2,
491 Terminator, 3,
492 naclbitc::FUNC_CODE_DECLAREBLOCKS, 1,
493 Terminator, 3,
494 naclbitc::FUNC_CODE_INST_STORE, 2,
495 1, getEncAlignPower(0),
496 Terminator, 3,
497 naclbitc::FUNC_CODE_INST_RET, 1,
498 Terminator, 0,
499 naclbitc::BLK_CODE_EXIT, Terminator,
500 0, naclbitc::BLK_CODE_EXIT,
501 Terminator};
399 502
400 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_STORE 503 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_STORE
401 504
402 // Show text when alignment is 1. 505 // Show text when alignment is 1.
403 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), 506 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords),
404 Terminator); 507 Terminator);
405 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good Store Alignment 1")); 508 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good Store Alignment 1"));
406 EXPECT_EQ("module { // BlockID = 8\n" 509 EXPECT_EQ("module { // BlockID = 8\n"
407 " types { // BlockID = 17\n" 510 " types { // BlockID = 17\n"
408 " count 3;\n" 511 " count 3;\n"
409 " @t0 = float;\n" 512 " @t0 = float;\n"
410 " @t1 = i32;\n" 513 " @t1 = i32;\n"
411 " @t2 = float (i32, float);\n" 514 " @t2 = float (i32, float);\n"
412 " }\n" 515 " }\n"
413 " define external float @f0(i32, float);\n" 516 " define external float @f0(i32, float);\n"
414 " function float @f0(i32 %p0, float %p1) { // BlockID = 12\n" 517 " function float @f0(i32 %p0, float %p1) { // BlockID = 12\n"
415 " blocks 1;\n" 518 " blocks 1;\n"
416 " %b0:\n" 519 " %b0:\n"
417 " store float %p1, float* %p0, align 1;\n" 520 " store float %p1, float* %p0, align 1;\n"
418 " ret float %p1;\n" 521 " ret float %p1;\n"
419 " }\n" 522 " }\n"
420 "}\n", 523 "}\n",
421 DumpMunger.getTestResults()); 524 DumpMunger.getTestResults());
422 IceTest::SubzeroBitcodeMunger Munger( 525 IceTest::SubzeroBitcodeMunger Munger(
423 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); 526 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator);
424 EXPECT_TRUE(Munger.runTest("Good store alignment")); 527 EXPECT_TRUE(Munger.runTest("Good store alignment"));
425 528
426 // Show what happens when changing alignment to 0. 529 // Show what happens when changing alignment to 0.
427 const uint64_t Align0[] = { 530 const uint64_t Align0[] = {
428 ReplaceIndex, NaClBitcodeMunger::Replace, 531 ReplaceIndex, NaClBitcodeMunger::Replace, 3,
429 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, 532 naclbitc::FUNC_CODE_INST_STORE, 2, 1,
533 getEncAlignZero(), Terminator,
430 }; 534 };
431 EXPECT_FALSE( 535 EXPECT_FALSE(
432 Munger.runTest("Bad store alignment 0", Align0, array_lengthof(Align0))); 536 Munger.runTest("Bad store alignment 0", Align0, array_lengthof(Align0)));
433 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 0>\n", 537 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 0>\n",
434 Munger.getTestResults()); 538 Munger.getTestResults());
435 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 0", Align0, 539 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 0", Align0,
436 array_lengthof(Align0))); 540 array_lengthof(Align0)));
437 EXPECT_EQ( 541 EXPECT_EQ(
438 " store float %p1, float* %p0, align 0;\n" 542 " store float %p1, float* %p0, align 0;\n"
439 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", 543 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n",
440 DumpMunger.getLinesWithSubstring("store")); 544 DumpMunger.getLinesWithSubstring("store"));
441 545
442 // Show what happens when changing alignment to 4. 546 // Show what happens when changing alignment to 4.
443 const uint64_t Align4[] = { 547 const uint64_t Align4[] = {
444 ReplaceIndex, NaClBitcodeMunger::Replace, 548 ReplaceIndex, NaClBitcodeMunger::Replace, 3,
445 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(2), Terminator, 549 naclbitc::FUNC_CODE_INST_STORE, 2, 1,
550 getEncAlignPower(2), Terminator,
446 }; 551 };
447 EXPECT_TRUE( 552 EXPECT_TRUE(
448 Munger.runTest("Bad store alignment 4", Align4, array_lengthof(Align4))); 553 Munger.runTest("Bad store alignment 4", Align4, array_lengthof(Align4)));
449 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good store alignment 4", Align4, 554 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good store alignment 4", Align4,
450 array_lengthof(Align4))); 555 array_lengthof(Align4)));
451 556
452 // Show what happens when changing alignment to 8. 557 // Show what happens when changing alignment to 8.
453 const uint64_t Align8[] = { 558 const uint64_t Align8[] = {
454 ReplaceIndex, NaClBitcodeMunger::Replace, 559 ReplaceIndex, NaClBitcodeMunger::Replace, 3,
455 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(3), Terminator, 560 naclbitc::FUNC_CODE_INST_STORE, 2, 1,
561 getEncAlignPower(3), Terminator,
456 }; 562 };
457 EXPECT_FALSE( 563 EXPECT_FALSE(
458 Munger.runTest("Bad store alignment 8", Align8, array_lengthof(Align8))); 564 Munger.runTest("Bad store alignment 8", Align8, array_lengthof(Align8)));
459 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 4>\n", 565 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 4>\n",
460 Munger.getTestResults()); 566 Munger.getTestResults());
461 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 8", Align8, 567 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 8", Align8,
462 array_lengthof(Align8))); 568 array_lengthof(Align8)));
463 EXPECT_EQ( 569 EXPECT_EQ(
464 " store float %p1, float* %p0, align 8;\n" 570 " store float %p1, float* %p0, align 8;\n"
465 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", 571 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n",
466 DumpMunger.getLinesWithSubstring("store")); 572 DumpMunger.getLinesWithSubstring("store"));
467 573
468 // Show what happens when changing alignment to 2**29. 574 // Show what happens when changing alignment to 2**29.
469 const uint64_t Align29[] = { 575 const uint64_t Align29[] = {
470 ReplaceIndex, NaClBitcodeMunger::Replace, 576 ReplaceIndex, NaClBitcodeMunger::Replace, 3,
471 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(29), Terminator, 577 naclbitc::FUNC_CODE_INST_STORE, 2, 1,
578 getEncAlignPower(29), Terminator,
472 }; 579 };
473 EXPECT_FALSE(Munger.runTest("Bad store alignment 29", Align29, 580 EXPECT_FALSE(Munger.runTest("Bad store alignment 29", Align29,
474 array_lengthof(Align29))); 581 array_lengthof(Align29)));
475 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 30>\n", 582 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 30>\n",
476 Munger.getTestResults()); 583 Munger.getTestResults());
477 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 29", Align29, 584 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 29", Align29,
478 array_lengthof(Align29))); 585 array_lengthof(Align29)));
479 EXPECT_EQ( 586 EXPECT_EQ(
480 " store float %p1, float* %p0, align 536870912;\n" 587 " store float %p1, float* %p0, align 536870912;\n"
481 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", 588 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n",
482 DumpMunger.getLinesWithSubstring("store")); 589 DumpMunger.getLinesWithSubstring("store"));
483 590
484 const uint64_t Align30[] = { 591 const uint64_t Align30[] = {
485 ReplaceIndex, NaClBitcodeMunger::Replace, 592 ReplaceIndex, NaClBitcodeMunger::Replace,
486 // Note: alignment stored as 0 or log2(Alignment)+1. 593 // Note: alignment stored as 0 or log2(Alignment)+1.
487 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, 594 3, naclbitc::FUNC_CODE_INST_STORE, 2,
595 1, getEncAlignPower(30), Terminator,
488 }; 596 };
489 EXPECT_FALSE(Munger.runTest("Bad store alignment 30", Align30, 597 EXPECT_FALSE(Munger.runTest("Bad store alignment 30", Align30,
490 array_lengthof(Align30))); 598 array_lengthof(Align30)));
491 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 31>\n", 599 EXPECT_EQ("Error: (62:4) Invalid function record: <24 2 1 31>\n",
492 Munger.getTestResults()); 600 Munger.getTestResults());
493 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad Store alignment 30", Align30, 601 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad Store alignment 30", Align30,
494 array_lengthof(Align30))); 602 array_lengthof(Align30)));
495 EXPECT_EQ( 603 EXPECT_EQ(
496 " store float %p1, float* %p0, align 0;\n" 604 " store float %p1, float* %p0, align 0;\n"
497 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", 605 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n",
498 DumpMunger.getLinesWithSubstring("store")); 606 DumpMunger.getLinesWithSubstring("store"));
499 } 607 }
500 608
501 } // end of anonymous namespace 609 } // end of anonymous namespace
OLDNEW
« crosstest/mem_intrin_main.cpp ('K') | « unittest/BitcodeMunge.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698