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