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

Side by Side Diff: unittest/IceParseInstsTest.cpp

Issue 1149423011: Clean up unit munging unit tests using common NaCl API. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix nits. Created 5 years, 6 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 | « unittest/BitcodeMunge.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- unittest/IceParseInstsTest.cpp - test instruction errors -----------===// 1 //===- unittest/IceParseInstsTest.cpp - test instruction errors -----------===//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 9
10 #include "llvm/ADT/STLExtras.h" 10 #include "llvm/ADT/STLExtras.h"
11 #include "llvm/Bitcode/NaCl/NaClBitcodeParser.h" 11 #include "llvm/Bitcode/NaCl/NaClBitcodeParser.h"
12 #include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h" 12 #include "llvm/Bitcode/NaCl/NaClLLVMBitCodes.h"
13 13
14 #include "BitcodeMunge.h" 14 #include "BitcodeMunge.h"
15 15 #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
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
OLDNEW
« no previous file with comments | « unittest/BitcodeMunge.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698