OLD | NEW |
1 //===- unittest/IceParseInstsTest.cpp - test instruction errors -----------===// | 1 //===- unittest/IceParseInstsTest.cpp - test instruction errors -----------===// |
2 // | 2 // |
3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 | 9 |
10 #include "llvm/ADT/STLExtras.h" | 10 #include "llvm/ADT/STLExtras.h" |
11 #include "llvm/Bitcode/NaCl/NaClBitcodeParser.h" | 11 #include "llvm/Bitcode/NaCl/NaClBitcodeParser.h" |
12 #include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h" | 12 #include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h" |
13 | 13 |
14 #include "BitcodeMunge.h" | 14 #include "BitcodeMunge.h" |
15 | 15 #include "unittests/Bitcode/NaClMungeTest.h" |
16 #include "gtest/gtest.h" | |
17 | 16 |
18 using namespace llvm; | 17 using namespace llvm; |
| 18 using namespace naclmungetest; |
19 | 19 |
20 namespace { | 20 namespace { |
21 | 21 |
22 static const uint64_t Terminator = 0x5768798008978675LL; | |
23 | |
24 // Note: alignment stored as 0 or log2(Alignment)+1. | 22 // Note: alignment stored as 0 or log2(Alignment)+1. |
25 uint64_t getEncAlignPower(unsigned Power) { | 23 uint64_t getEncAlignPower(unsigned Power) { |
26 return Power + 1; | 24 return Power + 1; |
27 } | 25 } |
28 uint64_t getEncAlignZero() { return 0; } | 26 uint64_t getEncAlignZero() { return 0; } |
29 | 27 |
30 /// Test how we report a call arg that refers to nonexistent call argument | 28 /// Test how we report a call arg that refers to nonexistent call argument |
31 TEST(IceParseInstsTest, NonexistentCallArg) { | 29 TEST(IceParseInstsTest, NonexistentCallArg) { |
32 const uint64_t BitcodeRecords[] = { | 30 const uint64_t BitcodeRecords[] = { |
33 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 31 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
34 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | 32 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
35 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, | 33 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, |
36 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | 34 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
37 3, naclbitc::TYPE_CODE_VOID, Terminator, | 35 3, naclbitc::TYPE_CODE_VOID, Terminator, |
38 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, 0, Terminator, | 36 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, 0, Terminator, |
39 0, naclbitc::BLK_CODE_EXIT, Terminator, | 37 0, naclbitc::BLK_CODE_EXIT, Terminator, |
40 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 1, 0, Terminator, | 38 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 1, 0, Terminator, |
41 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | 39 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, |
42 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | 40 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
43 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | 41 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
44 // Note: 100 is a bad value index in next line. | 42 // Note: 100 is a bad value index in next line. |
45 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, | 43 3, naclbitc::FUNC_CODE_INST_CALL, 0, 4, 2, 100, Terminator, |
46 3, naclbitc::FUNC_CODE_INST_RET, Terminator, | 44 3, naclbitc::FUNC_CODE_INST_RET, Terminator, |
47 0, naclbitc::BLK_CODE_EXIT, Terminator, | 45 0, naclbitc::BLK_CODE_EXIT, Terminator, |
48 0, naclbitc::BLK_CODE_EXIT, Terminator | 46 0, naclbitc::BLK_CODE_EXIT, Terminator |
49 }; | 47 }; |
50 | 48 |
51 // Show bitcode objdump for BitcodeRecords. | 49 // Show bitcode objdump for BitcodeRecords. |
52 NaClObjDumpMunger DumpMunger(BitcodeRecords, | 50 NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords)); |
53 array_lengthof(BitcodeRecords), Terminator); | 51 EXPECT_FALSE(DumpMunger.runTest()); |
54 EXPECT_FALSE(DumpMunger.runTest("Nonexistent call arg")); | |
55 EXPECT_EQ(" 66:4| 3: <34, 0, 4, 2, 100> | call void @f0(i32 " | 52 EXPECT_EQ(" 66:4| 3: <34, 0, 4, 2, 100> | call void @f0(i32 " |
56 "%p0, i32 @f0);\n" | 53 "%p0, i32 @f0);\n" |
57 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n", | 54 "Error(66:4): Invalid relative value id: 100 (Must be <= 4)\n", |
58 DumpMunger.getLinesWithSubstring("66:4")); | 55 DumpMunger.getLinesWithSubstring("66:4")); |
59 | 56 |
60 // Show that we get appropriate error when parsing in Subzero. | 57 // Show that we get appropriate error when parsing in Subzero. |
61 IceTest::SubzeroBitcodeMunger Munger( | 58 IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); |
62 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 59 EXPECT_FALSE(Munger.runTest()); |
63 EXPECT_FALSE(Munger.runTest("Nonexistent call arg")); | |
64 EXPECT_EQ("Error(66:4): Invalid function record: <34 0 4 2 100>\n", | 60 EXPECT_EQ("Error(66:4): Invalid function record: <34 0 4 2 100>\n", |
65 Munger.getTestResults()); | 61 Munger.getTestResults()); |
66 | 62 |
67 // Show that we generate a fatal error when not allowing error recovery. | 63 // Show that we generate a fatal error when not allowing error recovery. |
68 Munger.Flags.setAllowErrorRecovery(false); | 64 Munger.Flags.setAllowErrorRecovery(false); |
69 EXPECT_DEATH( | 65 EXPECT_DEATH(Munger.runTest(), ".*ERROR: Unable to continue.*"); |
70 Munger.runTest("Nonexistent call arg"), | |
71 ".*ERROR: Unable to continue.*"); | |
72 } | 66 } |
73 | 67 |
74 /// Test how we recognize alignments in alloca instructions. | 68 /// Test how we recognize alignments in alloca instructions. |
75 TEST(IceParseInstsTests, AllocaAlignment) { | 69 TEST(IceParseInstsTests, AllocaAlignment) { |
76 const uint64_t BitcodeRecords[] = { | 70 const uint64_t BitcodeRecords[] = { |
77 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 71 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
78 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | 72 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
79 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, | 73 3, naclbitc::TYPE_CODE_NUMENTRY, 4, Terminator, |
80 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | 74 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
81 3, naclbitc::TYPE_CODE_VOID, Terminator, | 75 3, naclbitc::TYPE_CODE_VOID, Terminator, |
82 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator, | 76 3, naclbitc::TYPE_CODE_FUNCTION, 0, 1, 0, Terminator, |
83 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator, | 77 3, naclbitc::TYPE_CODE_INTEGER, 8, Terminator, |
84 0, naclbitc::BLK_CODE_EXIT, Terminator, | 78 0, naclbitc::BLK_CODE_EXIT, Terminator, |
85 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | 79 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, |
86 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | 80 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
87 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | 81 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
88 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(0), Terminator, | 82 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(0), Terminator, |
89 3, naclbitc::FUNC_CODE_INST_RET, Terminator, | 83 3, naclbitc::FUNC_CODE_INST_RET, Terminator, |
90 0, naclbitc::BLK_CODE_EXIT, Terminator, | 84 0, naclbitc::BLK_CODE_EXIT, Terminator, |
91 0, naclbitc::BLK_CODE_EXIT, Terminator}; | 85 0, naclbitc::BLK_CODE_EXIT, Terminator}; |
92 | 86 |
93 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA | 87 const uint64_t ReplaceIndex = 11; // index for FUNC_CODE_INST_ALLOCA |
94 | 88 |
95 // Show text when alignment is 1. | 89 // Show text when alignment is 1. |
96 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), | 90 NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords)); |
97 Terminator); | 91 EXPECT_TRUE(DumpMunger.runTest()); |
98 EXPECT_TRUE(DumpMunger.runTest("Good alloca alignment 1")); | |
99 EXPECT_EQ(" 62:4| 3: <19, 1, 1> | %v0 = alloca i8, i32 " | 92 EXPECT_EQ(" 62:4| 3: <19, 1, 1> | %v0 = alloca i8, i32 " |
100 "%p0, align 1;\n", | 93 "%p0, align 1;\n", |
101 DumpMunger.getLinesWithSubstring("62:4")); | 94 DumpMunger.getLinesWithSubstring("62:4")); |
102 | 95 |
103 // Show that we can handle alignment of 1. | 96 // Show that we can handle alignment of 1. |
104 IceTest::SubzeroBitcodeMunger Munger( | 97 IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); |
105 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 98 EXPECT_TRUE(Munger.runTest()); |
106 EXPECT_TRUE(Munger.runTest("Good alloca alignment 1")); | |
107 | 99 |
108 // Show what happens when changing alignment to 0. | 100 // Show what happens when changing alignment to 0. |
109 const uint64_t Align0[] = { | 101 const uint64_t Align0[] = { |
110 ReplaceIndex, NaClMungedBitcode::Replace, | 102 ReplaceIndex, NaClMungedBitcode::Replace, |
111 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator, | 103 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignZero(), Terminator, |
112 }; | 104 }; |
113 EXPECT_TRUE(Munger.runTest("Good alloca alignment 0", Align0, | 105 EXPECT_TRUE(Munger.runTest(ARRAY(Align0))); |
114 array_lengthof(Align0))); | 106 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align0))); |
115 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 0", Align0, | |
116 array_lengthof(Align0))); | |
117 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", | 107 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", |
118 DumpMunger.getLinesWithSubstring("alloca")); | 108 DumpMunger.getLinesWithSubstring("alloca")); |
119 | 109 |
120 // Show what happens when changing alignment to 2**30. | 110 // Show what happens when changing alignment to 2**30. |
121 const uint64_t Align30[] = { | 111 const uint64_t Align30[] = { |
122 ReplaceIndex, NaClMungedBitcode::Replace, | 112 ReplaceIndex, NaClMungedBitcode::Replace, |
123 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, | 113 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(30), Terminator, |
124 }; | 114 }; |
125 EXPECT_FALSE(Munger.runTest("Bad alloca alignment 30", Align30, | 115 EXPECT_FALSE(Munger.runTest(ARRAY(Align30))); |
126 array_lengthof(Align30))); | |
127 EXPECT_EQ("Error(62:4): Invalid function record: <19 1 31>\n", | 116 EXPECT_EQ("Error(62:4): Invalid function record: <19 1 31>\n", |
128 Munger.getTestResults()); | 117 Munger.getTestResults()); |
129 | 118 |
130 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad alloca alignment 30", Align30, | 119 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); |
131 array_lengthof(Align30))); | |
132 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", | 120 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 0;\n", |
133 DumpMunger.getLinesWithSubstring("alloca")); | 121 DumpMunger.getLinesWithSubstring("alloca")); |
134 EXPECT_EQ( | 122 EXPECT_EQ( |
135 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", | 123 "Error(62:4): Alignment can't be greater than 2**29. Found: 2**30\n", |
136 DumpMunger.getLinesWithSubstring("Error")); | 124 DumpMunger.getLinesWithSubstring("Error")); |
137 | 125 |
138 // Show what happens when changing alignment to 2**29. | 126 // Show what happens when changing alignment to 2**29. |
139 const uint64_t Align29[] = { | 127 const uint64_t Align29[] = { |
140 ReplaceIndex, NaClMungedBitcode::Replace, | 128 ReplaceIndex, NaClMungedBitcode::Replace, |
141 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(29), Terminator, | 129 3, naclbitc::FUNC_CODE_INST_ALLOCA, 1, getEncAlignPower(29), Terminator, |
142 }; | 130 }; |
143 EXPECT_TRUE(Munger.runTest("Good alloca alignment 29", Align29, | 131 EXPECT_TRUE(Munger.runTest(ARRAY(Align29))); |
144 array_lengthof(Align29))); | 132 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align29))); |
145 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good alloca alignment 29", Align29, | |
146 array_lengthof(Align29))); | |
147 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 536870912;\n", | 133 EXPECT_EQ(" %v0 = alloca i8, i32 %p0, align 536870912;\n", |
148 DumpMunger.getLinesWithSubstring("alloca")); | 134 DumpMunger.getLinesWithSubstring("alloca")); |
149 } | 135 } |
150 | 136 |
151 // Test how we recognize alignments in load i32 instructions. | 137 // Test how we recognize alignments in load i32 instructions. |
152 TEST(IceParseInstsTests, LoadI32Alignment) { | 138 TEST(IceParseInstsTests, LoadI32Alignment) { |
153 const uint64_t BitcodeRecords[] = { | 139 const uint64_t BitcodeRecords[] = { |
154 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 140 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
155 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | 141 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
156 3, naclbitc::TYPE_CODE_NUMENTRY, 2, Terminator, | 142 3, naclbitc::TYPE_CODE_NUMENTRY, 2, Terminator, |
157 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | 143 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
158 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 0, Terminator, | 144 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 0, Terminator, |
159 0, naclbitc::BLK_CODE_EXIT, Terminator, | 145 0, naclbitc::BLK_CODE_EXIT, Terminator, |
160 3, naclbitc::MODULE_CODE_FUNCTION, 1, 0, 0, 0, Terminator, | 146 3, naclbitc::MODULE_CODE_FUNCTION, 1, 0, 0, 0, Terminator, |
161 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | 147 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
162 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | 148 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
163 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 0, Terminator, | 149 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 0, Terminator, |
164 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | 150 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, |
165 0, naclbitc::BLK_CODE_EXIT, Terminator, | 151 0, naclbitc::BLK_CODE_EXIT, Terminator, |
166 0, naclbitc::BLK_CODE_EXIT, Terminator}; | 152 0, naclbitc::BLK_CODE_EXIT, Terminator}; |
167 | 153 |
168 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD | 154 const uint64_t ReplaceIndex = 9; // index for FUNC_CODE_INST_LOAD |
169 | 155 |
170 // Show text when alignment is 1. | 156 // Show text when alignment is 1. |
171 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), | 157 NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords)); |
172 Terminator); | 158 EXPECT_TRUE(DumpMunger.runTest()); |
173 EXPECT_TRUE(DumpMunger.runTest("Good load i32 alignment 1")); | |
174 EXPECT_EQ(" 58:4| 3: <20, 1, 1, 0> | %v0 = load i32* %p0, " | 159 EXPECT_EQ(" 58:4| 3: <20, 1, 1, 0> | %v0 = load i32* %p0, " |
175 "align 1;\n", | 160 "align 1;\n", |
176 DumpMunger.getLinesWithSubstring("58:4")); | 161 DumpMunger.getLinesWithSubstring("58:4")); |
177 IceTest::SubzeroBitcodeMunger Munger( | 162 IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); |
178 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 163 EXPECT_TRUE(Munger.runTest()); |
179 EXPECT_TRUE(Munger.runTest("Good load i32 alignment 1")); | |
180 | 164 |
181 // Show what happens when changing alignment to 0. | 165 // Show what happens when changing alignment to 0. |
182 const uint64_t Align0[] = { | 166 const uint64_t Align0[] = { |
183 ReplaceIndex, NaClMungedBitcode::Replace, | 167 ReplaceIndex, NaClMungedBitcode::Replace, |
184 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, | 168 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, |
185 }; | 169 }; |
186 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 0", Align0, | 170 EXPECT_FALSE(Munger.runTest(ARRAY(Align0))); |
187 array_lengthof(Align0))); | |
188 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 0 0>\n", | 171 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 0 0>\n", |
189 Munger.getTestResults()); | 172 Munger.getTestResults()); |
190 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 0", Align0, | 173 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0))); |
191 array_lengthof(Align0))); | |
192 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" | 174 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" |
193 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 175 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
194 DumpMunger.getLinesWithSubstring("load")); | 176 DumpMunger.getLinesWithSubstring("load")); |
195 | 177 |
196 // Show what happens when changing alignment to 4. | 178 // Show what happens when changing alignment to 4. |
197 const uint64_t Align4[] = { | 179 const uint64_t Align4[] = { |
198 ReplaceIndex, NaClMungedBitcode::Replace, | 180 ReplaceIndex, NaClMungedBitcode::Replace, |
199 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, | 181 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, |
200 }; | 182 }; |
201 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 4", Align4, | 183 EXPECT_FALSE(Munger.runTest(ARRAY(Align4))); |
202 array_lengthof(Align4))); | |
203 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 3 0>\n", | 184 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 3 0>\n", |
204 Munger.getTestResults()); | 185 Munger.getTestResults()); |
205 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 4", Align4, | 186 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align4))); |
206 array_lengthof(Align4))); | |
207 EXPECT_EQ(" %v0 = load i32* %p0, align 4;\n" | 187 EXPECT_EQ(" %v0 = load i32* %p0, align 4;\n" |
208 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 188 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
209 DumpMunger.getLinesWithSubstring("load")); | 189 DumpMunger.getLinesWithSubstring("load")); |
210 | 190 |
211 // Show what happens when changing alignment to 2**29. | 191 // Show what happens when changing alignment to 2**29. |
212 const uint64_t Align29[] = { | 192 const uint64_t Align29[] = { |
213 ReplaceIndex, NaClMungedBitcode::Replace, | 193 ReplaceIndex, NaClMungedBitcode::Replace, |
214 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, | 194 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, |
215 }; | 195 }; |
216 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 29", Align29, | 196 EXPECT_FALSE(Munger.runTest(ARRAY(Align29))); |
217 array_lengthof(Align29))); | |
218 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 30 0>\n", | 197 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 30 0>\n", |
219 Munger.getTestResults()); | 198 Munger.getTestResults()); |
220 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 29", | 199 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29))); |
221 Align29, array_lengthof(Align29))); | |
222 EXPECT_EQ(" %v0 = load i32* %p0, align 536870912;\n" | 200 EXPECT_EQ(" %v0 = load i32* %p0, align 536870912;\n" |
223 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 201 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
224 DumpMunger.getLinesWithSubstring("load")); | 202 DumpMunger.getLinesWithSubstring("load")); |
225 | 203 |
226 // Show what happens when changing alignment to 2**30. | 204 // Show what happens when changing alignment to 2**30. |
227 const uint64_t Align30[] = { | 205 const uint64_t Align30[] = { |
228 ReplaceIndex, NaClMungedBitcode::Replace, | 206 ReplaceIndex, NaClMungedBitcode::Replace, |
229 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, | 207 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, |
230 }; | 208 }; |
231 EXPECT_FALSE(Munger.runTest("Bad load i32 alignment 30", Align30, | 209 EXPECT_FALSE(Munger.runTest(ARRAY(Align30))); |
232 array_lengthof(Align30))); | |
233 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 31 0>\n", | 210 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 31 0>\n", |
234 Munger.getTestResults()); | 211 Munger.getTestResults()); |
235 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load i32 alignment 30", | 212 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); |
236 Align30, array_lengthof(Align30))); | |
237 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" | 213 EXPECT_EQ(" %v0 = load i32* %p0, align 0;\n" |
238 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", | 214 "Error(58:4): load: Illegal alignment for i32. Expects: 1\n", |
239 DumpMunger.getLinesWithSubstring("load")); | 215 DumpMunger.getLinesWithSubstring("load")); |
240 } | 216 } |
241 | 217 |
242 // Test how we recognize alignments in load float instructions. | 218 // Test how we recognize alignments in load float instructions. |
243 TEST(IceParseInstsTests, LoadFloatAlignment) { | 219 TEST(IceParseInstsTests, LoadFloatAlignment) { |
244 const uint64_t BitcodeRecords[] = { | 220 const uint64_t BitcodeRecords[] = { |
245 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 221 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
246 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, | 222 1, naclbitc::BLK_CODE_ENTER, naclbitc::TYPE_BLOCK_ID_NEW, 2, Terminator, |
247 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, | 223 3, naclbitc::TYPE_CODE_NUMENTRY, 3, Terminator, |
248 3, naclbitc::TYPE_CODE_FLOAT, Terminator, | 224 3, naclbitc::TYPE_CODE_FLOAT, Terminator, |
249 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, | 225 3, naclbitc::TYPE_CODE_INTEGER, 32, Terminator, |
250 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 1, Terminator, | 226 3, naclbitc::TYPE_CODE_FUNCTION, 0, 0, 1, Terminator, |
251 0, naclbitc::BLK_CODE_EXIT, Terminator, | 227 0, naclbitc::BLK_CODE_EXIT, Terminator, |
252 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, | 228 3, naclbitc::MODULE_CODE_FUNCTION, 2, 0, 0, 0, Terminator, |
253 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, | 229 1, naclbitc::BLK_CODE_ENTER, naclbitc::FUNCTION_BLOCK_ID, 2, Terminator, |
254 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, | 230 3, naclbitc::FUNC_CODE_DECLAREBLOCKS, 1, Terminator, |
255 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 0, Terminator, | 231 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(0), 0, Terminator, |
256 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, | 232 3, naclbitc::FUNC_CODE_INST_RET, 1, Terminator, |
257 0, naclbitc::BLK_CODE_EXIT, Terminator, | 233 0, naclbitc::BLK_CODE_EXIT, Terminator, |
258 0, naclbitc::BLK_CODE_EXIT, Terminator}; | 234 0, naclbitc::BLK_CODE_EXIT, Terminator}; |
259 | 235 |
260 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_LOAD | 236 const uint64_t ReplaceIndex = 10; // index for FUNC_CODE_INST_LOAD |
261 | 237 |
262 // Show text when alignment is 1. | 238 // Show text when alignment is 1. |
263 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), | 239 NaClObjDumpMunger DumpMunger(ARRAY_TERM(BitcodeRecords)); |
264 Terminator); | 240 EXPECT_TRUE(DumpMunger.runTest()); |
265 EXPECT_TRUE(DumpMunger.runTest("Good load float alignment 1")); | |
266 EXPECT_EQ(" 58:4| 3: <20, 1, 1, 0> | %v0 = load float* " | 241 EXPECT_EQ(" 58:4| 3: <20, 1, 1, 0> | %v0 = load float* " |
267 "%p0, align 1;\n", | 242 "%p0, align 1;\n", |
268 DumpMunger.getLinesWithSubstring("58:4")); | 243 DumpMunger.getLinesWithSubstring("58:4")); |
269 IceTest::SubzeroBitcodeMunger Munger( | 244 IceTest::SubzeroBitcodeMunger Munger(ARRAY_TERM(BitcodeRecords)); |
270 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 245 EXPECT_TRUE(Munger.runTest()); |
271 EXPECT_TRUE(Munger.runTest("Good load float alignment 1")); | |
272 | 246 |
273 // Show what happens when changing alignment to 0. | 247 // Show what happens when changing alignment to 0. |
274 const uint64_t Align0[] = { | 248 const uint64_t Align0[] = { |
275 ReplaceIndex, NaClMungedBitcode::Replace, | 249 ReplaceIndex, NaClMungedBitcode::Replace, |
276 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, | 250 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignZero(), 0, Terminator, |
277 }; | 251 }; |
278 EXPECT_FALSE(Munger.runTest("Bad load float alignment 0", Align0, | 252 EXPECT_FALSE(Munger.runTest(ARRAY(Align0))); |
279 array_lengthof(Align0))); | |
280 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 0 0>\n", | 253 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 0 0>\n", |
281 Munger.getTestResults()); | 254 Munger.getTestResults()); |
282 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 0", | 255 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0))); |
283 Align0, array_lengthof(Align0))); | |
284 EXPECT_EQ( | 256 EXPECT_EQ( |
285 " %v0 = load float* %p0, align 0;\n" | 257 " %v0 = load float* %p0, align 0;\n" |
286 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", | 258 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
287 DumpMunger.getLinesWithSubstring("load")); | 259 DumpMunger.getLinesWithSubstring("load")); |
288 | 260 |
289 // Show what happens when changing alignment to 4. | 261 // Show what happens when changing alignment to 4. |
290 const uint64_t Align4[] = { | 262 const uint64_t Align4[] = { |
291 ReplaceIndex, NaClMungedBitcode::Replace, | 263 ReplaceIndex, NaClMungedBitcode::Replace, |
292 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, | 264 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(2), 0, Terminator, |
293 }; | 265 }; |
294 EXPECT_TRUE(Munger.runTest("Good load float alignment 4", Align4, | 266 EXPECT_TRUE(Munger.runTest(ARRAY(Align4))); |
295 array_lengthof(Align4))); | 267 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align4))); |
296 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good load float alignment 4", | |
297 Align4, array_lengthof(Align4))); | |
298 EXPECT_EQ(" %v0 = load float* %p0, align 4;\n", | 268 EXPECT_EQ(" %v0 = load float* %p0, align 4;\n", |
299 DumpMunger.getLinesWithSubstring("load")); | 269 DumpMunger.getLinesWithSubstring("load")); |
300 | 270 |
301 const uint64_t Align29[] = { | 271 const uint64_t Align29[] = { |
302 ReplaceIndex, NaClMungedBitcode::Replace, | 272 ReplaceIndex, NaClMungedBitcode::Replace, |
303 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, | 273 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(29), 0, Terminator, |
304 }; | 274 }; |
305 EXPECT_FALSE(Munger.runTest("Bad load float alignment 29", Align29, | 275 EXPECT_FALSE(Munger.runTest(ARRAY(Align29))); |
306 array_lengthof(Align29))); | |
307 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 30 0>\n", | 276 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 30 0>\n", |
308 Munger.getTestResults()); | 277 Munger.getTestResults()); |
309 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 29", | 278 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29))); |
310 Align29, array_lengthof(Align29))); | |
311 EXPECT_EQ( | 279 EXPECT_EQ( |
312 " %v0 = load float* %p0, align 536870912;\n" | 280 " %v0 = load float* %p0, align 536870912;\n" |
313 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", | 281 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
314 DumpMunger.getLinesWithSubstring("load")); | 282 DumpMunger.getLinesWithSubstring("load")); |
315 | 283 |
316 // Show what happens when changing alignment to 2**30. | 284 // Show what happens when changing alignment to 2**30. |
317 const uint64_t Align30[] = { | 285 const uint64_t Align30[] = { |
318 ReplaceIndex, NaClMungedBitcode::Replace, | 286 ReplaceIndex, NaClMungedBitcode::Replace, |
319 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, | 287 3, naclbitc::FUNC_CODE_INST_LOAD, 1, getEncAlignPower(30), 0, Terminator, |
320 }; | 288 }; |
321 EXPECT_FALSE(Munger.runTest("Bad load float alignment 30", Align30, | 289 EXPECT_FALSE(Munger.runTest(ARRAY(Align30))); |
322 array_lengthof(Align30))); | |
323 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 31 0>\n", | 290 EXPECT_EQ("Error(58:4): Invalid function record: <20 1 31 0>\n", |
324 Munger.getTestResults()); | 291 Munger.getTestResults()); |
325 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad load float alignment 30", | 292 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); |
326 Align30, array_lengthof(Align30))); | |
327 EXPECT_EQ( | 293 EXPECT_EQ( |
328 " %v0 = load float* %p0, align 0;\n" | 294 " %v0 = load float* %p0, align 0;\n" |
329 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", | 295 "Error(58:4): load: Illegal alignment for float. Expects: 1 or 4\n", |
330 DumpMunger.getLinesWithSubstring("load")); | 296 DumpMunger.getLinesWithSubstring("load")); |
331 } | 297 } |
332 | 298 |
333 // Test how we recognize alignments in store instructions. | 299 // Test how we recognize alignments in store instructions. |
334 TEST(NaClParseInstsTests, StoreAlignment) { | 300 TEST(NaClParseInstsTests, StoreAlignment) { |
335 const uint64_t BitcodeRecords[] = { | 301 const uint64_t BitcodeRecords[] = { |
336 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, | 302 1, naclbitc::BLK_CODE_ENTER, naclbitc::MODULE_BLOCK_ID, 2, Terminator, |
(...skipping 15 matching lines...) Expand all Loading... |
352 | 318 |
353 // Show text when alignment is 1. | 319 // Show text when alignment is 1. |
354 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), | 320 NaClObjDumpMunger DumpMunger(BitcodeRecords, array_lengthof(BitcodeRecords), |
355 Terminator); | 321 Terminator); |
356 EXPECT_TRUE(DumpMunger.runTest("Good Store Alignment 1")); | 322 EXPECT_TRUE(DumpMunger.runTest("Good Store Alignment 1")); |
357 EXPECT_EQ(" 62:4| 3: <24, 2, 1, 1> | store float %p1, " | 323 EXPECT_EQ(" 62:4| 3: <24, 2, 1, 1> | store float %p1, " |
358 "float* %p0, \n", | 324 "float* %p0, \n", |
359 DumpMunger.getLinesWithSubstring("62:4")); | 325 DumpMunger.getLinesWithSubstring("62:4")); |
360 IceTest::SubzeroBitcodeMunger Munger( | 326 IceTest::SubzeroBitcodeMunger Munger( |
361 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); | 327 BitcodeRecords, array_lengthof(BitcodeRecords), Terminator); |
362 EXPECT_TRUE(Munger.runTest("Good store alignment")); | 328 EXPECT_TRUE(Munger.runTest()); |
363 | 329 |
364 // Show what happens when changing alignment to 0. | 330 // Show what happens when changing alignment to 0. |
365 const uint64_t Align0[] = { | 331 const uint64_t Align0[] = { |
366 ReplaceIndex, NaClMungedBitcode::Replace, | 332 ReplaceIndex, NaClMungedBitcode::Replace, |
367 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, | 333 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignZero(), Terminator, |
368 }; | 334 }; |
369 EXPECT_FALSE( | 335 EXPECT_FALSE(Munger.runTest(ARRAY(Align0))); |
370 Munger.runTest("Bad store alignment 0", Align0, array_lengthof(Align0))); | |
371 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 0>\n", | 336 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 0>\n", |
372 Munger.getTestResults()); | 337 Munger.getTestResults()); |
373 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 0", Align0, | 338 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align0))); |
374 array_lengthof(Align0))); | |
375 EXPECT_EQ( | 339 EXPECT_EQ( |
376 " store float %p1, float* %p0, align 0;\n" | 340 " store float %p1, float* %p0, align 0;\n" |
377 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 341 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
378 DumpMunger.getLinesWithSubstring("store")); | 342 DumpMunger.getLinesWithSubstring("store")); |
379 | 343 |
380 // Show what happens when changing alignment to 4. | 344 // Show what happens when changing alignment to 4. |
381 const uint64_t Align4[] = { | 345 const uint64_t Align4[] = { |
382 ReplaceIndex, NaClMungedBitcode::Replace, | 346 ReplaceIndex, NaClMungedBitcode::Replace, |
383 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(2), Terminator, | 347 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(2), Terminator, |
384 }; | 348 }; |
385 EXPECT_TRUE( | 349 EXPECT_TRUE(Munger.runTest(ARRAY(Align4))); |
386 Munger.runTest("Bad store alignment 4", Align4, array_lengthof(Align4))); | 350 EXPECT_TRUE(DumpMunger.runTestForAssembly(ARRAY(Align4))); |
387 EXPECT_TRUE(DumpMunger.runTestForAssembly("Good store alignment 4", Align4, | |
388 array_lengthof(Align4))); | |
389 | 351 |
390 // Show what happens when changing alignment to 8. | 352 // Show what happens when changing alignment to 8. |
391 const uint64_t Align8[] = { | 353 const uint64_t Align8[] = { |
392 ReplaceIndex, NaClMungedBitcode::Replace, | 354 ReplaceIndex, NaClMungedBitcode::Replace, |
393 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(3), Terminator, | 355 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(3), Terminator, |
394 }; | 356 }; |
395 EXPECT_FALSE( | 357 EXPECT_FALSE(Munger.runTest(ARRAY(Align8))); |
396 Munger.runTest("Bad store alignment 8", Align8, array_lengthof(Align8))); | |
397 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 4>\n", | 358 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 4>\n", |
398 Munger.getTestResults()); | 359 Munger.getTestResults()); |
399 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 8", Align8, | 360 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align8))); |
400 array_lengthof(Align8))); | |
401 EXPECT_EQ( | 361 EXPECT_EQ( |
402 " store float %p1, float* %p0, align 8;\n" | 362 " store float %p1, float* %p0, align 8;\n" |
403 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 363 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
404 DumpMunger.getLinesWithSubstring("store")); | 364 DumpMunger.getLinesWithSubstring("store")); |
405 | 365 |
406 // Show what happens when changing alignment to 2**29. | 366 // Show what happens when changing alignment to 2**29. |
407 const uint64_t Align29[] = { | 367 const uint64_t Align29[] = { |
408 ReplaceIndex, NaClMungedBitcode::Replace, | 368 ReplaceIndex, NaClMungedBitcode::Replace, |
409 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(29), Terminator, | 369 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(29), Terminator, |
410 }; | 370 }; |
411 EXPECT_FALSE(Munger.runTest("Bad store alignment 29", Align29, | 371 EXPECT_FALSE(Munger.runTest(ARRAY(Align29))); |
412 array_lengthof(Align29))); | |
413 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 30>\n", | 372 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 30>\n", |
414 Munger.getTestResults()); | 373 Munger.getTestResults()); |
415 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad store alignment 29", Align29, | 374 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align29))); |
416 array_lengthof(Align29))); | |
417 EXPECT_EQ( | 375 EXPECT_EQ( |
418 " store float %p1, float* %p0, align 536870912;\n" | 376 " store float %p1, float* %p0, align 536870912;\n" |
419 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 377 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
420 DumpMunger.getLinesWithSubstring("store")); | 378 DumpMunger.getLinesWithSubstring("store")); |
421 | 379 |
422 const uint64_t Align30[] = { | 380 const uint64_t Align30[] = { |
423 ReplaceIndex, NaClMungedBitcode::Replace, | 381 ReplaceIndex, NaClMungedBitcode::Replace, |
424 // Note: alignment stored as 0 or log2(Alignment)+1. | 382 // Note: alignment stored as 0 or log2(Alignment)+1. |
425 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, | 383 3, naclbitc::FUNC_CODE_INST_STORE, 2, 1, getEncAlignPower(30), Terminator, |
426 }; | 384 }; |
427 EXPECT_FALSE(Munger.runTest("Bad store alignment 30", Align30, | 385 EXPECT_FALSE(Munger.runTest(ARRAY(Align30))); |
428 array_lengthof(Align30))); | |
429 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 31>\n", | 386 EXPECT_EQ("Error(62:4): Invalid function record: <24 2 1 31>\n", |
430 Munger.getTestResults()); | 387 Munger.getTestResults()); |
431 EXPECT_FALSE(DumpMunger.runTestForAssembly("Bad Store alignment 30", Align30, | 388 EXPECT_FALSE(DumpMunger.runTestForAssembly(ARRAY(Align30))); |
432 array_lengthof(Align30))); | |
433 EXPECT_EQ( | 389 EXPECT_EQ( |
434 " store float %p1, float* %p0, align 0;\n" | 390 " store float %p1, float* %p0, align 0;\n" |
435 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", | 391 "Error(62:4): store: Illegal alignment for float. Expects: 1 or 4\n", |
436 DumpMunger.getLinesWithSubstring("store")); | 392 DumpMunger.getLinesWithSubstring("store")); |
437 } | 393 } |
438 | 394 |
439 } // end of anonymous namespace | 395 } // end of anonymous namespace |
OLD | NEW |