brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.0 KiB · ab7b0fe Raw
119 lines · cpp
1//===- SFrameTest.cpp -----------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/BinaryFormat/SFrame.h"10#include "gtest/gtest.h"11#include <type_traits>12 13using namespace llvm;14using namespace llvm::sframe;15 16namespace {17 18template <typename EndianT> class SFrameTest : public testing::Test {19protected:20  static constexpr endianness Endian = EndianT::value;21 22  // Test structure sizes and triviality.23  static_assert(std::is_trivial_v<Preamble<Endian>>);24  static_assert(sizeof(Preamble<Endian>) == 4);25 26  static_assert(std::is_trivial_v<Header<Endian>>);27  static_assert(sizeof(Header<Endian>) == 28);28 29  static_assert(std::is_trivial_v<FuncDescEntry<Endian>>);30  static_assert(sizeof(FuncDescEntry<Endian>) == 20);31 32  static_assert(std::is_trivial_v<FrameRowEntryAddr1<Endian>>);33  static_assert(sizeof(FrameRowEntryAddr1<Endian>) == 2);34 35  static_assert(std::is_trivial_v<FrameRowEntryAddr2<Endian>>);36  static_assert(sizeof(FrameRowEntryAddr2<Endian>) == 3);37 38  static_assert(std::is_trivial_v<FrameRowEntryAddr4<Endian>>);39  static_assert(sizeof(FrameRowEntryAddr4<Endian>) == 5);40};41 42struct NameGenerator {43  template <typename T> static constexpr const char *GetName(int) {44    if constexpr (T::value == endianness::little)45      return "little";46    if constexpr (T::value == endianness::big)47      return "big";48  }49};50using Types =51    testing::Types<std::integral_constant<endianness, endianness::little>,52                   std::integral_constant<endianness, endianness::big>>;53TYPED_TEST_SUITE(SFrameTest, Types, NameGenerator);54 55TYPED_TEST(SFrameTest, FDEFlags) {56  FuncDescEntry<TestFixture::Endian> FDE = {};57  EXPECT_EQ(FDE.Info.Info, 0u);58  EXPECT_EQ(FDE.Info.getPAuthKey(), 0);59  EXPECT_EQ(FDE.Info.getFDEType(), FDEType::PCInc);60  EXPECT_EQ(FDE.Info.getFREType(), FREType::Addr1);61 62  FDE.Info.setPAuthKey(1);63  EXPECT_EQ(FDE.Info.Info, 0x20u);64  EXPECT_EQ(FDE.Info.getPAuthKey(), 1);65  EXPECT_EQ(FDE.Info.getFDEType(), FDEType::PCInc);66  EXPECT_EQ(FDE.Info.getFREType(), FREType::Addr1);67 68  FDE.Info.setFDEType(FDEType::PCMask);69  EXPECT_EQ(FDE.Info.Info, 0x30u);70  EXPECT_EQ(FDE.Info.getPAuthKey(), 1);71  EXPECT_EQ(FDE.Info.getFDEType(), FDEType::PCMask);72  EXPECT_EQ(FDE.Info.getFREType(), FREType::Addr1);73 74  FDE.Info.setFREType(FREType::Addr4);75  EXPECT_EQ(FDE.Info.Info, 0x32u);76  EXPECT_EQ(FDE.Info.getPAuthKey(), 1);77  EXPECT_EQ(FDE.Info.getFDEType(), FDEType::PCMask);78  EXPECT_EQ(FDE.Info.getFREType(), FREType::Addr4);79}80 81TYPED_TEST(SFrameTest, FREFlags) {82  FREInfo<TestFixture::Endian> Info = {};83  EXPECT_EQ(Info.Info, 0u);84  EXPECT_FALSE(Info.isReturnAddressSigned());85  EXPECT_EQ(Info.getOffsetSize(), FREOffset::B1);86  EXPECT_EQ(Info.getOffsetCount(), 0u);87  EXPECT_EQ(Info.getBaseRegister(), BaseReg::FP);88 89  Info.setReturnAddressSigned(true);90  EXPECT_EQ(Info.Info, 0x80u);91  EXPECT_TRUE(Info.isReturnAddressSigned());92  EXPECT_EQ(Info.getOffsetSize(), FREOffset::B1);93  EXPECT_EQ(Info.getOffsetCount(), 0u);94  EXPECT_EQ(Info.getBaseRegister(), BaseReg::FP);95 96  Info.setOffsetSize(FREOffset::B4);97  EXPECT_EQ(Info.Info, 0xc0u);98  EXPECT_TRUE(Info.isReturnAddressSigned());99  EXPECT_EQ(Info.getOffsetSize(), FREOffset::B4);100  EXPECT_EQ(Info.getOffsetCount(), 0u);101  EXPECT_EQ(Info.getBaseRegister(), BaseReg::FP);102 103  Info.setOffsetCount(3);104  EXPECT_EQ(Info.Info, 0xc6u);105  EXPECT_TRUE(Info.isReturnAddressSigned());106  EXPECT_EQ(Info.getOffsetSize(), FREOffset::B4);107  EXPECT_EQ(Info.getOffsetCount(), 3u);108  EXPECT_EQ(Info.getBaseRegister(), BaseReg::FP);109 110  Info.setBaseRegister(BaseReg::SP);111  EXPECT_EQ(Info.Info, 0xc7u);112  EXPECT_TRUE(Info.isReturnAddressSigned());113  EXPECT_EQ(Info.getOffsetSize(), FREOffset::B4);114  EXPECT_EQ(Info.getOffsetCount(), 3u);115  EXPECT_EQ(Info.getBaseRegister(), BaseReg::SP);116}117 118} // namespace119