@@ -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
162225INSTANTIATE_TEST_SUITE_P (AArch64, PassTester,
163226 ::testing::Values (Triple::aarch64));
0 commit comments