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