OLD | NEW |
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 Loading... |
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 |
OLD | NEW |