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

Side by Side Diff: unittests/Bitcode/NaClParseInstsTest.cpp

Issue 1140153004: Clean up bitcode munging tests. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-llvm.git@master
Patch Set: Fix issues in patch set 2. Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « unittests/Bitcode/NaClObjDumpTypesTest.cpp ('k') | unittests/Bitcode/NaClParseTypesTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- llvm/unittest/Bitcode/NaClParseInstsTest.cpp ----------------------===// 1 //===- llvm/unittest/Bitcode/NaClParseInstsTest.cpp ----------------------===//
2 // Tests parser for PNaCl bitcode instructions. 2 // Tests parser for PNaCl bitcode instructions.
3 // 3 //
4 // The LLVM Compiler Infrastructure 4 // The LLVM Compiler Infrastructure
5 // 5 //
6 // This file is distributed under the University of Illinois Open Source 6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details. 7 // License. See LICENSE.TXT for details.
8 // 8 //
9 //===----------------------------------------------------------------------===// 9 //===----------------------------------------------------------------------===//
10 10
11 // Tests record errors in the function block when parsing PNaCl bitcode. 11 // Tests record errors in the function block when parsing PNaCl bitcode.
12 12
13 // TODO(kschimpf) Add more tests. 13 // TODO(kschimpf) Add more tests.
14 14
15 #include "llvm/ADT/STLExtras.h" 15
16 #include "llvm/Bitcode/NaCl/NaClBitcodeMunge.h" 16 #include "NaClMungeTest.h"
17 #include "llvm/Bitcode/NaCl/NaClBitcodeParser.h" 17
18 #include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h" 18 #include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h"
19 19
20 #include "gtest/gtest.h"
21
22 using namespace llvm; 20 using namespace llvm;
23 21
24 namespace { 22 namespace naclmungetest {
25
26 static const uint64_t Terminator = 0x5768798008978675LL;
27 23
28 // Note: alignment stored as 0 or log2(Alignment)+1. 24 // Note: alignment stored as 0 or log2(Alignment)+1.
29 uint64_t getEncAlignPower(unsigned Power) { 25 uint64_t getEncAlignPower(unsigned Power) {
30 return Power + 1; 26 return Power + 1;
31 } 27 }
32 uint64_t getEncAlignZero() { return 0; } 28 uint64_t getEncAlignZero() { return 0; }
33 29
34 /// Test how we report a call arg that refers to nonexistent call argument 30 /// Test how we report a call arg that refers to nonexistent call argument
35 TEST(NaClParseInstsTest, NonexistantCallArg) { 31 TEST(NaClParseInstsTest, NonexistantCallArg) {
36 const uint64_t BitcodeRecords[] = { 32 const uint64_t BitcodeRecords[] = {
37 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, 33 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator,
38 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, 34 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator,
39 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, 35 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator,
40 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, 36 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator,
41 3, naclbitc::TYPE_CODE_VOID, Terminator, 37 3, naclbitc::TYPE_CODE_VOID, Terminator,
42 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, 0, Terminator, 38 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, 0, Terminator,
43 0, naclbitc::BLK_CODE_EXIT, Terminator, 39 0, naclbitc::BLK_CODE_EXIT, Terminator,
44 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 1, 0, Terminator, 40 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 1, 0, Terminator,
45 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, 41 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator,
46 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, 42 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator,
47 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, 43 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator,
48 // Note: 100 is a bad value index in next line. 44 // Note: 100 is a bad value index in next line.
49 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, 45 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator,
50 3, naclbitc::FUNC_CODE_INST_RET, Terminator, 46 3, naclbitc::FUNC_CODE_INST_RET, Terminator,
51 0, naclbitc::BLK_CODE_EXIT, Terminator, 47 0, naclbitc::BLK_CODE_EXIT, Terminator,
52 0, naclbitc::BLK_CODE_EXIT, Terminator 48 0, naclbitc::BLK_CODE_EXIT, Terminator
53 }; 49 };
54 50
55 // Show text of base input. 51 // Show text of base input.
56 NaClObjDumpMunger DumpMunger(BitcodeRecords, 52 NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords));
57 array_lengthof(BitcodeRecords), Terminator); 53 EXPECT_FALSE(DumpMunger.runTest());
58 EXPECT_FALSE(DumpMunger.runTest("Nonexistant call arg"));
59 EXPECT_EQ( 54 EXPECT_EQ(
60 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " 55 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, "
61 "88, 69)\n" 56 "88, 69)\n"
62 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" 57 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n"
63 " | 0> |\n" 58 " | 0> |\n"
64 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" 59 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n"
65 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n" 60 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n"
66 " 32:0| 3: <1, 3> | count 3;\n" 61 " 32:0| 3: <1, 3> | count 3;\n"
67 " 34:4| 3: <7, 32> | @t0 = i32;\n" 62 " 34:4| 3: <7, 32> | @t0 = i32;\n"
68 " 37:6| 3: <2> | @t1 = void;\n" 63 " 37:6| 3: <2> | @t1 = void;\n"
(...skipping 10 matching lines...) Expand all
79 " 64:0| 3: <1, 1> | blocks 1;\n" 74 " 64:0| 3: <1, 1> | blocks 1;\n"
80 " | | %b0:\n" 75 " | | %b0:\n"
81 " 66:4| 3: <34, 0, 4, 2, 100> | call void @f0(i32 %p0, i32" 76 " 66:4| 3: <34, 0, 4, 2, 100> | call void @f0(i32 %p0, i32"
82 " @f0);\n" 77 " @f0);\n"
83 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n" 78 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n"
84 " 72:6| 3: <10> | ret void;\n" 79 " 72:6| 3: <10> | ret void;\n"
85 " 74:4| 0: <65534> | }\n" 80 " 74:4| 0: <65534> | }\n"
86 " 76:0|0: <65534> |}\n", 81 " 76:0|0: <65534> |}\n",
87 DumpMunger.getTestResults()); 82 DumpMunger.getTestResults());
88 83
89 NaClParseBitcodeMunger Munger(BitcodeRecords, 84 NaClParseBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords));
90 array_lengthof(BitcodeRecords), Terminator); 85 EXPECT_FALSE(Munger.runTest(true));
91 EXPECT_FALSE(Munger.runTest("Nonexistant call arg", true));
92 EXPECT_EQ( 86 EXPECT_EQ(
93 "Error(72:6): Invalid call argument: Index 1\n" 87 "Error(72:6): Invalid call argument: Index 1\n"
94 "Error: Invalid value in record\n", 88 "Error: Invalid value in record\n",
95 Munger.getTestResults()); 89 Munger.getTestResults());
96 } 90 }
97 91
98 /// Test how we recognize alignments in alloca instructions. 92 /// Test how we recognize alignments in alloca instructions.
99 TEST(NaClParseInstsTests, BadAllocaAlignment) { 93 TEST(NaClParseInstsTests, BadAllocaAlignment) {
100 const uint64_t BitcodeRecords[] = { 94 const uint64_t BitcodeRecords[] = {
101 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, 95 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator,
102 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, 96 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator,
103 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, 97 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator,
104 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, 98 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator,
105 3, naclbitc::TYPE_CODE_VOID, Terminator, 99 3, naclbitc::TYPE_CODE_VOID, Terminator,
106 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator, 100 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator,
107 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator, 101 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator,
108 0, naclbitc::BLK_CODE_EXIT, Terminator, 102 0, naclbitc::BLK_CODE_EXIT, Terminator,
109 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, 103 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator,
110 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, 104 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator,
111 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, 105 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator,
112 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(0), Terminator, 106 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(0), Terminator,
113 3, naclbitc::FUNC_CODE_INST_RET, Terminator, 107 3, naclbitc::FUNC_CODE_INST_RET, Terminator,
114 0, naclbitc::BLK_CODE_EXIT, Terminator, 108 0, naclbitc::BLK_CODE_EXIT, Terminator,
115 0, naclbitc::BLK_CODE_EXIT, Terminator 109 0, naclbitc::BLK_CODE_EXIT, Terminator
116 }; 110 };
117 111
118 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA 112 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA
119 113
120 // Show text when alignment is 1. 114 // Show text when alignment is 1.
121 NaClObjDumpMunger DumpMunger(BitcodeRecords, 115 NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords));
122 array_lengthof(BitcodeRecords), Terminator); 116 EXPECT_TRUE(DumpMunger.runTest());
123 EXPECT_TRUE(DumpMunger.runTest("BadAllocaAlignment"));
124 EXPECT_EQ( 117 EXPECT_EQ(
125 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " 118 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, "
126 "88, 69)\n" 119 "88, 69)\n"
127 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" 120 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n"
128 " | 0> |\n" 121 " | 0> |\n"
129 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" 122 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n"
130 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n" 123 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n"
131 " 32:0| 3: <1, 4> | count 4;\n" 124 " 32:0| 3: <1, 4> | count 4;\n"
132 " 34:4| 3: <7, 32> | @t0 = i32;\n" 125 " 34:4| 3: <7, 32> | @t0 = i32;\n"
133 " 37:6| 3: <2> | @t1 = void;\n" 126 " 37:6| 3: <2> | @t1 = void;\n"
134 " 39:4| 3: <21, 0, 1, 0> | @t2 = void (i32);\n" 127 " 39:4| 3: <21, 0, 1, 0> | @t2 = void (i32);\n"
135 " 43:4| 3: <7, 8> | @t3 = i8;\n" 128 " 43:4| 3: <7, 8> | @t3 = i8;\n"
136 " 46:0| 0: <65534> | }\n" 129 " 46:0| 0: <65534> | }\n"
137 " 48:0| 3: <8, 2, 0, 0, 0> | define external void @f0(i32" 130 " 48:0| 3: <8, 2, 0, 0, 0> | define external void @f0(i32"
138 ");\n" 131 ");\n"
139 " 52:6| 1: <65535, 12, 2> | function void @f0(i32 %p0) {" 132 " 52:6| 1: <65535, 12, 2> | function void @f0(i32 %p0) {"
140 " \n" 133 " \n"
141 " | | // BlockID " 134 " | | // BlockID "
142 "= 12\n" 135 "= 12\n"
143 " 60:0| 3: <1, 1> | blocks 1;\n" 136 " 60:0| 3: <1, 1> | blocks 1;\n"
144 " | | %b0:\n" 137 " | | %b0:\n"
145 " 62:4| 3: <19, 1, 1> | %v0 = alloca i8, i32 %p0, " 138 " 62:4| 3: <19, 1, 1> | %v0 = alloca i8, i32 %p0, "
146 "align 1;\n" 139 "align 1;\n"
147 " 65:6| 3: <10> | ret void;\n" 140 " 65:6| 3: <10> | ret void;\n"
148 " 67:4| 0: <65534> | }\n" 141 " 67:4| 0: <65534> | }\n"
149 " 68:0|0: <65534> |}\n", 142 " 68:0|0: <65534> |}\n",
150 DumpMunger.getTestResults()); 143 DumpMunger.getTestResults());
151 NaClParseBitcodeMunger Munger(BitcodeRecords, 144 NaClParseBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords));
152 array_lengthof(BitcodeRecords), Terminator); 145 EXPECT_TRUE(Munger.runTest(true));
153 EXPECT_TRUE(Munger.runTest("BadAllocaAlignment", true));
154 146
155 // Show what happens when changing alignment to 0. 147 // Show what happens when changing alignment to 0.
156 const uint64_t Align0[] = { 148 const uint64_t Align0[] = {
157 ReplaceIndex, NaClMungedBitcode::Replace, 149 ReplaceIndex, NaClMungedBitcode::Replace,
158 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator, 150 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator,
159 }; 151 };
160 EXPECT_TRUE(Munger.runTest( 152 EXPECT_TRUE(Munger.runTest(ARRAY(Align0), true));
161 "BadAllocaAlignment-0", Align0, array_lengthof(Align0), true)); 153 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align0)));
162 EXPECT_TRUE(DumpMunger.runTestForAssembly(
163 "BadAllocaAlignment-0", Align0, array_lengthof(Align0)));
164 EXPECT_EQ( 154 EXPECT_EQ(
165 " %v0 = alloca i8, i32 %p0, align 0;\n", 155 " %v0 = alloca i8, i32 %p0, align 0;\n",
166 DumpMunger.getLinesWithSubstring("alloca")); 156 DumpMunger.getLinesWithSubstring("alloca"));
167 157
168 // Show what happens when changing alignment to 2**30. 158 // Show what happens when changing alignment to 2**30.
169 const uint64_t Align30[] = { 159 const uint64_t Align30[] = {
170 ReplaceIndex, NaClMungedBitcode::Replace, 160 ReplaceIndex, NaClMungedBitcode::Replace,
171 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, 161 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator,
172 }; 162 };
173 EXPECT_FALSE(Munger.runTest( 163 EXPECT_FALSE(Munger.runTest(ARRAY(Align30), true));
174 "BadAllocaAlignment-30", Align30, array_lengthof(Align30), true));
175 EXPECT_EQ( 164 EXPECT_EQ(
176 "Error(65:6): Alignment can't be greater than 2**29. Found: 2**30\n" 165 "Error(65:6): Alignment can't be greater than 2**29. Found: 2**30\n"
177 "Error: Invalid value in record\n", 166 "Error: Invalid value in record\n",
178 Munger.getTestResults()); 167 Munger.getTestResults());
179 EXPECT_FALSE(DumpMunger.runTestForAssembly( 168 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30)));
180 "BadAllocaAlignment-30", Align30, array_lengthof(Align30)));
181 EXPECT_EQ( 169 EXPECT_EQ(
182 " %v0 = alloca i8, i32 %p0, align 0;\n", 170 " %v0 = alloca i8, i32 %p0, align 0;\n",
183 DumpMunger.getLinesWithSubstring("alloca")); 171 DumpMunger.getLinesWithSubstring("alloca"));
184 EXPECT_EQ( 172 EXPECT_EQ(
185 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", 173 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n",
186 DumpMunger.getLinesWithSubstring("Error")); 174 DumpMunger.getLinesWithSubstring("Error"));
187 175
188 // Show what happens when changing alignment to 2**29. 176 // Show what happens when changing alignment to 2**29.
189 const uint64_t Align29[] = { 177 const uint64_t Align29[] = {
190 ReplaceIndex, NaClMungedBitcode::Replace, 178 ReplaceIndex, NaClMungedBitcode::Replace,
191 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(29), Terminator, 179 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(29), Terminator,
192 }; 180 };
193 EXPECT_TRUE(Munger.runTest( 181 EXPECT_TRUE(Munger.runTest(ARRAY(Align29), true));
194 "BadAllocaAlignment-29", Align29, array_lengthof(Align29), true));
195 EXPECT_EQ( 182 EXPECT_EQ(
196 "Successful parse!\n", 183 "Successful parse!\n",
197 Munger.getTestResults()); 184 Munger.getTestResults());
198 EXPECT_TRUE(DumpMunger.runTestForAssembly( 185 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align29)));
199 "BadAllocaAlignment-29", Align29, array_lengthof(Align29)));
200 EXPECT_EQ( 186 EXPECT_EQ(
201 " %v0 = alloca i8, i32 %p0, align 536870912;\n", 187 " %v0 = alloca i8, i32 %p0, align 536870912;\n",
202 DumpMunger.getLinesWithSubstring("alloca")); 188 DumpMunger.getLinesWithSubstring("alloca"));
203 } 189 }
204 190
205 // Test how we recognize alignments in load instructions. 191 // Test how we recognize alignments in load instructions.
206 TEST(NaClParseInstsTests, BadLoadAlignment) { 192 TEST(NaClParseInstsTests, BadLoadAlignment) {
207 const uint64_t BitcodeRecords[] = { 193 const uint64_t BitcodeRecords[] = {
208 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, 194 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator,
209 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, 195 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator,
210 3, naclbitc::TYPE_CODE_NUMENTRY, 2, Terminator, 196 3, naclbitc::TYPE_CODE_NUMENTRY, 2, Terminator,
211 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, 197 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator,
212 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 0, Terminator, 198 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 0, Terminator,
213 0, naclbitc::BLK_CODE_EXIT, Terminator, 199 0, naclbitc::BLK_CODE_EXIT, Terminator,
214 3, naclbitc::MODULE_CODE_FUNCTION, 1, 0, 0, 0, Terminator, 200 3, naclbitc::MODULE_CODE_FUNCTION, 1, 0, 0, 0, Terminator,
215 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, 201 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator,
216 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, 202 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator,
217 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 0, Terminator, 203 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 0, Terminator,
218 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, 204 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator,
219 0, naclbitc::BLK_CODE_EXIT, Terminator, 205 0, naclbitc::BLK_CODE_EXIT, Terminator,
220 0, naclbitc::BLK_CODE_EXIT, Terminator 206 0, naclbitc::BLK_CODE_EXIT, Terminator
221 }; 207 };
222 208
223 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD 209 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD
224 210
225 // Show text when alignment is 1. 211 // Show text when alignment is 1.
226 NaClObjDumpMunger DumpMunger(BitcodeRecords, 212 NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords));
227 array_lengthof(BitcodeRecords), Terminator); 213 EXPECT_TRUE(DumpMunger.runTest());
228 EXPECT_TRUE(DumpMunger.runTest("BadLoadAlignment-1"));
229 EXPECT_EQ( 214 EXPECT_EQ(
230 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " 215 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, "
231 "88, 69)\n" 216 "88, 69)\n"
232 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" 217 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n"
233 " | 0> |\n" 218 " | 0> |\n"
234 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" 219 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n"
235 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n" 220 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n"
236 " 32:0| 3: <1, 2> | count 2;\n" 221 " 32:0| 3: <1, 2> | count 2;\n"
237 " 34:4| 3: <7, 32> | @t0 = i32;\n" 222 " 34:4| 3: <7, 32> | @t0 = i32;\n"
238 " 37:6| 3: <21, 0, 0, 0> | @t1 = i32 (i32);\n" 223 " 37:6| 3: <21, 0, 0, 0> | @t1 = i32 (i32);\n"
239 " 41:6| 0: <65534> | }\n" 224 " 41:6| 0: <65534> | }\n"
240 " 44:0| 3: <8, 1, 0, 0, 0> | define external i32 @f0(i32" 225 " 44:0| 3: <8, 1, 0, 0, 0> | define external i32 @f0(i32"
241 ");\n" 226 ");\n"
242 " 48:6| 1: <65535, 12, 2> | function i32 @f0(i32 %p0) {" 227 " 48:6| 1: <65535, 12, 2> | function i32 @f0(i32 %p0) {"
243 " \n" 228 " \n"
244 " | | // BlockID " 229 " | | // BlockID "
245 "= 12\n" 230 "= 12\n"
246 " 56:0| 3: <1, 1> | blocks 1;\n" 231 " 56:0| 3: <1, 1> | blocks 1;\n"
247 " | | %b0:\n" 232 " | | %b0:\n"
248 " 58:4| 3: <20, 1, 1, 0> | %v0 = load i32* %p0, " 233 " 58:4| 3: <20, 1, 1, 0> | %v0 = load i32* %p0, "
249 "align 1;\n" 234 "align 1;\n"
250 " 62:4| 3: <10, 1> | ret i32 %v0;\n" 235 " 62:4| 3: <10, 1> | ret i32 %v0;\n"
251 " 65:0| 0: <65534> | }\n" 236 " 65:0| 0: <65534> | }\n"
252 " 68:0|0: <65534> |}\n", 237 " 68:0|0: <65534> |}\n",
253 DumpMunger.getTestResults()); 238 DumpMunger.getTestResults());
254 NaClParseBitcodeMunger Munger(BitcodeRecords, 239 NaClParseBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords));
255 array_lengthof(BitcodeRecords), Terminator); 240 EXPECT_TRUE(Munger.runTest(true));
256 EXPECT_TRUE(Munger.runTest("BadLoadAlignment", true));
257 241
258 // Show what happens when changing alignment to 0. 242 // Show what happens when changing alignment to 0.
259 const uint64_t Align0[] = { 243 const uint64_t Align0[] = {
260 ReplaceIndex, NaClMungedBitcode::Replace, 244 ReplaceIndex, NaClMungedBitcode::Replace,
261 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, 245 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator,
262 }; 246 };
263 // Note: Correct alignment is not checked by Munger (i.e. the PNaCl 247 // Note: Correct alignment is not checked by Munger (i.e. the PNaCl
264 // bitcode reader). It is checked later by the PNaCl ABI checker in 248 // bitcode reader). It is checked later by the PNaCl ABI checker in
265 // pnacl-llc. On the other hand, the DumpMunger checks alignment for 249 // pnacl-llc. On the other hand, the DumpMunger checks alignment for
266 // loads while parsing. 250 // loads while parsing.
267 EXPECT_TRUE(Munger.runTest( 251 EXPECT_TRUE(Munger.runTest(ARRAY(Align0), true));
268 "BadLoadAlignment-0", Align0, array_lengthof(Align0), true)); 252 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0)));
269 EXPECT_FALSE(DumpMunger.runTestForAssembly(
270 "BadLoadAlignment-0", Align0, array_lengthof(Align0)));
271 EXPECT_EQ( 253 EXPECT_EQ(
272 " %v0 = load i32* %p0, align 0;\n" 254 " %v0 = load i32* %p0, align 0;\n"
273 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", 255 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n",
274 DumpMunger.getLinesWithSubstring("load")); 256 DumpMunger.getLinesWithSubstring("load"));
275 257
276 // Show what happens when changing alignment to 4. 258 // Show what happens when changing alignment to 4.
277 const uint64_t Align4[] = { 259 const uint64_t Align4[] = {
278 ReplaceIndex, NaClMungedBitcode::Replace, 260 ReplaceIndex, NaClMungedBitcode::Replace,
279 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, 261 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator,
280 }; 262 };
281 EXPECT_TRUE(Munger.runTest( 263 EXPECT_TRUE(Munger.runTest(ARRAY(Align4), true));
282 "BadLoadAlignment-4", Align4, array_lengthof(Align4), true)); 264 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align4)));
283 EXPECT_FALSE(DumpMunger.runTestForAssembly(
284 "BadLoadAlignment-4", Align4, array_lengthof(Align4)));
285 EXPECT_EQ( 265 EXPECT_EQ(
286 " %v0 = load i32* %p0, align 4;\n" 266 " %v0 = load i32* %p0, align 4;\n"
287 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", 267 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n",
288 DumpMunger.getLinesWithSubstring("load")); 268 DumpMunger.getLinesWithSubstring("load"));
289 269
290 // Show what happens when changing alignment to 2**29. 270 // Show what happens when changing alignment to 2**29.
291 const uint64_t Align29[] = { 271 const uint64_t Align29[] = {
292 ReplaceIndex, NaClMungedBitcode::Replace, 272 ReplaceIndex, NaClMungedBitcode::Replace,
293 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, 273 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator,
294 }; 274 };
295 EXPECT_TRUE(Munger.runTest( 275 EXPECT_TRUE(Munger.runTest(ARRAY(Align29), true));
296 "BadLoadAlignment-29", Align29, array_lengthof(Align29), true)); 276 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29)));
297 EXPECT_FALSE(DumpMunger.runTestForAssembly(
298 "BadLoadAlignment-29", Align29, array_lengthof(Align29)));
299 EXPECT_EQ( 277 EXPECT_EQ(
300 " %v0 = load i32* %p0, align 536870912;\n" 278 " %v0 = load i32* %p0, align 536870912;\n"
301 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", 279 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n",
302 DumpMunger.getLinesWithSubstring("load")); 280 DumpMunger.getLinesWithSubstring("load"));
303 281
304 // Show what happens when changing alignment to 2**30. 282 // Show what happens when changing alignment to 2**30.
305 const uint64_t Align30[] = { 283 const uint64_t Align30[] = {
306 ReplaceIndex, NaClMungedBitcode::Replace, 284 ReplaceIndex, NaClMungedBitcode::Replace,
307 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, 285 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator,
308 }; 286 };
309 EXPECT_FALSE(Munger.runTest( 287 EXPECT_FALSE(Munger.runTest(ARRAY(Align30), true));
310 "BadLoadAlignment-30", Align30, array_lengthof(Align30), true));
311 EXPECT_EQ( 288 EXPECT_EQ(
312 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n" 289 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n"
313 "Error: Invalid value in record\n", 290 "Error: Invalid value in record\n",
314 Munger.getTestResults()); 291 Munger.getTestResults());
315 EXPECT_FALSE(DumpMunger.runTestForAssembly( 292 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30)));
316 "BadLoadAlignment-30", Align30, array_lengthof(Align30)));
317 EXPECT_EQ( 293 EXPECT_EQ(
318 " %v0 = load i32* %p0, align 0;\n" 294 " %v0 = load i32* %p0, align 0;\n"
319 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", 295 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n",
320 DumpMunger.getLinesWithSubstring("load")); 296 DumpMunger.getLinesWithSubstring("load"));
321 } 297 }
322 298
323 // Test how we recognize alignments in store instructions. 299 // Test how we recognize alignments in store instructions.
324 TEST(NaClParseInstsTests, BadStoreAlignment) { 300 TEST(NaClParseInstsTests, BadStoreAlignment) {
325 const uint64_t BitcodeRecords[] = { 301 const uint64_t BitcodeRecords[] = {
326 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, 302 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator,
327 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, 303 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator,
328 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, 304 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator,
329 3, naclbitc::TYPE_CODE_FLOAT, Terminator, 305 3, naclbitc::TYPE_CODE_FLOAT, Terminator,
330 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, 306 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator,
331 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 1, 0, Terminator, 307 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 1, 0, Terminator,
332 0, naclbitc::BLK_CODE_EXIT, Terminator, 308 0, naclbitc::BLK_CODE_EXIT, Terminator,
333 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, 309 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator,
334 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, 310 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator,
335 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, 311 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator,
336 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(0), Terminator, 312 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(0), Terminator,
337 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, 313 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator,
338 0, naclbitc::BLK_CODE_EXIT, Terminator, 314 0, naclbitc::BLK_CODE_EXIT, Terminator,
339 0, naclbitc::BLK_CODE_EXIT, Terminator 315 0, naclbitc::BLK_CODE_EXIT, Terminator
340 }; 316 };
341 317
342 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_STORE 318 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_STORE
343 319
344 // Show text when alignment is 1. 320 // Show text when alignment is 1.
345 NaClObjDumpMunger DumpMunger(BitcodeRecords, 321 NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords));
346 array_lengthof(BitcodeRecords), Terminator); 322 EXPECT_TRUE(DumpMunger.runTest());
347 EXPECT_TRUE(DumpMunger.runTest("BadStoreAlignment"));
348 EXPECT_EQ( 323 EXPECT_EQ(
349 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, " 324 " 0:0|<65532, 80, 69, 88, 69, 1, 0,|Magic Number: 'PEXE' (80, 69, "
350 "88, 69)\n" 325 "88, 69)\n"
351 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n" 326 " | 8, 0, 17, 0, 4, 0, 2, 0, 0, |PNaCl Version: 2\n"
352 " | 0> |\n" 327 " | 0> |\n"
353 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n" 328 " 16:0|1: <65535, 8, 2> |module { // BlockID = 8\n"
354 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n" 329 " 24:0| 1: <65535, 17, 2> | types { // BlockID = 17\n"
355 " 32:0| 3: <1, 3> | count 3;\n" 330 " 32:0| 3: <1, 3> | count 3;\n"
356 " 34:4| 3: <3> | @t0 = float;\n" 331 " 34:4| 3: <3> | @t0 = float;\n"
357 " 36:2| 3: <7, 32> | @t1 = i32;\n" 332 " 36:2| 3: <7, 32> | @t1 = i32;\n"
358 " 39:4| 3: <21, 0, 0, 1, 0> | @t2 = float (i32, float);\n" 333 " 39:4| 3: <21, 0, 0, 1, 0> | @t2 = float (i32, float);\n"
359 " 44:2| 0: <65534> | }\n" 334 " 44:2| 0: <65534> | }\n"
360 " 48:0| 3: <8, 2, 0, 0, 0> | define external \n" 335 " 48:0| 3: <8, 2, 0, 0, 0> | define external \n"
361 " | | float @f0(i32, float);\n" 336 " | | float @f0(i32, float);\n"
362 " 52:6| 1: <65535, 12, 2> | function \n" 337 " 52:6| 1: <65535, 12, 2> | function \n"
363 " | | float @f0(i32 %p0, float " 338 " | | float @f0(i32 %p0, float "
364 "%p1) { \n" 339 "%p1) { \n"
365 " | | // BlockID " 340 " | | // BlockID "
366 "= 12\n" 341 "= 12\n"
367 " 60:0| 3: <1, 1> | blocks 1;\n" 342 " 60:0| 3: <1, 1> | blocks 1;\n"
368 " | | %b0:\n" 343 " | | %b0:\n"
369 " 62:4| 3: <24, 2, 1, 1> | store float %p1, float* " 344 " 62:4| 3: <24, 2, 1, 1> | store float %p1, float* "
370 "%p0, \n" 345 "%p0, \n"
371 " | | align 1;\n" 346 " | | align 1;\n"
372 " 66:4| 3: <10, 1> | ret float %p1;\n" 347 " 66:4| 3: <10, 1> | ret float %p1;\n"
373 " 69:0| 0: <65534> | }\n" 348 " 69:0| 0: <65534> | }\n"
374 " 72:0|0: <65534> |}\n", 349 " 72:0|0: <65534> |}\n",
375 DumpMunger.getTestResults()); 350 DumpMunger.getTestResults());
376 NaClParseBitcodeMunger Munger(BitcodeRecords, 351 NaClParseBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords));
377 array_lengthof(BitcodeRecords), Terminator); 352 EXPECT_TRUE(Munger.runTest(true));
378 EXPECT_TRUE(Munger.runTest("BadStoreAlignment", true));
379 353
380 // Show what happens when changing alignment to 0. 354 // Show what happens when changing alignment to 0.
381 const uint64_t Align0[] = { 355 const uint64_t Align0[] = {
382 ReplaceIndex, NaClMungedBitcode::Replace, 356 ReplaceIndex, NaClMungedBitcode::Replace,
383 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, 357 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator,
384 }; 358 };
385 // Note: Correct alignment is not checked by Munger (i.e. the PNaCl 359 // Note: Correct alignment is not checked by Munger (i.e. the PNaCl
386 // bitcode reader). It is checked later by the PNaCl ABI checker in 360 // bitcode reader). It is checked later by the PNaCl ABI checker in
387 // pnacl-llc. On the other hand, the DumpMunger checks alignment for 361 // pnacl-llc. On the other hand, the DumpMunger checks alignment for
388 // stores while parsing. 362 // stores while parsing.
389 EXPECT_TRUE(Munger.runTest( 363 EXPECT_TRUE(Munger.runTest(ARRAY(Align0), true));
390 "BadStoreAlignment-0", Align0, array_lengthof(Align0), true)); 364 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0)));
391 EXPECT_FALSE(DumpMunger.runTestForAssembly(
392 "BadStoreAlignment-0", Align0, array_lengthof(Align0)));
393 EXPECT_EQ( 365 EXPECT_EQ(
394 " store float %p1, float* %p0, align 0;\n" 366 " store float %p1, float* %p0, align 0;\n"
395 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", 367 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n",
396 DumpMunger.getLinesWithSubstring("store")); 368 DumpMunger.getLinesWithSubstring("store"));
397 369
398 // Show what happens when changing alignment to 4. 370 // Show what happens when changing alignment to 4.
399 const uint64_t Align4[] = { 371 const uint64_t Align4[] = {
400 ReplaceIndex, NaClMungedBitcode::Replace, 372 ReplaceIndex, NaClMungedBitcode::Replace,
401 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(2), Terminator, 373 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(2), Terminator,
402 }; 374 };
403 EXPECT_TRUE(Munger.runTest( 375 EXPECT_TRUE(Munger.runTest(ARRAY(Align4), true));
404 "BadStoreAlignment-4", Align4, array_lengthof(Align4), true)); 376 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align4)));
405 EXPECT_TRUE(DumpMunger.runTestForAssembly(
406 "BadStoreAlignment-4", Align4, array_lengthof(Align4)));
407 377
408 // Show what happens when changing alignment to 8. 378 // Show what happens when changing alignment to 8.
409 const uint64_t Align8[] = { 379 const uint64_t Align8[] = {
410 ReplaceIndex, NaClMungedBitcode::Replace, 380 ReplaceIndex, NaClMungedBitcode::Replace,
411 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(3), Terminator, 381 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(3), Terminator,
412 }; 382 };
413 EXPECT_TRUE(Munger.runTest( 383 EXPECT_TRUE(Munger.runTest(ARRAY(Align8), true));
414 "BadStoreAlignment-8", Align8, array_lengthof(Align8), true)); 384 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align8)));
415 EXPECT_FALSE(DumpMunger.runTestForAssembly(
416 "BadStoreAlignment-8", Align8, array_lengthof(Align8)));
417 EXPECT_EQ( 385 EXPECT_EQ(
418 " store float %p1, float* %p0, align 8;\n" 386 " store float %p1, float* %p0, align 8;\n"
419 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", 387 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n",
420 DumpMunger.getLinesWithSubstring("store")); 388 DumpMunger.getLinesWithSubstring("store"));
421 389
422 // Show what happens when changing alignment to 2**29. 390 // Show what happens when changing alignment to 2**29.
423 const uint64_t Align29[] = { 391 const uint64_t Align29[] = {
424 ReplaceIndex, NaClMungedBitcode::Replace, 392 ReplaceIndex, NaClMungedBitcode::Replace,
425 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(29), Terminator, 393 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(29), Terminator,
426 }; 394 };
427 EXPECT_TRUE(Munger.runTest( 395 EXPECT_TRUE(Munger.runTest(ARRAY(Align29), true));
428 "BadStoreAlignment-29", Align29, array_lengthof(Align29), true)); 396 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29)));
429 EXPECT_FALSE(DumpMunger.runTestForAssembly(
430 "BadStoreAlignment-29", Align29, array_lengthof(Align29)));
431 EXPECT_EQ( 397 EXPECT_EQ(
432 " store float %p1, float* %p0, align 536870912;\n" 398 " store float %p1, float* %p0, align 536870912;\n"
433 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", 399 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n",
434 DumpMunger.getLinesWithSubstring("store")); 400 DumpMunger.getLinesWithSubstring("store"));
435 401
436 // Show what happens when changing alignment to 2**30. 402 // Show what happens when changing alignment to 2**30.
437 const uint64_t Align30[] = { 403 const uint64_t Align30[] = {
438 ReplaceIndex, NaClMungedBitcode::Replace, 404 ReplaceIndex, NaClMungedBitcode::Replace,
439 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, 405 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator,
440 }; 406 };
441 EXPECT_FALSE(Munger.runTest( 407 EXPECT_FALSE(Munger.runTest(ARRAY(Align30), true));
442 "BadStoreAlignment-30", Align30, array_lengthof(Align30), true));
443 EXPECT_EQ( 408 EXPECT_EQ(
444 "Error(66:4): Alignment can't be greater than 2**29. Found: 2**30\n" 409 "Error(66:4): Alignment can't be greater than 2**29. Found: 2**30\n"
445 "Error: Invalid value in record\n", 410 "Error: Invalid value in record\n",
446 Munger.getTestResults()); 411 Munger.getTestResults());
447 EXPECT_FALSE(DumpMunger.runTestForAssembly( 412 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30)));
448 "BadStoreAlignment-30", Align30, array_lengthof(Align30)));
449 EXPECT_EQ( 413 EXPECT_EQ(
450 " store float %p1, float* %p0, align 0;\n" 414 " store float %p1, float* %p0, align 0;\n"
451 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", 415 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n",
452 DumpMunger.getLinesWithSubstring("store")); 416 DumpMunger.getLinesWithSubstring("store"));
453 } 417 }
454 418
455 } // end of anonamous namespace. 419 } // end of namespace naclmungetest
OLDNEW
« no previous file with comments | « unittests/Bitcode/NaClObjDumpTypesTest.cpp ('k') | unittests/Bitcode/NaClParseTypesTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698