|
|
|
|
@@ -172,7 +172,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestSimple64bitFrameFunction) {
|
|
|
|
|
|
|
|
|
|
// 0: CFA=rsp +8 => rsp=CFA+0 rip=[CFA-8]
|
|
|
|
|
const UnwindPlan::Row *row = unwind_plan.GetRowForFunctionOffset(0);
|
|
|
|
|
EXPECT_EQ(0ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(0, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -183,7 +183,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestSimple64bitFrameFunction) {
|
|
|
|
|
|
|
|
|
|
// 1: CFA=rsp+16 => rbp=[CFA-16] rsp=CFA+0 rip=[CFA-8]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(1);
|
|
|
|
|
EXPECT_EQ(1ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(1, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -194,7 +194,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestSimple64bitFrameFunction) {
|
|
|
|
|
|
|
|
|
|
// 4: CFA=rbp+16 => rbp=[CFA-16] rsp=CFA+0 rip=[CFA-8]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(4);
|
|
|
|
|
EXPECT_EQ(4ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(4, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rbp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -205,7 +205,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestSimple64bitFrameFunction) {
|
|
|
|
|
|
|
|
|
|
// 7: CFA=rsp +8 => rsp=CFA+0 rip=[CFA-8]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(7);
|
|
|
|
|
EXPECT_EQ(7ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(7, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -248,7 +248,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestSimple32bitFrameFunction) {
|
|
|
|
|
|
|
|
|
|
// offset 0 -- pushl %ebp
|
|
|
|
|
const UnwindPlan::Row *row = unwind_plan.GetRowForFunctionOffset(0);
|
|
|
|
|
EXPECT_EQ(0ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(0, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_esp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(4, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -259,7 +259,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestSimple32bitFrameFunction) {
|
|
|
|
|
|
|
|
|
|
// 1: CFA=esp +8 => ebp=[CFA-8] esp=CFA+0 eip=[CFA-4]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(1);
|
|
|
|
|
EXPECT_EQ(1ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(1, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_esp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -270,7 +270,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestSimple32bitFrameFunction) {
|
|
|
|
|
|
|
|
|
|
// 3: CFA=ebp +8 => ebp=[CFA-8] esp=CFA+0 eip=[CFA-4]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(3);
|
|
|
|
|
EXPECT_EQ(3ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(3, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_ebp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -281,7 +281,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestSimple32bitFrameFunction) {
|
|
|
|
|
|
|
|
|
|
// 6: CFA=esp +4 => esp=CFA+0 eip=[CFA-4]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(6);
|
|
|
|
|
EXPECT_EQ(6ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(6, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_esp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(4, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -389,7 +389,7 @@ TEST_F(Testx86AssemblyInspectionEngine, Test64bitFramelessBigStackFrame) {
|
|
|
|
|
|
|
|
|
|
const UnwindPlan::Row *row = unwind_plan.GetRowForFunctionOffset(17);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(17ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(17, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(14496, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -427,7 +427,7 @@ TEST_F(Testx86AssemblyInspectionEngine, Test64bitFramelessBigStackFrame) {
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(34);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(34ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(34, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -658,7 +658,7 @@ TEST_F(Testx86AssemblyInspectionEngine, Test32bitFramelessBigStackFrame) {
|
|
|
|
|
// CFA=esp+14464 => ebx=[CFA-12] edi=[CFA-16] esi=[CFA-20] ebp=[CFA-8]
|
|
|
|
|
// esp=CFA+0 eip=[CFA-4]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(10);
|
|
|
|
|
EXPECT_EQ(10ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(10, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_esp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(14464, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -666,13 +666,13 @@ TEST_F(Testx86AssemblyInspectionEngine, Test32bitFramelessBigStackFrame) {
|
|
|
|
|
// 15: CFA=esp+14468 => ebx=[CFA-12] edi=[CFA-16] esi=[CFA-20] ebp=[CFA-8]
|
|
|
|
|
// esp=CFA+0 eip=[CFA-4]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(15);
|
|
|
|
|
EXPECT_EQ(15ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(15, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(14468, row->GetCFAValue().GetOffset());
|
|
|
|
|
|
|
|
|
|
// 16: CFA=esp+14464 => ebx=[CFA-12] edi=[CFA-16] esi=[CFA-20] ebp=[CFA-8]
|
|
|
|
|
// esp=CFA+0 eip=[CFA-4]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(16);
|
|
|
|
|
EXPECT_EQ(16ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(16, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(14464, row->GetCFAValue().GetOffset());
|
|
|
|
|
|
|
|
|
|
// Check that the row for offset 16 has the registers saved that we expect
|
|
|
|
|
@@ -703,7 +703,7 @@ TEST_F(Testx86AssemblyInspectionEngine, Test32bitFramelessBigStackFrame) {
|
|
|
|
|
// 23: CFA=esp+14472 => ebx=[CFA-12] edi=[CFA-16] esi=[CFA-20] ebp=[CFA-8]
|
|
|
|
|
// esp=CFA+0 eip=[CFA-4]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(23);
|
|
|
|
|
EXPECT_EQ(23ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(23, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_esp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(14472, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -711,26 +711,26 @@ TEST_F(Testx86AssemblyInspectionEngine, Test32bitFramelessBigStackFrame) {
|
|
|
|
|
// 24: CFA=esp+14476 => ebx=[CFA-12] edi=[CFA-16] esi=[CFA-20] ebp=[CFA-8]
|
|
|
|
|
// esp=CFA+0 eip=[CFA-4]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(24);
|
|
|
|
|
EXPECT_EQ(24ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(24, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(14476, row->GetCFAValue().GetOffset());
|
|
|
|
|
|
|
|
|
|
// 28: CFA=esp+14480 => ebx=[CFA-12] edi=[CFA-16] esi=[CFA-20] ebp=[CFA-8]
|
|
|
|
|
// esp=CFA+0 eip=[CFA-4]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(28);
|
|
|
|
|
EXPECT_EQ(28ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(28, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(14480, row->GetCFAValue().GetOffset());
|
|
|
|
|
|
|
|
|
|
// 36: CFA=esp+14464 => ebx=[CFA-12] edi=[CFA-16] esi=[CFA-20] ebp=[CFA-8]
|
|
|
|
|
// esp=CFA+0 eip=[CFA-4]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(36);
|
|
|
|
|
EXPECT_EQ(36ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(36, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(14464, row->GetCFAValue().GetOffset());
|
|
|
|
|
|
|
|
|
|
// Check that the epilogue gets us back to the original unwind state
|
|
|
|
|
|
|
|
|
|
// 47: CFA=esp +4 => esp=CFA+0 eip=[CFA-4]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(47);
|
|
|
|
|
EXPECT_EQ(47ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(47, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_esp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(4, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -809,7 +809,7 @@ TEST_F(Testx86AssemblyInspectionEngine, Test64bitFramelessSmallStackFrame) {
|
|
|
|
|
|
|
|
|
|
const UnwindPlan::Row *row = unwind_plan.GetRowForFunctionOffset(13);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(1ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(1, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -841,7 +841,7 @@ TEST_F(Testx86AssemblyInspectionEngine, Test64bitFramelessSmallStackFrame) {
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(22);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(22ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(22, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -918,7 +918,7 @@ TEST_F(Testx86AssemblyInspectionEngine, Test32bitFramelessSmallStackFrame) {
|
|
|
|
|
|
|
|
|
|
const UnwindPlan::Row *row = unwind_plan.GetRowForFunctionOffset(3);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(3ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(3, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -927,7 +927,7 @@ TEST_F(Testx86AssemblyInspectionEngine, Test32bitFramelessSmallStackFrame) {
|
|
|
|
|
// 8: CFA=esp+20 => esp=CFA+0 eip=[CFA-4]
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(8);
|
|
|
|
|
EXPECT_EQ(8ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(8, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(20, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -936,7 +936,7 @@ TEST_F(Testx86AssemblyInspectionEngine, Test32bitFramelessSmallStackFrame) {
|
|
|
|
|
// row[3]: 9: CFA=esp+16 => esp=CFA+0 eip=[CFA-4]
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(9);
|
|
|
|
|
EXPECT_EQ(9ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(9, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -955,7 +955,7 @@ TEST_F(Testx86AssemblyInspectionEngine, Test32bitFramelessSmallStackFrame) {
|
|
|
|
|
// 34: CFA=esp +4 => esp=CFA+0 eip=[CFA-4]
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(34);
|
|
|
|
|
EXPECT_EQ(34ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(34, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(4, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -979,7 +979,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPushRBP) {
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(1);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(1ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(1, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -994,7 +994,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPushRBP) {
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(1);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(1ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(1, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1022,13 +1022,13 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPushImm) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(5);
|
|
|
|
|
EXPECT_EQ(5ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(5, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(7);
|
|
|
|
|
EXPECT_EQ(7ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(7, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(24, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1038,13 +1038,13 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPushImm) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(5);
|
|
|
|
|
EXPECT_EQ(5ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(5, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(7);
|
|
|
|
|
EXPECT_EQ(7ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(7, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(12, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1072,7 +1072,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPush0) {
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(2);
|
|
|
|
|
|
|
|
|
|
// We're verifying that no row was created for the 'pushq $0'
|
|
|
|
|
EXPECT_EQ(0ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(0, row->GetOffset());
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<x86AssemblyInspectionEngine> engine32 = Geti386Inspector();
|
|
|
|
|
EXPECT_TRUE(engine32->GetNonCallSiteUnwindPlanFromAssembly(
|
|
|
|
|
@@ -1081,7 +1081,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPush0) {
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(2);
|
|
|
|
|
|
|
|
|
|
// We're verifying that no row was created for the 'pushq $0'
|
|
|
|
|
EXPECT_EQ(0ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(0, row->GetOffset());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(Testx86AssemblyInspectionEngine, TestPushExtended) {
|
|
|
|
|
@@ -1104,7 +1104,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPushExtended) {
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(4);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(4ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(4, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1114,19 +1114,19 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPushExtended) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(4);
|
|
|
|
|
EXPECT_EQ(4ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(4, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(10);
|
|
|
|
|
EXPECT_EQ(10ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(10, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(12, row->GetCFAValue().GetOffset());
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(12);
|
|
|
|
|
EXPECT_EQ(12ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(12, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1150,7 +1150,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPushR15) {
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(2);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(2ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(2, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1178,7 +1178,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPushR14) {
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(2);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(2ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(2, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1206,7 +1206,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPushR13) {
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(2);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(2ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(2, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1234,7 +1234,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPushR12) {
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(2);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(2ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(2, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1262,7 +1262,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPushRBX) {
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(1);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(1ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(1, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1293,7 +1293,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPushEAX) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(1);
|
|
|
|
|
EXPECT_EQ(1ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(1, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_esp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1322,7 +1322,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPushECX) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(1);
|
|
|
|
|
EXPECT_EQ(1ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(1, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_esp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1351,7 +1351,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPushEDX) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(1);
|
|
|
|
|
EXPECT_EQ(1ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(1, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_esp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1377,7 +1377,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPushEBX) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(1);
|
|
|
|
|
EXPECT_EQ(1ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(1, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_esp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1405,7 +1405,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPushEBP) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(1);
|
|
|
|
|
EXPECT_EQ(1ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(1, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_esp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1433,7 +1433,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPushRBPWithREX) {
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(2);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(2ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(2, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1461,7 +1461,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPushESI) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(1);
|
|
|
|
|
EXPECT_EQ(1ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(1, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_esp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1489,7 +1489,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPushEDI) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(1);
|
|
|
|
|
EXPECT_EQ(1ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(1, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_esp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1517,7 +1517,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestMovRSPtoRBP) {
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(3);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(3ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(3, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rbp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1533,7 +1533,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestMovRSPtoRBP) {
|
|
|
|
|
data64_2, sizeof(data64_2), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(3);
|
|
|
|
|
EXPECT_EQ(3ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(3, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rbp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1549,7 +1549,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestMovRSPtoRBP) {
|
|
|
|
|
data32_1, sizeof(data32_1), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(2);
|
|
|
|
|
EXPECT_EQ(2ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(2, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_ebp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1565,7 +1565,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestMovRSPtoRBP) {
|
|
|
|
|
data32_2, sizeof(data32_2), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(2);
|
|
|
|
|
EXPECT_EQ(2ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(2, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_ebp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1589,7 +1589,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestSubRSP) {
|
|
|
|
|
data1, sizeof(data1), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(7);
|
|
|
|
|
EXPECT_EQ(7ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(7, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(264, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1605,7 +1605,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestSubRSP) {
|
|
|
|
|
data2, sizeof(data2), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(4);
|
|
|
|
|
EXPECT_EQ(4ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(4, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(24, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1629,7 +1629,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestSubESP) {
|
|
|
|
|
data1, sizeof(data1), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(6);
|
|
|
|
|
EXPECT_EQ(6ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(6, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(260, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1645,7 +1645,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestSubESP) {
|
|
|
|
|
data2, sizeof(data2), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(3);
|
|
|
|
|
EXPECT_EQ(3ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(3, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(20, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1669,7 +1669,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestAddRSP) {
|
|
|
|
|
data1, sizeof(data1), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(7);
|
|
|
|
|
EXPECT_EQ(7ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(7, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8 - 256, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1685,7 +1685,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestAddRSP) {
|
|
|
|
|
data2, sizeof(data2), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(4);
|
|
|
|
|
EXPECT_EQ(4ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(4, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8 - 16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1709,7 +1709,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestAddESP) {
|
|
|
|
|
data1, sizeof(data1), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(6);
|
|
|
|
|
EXPECT_EQ(6ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(6, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(4 - 256, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1725,7 +1725,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestAddESP) {
|
|
|
|
|
data2, sizeof(data2), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(3);
|
|
|
|
|
EXPECT_EQ(3ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(3, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(4 - 16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1749,7 +1749,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestLEA_RSP_Pattern) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(0);
|
|
|
|
|
EXPECT_EQ(0ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(0, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1774,7 +1774,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPopRBX) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(2);
|
|
|
|
|
EXPECT_EQ(2ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(2, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1800,7 +1800,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPopRBP) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(2);
|
|
|
|
|
EXPECT_EQ(2ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(2, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1826,7 +1826,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPopR12) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(4);
|
|
|
|
|
EXPECT_EQ(4ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(4, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1852,7 +1852,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPopR13) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(4);
|
|
|
|
|
EXPECT_EQ(4ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(4, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1878,7 +1878,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPopR14) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(4);
|
|
|
|
|
EXPECT_EQ(4ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(4, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1904,7 +1904,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPopR15) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(4);
|
|
|
|
|
EXPECT_EQ(4ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(4, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1930,7 +1930,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPopEBX) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(2);
|
|
|
|
|
EXPECT_EQ(2ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(2, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(4, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1956,7 +1956,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPopEBP) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(2);
|
|
|
|
|
EXPECT_EQ(2ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(2, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(4, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -1982,7 +1982,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPopRBPWithREX) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(4);
|
|
|
|
|
EXPECT_EQ(4ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(4, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2008,7 +2008,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPopESI) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(2);
|
|
|
|
|
EXPECT_EQ(2ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(2, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(4, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2034,7 +2034,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestPopEDI) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(2);
|
|
|
|
|
EXPECT_EQ(2ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(2, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(4, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2069,13 +2069,13 @@ TEST_F(Testx86AssemblyInspectionEngine, Testi386IgnoredRegisters) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(4);
|
|
|
|
|
EXPECT_EQ(4ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(4, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(20, row->GetCFAValue().GetOffset());
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(7);
|
|
|
|
|
EXPECT_EQ(7ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(7, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2101,7 +2101,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestLEAVE) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(2);
|
|
|
|
|
EXPECT_EQ(2ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(2, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2111,7 +2111,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestLEAVE) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(2);
|
|
|
|
|
EXPECT_EQ(2ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(2, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(4, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2140,7 +2140,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestCALLNextInsn) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(5);
|
|
|
|
|
EXPECT_EQ(5ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(5, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2169,7 +2169,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestSpillRegToStackViaMOVx86_64) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(19);
|
|
|
|
|
EXPECT_EQ(19ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(19, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rbp);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
|
|
|
|
|
@@ -2207,7 +2207,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestSpillRegToStackViaMOVi386) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(12);
|
|
|
|
|
EXPECT_EQ(12ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(12, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rbp);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
|
|
|
|
|
@@ -2280,22 +2280,22 @@ TEST_F(Testx86AssemblyInspectionEngine, TestSpArithx86_64Augmented) {
|
|
|
|
|
// Before we touch the stack pointer, we should still refer to the
|
|
|
|
|
// row from after the prologue.
|
|
|
|
|
const UnwindPlan::Row *row = unwind_plan.GetRowForFunctionOffset(5);
|
|
|
|
|
EXPECT_EQ(4ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(4, row->GetOffset());
|
|
|
|
|
|
|
|
|
|
// Check the first stack pointer update.
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(12);
|
|
|
|
|
EXPECT_EQ(12ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(12, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_EQ(152, row->GetCFAValue().GetOffset());
|
|
|
|
|
|
|
|
|
|
// After the nop, we should still refer to the same row.
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(13);
|
|
|
|
|
EXPECT_EQ(12ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(12, row->GetOffset());
|
|
|
|
|
|
|
|
|
|
// Check that the second stack pointer update is reflected in the
|
|
|
|
|
// unwind plan.
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(20);
|
|
|
|
|
EXPECT_EQ(20ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(20, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
}
|
|
|
|
|
@@ -2354,7 +2354,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestSimplex86_64Augmented) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan, reg_ctx_sp));
|
|
|
|
|
|
|
|
|
|
const UnwindPlan::Row *row = unwind_plan.GetRowForFunctionOffset(6);
|
|
|
|
|
EXPECT_EQ(6ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(6, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
|
|
|
|
|
@@ -2421,7 +2421,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestSimplei386ugmented) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan, reg_ctx_sp));
|
|
|
|
|
|
|
|
|
|
const UnwindPlan::Row *row = unwind_plan.GetRowForFunctionOffset(5);
|
|
|
|
|
EXPECT_EQ(5ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(5, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_esp);
|
|
|
|
|
EXPECT_EQ(4, row->GetCFAValue().GetOffset());
|
|
|
|
|
|
|
|
|
|
@@ -2458,7 +2458,7 @@ TEST_F(Testx86AssemblyInspectionEngine, Test32BitOnlyInstruction) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(2);
|
|
|
|
|
EXPECT_EQ(2ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(2, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_esp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2473,7 +2473,7 @@ TEST_F(Testx86AssemblyInspectionEngine, Test32BitOnlyInstruction) {
|
|
|
|
|
data, sizeof(data), sample_range, unwind_plan));
|
|
|
|
|
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(2);
|
|
|
|
|
EXPECT_EQ(0ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(0, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2683,7 +2683,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestReturnDetect) {
|
|
|
|
|
|
|
|
|
|
// 0: CFA=rsp +8 => rsp=CFA+0 rip=[CFA-8]
|
|
|
|
|
const UnwindPlan::Row *row = unwind_plan.GetRowForFunctionOffset(0);
|
|
|
|
|
EXPECT_EQ(0ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(0, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2694,7 +2694,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestReturnDetect) {
|
|
|
|
|
|
|
|
|
|
// 1: CFA=rsp+16 => rbp=[CFA-16] rsp=CFA+0 rip=[CFA-8]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(1);
|
|
|
|
|
EXPECT_EQ(1ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(1, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2705,7 +2705,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestReturnDetect) {
|
|
|
|
|
|
|
|
|
|
// 4: CFA=rbp+16 => rbp=[CFA-16] rsp=CFA+0 rip=[CFA-8]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(4);
|
|
|
|
|
EXPECT_EQ(4ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(4, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rbp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2716,7 +2716,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestReturnDetect) {
|
|
|
|
|
|
|
|
|
|
// 7: CFA=rsp +8 => rsp=CFA+0 rip=[CFA-8]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(7);
|
|
|
|
|
EXPECT_EQ(7ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(7, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2727,7 +2727,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestReturnDetect) {
|
|
|
|
|
|
|
|
|
|
// 8: CFA=rbp+16 => rbp=[CFA-16] rsp=CFA+0 rip=[CFA-8]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(8);
|
|
|
|
|
EXPECT_EQ(8ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(8, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rbp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2738,7 +2738,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestReturnDetect) {
|
|
|
|
|
|
|
|
|
|
// 11: CFA=rsp +8 => rsp=CFA+0 rip=[CFA-8]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(11);
|
|
|
|
|
EXPECT_EQ(11ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(11, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2749,7 +2749,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestReturnDetect) {
|
|
|
|
|
|
|
|
|
|
// 12: CFA=rbp+16 => rbp=[CFA-16] rsp=CFA+0 rip=[CFA-8]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(12);
|
|
|
|
|
EXPECT_EQ(12ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(12, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rbp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2760,7 +2760,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestReturnDetect) {
|
|
|
|
|
|
|
|
|
|
// 15: CFA=rsp +8 => rsp=CFA+0 rip=[CFA-8]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(15);
|
|
|
|
|
EXPECT_EQ(15ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(15, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2771,7 +2771,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestReturnDetect) {
|
|
|
|
|
|
|
|
|
|
// 18: CFA=rbp+16 => rbp=[CFA-16] rsp=CFA+0 rip=[CFA-8]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(18);
|
|
|
|
|
EXPECT_EQ(18ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(18, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rbp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2782,7 +2782,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestReturnDetect) {
|
|
|
|
|
|
|
|
|
|
// 21: CFA=rsp +8 => rsp=CFA+0 rip=[CFA-8]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(21);
|
|
|
|
|
EXPECT_EQ(21ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(21, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(8, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2793,7 +2793,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestReturnDetect) {
|
|
|
|
|
|
|
|
|
|
// 24: CFA=rbp+16 => rbp=[CFA-16] rsp=CFA+0 rip=[CFA-8]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(24);
|
|
|
|
|
EXPECT_EQ(24ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(24, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rbp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(16, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2849,7 +2849,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestDisassemblyMidFunctionEpilogues) {
|
|
|
|
|
// Check that we've unwound the stack after the first mid-function epilogue
|
|
|
|
|
// row: CFA=esp +4 => esp=CFA+0 eip=[CFA-4]
|
|
|
|
|
const UnwindPlan::Row *row = unwind_plan.GetRowForFunctionOffset(16);
|
|
|
|
|
EXPECT_EQ(16ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(16, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_esp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(wordsize, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2858,7 +2858,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestDisassemblyMidFunctionEpilogues) {
|
|
|
|
|
// unwind instructions after a jmpq *%eax
|
|
|
|
|
// row: CFA=ebp +8 => esp=CFA+0 eip=[CFA-8]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(18);
|
|
|
|
|
EXPECT_EQ(18ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(18, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_ebp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(wordsize * 2, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2867,7 +2867,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestDisassemblyMidFunctionEpilogues) {
|
|
|
|
|
// unwind instructions after a mid-function retq
|
|
|
|
|
// row: CFA=ebp +8 => esp=CFA+0 eip=[CFA-8]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(28);
|
|
|
|
|
EXPECT_EQ(28ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(28, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_ebp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(wordsize * 2, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2876,7 +2876,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestDisassemblyMidFunctionEpilogues) {
|
|
|
|
|
// the stack frame has been unwound
|
|
|
|
|
// row: CFA=esp +4 => esp=CFA+0 eip=[CFA-4]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(34);
|
|
|
|
|
EXPECT_EQ(34ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(34, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_esp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(wordsize, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2890,7 +2890,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestDisassemblyMidFunctionEpilogues) {
|
|
|
|
|
// Check that we've unwound the stack after the first mid-function epilogue
|
|
|
|
|
// row: CFA=rsp +8 => rsp=CFA+0 rip=[CFA-8]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(16);
|
|
|
|
|
EXPECT_EQ(16ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(16, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(wordsize, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2899,7 +2899,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestDisassemblyMidFunctionEpilogues) {
|
|
|
|
|
// unwind instructions after a jmpq *%eax
|
|
|
|
|
// row: CFA=rbp+16 => rsp=CFA+0 rip=[CFA-16]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(18);
|
|
|
|
|
EXPECT_EQ(18ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(18, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rbp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(wordsize * 2, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2908,7 +2908,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestDisassemblyMidFunctionEpilogues) {
|
|
|
|
|
// unwind instructions after a mid-function retq
|
|
|
|
|
// row: CFA=rbp+16 => rsp=CFA+0 rip=[CFA-16]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(28);
|
|
|
|
|
EXPECT_EQ(28ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(28, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rbp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(wordsize * 2, row->GetCFAValue().GetOffset());
|
|
|
|
|
@@ -2917,7 +2917,7 @@ TEST_F(Testx86AssemblyInspectionEngine, TestDisassemblyMidFunctionEpilogues) {
|
|
|
|
|
// the stack frame has been unwound
|
|
|
|
|
// row: CFA=rsp +8 => esp=CFA+0 rip=[CFA-8]
|
|
|
|
|
row = unwind_plan.GetRowForFunctionOffset(34);
|
|
|
|
|
EXPECT_EQ(34ull, row->GetOffset());
|
|
|
|
|
EXPECT_EQ(34, row->GetOffset());
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().GetRegisterNumber() == k_rsp);
|
|
|
|
|
EXPECT_TRUE(row->GetCFAValue().IsRegisterPlusOffset() == true);
|
|
|
|
|
EXPECT_EQ(wordsize, row->GetCFAValue().GetOffset());
|
|
|
|
|
|