xref: /aosp_15_r20/external/swiftshader/third_party/subzero/unittest/IceParseInstsTest.cpp (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker //===- unittest/IceParseInstsTest.cpp - test instruction errors -----------===//
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker //                        The Subzero Code Generator
4*03ce13f7SAndroid Build Coastguard Worker //
5*03ce13f7SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*03ce13f7SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*03ce13f7SAndroid Build Coastguard Worker //
8*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*03ce13f7SAndroid Build Coastguard Worker 
10*03ce13f7SAndroid Build Coastguard Worker #include <string>
11*03ce13f7SAndroid Build Coastguard Worker 
12*03ce13f7SAndroid Build Coastguard Worker #pragma clang diagnostic push
13*03ce13f7SAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wunused-parameter"
14*03ce13f7SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
15*03ce13f7SAndroid Build Coastguard Worker #include "llvm/Bitcode/NaCl/NaClBitcodeParser.h"
16*03ce13f7SAndroid Build Coastguard Worker #include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h"
17*03ce13f7SAndroid Build Coastguard Worker #pragma clang diagnostic pop
18*03ce13f7SAndroid Build Coastguard Worker 
19*03ce13f7SAndroid Build Coastguard Worker #include "BitcodeMunge.h"
20*03ce13f7SAndroid Build Coastguard Worker #include "unittests/Bitcode/NaClMungeTest.h"
21*03ce13f7SAndroid Build Coastguard Worker 
22*03ce13f7SAndroid Build Coastguard Worker using namespace llvm;
23*03ce13f7SAndroid Build Coastguard Worker using namespace naclmungetest;
24*03ce13f7SAndroid Build Coastguard Worker 
25*03ce13f7SAndroid Build Coastguard Worker namespace {
26*03ce13f7SAndroid Build Coastguard Worker 
27*03ce13f7SAndroid Build Coastguard Worker // The ParseError constant is passed to the BitcodeMunger to prevent translation
28*03ce13f7SAndroid Build Coastguard Worker // when we expect a Parse error.
29*03ce13f7SAndroid Build Coastguard Worker constexpr bool ParseError = true;
30*03ce13f7SAndroid Build Coastguard Worker 
31*03ce13f7SAndroid Build Coastguard Worker // Note: alignment stored as 0 or log2(Alignment)+1.
getEncAlignPower(unsigned Power)32*03ce13f7SAndroid Build Coastguard Worker uint64_t getEncAlignPower(unsigned Power) { return Power + 1; }
getEncAlignZero()33*03ce13f7SAndroid Build Coastguard Worker uint64_t getEncAlignZero() { return 0; }
34*03ce13f7SAndroid Build Coastguard Worker 
35*03ce13f7SAndroid Build Coastguard Worker /// Test how we report a call arg that refers to nonexistent call argument
TEST(IceParseInstsTest,NonexistentCallArg)36*03ce13f7SAndroid Build Coastguard Worker TEST(IceParseInstsTest, NonexistentCallArg) {
37*03ce13f7SAndroid Build Coastguard Worker   const uint64_t BitcodeRecords[] = {
38*03ce13f7SAndroid Build Coastguard Worker       1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, 1,
39*03ce13f7SAndroid Build Coastguard Worker       naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, 3,
40*03ce13f7SAndroid Build Coastguard Worker       naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, 3,
41*03ce13f7SAndroid Build Coastguard Worker       naclbitc::TYPE_CODE_INTEGER, 32, Terminator, 3, naclbitc::TYPE_CODE_VOID,
42*03ce13f7SAndroid Build Coastguard Worker       Terminator, 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, 0, Terminator, 0,
43*03ce13f7SAndroid Build Coastguard Worker       naclbitc::BLK_CODE_EXIT, Terminator, 3, naclbitc::MODULE_CODE_FUNCTION, 2,
44*03ce13f7SAndroid Build Coastguard Worker       0, 1, 3, Terminator, 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 3,
45*03ce13f7SAndroid Build Coastguard Worker       Terminator, 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2,
46*03ce13f7SAndroid Build Coastguard Worker       Terminator, 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator,
47*03ce13f7SAndroid Build Coastguard Worker       // Note: 100 is a bad value index in next line.
48*03ce13f7SAndroid Build Coastguard Worker       3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, 3,
49*03ce13f7SAndroid Build Coastguard Worker       naclbitc::FUNC_CODE_INST_RET, Terminator, 0, naclbitc::BLK_CODE_EXIT,
50*03ce13f7SAndroid Build Coastguard Worker       Terminator, 0, naclbitc::BLK_CODE_EXIT, Terminator};
51*03ce13f7SAndroid Build Coastguard Worker 
52*03ce13f7SAndroid Build Coastguard Worker   // Show bitcode objdump for BitcodeRecords.
53*03ce13f7SAndroid Build Coastguard Worker   NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords));
54*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(DumpMunger.runTest());
55*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("      66:4|    3: <34, 0, 4, 2, 100>    |    call void @f0(i32 "
56*03ce13f7SAndroid Build Coastguard Worker             "%p0, i32 @f0);\n"
57*03ce13f7SAndroid Build Coastguard Worker             "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n",
58*03ce13f7SAndroid Build Coastguard Worker             DumpMunger.getLinesWithSubstring("66:4"));
59*03ce13f7SAndroid Build Coastguard Worker 
60*03ce13f7SAndroid Build Coastguard Worker   // Show that we get appropriate error when parsing in Subzero.
61*03ce13f7SAndroid Build Coastguard Worker   IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords));
62*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(Munger.runTest(ParseError));
63*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("Error(66:4): Invalid function record: <34 0 4 2 100>\n",
64*03ce13f7SAndroid Build Coastguard Worker             Munger.getTestResults());
65*03ce13f7SAndroid Build Coastguard Worker 
66*03ce13f7SAndroid Build Coastguard Worker   // Show that we generate a fatal error when not allowing error recovery.
67*03ce13f7SAndroid Build Coastguard Worker   Ice::ClFlags::Flags.setAllowErrorRecovery(false);
68*03ce13f7SAndroid Build Coastguard Worker   EXPECT_DEATH(Munger.runTest(ParseError), ".*ERROR: Unable to continue.*");
69*03ce13f7SAndroid Build Coastguard Worker }
70*03ce13f7SAndroid Build Coastguard Worker 
71*03ce13f7SAndroid Build Coastguard Worker /// Test how we recognize alignments in alloca instructions.
TEST(IceParseInstsTests,AllocaAlignment)72*03ce13f7SAndroid Build Coastguard Worker TEST(IceParseInstsTests, AllocaAlignment) {
73*03ce13f7SAndroid Build Coastguard Worker   const uint64_t BitcodeRecords[] = {1,
74*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_ENTER,
75*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::MODULE_BLOCK_ID,
76*03ce13f7SAndroid Build Coastguard Worker                                      2,
77*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
78*03ce13f7SAndroid Build Coastguard Worker                                      1,
79*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_ENTER,
80*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::TYPE_BLOCK_ID_NEW,
81*03ce13f7SAndroid Build Coastguard Worker                                      2,
82*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
83*03ce13f7SAndroid Build Coastguard Worker                                      3,
84*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::TYPE_CODE_NUMENTRY,
85*03ce13f7SAndroid Build Coastguard Worker                                      4,
86*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
87*03ce13f7SAndroid Build Coastguard Worker                                      3,
88*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::TYPE_CODE_INTEGER,
89*03ce13f7SAndroid Build Coastguard Worker                                      32,
90*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
91*03ce13f7SAndroid Build Coastguard Worker                                      3,
92*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::TYPE_CODE_VOID,
93*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
94*03ce13f7SAndroid Build Coastguard Worker                                      3,
95*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::TYPE_CODE_FUNCTION,
96*03ce13f7SAndroid Build Coastguard Worker                                      0,
97*03ce13f7SAndroid Build Coastguard Worker                                      1,
98*03ce13f7SAndroid Build Coastguard Worker                                      0,
99*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
100*03ce13f7SAndroid Build Coastguard Worker                                      3,
101*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::TYPE_CODE_INTEGER,
102*03ce13f7SAndroid Build Coastguard Worker                                      8,
103*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
104*03ce13f7SAndroid Build Coastguard Worker                                      0,
105*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_EXIT,
106*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
107*03ce13f7SAndroid Build Coastguard Worker                                      3,
108*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::MODULE_CODE_FUNCTION,
109*03ce13f7SAndroid Build Coastguard Worker                                      2,
110*03ce13f7SAndroid Build Coastguard Worker                                      0,
111*03ce13f7SAndroid Build Coastguard Worker                                      0,
112*03ce13f7SAndroid Build Coastguard Worker                                      3,
113*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
114*03ce13f7SAndroid Build Coastguard Worker                                      1,
115*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_ENTER,
116*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::FUNCTION_BLOCK_ID,
117*03ce13f7SAndroid Build Coastguard Worker                                      2,
118*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
119*03ce13f7SAndroid Build Coastguard Worker                                      3,
120*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::FUNC_CODE_DECLAREBLOCKS,
121*03ce13f7SAndroid Build Coastguard Worker                                      1,
122*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
123*03ce13f7SAndroid Build Coastguard Worker                                      3,
124*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::FUNC_CODE_INST_ALLOCA,
125*03ce13f7SAndroid Build Coastguard Worker                                      1,
126*03ce13f7SAndroid Build Coastguard Worker                                      getEncAlignPower(0),
127*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
128*03ce13f7SAndroid Build Coastguard Worker                                      3,
129*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::FUNC_CODE_INST_RET,
130*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
131*03ce13f7SAndroid Build Coastguard Worker                                      0,
132*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_EXIT,
133*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
134*03ce13f7SAndroid Build Coastguard Worker                                      0,
135*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_EXIT,
136*03ce13f7SAndroid Build Coastguard Worker                                      Terminator};
137*03ce13f7SAndroid Build Coastguard Worker 
138*03ce13f7SAndroid Build Coastguard Worker   const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA
139*03ce13f7SAndroid Build Coastguard Worker 
140*03ce13f7SAndroid Build Coastguard Worker   // Show text when alignment is 1.
141*03ce13f7SAndroid Build Coastguard Worker   NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords));
142*03ce13f7SAndroid Build Coastguard Worker   EXPECT_TRUE(DumpMunger.runTest());
143*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("      62:4|    3: <19, 1, 1>            |    %v0 = alloca i8, i32 "
144*03ce13f7SAndroid Build Coastguard Worker             "%p0, align 1;\n",
145*03ce13f7SAndroid Build Coastguard Worker             DumpMunger.getLinesWithSubstring("62:4"));
146*03ce13f7SAndroid Build Coastguard Worker 
147*03ce13f7SAndroid Build Coastguard Worker   // Show that we can handle alignment of 1.
148*03ce13f7SAndroid Build Coastguard Worker   IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords));
149*03ce13f7SAndroid Build Coastguard Worker   EXPECT_TRUE(Munger.runTest());
150*03ce13f7SAndroid Build Coastguard Worker 
151*03ce13f7SAndroid Build Coastguard Worker   // Show what happens when changing alignment to 0.
152*03ce13f7SAndroid Build Coastguard Worker   const uint64_t Align0[] = {
153*03ce13f7SAndroid Build Coastguard Worker       ReplaceIndex,
154*03ce13f7SAndroid Build Coastguard Worker       NaClMungedBitcode::Replace,
155*03ce13f7SAndroid Build Coastguard Worker       3,
156*03ce13f7SAndroid Build Coastguard Worker       naclbitc::FUNC_CODE_INST_ALLOCA,
157*03ce13f7SAndroid Build Coastguard Worker       1,
158*03ce13f7SAndroid Build Coastguard Worker       getEncAlignZero(),
159*03ce13f7SAndroid Build Coastguard Worker       Terminator,
160*03ce13f7SAndroid Build Coastguard Worker   };
161*03ce13f7SAndroid Build Coastguard Worker   EXPECT_TRUE(Munger.runTest(ARRAY(Align0)));
162*03ce13f7SAndroid Build Coastguard Worker   EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align0)));
163*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("    %v0 = alloca i8, i32 %p0, align 0;\n",
164*03ce13f7SAndroid Build Coastguard Worker             DumpMunger.getLinesWithSubstring("alloca"));
165*03ce13f7SAndroid Build Coastguard Worker 
166*03ce13f7SAndroid Build Coastguard Worker   // Show what happens when changing alignment to 2**30.
167*03ce13f7SAndroid Build Coastguard Worker   const uint64_t Align30[] = {
168*03ce13f7SAndroid Build Coastguard Worker       ReplaceIndex,
169*03ce13f7SAndroid Build Coastguard Worker       NaClMungedBitcode::Replace,
170*03ce13f7SAndroid Build Coastguard Worker       3,
171*03ce13f7SAndroid Build Coastguard Worker       naclbitc::FUNC_CODE_INST_ALLOCA,
172*03ce13f7SAndroid Build Coastguard Worker       1,
173*03ce13f7SAndroid Build Coastguard Worker       getEncAlignPower(30),
174*03ce13f7SAndroid Build Coastguard Worker       Terminator,
175*03ce13f7SAndroid Build Coastguard Worker   };
176*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(Munger.runTest(ARRAY(Align30), ParseError));
177*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("Error(62:4): Invalid function record: <19 1 31>\n",
178*03ce13f7SAndroid Build Coastguard Worker             Munger.getTestResults());
179*03ce13f7SAndroid Build Coastguard Worker 
180*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30)));
181*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("    %v0 = alloca i8, i32 %p0, align 0;\n",
182*03ce13f7SAndroid Build Coastguard Worker             DumpMunger.getLinesWithSubstring("alloca"));
183*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ(
184*03ce13f7SAndroid Build Coastguard Worker       "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n",
185*03ce13f7SAndroid Build Coastguard Worker       DumpMunger.getLinesWithSubstring("Error"));
186*03ce13f7SAndroid Build Coastguard Worker 
187*03ce13f7SAndroid Build Coastguard Worker   // Show what happens when changing alignment to 2**29.
188*03ce13f7SAndroid Build Coastguard Worker   const uint64_t Align29[] = {
189*03ce13f7SAndroid Build Coastguard Worker       ReplaceIndex,
190*03ce13f7SAndroid Build Coastguard Worker       NaClMungedBitcode::Replace,
191*03ce13f7SAndroid Build Coastguard Worker       3,
192*03ce13f7SAndroid Build Coastguard Worker       naclbitc::FUNC_CODE_INST_ALLOCA,
193*03ce13f7SAndroid Build Coastguard Worker       1,
194*03ce13f7SAndroid Build Coastguard Worker       getEncAlignPower(29),
195*03ce13f7SAndroid Build Coastguard Worker       Terminator,
196*03ce13f7SAndroid Build Coastguard Worker   };
197*03ce13f7SAndroid Build Coastguard Worker   EXPECT_TRUE(Munger.runTest(ARRAY(Align29)));
198*03ce13f7SAndroid Build Coastguard Worker   EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align29)));
199*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("    %v0 = alloca i8, i32 %p0, align 536870912;\n",
200*03ce13f7SAndroid Build Coastguard Worker             DumpMunger.getLinesWithSubstring("alloca"));
201*03ce13f7SAndroid Build Coastguard Worker }
202*03ce13f7SAndroid Build Coastguard Worker 
203*03ce13f7SAndroid Build Coastguard Worker // Test how we recognize alignments in load i32 instructions.
TEST(IceParseInstsTests,LoadI32Alignment)204*03ce13f7SAndroid Build Coastguard Worker TEST(IceParseInstsTests, LoadI32Alignment) {
205*03ce13f7SAndroid Build Coastguard Worker   const uint64_t BitcodeRecords[] = {1,
206*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_ENTER,
207*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::MODULE_BLOCK_ID,
208*03ce13f7SAndroid Build Coastguard Worker                                      2,
209*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
210*03ce13f7SAndroid Build Coastguard Worker                                      1,
211*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_ENTER,
212*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::TYPE_BLOCK_ID_NEW,
213*03ce13f7SAndroid Build Coastguard Worker                                      2,
214*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
215*03ce13f7SAndroid Build Coastguard Worker                                      3,
216*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::TYPE_CODE_NUMENTRY,
217*03ce13f7SAndroid Build Coastguard Worker                                      2,
218*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
219*03ce13f7SAndroid Build Coastguard Worker                                      3,
220*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::TYPE_CODE_INTEGER,
221*03ce13f7SAndroid Build Coastguard Worker                                      32,
222*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
223*03ce13f7SAndroid Build Coastguard Worker                                      3,
224*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::TYPE_CODE_FUNCTION,
225*03ce13f7SAndroid Build Coastguard Worker                                      0,
226*03ce13f7SAndroid Build Coastguard Worker                                      0,
227*03ce13f7SAndroid Build Coastguard Worker                                      0,
228*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
229*03ce13f7SAndroid Build Coastguard Worker                                      0,
230*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_EXIT,
231*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
232*03ce13f7SAndroid Build Coastguard Worker                                      3,
233*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::MODULE_CODE_FUNCTION,
234*03ce13f7SAndroid Build Coastguard Worker                                      1,
235*03ce13f7SAndroid Build Coastguard Worker                                      0,
236*03ce13f7SAndroid Build Coastguard Worker                                      0,
237*03ce13f7SAndroid Build Coastguard Worker                                      3,
238*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
239*03ce13f7SAndroid Build Coastguard Worker                                      1,
240*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_ENTER,
241*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::FUNCTION_BLOCK_ID,
242*03ce13f7SAndroid Build Coastguard Worker                                      2,
243*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
244*03ce13f7SAndroid Build Coastguard Worker                                      3,
245*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::FUNC_CODE_DECLAREBLOCKS,
246*03ce13f7SAndroid Build Coastguard Worker                                      1,
247*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
248*03ce13f7SAndroid Build Coastguard Worker                                      3,
249*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::FUNC_CODE_INST_LOAD,
250*03ce13f7SAndroid Build Coastguard Worker                                      1,
251*03ce13f7SAndroid Build Coastguard Worker                                      getEncAlignPower(0),
252*03ce13f7SAndroid Build Coastguard Worker                                      0,
253*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
254*03ce13f7SAndroid Build Coastguard Worker                                      3,
255*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::FUNC_CODE_INST_RET,
256*03ce13f7SAndroid Build Coastguard Worker                                      1,
257*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
258*03ce13f7SAndroid Build Coastguard Worker                                      0,
259*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_EXIT,
260*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
261*03ce13f7SAndroid Build Coastguard Worker                                      0,
262*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_EXIT,
263*03ce13f7SAndroid Build Coastguard Worker                                      Terminator};
264*03ce13f7SAndroid Build Coastguard Worker 
265*03ce13f7SAndroid Build Coastguard Worker   const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD
266*03ce13f7SAndroid Build Coastguard Worker 
267*03ce13f7SAndroid Build Coastguard Worker   // Show text when alignment is 1.
268*03ce13f7SAndroid Build Coastguard Worker   NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords));
269*03ce13f7SAndroid Build Coastguard Worker   EXPECT_TRUE(DumpMunger.runTest());
270*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("      58:4|    3: <20, 1, 1, 0>         |    %v0 = load i32* %p0, "
271*03ce13f7SAndroid Build Coastguard Worker             "align 1;\n",
272*03ce13f7SAndroid Build Coastguard Worker             DumpMunger.getLinesWithSubstring("58:4"));
273*03ce13f7SAndroid Build Coastguard Worker   IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords));
274*03ce13f7SAndroid Build Coastguard Worker   EXPECT_TRUE(Munger.runTest());
275*03ce13f7SAndroid Build Coastguard Worker 
276*03ce13f7SAndroid Build Coastguard Worker   // Show what happens when changing alignment to 0.
277*03ce13f7SAndroid Build Coastguard Worker   const uint64_t Align0[] = {
278*03ce13f7SAndroid Build Coastguard Worker       ReplaceIndex,
279*03ce13f7SAndroid Build Coastguard Worker       NaClMungedBitcode::Replace,
280*03ce13f7SAndroid Build Coastguard Worker       3,
281*03ce13f7SAndroid Build Coastguard Worker       naclbitc::FUNC_CODE_INST_LOAD,
282*03ce13f7SAndroid Build Coastguard Worker       1,
283*03ce13f7SAndroid Build Coastguard Worker       getEncAlignZero(),
284*03ce13f7SAndroid Build Coastguard Worker       0,
285*03ce13f7SAndroid Build Coastguard Worker       Terminator,
286*03ce13f7SAndroid Build Coastguard Worker   };
287*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(Munger.runTest(ARRAY(Align0), ParseError));
288*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("Error(58:4): Invalid function record: <20 1 0 0>\n",
289*03ce13f7SAndroid Build Coastguard Worker             Munger.getTestResults());
290*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0)));
291*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("    %v0 = load i32* %p0, align 0;\n"
292*03ce13f7SAndroid Build Coastguard Worker             "Error(58:4): load: Illegal alignment for i32. Expects: 1\n",
293*03ce13f7SAndroid Build Coastguard Worker             DumpMunger.getLinesWithSubstring("load"));
294*03ce13f7SAndroid Build Coastguard Worker 
295*03ce13f7SAndroid Build Coastguard Worker   // Show what happens when changing alignment to 4.
296*03ce13f7SAndroid Build Coastguard Worker   const uint64_t Align4[] = {
297*03ce13f7SAndroid Build Coastguard Worker       ReplaceIndex,
298*03ce13f7SAndroid Build Coastguard Worker       NaClMungedBitcode::Replace,
299*03ce13f7SAndroid Build Coastguard Worker       3,
300*03ce13f7SAndroid Build Coastguard Worker       naclbitc::FUNC_CODE_INST_LOAD,
301*03ce13f7SAndroid Build Coastguard Worker       1,
302*03ce13f7SAndroid Build Coastguard Worker       getEncAlignPower(2),
303*03ce13f7SAndroid Build Coastguard Worker       0,
304*03ce13f7SAndroid Build Coastguard Worker       Terminator,
305*03ce13f7SAndroid Build Coastguard Worker   };
306*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(Munger.runTest(ARRAY(Align4), ParseError));
307*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("Error(58:4): Invalid function record: <20 1 3 0>\n",
308*03ce13f7SAndroid Build Coastguard Worker             Munger.getTestResults());
309*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align4)));
310*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("    %v0 = load i32* %p0, align 4;\n"
311*03ce13f7SAndroid Build Coastguard Worker             "Error(58:4): load: Illegal alignment for i32. Expects: 1\n",
312*03ce13f7SAndroid Build Coastguard Worker             DumpMunger.getLinesWithSubstring("load"));
313*03ce13f7SAndroid Build Coastguard Worker 
314*03ce13f7SAndroid Build Coastguard Worker   // Show what happens when changing alignment to 2**29.
315*03ce13f7SAndroid Build Coastguard Worker   const uint64_t Align29[] = {
316*03ce13f7SAndroid Build Coastguard Worker       ReplaceIndex,
317*03ce13f7SAndroid Build Coastguard Worker       NaClMungedBitcode::Replace,
318*03ce13f7SAndroid Build Coastguard Worker       3,
319*03ce13f7SAndroid Build Coastguard Worker       naclbitc::FUNC_CODE_INST_LOAD,
320*03ce13f7SAndroid Build Coastguard Worker       1,
321*03ce13f7SAndroid Build Coastguard Worker       getEncAlignPower(29),
322*03ce13f7SAndroid Build Coastguard Worker       0,
323*03ce13f7SAndroid Build Coastguard Worker       Terminator,
324*03ce13f7SAndroid Build Coastguard Worker   };
325*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(Munger.runTest(ARRAY(Align29), ParseError));
326*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("Error(58:4): Invalid function record: <20 1 30 0>\n",
327*03ce13f7SAndroid Build Coastguard Worker             Munger.getTestResults());
328*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29)));
329*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("    %v0 = load i32* %p0, align 536870912;\n"
330*03ce13f7SAndroid Build Coastguard Worker             "Error(58:4): load: Illegal alignment for i32. Expects: 1\n",
331*03ce13f7SAndroid Build Coastguard Worker             DumpMunger.getLinesWithSubstring("load"));
332*03ce13f7SAndroid Build Coastguard Worker 
333*03ce13f7SAndroid Build Coastguard Worker   // Show what happens when changing alignment to 2**30.
334*03ce13f7SAndroid Build Coastguard Worker   const uint64_t Align30[] = {
335*03ce13f7SAndroid Build Coastguard Worker       ReplaceIndex,
336*03ce13f7SAndroid Build Coastguard Worker       NaClMungedBitcode::Replace,
337*03ce13f7SAndroid Build Coastguard Worker       3,
338*03ce13f7SAndroid Build Coastguard Worker       naclbitc::FUNC_CODE_INST_LOAD,
339*03ce13f7SAndroid Build Coastguard Worker       1,
340*03ce13f7SAndroid Build Coastguard Worker       getEncAlignPower(30),
341*03ce13f7SAndroid Build Coastguard Worker       0,
342*03ce13f7SAndroid Build Coastguard Worker       Terminator,
343*03ce13f7SAndroid Build Coastguard Worker   };
344*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(Munger.runTest(ARRAY(Align30), ParseError));
345*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("Error(58:4): Invalid function record: <20 1 31 0>\n",
346*03ce13f7SAndroid Build Coastguard Worker             Munger.getTestResults());
347*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30)));
348*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("    %v0 = load i32* %p0, align 0;\n"
349*03ce13f7SAndroid Build Coastguard Worker             "Error(58:4): load: Illegal alignment for i32. Expects: 1\n",
350*03ce13f7SAndroid Build Coastguard Worker             DumpMunger.getLinesWithSubstring("load"));
351*03ce13f7SAndroid Build Coastguard Worker }
352*03ce13f7SAndroid Build Coastguard Worker 
353*03ce13f7SAndroid Build Coastguard Worker // Test how we recognize alignments in load float instructions.
TEST(IceParseInstsTests,LoadFloatAlignment)354*03ce13f7SAndroid Build Coastguard Worker TEST(IceParseInstsTests, LoadFloatAlignment) {
355*03ce13f7SAndroid Build Coastguard Worker   const uint64_t BitcodeRecords[] = {1,
356*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_ENTER,
357*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::MODULE_BLOCK_ID,
358*03ce13f7SAndroid Build Coastguard Worker                                      2,
359*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
360*03ce13f7SAndroid Build Coastguard Worker                                      1,
361*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_ENTER,
362*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::TYPE_BLOCK_ID_NEW,
363*03ce13f7SAndroid Build Coastguard Worker                                      2,
364*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
365*03ce13f7SAndroid Build Coastguard Worker                                      3,
366*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::TYPE_CODE_NUMENTRY,
367*03ce13f7SAndroid Build Coastguard Worker                                      3,
368*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
369*03ce13f7SAndroid Build Coastguard Worker                                      3,
370*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::TYPE_CODE_FLOAT,
371*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
372*03ce13f7SAndroid Build Coastguard Worker                                      3,
373*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::TYPE_CODE_INTEGER,
374*03ce13f7SAndroid Build Coastguard Worker                                      32,
375*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
376*03ce13f7SAndroid Build Coastguard Worker                                      3,
377*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::TYPE_CODE_FUNCTION,
378*03ce13f7SAndroid Build Coastguard Worker                                      0,
379*03ce13f7SAndroid Build Coastguard Worker                                      0,
380*03ce13f7SAndroid Build Coastguard Worker                                      1,
381*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
382*03ce13f7SAndroid Build Coastguard Worker                                      0,
383*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_EXIT,
384*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
385*03ce13f7SAndroid Build Coastguard Worker                                      3,
386*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::MODULE_CODE_FUNCTION,
387*03ce13f7SAndroid Build Coastguard Worker                                      2,
388*03ce13f7SAndroid Build Coastguard Worker                                      0,
389*03ce13f7SAndroid Build Coastguard Worker                                      0,
390*03ce13f7SAndroid Build Coastguard Worker                                      3,
391*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
392*03ce13f7SAndroid Build Coastguard Worker                                      1,
393*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_ENTER,
394*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::FUNCTION_BLOCK_ID,
395*03ce13f7SAndroid Build Coastguard Worker                                      2,
396*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
397*03ce13f7SAndroid Build Coastguard Worker                                      3,
398*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::FUNC_CODE_DECLAREBLOCKS,
399*03ce13f7SAndroid Build Coastguard Worker                                      1,
400*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
401*03ce13f7SAndroid Build Coastguard Worker                                      3,
402*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::FUNC_CODE_INST_LOAD,
403*03ce13f7SAndroid Build Coastguard Worker                                      1,
404*03ce13f7SAndroid Build Coastguard Worker                                      getEncAlignPower(0),
405*03ce13f7SAndroid Build Coastguard Worker                                      0,
406*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
407*03ce13f7SAndroid Build Coastguard Worker                                      3,
408*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::FUNC_CODE_INST_RET,
409*03ce13f7SAndroid Build Coastguard Worker                                      1,
410*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
411*03ce13f7SAndroid Build Coastguard Worker                                      0,
412*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_EXIT,
413*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
414*03ce13f7SAndroid Build Coastguard Worker                                      0,
415*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_EXIT,
416*03ce13f7SAndroid Build Coastguard Worker                                      Terminator};
417*03ce13f7SAndroid Build Coastguard Worker 
418*03ce13f7SAndroid Build Coastguard Worker   const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_LOAD
419*03ce13f7SAndroid Build Coastguard Worker 
420*03ce13f7SAndroid Build Coastguard Worker   // Show text when alignment is 1.
421*03ce13f7SAndroid Build Coastguard Worker   NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords));
422*03ce13f7SAndroid Build Coastguard Worker   EXPECT_TRUE(DumpMunger.runTest());
423*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("      58:4|    3: <20, 1, 1, 0>         |    %v0 = load float* "
424*03ce13f7SAndroid Build Coastguard Worker             "%p0, align 1;\n",
425*03ce13f7SAndroid Build Coastguard Worker             DumpMunger.getLinesWithSubstring("58:4"));
426*03ce13f7SAndroid Build Coastguard Worker   IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords));
427*03ce13f7SAndroid Build Coastguard Worker   EXPECT_TRUE(Munger.runTest());
428*03ce13f7SAndroid Build Coastguard Worker 
429*03ce13f7SAndroid Build Coastguard Worker   // Show what happens when changing alignment to 0.
430*03ce13f7SAndroid Build Coastguard Worker   const uint64_t Align0[] = {
431*03ce13f7SAndroid Build Coastguard Worker       ReplaceIndex,
432*03ce13f7SAndroid Build Coastguard Worker       NaClMungedBitcode::Replace,
433*03ce13f7SAndroid Build Coastguard Worker       3,
434*03ce13f7SAndroid Build Coastguard Worker       naclbitc::FUNC_CODE_INST_LOAD,
435*03ce13f7SAndroid Build Coastguard Worker       1,
436*03ce13f7SAndroid Build Coastguard Worker       getEncAlignZero(),
437*03ce13f7SAndroid Build Coastguard Worker       0,
438*03ce13f7SAndroid Build Coastguard Worker       Terminator,
439*03ce13f7SAndroid Build Coastguard Worker   };
440*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(Munger.runTest(ARRAY(Align0), ParseError));
441*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("Error(58:4): Invalid function record: <20 1 0 0>\n",
442*03ce13f7SAndroid Build Coastguard Worker             Munger.getTestResults());
443*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0)));
444*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("    %v0 = load float* %p0, align 0;\n"
445*03ce13f7SAndroid Build Coastguard Worker             "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n",
446*03ce13f7SAndroid Build Coastguard Worker             DumpMunger.getLinesWithSubstring("load"));
447*03ce13f7SAndroid Build Coastguard Worker 
448*03ce13f7SAndroid Build Coastguard Worker   // Show what happens when changing alignment to 4.
449*03ce13f7SAndroid Build Coastguard Worker   const uint64_t Align4[] = {
450*03ce13f7SAndroid Build Coastguard Worker       ReplaceIndex,
451*03ce13f7SAndroid Build Coastguard Worker       NaClMungedBitcode::Replace,
452*03ce13f7SAndroid Build Coastguard Worker       3,
453*03ce13f7SAndroid Build Coastguard Worker       naclbitc::FUNC_CODE_INST_LOAD,
454*03ce13f7SAndroid Build Coastguard Worker       1,
455*03ce13f7SAndroid Build Coastguard Worker       getEncAlignPower(2),
456*03ce13f7SAndroid Build Coastguard Worker       0,
457*03ce13f7SAndroid Build Coastguard Worker       Terminator,
458*03ce13f7SAndroid Build Coastguard Worker   };
459*03ce13f7SAndroid Build Coastguard Worker   EXPECT_TRUE(Munger.runTest(ARRAY(Align4)));
460*03ce13f7SAndroid Build Coastguard Worker   EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align4)));
461*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("    %v0 = load float* %p0, align 4;\n",
462*03ce13f7SAndroid Build Coastguard Worker             DumpMunger.getLinesWithSubstring("load"));
463*03ce13f7SAndroid Build Coastguard Worker 
464*03ce13f7SAndroid Build Coastguard Worker   const uint64_t Align29[] = {
465*03ce13f7SAndroid Build Coastguard Worker       ReplaceIndex,
466*03ce13f7SAndroid Build Coastguard Worker       NaClMungedBitcode::Replace,
467*03ce13f7SAndroid Build Coastguard Worker       3,
468*03ce13f7SAndroid Build Coastguard Worker       naclbitc::FUNC_CODE_INST_LOAD,
469*03ce13f7SAndroid Build Coastguard Worker       1,
470*03ce13f7SAndroid Build Coastguard Worker       getEncAlignPower(29),
471*03ce13f7SAndroid Build Coastguard Worker       0,
472*03ce13f7SAndroid Build Coastguard Worker       Terminator,
473*03ce13f7SAndroid Build Coastguard Worker   };
474*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(Munger.runTest(ARRAY(Align29), ParseError));
475*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("Error(58:4): Invalid function record: <20 1 30 0>\n",
476*03ce13f7SAndroid Build Coastguard Worker             Munger.getTestResults());
477*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29)));
478*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("    %v0 = load float* %p0, align 536870912;\n"
479*03ce13f7SAndroid Build Coastguard Worker             "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n",
480*03ce13f7SAndroid Build Coastguard Worker             DumpMunger.getLinesWithSubstring("load"));
481*03ce13f7SAndroid Build Coastguard Worker 
482*03ce13f7SAndroid Build Coastguard Worker   // Show what happens when changing alignment to 2**30.
483*03ce13f7SAndroid Build Coastguard Worker   const uint64_t Align30[] = {
484*03ce13f7SAndroid Build Coastguard Worker       ReplaceIndex,
485*03ce13f7SAndroid Build Coastguard Worker       NaClMungedBitcode::Replace,
486*03ce13f7SAndroid Build Coastguard Worker       3,
487*03ce13f7SAndroid Build Coastguard Worker       naclbitc::FUNC_CODE_INST_LOAD,
488*03ce13f7SAndroid Build Coastguard Worker       1,
489*03ce13f7SAndroid Build Coastguard Worker       getEncAlignPower(30),
490*03ce13f7SAndroid Build Coastguard Worker       0,
491*03ce13f7SAndroid Build Coastguard Worker       Terminator,
492*03ce13f7SAndroid Build Coastguard Worker   };
493*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(Munger.runTest(ARRAY(Align30), ParseError));
494*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("Error(58:4): Invalid function record: <20 1 31 0>\n",
495*03ce13f7SAndroid Build Coastguard Worker             Munger.getTestResults());
496*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30)));
497*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("    %v0 = load float* %p0, align 0;\n"
498*03ce13f7SAndroid Build Coastguard Worker             "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n",
499*03ce13f7SAndroid Build Coastguard Worker             DumpMunger.getLinesWithSubstring("load"));
500*03ce13f7SAndroid Build Coastguard Worker }
501*03ce13f7SAndroid Build Coastguard Worker 
502*03ce13f7SAndroid Build Coastguard Worker // Test how we recognize alignments in store instructions.
TEST(NaClParseInstsTests,StoreAlignment)503*03ce13f7SAndroid Build Coastguard Worker TEST(NaClParseInstsTests, StoreAlignment) {
504*03ce13f7SAndroid Build Coastguard Worker   const uint64_t BitcodeRecords[] = {1,
505*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_ENTER,
506*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::MODULE_BLOCK_ID,
507*03ce13f7SAndroid Build Coastguard Worker                                      2,
508*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
509*03ce13f7SAndroid Build Coastguard Worker                                      1,
510*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_ENTER,
511*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::TYPE_BLOCK_ID_NEW,
512*03ce13f7SAndroid Build Coastguard Worker                                      2,
513*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
514*03ce13f7SAndroid Build Coastguard Worker                                      3,
515*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::TYPE_CODE_NUMENTRY,
516*03ce13f7SAndroid Build Coastguard Worker                                      3,
517*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
518*03ce13f7SAndroid Build Coastguard Worker                                      3,
519*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::TYPE_CODE_FLOAT,
520*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
521*03ce13f7SAndroid Build Coastguard Worker                                      3,
522*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::TYPE_CODE_INTEGER,
523*03ce13f7SAndroid Build Coastguard Worker                                      32,
524*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
525*03ce13f7SAndroid Build Coastguard Worker                                      3,
526*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::TYPE_CODE_FUNCTION,
527*03ce13f7SAndroid Build Coastguard Worker                                      0,
528*03ce13f7SAndroid Build Coastguard Worker                                      0,
529*03ce13f7SAndroid Build Coastguard Worker                                      1,
530*03ce13f7SAndroid Build Coastguard Worker                                      0,
531*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
532*03ce13f7SAndroid Build Coastguard Worker                                      0,
533*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_EXIT,
534*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
535*03ce13f7SAndroid Build Coastguard Worker                                      3,
536*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::MODULE_CODE_FUNCTION,
537*03ce13f7SAndroid Build Coastguard Worker                                      2,
538*03ce13f7SAndroid Build Coastguard Worker                                      0,
539*03ce13f7SAndroid Build Coastguard Worker                                      0,
540*03ce13f7SAndroid Build Coastguard Worker                                      3,
541*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
542*03ce13f7SAndroid Build Coastguard Worker                                      1,
543*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_ENTER,
544*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::FUNCTION_BLOCK_ID,
545*03ce13f7SAndroid Build Coastguard Worker                                      2,
546*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
547*03ce13f7SAndroid Build Coastguard Worker                                      3,
548*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::FUNC_CODE_DECLAREBLOCKS,
549*03ce13f7SAndroid Build Coastguard Worker                                      1,
550*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
551*03ce13f7SAndroid Build Coastguard Worker                                      3,
552*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::FUNC_CODE_INST_STORE,
553*03ce13f7SAndroid Build Coastguard Worker                                      2,
554*03ce13f7SAndroid Build Coastguard Worker                                      1,
555*03ce13f7SAndroid Build Coastguard Worker                                      getEncAlignPower(0),
556*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
557*03ce13f7SAndroid Build Coastguard Worker                                      3,
558*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::FUNC_CODE_INST_RET,
559*03ce13f7SAndroid Build Coastguard Worker                                      1,
560*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
561*03ce13f7SAndroid Build Coastguard Worker                                      0,
562*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_EXIT,
563*03ce13f7SAndroid Build Coastguard Worker                                      Terminator,
564*03ce13f7SAndroid Build Coastguard Worker                                      0,
565*03ce13f7SAndroid Build Coastguard Worker                                      naclbitc::BLK_CODE_EXIT,
566*03ce13f7SAndroid Build Coastguard Worker                                      Terminator};
567*03ce13f7SAndroid Build Coastguard Worker 
568*03ce13f7SAndroid Build Coastguard Worker   const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_STORE
569*03ce13f7SAndroid Build Coastguard Worker 
570*03ce13f7SAndroid Build Coastguard Worker   // Show text when alignment is 1.
571*03ce13f7SAndroid Build Coastguard Worker   NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords),
572*03ce13f7SAndroid Build Coastguard Worker                                Terminator);
573*03ce13f7SAndroid Build Coastguard Worker   EXPECT_TRUE(DumpMunger.runTest("Good Store Alignment 1"));
574*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("      62:4|    3: <24, 2, 1, 1>         |    store float %p1, "
575*03ce13f7SAndroid Build Coastguard Worker             "float* %p0, \n",
576*03ce13f7SAndroid Build Coastguard Worker             DumpMunger.getLinesWithSubstring("62:4"));
577*03ce13f7SAndroid Build Coastguard Worker   IceTest::SubzeroBitcodeMunger Munger(
578*03ce13f7SAndroid Build Coastguard Worker       BitcodeRecords, array_lengthof(BitcodeRecords), Terminator);
579*03ce13f7SAndroid Build Coastguard Worker   EXPECT_TRUE(Munger.runTest());
580*03ce13f7SAndroid Build Coastguard Worker 
581*03ce13f7SAndroid Build Coastguard Worker   // Show what happens when changing alignment to 0.
582*03ce13f7SAndroid Build Coastguard Worker   const uint64_t Align0[] = {
583*03ce13f7SAndroid Build Coastguard Worker       ReplaceIndex,
584*03ce13f7SAndroid Build Coastguard Worker       NaClMungedBitcode::Replace,
585*03ce13f7SAndroid Build Coastguard Worker       3,
586*03ce13f7SAndroid Build Coastguard Worker       naclbitc::FUNC_CODE_INST_STORE,
587*03ce13f7SAndroid Build Coastguard Worker       2,
588*03ce13f7SAndroid Build Coastguard Worker       1,
589*03ce13f7SAndroid Build Coastguard Worker       getEncAlignZero(),
590*03ce13f7SAndroid Build Coastguard Worker       Terminator,
591*03ce13f7SAndroid Build Coastguard Worker   };
592*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(Munger.runTest(ARRAY(Align0), ParseError));
593*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 0>\n",
594*03ce13f7SAndroid Build Coastguard Worker             Munger.getTestResults());
595*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0)));
596*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ(
597*03ce13f7SAndroid Build Coastguard Worker       "    store float %p1, float* %p0, align 0;\n"
598*03ce13f7SAndroid Build Coastguard Worker       "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n",
599*03ce13f7SAndroid Build Coastguard Worker       DumpMunger.getLinesWithSubstring("store"));
600*03ce13f7SAndroid Build Coastguard Worker 
601*03ce13f7SAndroid Build Coastguard Worker   // Show what happens when changing alignment to 4.
602*03ce13f7SAndroid Build Coastguard Worker   const uint64_t Align4[] = {
603*03ce13f7SAndroid Build Coastguard Worker       ReplaceIndex,
604*03ce13f7SAndroid Build Coastguard Worker       NaClMungedBitcode::Replace,
605*03ce13f7SAndroid Build Coastguard Worker       3,
606*03ce13f7SAndroid Build Coastguard Worker       naclbitc::FUNC_CODE_INST_STORE,
607*03ce13f7SAndroid Build Coastguard Worker       2,
608*03ce13f7SAndroid Build Coastguard Worker       1,
609*03ce13f7SAndroid Build Coastguard Worker       getEncAlignPower(2),
610*03ce13f7SAndroid Build Coastguard Worker       Terminator,
611*03ce13f7SAndroid Build Coastguard Worker   };
612*03ce13f7SAndroid Build Coastguard Worker   EXPECT_TRUE(Munger.runTest(ARRAY(Align4)));
613*03ce13f7SAndroid Build Coastguard Worker   EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align4)));
614*03ce13f7SAndroid Build Coastguard Worker 
615*03ce13f7SAndroid Build Coastguard Worker   // Show what happens when changing alignment to 8.
616*03ce13f7SAndroid Build Coastguard Worker   const uint64_t Align8[] = {
617*03ce13f7SAndroid Build Coastguard Worker       ReplaceIndex,
618*03ce13f7SAndroid Build Coastguard Worker       NaClMungedBitcode::Replace,
619*03ce13f7SAndroid Build Coastguard Worker       3,
620*03ce13f7SAndroid Build Coastguard Worker       naclbitc::FUNC_CODE_INST_STORE,
621*03ce13f7SAndroid Build Coastguard Worker       2,
622*03ce13f7SAndroid Build Coastguard Worker       1,
623*03ce13f7SAndroid Build Coastguard Worker       getEncAlignPower(3),
624*03ce13f7SAndroid Build Coastguard Worker       Terminator,
625*03ce13f7SAndroid Build Coastguard Worker   };
626*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(Munger.runTest(ARRAY(Align8), ParseError));
627*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 4>\n",
628*03ce13f7SAndroid Build Coastguard Worker             Munger.getTestResults());
629*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align8)));
630*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ(
631*03ce13f7SAndroid Build Coastguard Worker       "    store float %p1, float* %p0, align 8;\n"
632*03ce13f7SAndroid Build Coastguard Worker       "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n",
633*03ce13f7SAndroid Build Coastguard Worker       DumpMunger.getLinesWithSubstring("store"));
634*03ce13f7SAndroid Build Coastguard Worker 
635*03ce13f7SAndroid Build Coastguard Worker   // Show what happens when changing alignment to 2**29.
636*03ce13f7SAndroid Build Coastguard Worker   const uint64_t Align29[] = {
637*03ce13f7SAndroid Build Coastguard Worker       ReplaceIndex,
638*03ce13f7SAndroid Build Coastguard Worker       NaClMungedBitcode::Replace,
639*03ce13f7SAndroid Build Coastguard Worker       3,
640*03ce13f7SAndroid Build Coastguard Worker       naclbitc::FUNC_CODE_INST_STORE,
641*03ce13f7SAndroid Build Coastguard Worker       2,
642*03ce13f7SAndroid Build Coastguard Worker       1,
643*03ce13f7SAndroid Build Coastguard Worker       getEncAlignPower(29),
644*03ce13f7SAndroid Build Coastguard Worker       Terminator,
645*03ce13f7SAndroid Build Coastguard Worker   };
646*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(Munger.runTest(ARRAY(Align29), ParseError));
647*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 30>\n",
648*03ce13f7SAndroid Build Coastguard Worker             Munger.getTestResults());
649*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29)));
650*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ(
651*03ce13f7SAndroid Build Coastguard Worker       "    store float %p1, float* %p0, align 536870912;\n"
652*03ce13f7SAndroid Build Coastguard Worker       "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n",
653*03ce13f7SAndroid Build Coastguard Worker       DumpMunger.getLinesWithSubstring("store"));
654*03ce13f7SAndroid Build Coastguard Worker 
655*03ce13f7SAndroid Build Coastguard Worker   const uint64_t Align30[] = {
656*03ce13f7SAndroid Build Coastguard Worker       ReplaceIndex,
657*03ce13f7SAndroid Build Coastguard Worker       NaClMungedBitcode::Replace,
658*03ce13f7SAndroid Build Coastguard Worker       // Note: alignment stored as 0 or log2(Alignment)+1.
659*03ce13f7SAndroid Build Coastguard Worker       3,
660*03ce13f7SAndroid Build Coastguard Worker       naclbitc::FUNC_CODE_INST_STORE,
661*03ce13f7SAndroid Build Coastguard Worker       2,
662*03ce13f7SAndroid Build Coastguard Worker       1,
663*03ce13f7SAndroid Build Coastguard Worker       getEncAlignPower(30),
664*03ce13f7SAndroid Build Coastguard Worker       Terminator,
665*03ce13f7SAndroid Build Coastguard Worker   };
666*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(Munger.runTest(ARRAY(Align30), ParseError));
667*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 31>\n",
668*03ce13f7SAndroid Build Coastguard Worker             Munger.getTestResults());
669*03ce13f7SAndroid Build Coastguard Worker   EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30)));
670*03ce13f7SAndroid Build Coastguard Worker   EXPECT_EQ(
671*03ce13f7SAndroid Build Coastguard Worker       "    store float %p1, float* %p0, align 0;\n"
672*03ce13f7SAndroid Build Coastguard Worker       "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n",
673*03ce13f7SAndroid Build Coastguard Worker       DumpMunger.getLinesWithSubstring("store"));
674*03ce13f7SAndroid Build Coastguard Worker }
675*03ce13f7SAndroid Build Coastguard Worker 
676*03ce13f7SAndroid Build Coastguard Worker } // end of anonymous namespace
677