Skip to content

Commit 99fa15e

Browse files
committed
[BOLT] Test fillUnknownRAStateInBB
1 parent aa2d90b commit 99fa15e

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

bolt/unittests/Passes/InsertNegateRAState.cpp

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,69 @@ TEST_P(PassTester, ExampleTest) {
158158
EXPECT_EQ(CFILoc[0], 4);
159159
}
160160

161+
TEST_P(PassTester, fillUnknownStateInBBTest) {
162+
/* Check that a if BB starts with unknown RAState, we can fill the unknown
163+
states based on following instructions with known RAStates.
164+
*
165+
* .LBB0 (1 instructions, align : 1)
166+
Entry Point
167+
CFI State : 0
168+
00000000: adds x0, x0, #0x0
169+
CFI State: 0
170+
171+
.LBB1 (4 instructions, align : 1)
172+
CFI State : 0
173+
00000004: !CFI $0 ; OpNegateRAState
174+
00000004: adds x0, x0, #0x1
175+
00000008: adds x0, x0, #0x2
176+
0000000c: adds x0, x0, #0x3
177+
CFI State: 0
178+
*/
179+
if (GetParam() != Triple::aarch64)
180+
GTEST_SKIP();
181+
182+
ASSERT_NE(TextSection, nullptr);
183+
184+
PREPARE_FUNC("FuncWithUnknownStateInBB");
185+
BinaryBasicBlock *BB2 = BF->addBasicBlock();
186+
BB2->setCFIState(0);
187+
188+
MCInst Unsigned = MCInstBuilder(AArch64::ADDSXri)
189+
.addReg(AArch64::X0)
190+
.addReg(AArch64::X0)
191+
.addImm(0)
192+
.addImm(0);
193+
BC->MIB->setRAState(Unsigned, false);
194+
BB->addInstruction(Unsigned);
195+
196+
MCInst Unknown = MCInstBuilder(AArch64::ADDSXri)
197+
.addReg(AArch64::X0)
198+
.addReg(AArch64::X0)
199+
.addImm(1)
200+
.addImm(0);
201+
MCInst Unknown1 = MCInstBuilder(AArch64::ADDSXri)
202+
.addReg(AArch64::X0)
203+
.addReg(AArch64::X0)
204+
.addImm(2)
205+
.addImm(0);
206+
MCInst Signed = MCInstBuilder(AArch64::ADDSXri)
207+
.addReg(AArch64::X0)
208+
.addReg(AArch64::X0)
209+
.addImm(3)
210+
.addImm(0);
211+
BC->MIB->setRAState(Signed, true);
212+
BB2->addInstruction(Unknown);
213+
BB2->addInstruction(Unknown1);
214+
BB2->addInstruction(Signed);
215+
216+
Error E = PassManager->runPasses();
217+
EXPECT_FALSE(E);
218+
219+
auto CFILoc = findCFIOffsets(*BF);
220+
EXPECT_EQ(CFILoc.size(), 1u);
221+
EXPECT_EQ(CFILoc[0], 4);
222+
}
223+
161224
#ifdef AARCH64_AVAILABLE
162225
INSTANTIATE_TEST_SUITE_P(AArch64, PassTester,
163226
::testing::Values(Triple::aarch64));

0 commit comments

Comments
 (0)