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