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