brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · 2d7ef43 Raw
87 lines · cpp
1//===-- UnwindPlanTest.cpp ------------------------------------------------===//2//3//4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5// See https://llvm.org/LICENSE.txt for license information.6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7//8//===----------------------------------------------------------------------===//9 10#include "lldb/Symbol/UnwindPlan.h"11#include "gmock/gmock.h"12#include "gtest/gtest.h"13 14using namespace lldb_private;15using namespace lldb;16 17static UnwindPlan::Row make_simple_row(addr_t offset, uint64_t cfa_value) {18  UnwindPlan::Row row;19  row.SetOffset(offset);20  row.GetCFAValue().SetIsConstant(cfa_value);21  return row;22}23 24TEST(UnwindPlan, InsertRow) {25  UnwindPlan::Row row1 = make_simple_row(0, 42);26  UnwindPlan::Row row2 = make_simple_row(0, 47);27  UnwindPlan::Row row3 = make_simple_row(-1, 4242);28 29  UnwindPlan plan(eRegisterKindGeneric);30  plan.InsertRow(row1);31  EXPECT_THAT(plan.GetRowForFunctionOffset(0), testing::Pointee(row1));32 33  plan.InsertRow(row2, /*replace_existing=*/false);34  EXPECT_THAT(plan.GetRowForFunctionOffset(0), testing::Pointee(row1));35 36  plan.InsertRow(row2, /*replace_existing=*/true);37  EXPECT_THAT(plan.GetRowForFunctionOffset(0), testing::Pointee(row2));38 39  EXPECT_THAT(plan.GetRowForFunctionOffset(-1), nullptr);40  plan.InsertRow(row3);41  EXPECT_THAT(plan.GetRowForFunctionOffset(-1), testing::Pointee(row3));42}43 44TEST(UnwindPlan, GetRowForFunctionOffset) {45  UnwindPlan::Row row1 = make_simple_row(10, 42);46  UnwindPlan::Row row2 = make_simple_row(20, 47);47 48  UnwindPlan plan(eRegisterKindGeneric);49  plan.InsertRow(row1);50  plan.InsertRow(row2);51 52  EXPECT_THAT(plan.GetRowForFunctionOffset(0), nullptr);53  EXPECT_THAT(plan.GetRowForFunctionOffset(9), nullptr);54  EXPECT_THAT(plan.GetRowForFunctionOffset(10), testing::Pointee(row1));55  EXPECT_THAT(plan.GetRowForFunctionOffset(19), testing::Pointee(row1));56  EXPECT_THAT(plan.GetRowForFunctionOffset(20), testing::Pointee(row2));57  EXPECT_THAT(plan.GetRowForFunctionOffset(99), testing::Pointee(row2));58}59 60TEST(UnwindPlan, PlanValidAtAddress) {61  UnwindPlan::Row row1 = make_simple_row(0, 42);62  UnwindPlan::Row row2 = make_simple_row(10, 47);63 64  UnwindPlan plan(eRegisterKindGeneric);65  // When valid address range is not set, plans are valid as long as they have a66  // row that sets the CFA.67  EXPECT_FALSE(plan.PlanValidAtAddress(Address(0)));68  EXPECT_FALSE(plan.PlanValidAtAddress(Address(10)));69 70  plan.InsertRow(row2);71  EXPECT_TRUE(plan.PlanValidAtAddress(Address(0)));72  EXPECT_TRUE(plan.PlanValidAtAddress(Address(10)));73 74  plan.InsertRow(row1);75  EXPECT_TRUE(plan.PlanValidAtAddress(Address(0)));76  EXPECT_TRUE(plan.PlanValidAtAddress(Address(10)));77 78  // With an address range, they're only valid within that range.79  plan.SetPlanValidAddressRanges({AddressRange(0, 5), AddressRange(15, 5)});80  EXPECT_TRUE(plan.PlanValidAtAddress(Address(0)));81  EXPECT_FALSE(plan.PlanValidAtAddress(Address(5)));82  EXPECT_FALSE(plan.PlanValidAtAddress(Address(10)));83  EXPECT_TRUE(plan.PlanValidAtAddress(Address(15)));84  EXPECT_FALSE(plan.PlanValidAtAddress(Address(20)));85  EXPECT_FALSE(plan.PlanValidAtAddress(Address(25)));86}87