1*cada5b88SIgor Kudrin //===- llvm/unittest/DebugInfo/DWARFDebugFrameTest.cpp --------------------===// 2*cada5b88SIgor Kudrin // 3*cada5b88SIgor Kudrin // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*cada5b88SIgor Kudrin // See https://llvm.org/LICENSE.txt for license information. 5*cada5b88SIgor Kudrin // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*cada5b88SIgor Kudrin // 7*cada5b88SIgor Kudrin //===----------------------------------------------------------------------===// 8*cada5b88SIgor Kudrin 9*cada5b88SIgor Kudrin #include "llvm/ADT/SmallVector.h" 10*cada5b88SIgor Kudrin #include "llvm/ADT/StringRef.h" 11*cada5b88SIgor Kudrin #include "llvm/BinaryFormat/Dwarf.h" 12*cada5b88SIgor Kudrin #include "llvm/DebugInfo/DWARF/DWARFDebugFrame.h" 13*cada5b88SIgor Kudrin #include "gtest/gtest.h" 14*cada5b88SIgor Kudrin 15*cada5b88SIgor Kudrin using namespace llvm; 16*cada5b88SIgor Kudrin 17*cada5b88SIgor Kudrin namespace { 18*cada5b88SIgor Kudrin 19*cada5b88SIgor Kudrin dwarf::CIE createCIE(bool IsDWARF64, uint64_t Offset, uint64_t Length) { 20*cada5b88SIgor Kudrin return dwarf::CIE(IsDWARF64, Offset, Length, 21*cada5b88SIgor Kudrin /*Version=*/3, 22*cada5b88SIgor Kudrin /*Augmentation=*/StringRef(), 23*cada5b88SIgor Kudrin /*AddressSize=*/8, 24*cada5b88SIgor Kudrin /*SegmentDescriptorSize=*/0, 25*cada5b88SIgor Kudrin /*CodeAlignmentFactor=*/1, 26*cada5b88SIgor Kudrin /*DataAlignmentFactor=*/-8, 27*cada5b88SIgor Kudrin /*ReturnAddressRegister=*/16, 28*cada5b88SIgor Kudrin /*AugmentationData=*/StringRef(), 29*cada5b88SIgor Kudrin /*FDEPointerEncoding=*/dwarf::DW_EH_PE_absptr, 30*cada5b88SIgor Kudrin /*LSDAPointerEncoding=*/dwarf::DW_EH_PE_omit, 31*cada5b88SIgor Kudrin /*Personality=*/None, 32*cada5b88SIgor Kudrin /*PersonalityEnc=*/None, 33*cada5b88SIgor Kudrin /*Arch=*/Triple::x86_64); 34*cada5b88SIgor Kudrin } 35*cada5b88SIgor Kudrin 36*cada5b88SIgor Kudrin void expectDumpResult(const dwarf::CIE &TestCIE, bool IsEH, 37*cada5b88SIgor Kudrin StringRef ExpectedFirstLine) { 38*cada5b88SIgor Kudrin std::string Output; 39*cada5b88SIgor Kudrin raw_string_ostream OS(Output); 40*cada5b88SIgor Kudrin TestCIE.dump(OS, /*MRI=*/nullptr, IsEH); 41*cada5b88SIgor Kudrin OS.flush(); 42*cada5b88SIgor Kudrin StringRef FirstLine = StringRef(Output).split('\n').first; 43*cada5b88SIgor Kudrin EXPECT_EQ(FirstLine, ExpectedFirstLine); 44*cada5b88SIgor Kudrin } 45*cada5b88SIgor Kudrin 46*cada5b88SIgor Kudrin void expectDumpResult(const dwarf::FDE &TestFDE, bool IsEH, 47*cada5b88SIgor Kudrin StringRef ExpectedFirstLine) { 48*cada5b88SIgor Kudrin std::string Output; 49*cada5b88SIgor Kudrin raw_string_ostream OS(Output); 50*cada5b88SIgor Kudrin TestFDE.dump(OS, /*MRI=*/nullptr, IsEH); 51*cada5b88SIgor Kudrin OS.flush(); 52*cada5b88SIgor Kudrin StringRef FirstLine = StringRef(Output).split('\n').first; 53*cada5b88SIgor Kudrin EXPECT_EQ(FirstLine, ExpectedFirstLine); 54*cada5b88SIgor Kudrin } 55*cada5b88SIgor Kudrin 56*cada5b88SIgor Kudrin TEST(DWARFDebugFrame, DumpDWARF32CIE) { 57*cada5b88SIgor Kudrin dwarf::CIE TestCIE = createCIE(/*IsDWARF64=*/false, 58*cada5b88SIgor Kudrin /*Offset=*/0x1111abcd, 59*cada5b88SIgor Kudrin /*Length=*/0x2222abcd); 60*cada5b88SIgor Kudrin expectDumpResult(TestCIE, /*IsEH=*/false, "1111abcd 2222abcd ffffffff CIE"); 61*cada5b88SIgor Kudrin } 62*cada5b88SIgor Kudrin 63*cada5b88SIgor Kudrin TEST(DWARFDebugFrame, DumpDWARF64CIE) { 64*cada5b88SIgor Kudrin dwarf::CIE TestCIE = createCIE(/*IsDWARF64=*/true, 65*cada5b88SIgor Kudrin /*Offset=*/0x1111abcdabcd, 66*cada5b88SIgor Kudrin /*Length=*/0x2222abcdabcd); 67*cada5b88SIgor Kudrin expectDumpResult(TestCIE, /*IsEH=*/false, 68*cada5b88SIgor Kudrin "1111abcdabcd 00002222abcdabcd ffffffffffffffff CIE"); 69*cada5b88SIgor Kudrin } 70*cada5b88SIgor Kudrin 71*cada5b88SIgor Kudrin TEST(DWARFDebugFrame, DumpEHCIE) { 72*cada5b88SIgor Kudrin dwarf::CIE TestCIE = createCIE(/*IsDWARF64=*/false, 73*cada5b88SIgor Kudrin /*Offset=*/0x1000, 74*cada5b88SIgor Kudrin /*Length=*/0x20); 75*cada5b88SIgor Kudrin expectDumpResult(TestCIE, /*IsEH=*/true, "00001000 00000020 00000000 CIE"); 76*cada5b88SIgor Kudrin } 77*cada5b88SIgor Kudrin 78*cada5b88SIgor Kudrin TEST(DWARFDebugFrame, DumpEH64CIE) { 79*cada5b88SIgor Kudrin dwarf::CIE TestCIE = createCIE(/*IsDWARF64=*/true, 80*cada5b88SIgor Kudrin /*Offset=*/0x1000, 81*cada5b88SIgor Kudrin /*Length=*/0x20); 82*cada5b88SIgor Kudrin expectDumpResult(TestCIE, /*IsEH=*/true, 83*cada5b88SIgor Kudrin "00001000 0000000000000020 00000000 CIE"); 84*cada5b88SIgor Kudrin } 85*cada5b88SIgor Kudrin 86*cada5b88SIgor Kudrin TEST(DWARFDebugFrame, DumpDWARF64FDE) { 87*cada5b88SIgor Kudrin dwarf::CIE TestCIE = createCIE(/*IsDWARF64=*/true, 88*cada5b88SIgor Kudrin /*Offset=*/0x1111abcdabcd, 89*cada5b88SIgor Kudrin /*Length=*/0x2222abcdabcd); 90*cada5b88SIgor Kudrin dwarf::FDE TestFDE(/*IsDWARF64=*/true, 91*cada5b88SIgor Kudrin /*Offset=*/0x3333abcdabcd, 92*cada5b88SIgor Kudrin /*Length=*/0x4444abcdabcd, 93*cada5b88SIgor Kudrin /*CIEPointer=*/0x1111abcdabcd, 94*cada5b88SIgor Kudrin /*InitialLocation=*/0x5555abcdabcd, 95*cada5b88SIgor Kudrin /*AddressRange=*/0x111111111111, 96*cada5b88SIgor Kudrin /*Cie=*/&TestCIE, 97*cada5b88SIgor Kudrin /*LSDAAddress=*/None, 98*cada5b88SIgor Kudrin /*Arch=*/Triple::x86_64); 99*cada5b88SIgor Kudrin expectDumpResult(TestFDE, /*IsEH=*/false, 100*cada5b88SIgor Kudrin "3333abcdabcd 00004444abcdabcd 00001111abcdabcd FDE " 101*cada5b88SIgor Kudrin "cie=1111abcdabcd pc=5555abcdabcd...6666bcdebcde"); 102*cada5b88SIgor Kudrin } 103*cada5b88SIgor Kudrin 104*cada5b88SIgor Kudrin TEST(DWARFDebugFrame, DumpEH64FDE) { 105*cada5b88SIgor Kudrin dwarf::CIE TestCIE = createCIE(/*IsDWARF64=*/true, 106*cada5b88SIgor Kudrin /*Offset=*/0x1111ab9a000c, 107*cada5b88SIgor Kudrin /*Length=*/0x20); 108*cada5b88SIgor Kudrin dwarf::FDE TestFDE(/*IsDWARF64=*/true, 109*cada5b88SIgor Kudrin /*Offset=*/0x1111abcdabcd, 110*cada5b88SIgor Kudrin /*Length=*/0x2222abcdabcd, 111*cada5b88SIgor Kudrin /*CIEPointer=*/0x33abcd, 112*cada5b88SIgor Kudrin /*InitialLocation=*/0x4444abcdabcd, 113*cada5b88SIgor Kudrin /*AddressRange=*/0x111111111111, 114*cada5b88SIgor Kudrin /*Cie=*/&TestCIE, 115*cada5b88SIgor Kudrin /*LSDAAddress=*/None, 116*cada5b88SIgor Kudrin /*Arch=*/Triple::x86_64); 117*cada5b88SIgor Kudrin expectDumpResult(TestFDE, /*IsEH=*/true, 118*cada5b88SIgor Kudrin "1111abcdabcd 00002222abcdabcd 0033abcd FDE " 119*cada5b88SIgor Kudrin "cie=1111ab9a000c pc=4444abcdabcd...5555bcdebcde"); 120*cada5b88SIgor Kudrin } 121*cada5b88SIgor Kudrin 122*cada5b88SIgor Kudrin } // end anonymous namespace 123