xref: /aosp_15_r20/external/google-breakpad/src/common/dwarf/dwarf2diehandler_unittest.cc (revision 9712c20fc9bbfbac4935993a2ca0b3958c5adad2)
1*9712c20fSFrederick Mayle // -*- mode: c++ -*-
2*9712c20fSFrederick Mayle 
3*9712c20fSFrederick Mayle // Copyright 2010 Google LLC
4*9712c20fSFrederick Mayle //
5*9712c20fSFrederick Mayle // Redistribution and use in source and binary forms, with or without
6*9712c20fSFrederick Mayle // modification, are permitted provided that the following conditions are
7*9712c20fSFrederick Mayle // met:
8*9712c20fSFrederick Mayle //
9*9712c20fSFrederick Mayle //     * Redistributions of source code must retain the above copyright
10*9712c20fSFrederick Mayle // notice, this list of conditions and the following disclaimer.
11*9712c20fSFrederick Mayle //     * Redistributions in binary form must reproduce the above
12*9712c20fSFrederick Mayle // copyright notice, this list of conditions and the following disclaimer
13*9712c20fSFrederick Mayle // in the documentation and/or other materials provided with the
14*9712c20fSFrederick Mayle // distribution.
15*9712c20fSFrederick Mayle //     * Neither the name of Google LLC nor the names of its
16*9712c20fSFrederick Mayle // contributors may be used to endorse or promote products derived from
17*9712c20fSFrederick Mayle // this software without specific prior written permission.
18*9712c20fSFrederick Mayle //
19*9712c20fSFrederick Mayle // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20*9712c20fSFrederick Mayle // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21*9712c20fSFrederick Mayle // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22*9712c20fSFrederick Mayle // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23*9712c20fSFrederick Mayle // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24*9712c20fSFrederick Mayle // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25*9712c20fSFrederick Mayle // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26*9712c20fSFrederick Mayle // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27*9712c20fSFrederick Mayle // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28*9712c20fSFrederick Mayle // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29*9712c20fSFrederick Mayle // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*9712c20fSFrederick Mayle 
31*9712c20fSFrederick Mayle // Original author: Jim Blandy <[email protected]> <[email protected]>
32*9712c20fSFrederick Mayle 
33*9712c20fSFrederick Mayle // dwarf2diehander_unittest.cc: Unit tests for google_breakpad::DIEDispatcher.
34*9712c20fSFrederick Mayle 
35*9712c20fSFrederick Mayle #ifdef HAVE_CONFIG_H
36*9712c20fSFrederick Mayle #include <config.h>  // Must come first
37*9712c20fSFrederick Mayle #endif
38*9712c20fSFrederick Mayle 
39*9712c20fSFrederick Mayle #include <stdint.h>
40*9712c20fSFrederick Mayle 
41*9712c20fSFrederick Mayle #include <string>
42*9712c20fSFrederick Mayle #include <utility>
43*9712c20fSFrederick Mayle 
44*9712c20fSFrederick Mayle #include "breakpad_googletest_includes.h"
45*9712c20fSFrederick Mayle 
46*9712c20fSFrederick Mayle #include "common/dwarf/dwarf2diehandler.h"
47*9712c20fSFrederick Mayle #include "common/using_std_string.h"
48*9712c20fSFrederick Mayle 
49*9712c20fSFrederick Mayle using std::make_pair;
50*9712c20fSFrederick Mayle 
51*9712c20fSFrederick Mayle using ::testing::_;
52*9712c20fSFrederick Mayle using ::testing::ContainerEq;
53*9712c20fSFrederick Mayle using ::testing::ElementsAreArray;
54*9712c20fSFrederick Mayle using ::testing::Eq;
55*9712c20fSFrederick Mayle using ::testing::InSequence;
56*9712c20fSFrederick Mayle using ::testing::Return;
57*9712c20fSFrederick Mayle using ::testing::Sequence;
58*9712c20fSFrederick Mayle using ::testing::StrEq;
59*9712c20fSFrederick Mayle 
60*9712c20fSFrederick Mayle using google_breakpad::DIEDispatcher;
61*9712c20fSFrederick Mayle using google_breakpad::DIEHandler;
62*9712c20fSFrederick Mayle using google_breakpad::DwarfAttribute;
63*9712c20fSFrederick Mayle using google_breakpad::DwarfForm;
64*9712c20fSFrederick Mayle using google_breakpad::DwarfTag;
65*9712c20fSFrederick Mayle using google_breakpad::RootDIEHandler;
66*9712c20fSFrederick Mayle 
67*9712c20fSFrederick Mayle class MockDIEHandler: public DIEHandler {
68*9712c20fSFrederick Mayle  public:
69*9712c20fSFrederick Mayle   MOCK_METHOD3(ProcessAttributeUnsigned,
70*9712c20fSFrederick Mayle                void(DwarfAttribute, DwarfForm, uint64_t));
71*9712c20fSFrederick Mayle   MOCK_METHOD3(ProcessAttributeSigned,
72*9712c20fSFrederick Mayle                void(DwarfAttribute, DwarfForm, int64_t));
73*9712c20fSFrederick Mayle   MOCK_METHOD3(ProcessAttributeReference,
74*9712c20fSFrederick Mayle                void(DwarfAttribute, DwarfForm, uint64_t));
75*9712c20fSFrederick Mayle   MOCK_METHOD4(ProcessAttributeBuffer,
76*9712c20fSFrederick Mayle                void(DwarfAttribute, DwarfForm, const uint8_t*, uint64_t));
77*9712c20fSFrederick Mayle   MOCK_METHOD3(ProcessAttributeString,
78*9712c20fSFrederick Mayle                void(DwarfAttribute, DwarfForm, const string&));
79*9712c20fSFrederick Mayle   MOCK_METHOD3(ProcessAttributeSignature,
80*9712c20fSFrederick Mayle                void(DwarfAttribute, DwarfForm, uint64_t));
81*9712c20fSFrederick Mayle   MOCK_METHOD0(EndAttributes, bool());
82*9712c20fSFrederick Mayle   MOCK_METHOD2(FindChildHandler, DIEHandler *(uint64_t, DwarfTag));
83*9712c20fSFrederick Mayle   MOCK_METHOD0(Finish, void());
84*9712c20fSFrederick Mayle };
85*9712c20fSFrederick Mayle 
86*9712c20fSFrederick Mayle class MockRootDIEHandler: public RootDIEHandler {
87*9712c20fSFrederick Mayle  public:
88*9712c20fSFrederick Mayle   MOCK_METHOD3(ProcessAttributeUnsigned,
89*9712c20fSFrederick Mayle                void(DwarfAttribute, DwarfForm, uint64_t));
90*9712c20fSFrederick Mayle   MOCK_METHOD3(ProcessAttributeSigned,
91*9712c20fSFrederick Mayle                void(DwarfAttribute, DwarfForm, int64_t));
92*9712c20fSFrederick Mayle   MOCK_METHOD3(ProcessAttributeReference,
93*9712c20fSFrederick Mayle                void(DwarfAttribute, DwarfForm, uint64_t));
94*9712c20fSFrederick Mayle   MOCK_METHOD4(ProcessAttributeBuffer,
95*9712c20fSFrederick Mayle                void(DwarfAttribute, DwarfForm, const uint8_t*, uint64_t));
96*9712c20fSFrederick Mayle   MOCK_METHOD3(ProcessAttributeString,
97*9712c20fSFrederick Mayle                void(DwarfAttribute, DwarfForm, const string&));
98*9712c20fSFrederick Mayle   MOCK_METHOD3(ProcessAttributeSignature,
99*9712c20fSFrederick Mayle                void(DwarfAttribute, DwarfForm, uint64_t));
100*9712c20fSFrederick Mayle   MOCK_METHOD0(EndAttributes, bool());
101*9712c20fSFrederick Mayle   MOCK_METHOD2(FindChildHandler, DIEHandler *(uint64_t, DwarfTag));
102*9712c20fSFrederick Mayle   MOCK_METHOD0(Finish, void());
103*9712c20fSFrederick Mayle   MOCK_METHOD5(StartCompilationUnit, bool(uint64_t, uint8_t, uint8_t, uint64_t,
104*9712c20fSFrederick Mayle                                           uint8_t));
105*9712c20fSFrederick Mayle   MOCK_METHOD2(StartRootDIE, bool(uint64_t, DwarfTag));
106*9712c20fSFrederick Mayle };
107*9712c20fSFrederick Mayle 
108*9712c20fSFrederick Mayle // If the handler elects to skip the compilation unit, the dispatcher
109*9712c20fSFrederick Mayle // should tell the reader so.
TEST(Dwarf2DIEHandler,SkipCompilationUnit)110*9712c20fSFrederick Mayle TEST(Dwarf2DIEHandler, SkipCompilationUnit) {
111*9712c20fSFrederick Mayle   Sequence s;
112*9712c20fSFrederick Mayle   MockRootDIEHandler mock_root_handler;
113*9712c20fSFrederick Mayle   DIEDispatcher die_dispatcher(&mock_root_handler);
114*9712c20fSFrederick Mayle 
115*9712c20fSFrederick Mayle   EXPECT_CALL(mock_root_handler,
116*9712c20fSFrederick Mayle               StartCompilationUnit(0x8d42aed77cfccf3eLL,
117*9712c20fSFrederick Mayle                                    0x89, 0xdc,
118*9712c20fSFrederick Mayle                                    0x2ecb4dc778a80f21LL,
119*9712c20fSFrederick Mayle                                    0x66))
120*9712c20fSFrederick Mayle       .InSequence(s)
121*9712c20fSFrederick Mayle       .WillOnce(Return(false));
122*9712c20fSFrederick Mayle 
123*9712c20fSFrederick Mayle   EXPECT_FALSE(die_dispatcher.StartCompilationUnit(0x8d42aed77cfccf3eLL,
124*9712c20fSFrederick Mayle                                                    0x89, 0xdc,
125*9712c20fSFrederick Mayle                                                    0x2ecb4dc778a80f21LL,
126*9712c20fSFrederick Mayle                                                    0x66));
127*9712c20fSFrederick Mayle }
128*9712c20fSFrederick Mayle 
129*9712c20fSFrederick Mayle // If the handler elects to skip the root DIE, the dispatcher should
130*9712c20fSFrederick Mayle // tell the reader so.
TEST(Dwarf2DIEHandler,SkipRootDIE)131*9712c20fSFrederick Mayle TEST(Dwarf2DIEHandler, SkipRootDIE) {
132*9712c20fSFrederick Mayle   Sequence s;
133*9712c20fSFrederick Mayle   MockRootDIEHandler mock_root_handler;
134*9712c20fSFrederick Mayle   DIEDispatcher die_dispatcher(&mock_root_handler);
135*9712c20fSFrederick Mayle 
136*9712c20fSFrederick Mayle   EXPECT_CALL(mock_root_handler,
137*9712c20fSFrederick Mayle               StartCompilationUnit(0xde8994029fc8b999LL, 0xf4, 0x02,
138*9712c20fSFrederick Mayle                                    0xb00febffa76e2b2bLL, 0x5c))
139*9712c20fSFrederick Mayle       .InSequence(s)
140*9712c20fSFrederick Mayle       .WillOnce(Return(true));
141*9712c20fSFrederick Mayle   EXPECT_CALL(mock_root_handler,
142*9712c20fSFrederick Mayle               StartRootDIE(0x7d08242b4b510cf2LL, (DwarfTag) 0xb4f98da6))
143*9712c20fSFrederick Mayle       .InSequence(s)
144*9712c20fSFrederick Mayle       .WillOnce(Return(false));
145*9712c20fSFrederick Mayle 
146*9712c20fSFrederick Mayle   EXPECT_TRUE(die_dispatcher.StartCompilationUnit(0xde8994029fc8b999LL,
147*9712c20fSFrederick Mayle                                                   0xf4, 0x02,
148*9712c20fSFrederick Mayle                                                   0xb00febffa76e2b2bLL, 0x5c));
149*9712c20fSFrederick Mayle   EXPECT_FALSE(die_dispatcher.StartDIE(0x7d08242b4b510cf2LL,
150*9712c20fSFrederick Mayle                                        (DwarfTag) 0xb4f98da6));
151*9712c20fSFrederick Mayle   die_dispatcher.EndDIE(0x7d08242b4b510cf2LL);
152*9712c20fSFrederick Mayle }
153*9712c20fSFrederick Mayle 
154*9712c20fSFrederick Mayle // If the handler elects to skip the root DIE's children, the
155*9712c20fSFrederick Mayle // dispatcher should tell the reader so --- and avoid deleting the
156*9712c20fSFrederick Mayle // root handler.
TEST(Dwarf2DIEHandler,SkipRootDIEChildren)157*9712c20fSFrederick Mayle TEST(Dwarf2DIEHandler, SkipRootDIEChildren) {
158*9712c20fSFrederick Mayle   MockRootDIEHandler mock_root_handler;
159*9712c20fSFrederick Mayle   DIEDispatcher die_dispatcher(&mock_root_handler);
160*9712c20fSFrederick Mayle 
161*9712c20fSFrederick Mayle   {
162*9712c20fSFrederick Mayle     InSequence s;
163*9712c20fSFrederick Mayle 
164*9712c20fSFrederick Mayle     EXPECT_CALL(mock_root_handler,
165*9712c20fSFrederick Mayle                 StartCompilationUnit(0x15d6897480cc65a7LL, 0x26, 0xa0,
166*9712c20fSFrederick Mayle                                      0x09f8bf0767f91675LL, 0xdb))
167*9712c20fSFrederick Mayle       .WillOnce(Return(true));
168*9712c20fSFrederick Mayle     EXPECT_CALL(mock_root_handler,
169*9712c20fSFrederick Mayle                 StartRootDIE(0x7d08242b4b510cf2LL, (DwarfTag) 0xb4f98da6))
170*9712c20fSFrederick Mayle       .WillOnce(Return(true));
171*9712c20fSFrederick Mayle     // Please don't tell me about my children.
172*9712c20fSFrederick Mayle     EXPECT_CALL(mock_root_handler, EndAttributes())
173*9712c20fSFrederick Mayle       .WillOnce(Return(false));
174*9712c20fSFrederick Mayle     EXPECT_CALL(mock_root_handler, Finish())
175*9712c20fSFrederick Mayle       .WillOnce(Return());
176*9712c20fSFrederick Mayle   }
177*9712c20fSFrederick Mayle 
178*9712c20fSFrederick Mayle   EXPECT_TRUE(die_dispatcher.StartCompilationUnit(0x15d6897480cc65a7LL,
179*9712c20fSFrederick Mayle                                                   0x26, 0xa0,
180*9712c20fSFrederick Mayle                                                   0x09f8bf0767f91675LL, 0xdb));
181*9712c20fSFrederick Mayle   EXPECT_TRUE(die_dispatcher.StartDIE(0x7d08242b4b510cf2LL,
182*9712c20fSFrederick Mayle                                       (DwarfTag) 0xb4f98da6));
183*9712c20fSFrederick Mayle   EXPECT_FALSE(die_dispatcher.StartDIE(0x435150ceedccda18LL,
184*9712c20fSFrederick Mayle                                        (DwarfTag) 0xc3a17bba));
185*9712c20fSFrederick Mayle   die_dispatcher.EndDIE(0x435150ceedccda18LL);
186*9712c20fSFrederick Mayle   die_dispatcher.EndDIE(0x7d08242b4b510cf2LL);
187*9712c20fSFrederick Mayle }
188*9712c20fSFrederick Mayle 
189*9712c20fSFrederick Mayle // The dispatcher should pass attribute values through to the die
190*9712c20fSFrederick Mayle // handler accurately.
TEST(Dwarf2DIEHandler,PassAttributeValues)191*9712c20fSFrederick Mayle TEST(Dwarf2DIEHandler, PassAttributeValues) {
192*9712c20fSFrederick Mayle   MockRootDIEHandler mock_root_handler;
193*9712c20fSFrederick Mayle   DIEDispatcher die_dispatcher(&mock_root_handler);
194*9712c20fSFrederick Mayle 
195*9712c20fSFrederick Mayle   const uint8_t buffer[10] = {
196*9712c20fSFrederick Mayle     0x24, 0x24, 0x35, 0x9a, 0xca, 0xcf, 0xa8, 0x84, 0xa7, 0x18
197*9712c20fSFrederick Mayle   };
198*9712c20fSFrederick Mayle   string str = "\xc8\x26\x2e\x0d\xa4\x9c\x37\xd6\xfb\x1d";
199*9712c20fSFrederick Mayle 
200*9712c20fSFrederick Mayle   // Set expectations.
201*9712c20fSFrederick Mayle   {
202*9712c20fSFrederick Mayle     InSequence s;
203*9712c20fSFrederick Mayle 
204*9712c20fSFrederick Mayle     // We'll like the compilation unit header.
205*9712c20fSFrederick Mayle     EXPECT_CALL(mock_root_handler,
206*9712c20fSFrederick Mayle                 StartCompilationUnit(0x8d42aed77cfccf3eLL, 0x89, 0xdc,
207*9712c20fSFrederick Mayle                                      0x2ecb4dc778a80f21LL, 0x66))
208*9712c20fSFrederick Mayle       .WillOnce(Return(true));
209*9712c20fSFrederick Mayle 
210*9712c20fSFrederick Mayle     // We'll like the root DIE.
211*9712c20fSFrederick Mayle     EXPECT_CALL(mock_root_handler,
212*9712c20fSFrederick Mayle                 StartRootDIE(0xe2222da01e29f2a9LL, (DwarfTag) 0x9829445c))
213*9712c20fSFrederick Mayle       .WillOnce(Return(true));
214*9712c20fSFrederick Mayle 
215*9712c20fSFrederick Mayle     // Expect some attribute values.
216*9712c20fSFrederick Mayle     EXPECT_CALL(mock_root_handler,
217*9712c20fSFrederick Mayle                 ProcessAttributeUnsigned((DwarfAttribute) 0x1cc0bfed,
218*9712c20fSFrederick Mayle                                          (DwarfForm) 0x424f1468,
219*9712c20fSFrederick Mayle                                          0xa592571997facda1ULL))
220*9712c20fSFrederick Mayle       .WillOnce(Return());
221*9712c20fSFrederick Mayle     EXPECT_CALL(mock_root_handler,
222*9712c20fSFrederick Mayle                 ProcessAttributeSigned((DwarfAttribute) 0x43694dc9,
223*9712c20fSFrederick Mayle                                        (DwarfForm) 0xf6f78901L,
224*9712c20fSFrederick Mayle                                        0x92602a4e3bf1f446LL))
225*9712c20fSFrederick Mayle       .WillOnce(Return());
226*9712c20fSFrederick Mayle     EXPECT_CALL(mock_root_handler,
227*9712c20fSFrederick Mayle                 ProcessAttributeReference((DwarfAttribute) 0x4033e8cL,
228*9712c20fSFrederick Mayle                                           (DwarfForm) 0xf66fbe0bL,
229*9712c20fSFrederick Mayle                                           0x50fddef44734fdecULL))
230*9712c20fSFrederick Mayle       .WillOnce(Return());
231*9712c20fSFrederick Mayle     EXPECT_CALL(mock_root_handler,
232*9712c20fSFrederick Mayle                 ProcessAttributeBuffer((DwarfAttribute) 0x25d7e0af,
233*9712c20fSFrederick Mayle                                        (DwarfForm) 0xe99a539a,
234*9712c20fSFrederick Mayle                                        buffer, sizeof(buffer)))
235*9712c20fSFrederick Mayle       .WillOnce(Return());
236*9712c20fSFrederick Mayle     EXPECT_CALL(mock_root_handler,
237*9712c20fSFrederick Mayle                 ProcessAttributeString((DwarfAttribute) 0x310ed065,
238*9712c20fSFrederick Mayle                                        (DwarfForm) 0x15762fec,
239*9712c20fSFrederick Mayle                                        StrEq(str)))
240*9712c20fSFrederick Mayle       .WillOnce(Return());
241*9712c20fSFrederick Mayle     EXPECT_CALL(mock_root_handler,
242*9712c20fSFrederick Mayle                 ProcessAttributeSignature((DwarfAttribute) 0x58790d72,
243*9712c20fSFrederick Mayle                                           (DwarfForm) 0x4159f138,
244*9712c20fSFrederick Mayle                                           0x94682463613e6a5fULL))
245*9712c20fSFrederick Mayle       .WillOnce(Return());
246*9712c20fSFrederick Mayle     EXPECT_CALL(mock_root_handler, EndAttributes())
247*9712c20fSFrederick Mayle       .WillOnce(Return(true));
248*9712c20fSFrederick Mayle     EXPECT_CALL(mock_root_handler, FindChildHandler(_, _))
249*9712c20fSFrederick Mayle       .Times(0);
250*9712c20fSFrederick Mayle     EXPECT_CALL(mock_root_handler, Finish())
251*9712c20fSFrederick Mayle       .WillOnce(Return());
252*9712c20fSFrederick Mayle   }
253*9712c20fSFrederick Mayle 
254*9712c20fSFrederick Mayle   // Drive the dispatcher.
255*9712c20fSFrederick Mayle 
256*9712c20fSFrederick Mayle   // Report the CU header.
257*9712c20fSFrederick Mayle   EXPECT_TRUE(die_dispatcher.StartCompilationUnit(0x8d42aed77cfccf3eLL,
258*9712c20fSFrederick Mayle                                                   0x89, 0xdc,
259*9712c20fSFrederick Mayle                                                   0x2ecb4dc778a80f21LL,
260*9712c20fSFrederick Mayle                                                   0x66));
261*9712c20fSFrederick Mayle   // Report the root DIE.
262*9712c20fSFrederick Mayle   EXPECT_TRUE(die_dispatcher.StartDIE(0xe2222da01e29f2a9LL,
263*9712c20fSFrederick Mayle                                       (DwarfTag) 0x9829445c));
264*9712c20fSFrederick Mayle 
265*9712c20fSFrederick Mayle   // Report some attribute values.
266*9712c20fSFrederick Mayle   die_dispatcher.ProcessAttributeUnsigned(0xe2222da01e29f2a9LL,
267*9712c20fSFrederick Mayle                                           (DwarfAttribute) 0x1cc0bfed,
268*9712c20fSFrederick Mayle                                           (DwarfForm) 0x424f1468,
269*9712c20fSFrederick Mayle                                           0xa592571997facda1ULL);
270*9712c20fSFrederick Mayle   die_dispatcher.ProcessAttributeSigned(0xe2222da01e29f2a9LL,
271*9712c20fSFrederick Mayle                                         (DwarfAttribute) 0x43694dc9,
272*9712c20fSFrederick Mayle                                         (DwarfForm) 0xf6f78901,
273*9712c20fSFrederick Mayle                                         0x92602a4e3bf1f446LL);
274*9712c20fSFrederick Mayle   die_dispatcher.ProcessAttributeReference(0xe2222da01e29f2a9LL,
275*9712c20fSFrederick Mayle                                            (DwarfAttribute) 0x4033e8c,
276*9712c20fSFrederick Mayle                                            (DwarfForm) 0xf66fbe0b,
277*9712c20fSFrederick Mayle                                            0x50fddef44734fdecULL);
278*9712c20fSFrederick Mayle   die_dispatcher.ProcessAttributeBuffer(0xe2222da01e29f2a9LL,
279*9712c20fSFrederick Mayle                                         (DwarfAttribute) 0x25d7e0af,
280*9712c20fSFrederick Mayle                                         (DwarfForm) 0xe99a539a,
281*9712c20fSFrederick Mayle                                         buffer, sizeof(buffer));
282*9712c20fSFrederick Mayle   die_dispatcher.ProcessAttributeString(0xe2222da01e29f2a9LL,
283*9712c20fSFrederick Mayle                                         (DwarfAttribute) 0x310ed065,
284*9712c20fSFrederick Mayle                                         (DwarfForm) 0x15762fec,
285*9712c20fSFrederick Mayle                                         str);
286*9712c20fSFrederick Mayle   die_dispatcher.ProcessAttributeSignature(0xe2222da01e29f2a9LL,
287*9712c20fSFrederick Mayle                                            (DwarfAttribute) 0x58790d72,
288*9712c20fSFrederick Mayle                                            (DwarfForm) 0x4159f138,
289*9712c20fSFrederick Mayle                                            0x94682463613e6a5fULL);
290*9712c20fSFrederick Mayle 
291*9712c20fSFrederick Mayle   // Finish the root DIE (and thus the CU).
292*9712c20fSFrederick Mayle   die_dispatcher.EndDIE(0xe2222da01e29f2a9LL);
293*9712c20fSFrederick Mayle }
294*9712c20fSFrederick Mayle 
TEST(Dwarf2DIEHandler,FindAndSkipChildren)295*9712c20fSFrederick Mayle TEST(Dwarf2DIEHandler, FindAndSkipChildren) {
296*9712c20fSFrederick Mayle   MockRootDIEHandler mock_root_handler;
297*9712c20fSFrederick Mayle   MockDIEHandler *mock_child1_handler = new(MockDIEHandler);
298*9712c20fSFrederick Mayle   MockDIEHandler *mock_child3_handler = new(MockDIEHandler);
299*9712c20fSFrederick Mayle   DIEDispatcher die_dispatcher(&mock_root_handler);
300*9712c20fSFrederick Mayle 
301*9712c20fSFrederick Mayle   {
302*9712c20fSFrederick Mayle     InSequence s;
303*9712c20fSFrederick Mayle 
304*9712c20fSFrederick Mayle     // We'll like the compilation unit header.
305*9712c20fSFrederick Mayle     EXPECT_CALL(mock_root_handler,
306*9712c20fSFrederick Mayle                 StartCompilationUnit(0x9ec1e6d05e434a0eLL, 0xeb, 0x21,
307*9712c20fSFrederick Mayle                                      0x47dd3c764275a216LL, 0xa5))
308*9712c20fSFrederick Mayle       .WillOnce(Return(true));
309*9712c20fSFrederick Mayle 
310*9712c20fSFrederick Mayle     // Root DIE.
311*9712c20fSFrederick Mayle     {
312*9712c20fSFrederick Mayle       EXPECT_CALL(mock_root_handler,
313*9712c20fSFrederick Mayle                   StartRootDIE(0x15f0e06bdfe3c372LL, (DwarfTag) 0xf5d60c59))
314*9712c20fSFrederick Mayle         .WillOnce(Return(true));
315*9712c20fSFrederick Mayle       EXPECT_CALL(mock_root_handler,
316*9712c20fSFrederick Mayle                   ProcessAttributeSigned((DwarfAttribute) 0xf779a642,
317*9712c20fSFrederick Mayle                                          (DwarfForm) 0x2cb63027,
318*9712c20fSFrederick Mayle                                          0x18e744661769d08fLL))
319*9712c20fSFrederick Mayle         .WillOnce(Return());
320*9712c20fSFrederick Mayle       EXPECT_CALL(mock_root_handler, EndAttributes())
321*9712c20fSFrederick Mayle         .WillOnce(Return(true));
322*9712c20fSFrederick Mayle 
323*9712c20fSFrederick Mayle       // First child DIE.
324*9712c20fSFrederick Mayle       EXPECT_CALL(mock_root_handler,
325*9712c20fSFrederick Mayle                   FindChildHandler(0x149f644f8116fe8cLL,
326*9712c20fSFrederick Mayle                                    (DwarfTag) 0xac2cbd8c))
327*9712c20fSFrederick Mayle         .WillOnce(Return(mock_child1_handler));
328*9712c20fSFrederick Mayle       {
329*9712c20fSFrederick Mayle         EXPECT_CALL(*mock_child1_handler,
330*9712c20fSFrederick Mayle                     ProcessAttributeSigned((DwarfAttribute) 0xa6fd6f65,
331*9712c20fSFrederick Mayle                                            (DwarfForm) 0xe4f64c41,
332*9712c20fSFrederick Mayle                                            0x1b04e5444a55fe67LL))
333*9712c20fSFrederick Mayle           .WillOnce(Return());
334*9712c20fSFrederick Mayle         EXPECT_CALL(*mock_child1_handler, EndAttributes())
335*9712c20fSFrederick Mayle           .WillOnce(Return(false));
336*9712c20fSFrederick Mayle         // Skip first grandchild DIE and first great-grandchild DIE.
337*9712c20fSFrederick Mayle         EXPECT_CALL(*mock_child1_handler, Finish())
338*9712c20fSFrederick Mayle           .WillOnce(Return());
339*9712c20fSFrederick Mayle       }
340*9712c20fSFrederick Mayle 
341*9712c20fSFrederick Mayle       // Second child DIE.  Root handler will decline to return a handler
342*9712c20fSFrederick Mayle       // for this child.
343*9712c20fSFrederick Mayle       EXPECT_CALL(mock_root_handler,
344*9712c20fSFrederick Mayle                   FindChildHandler(0x97412be24875de9dLL,
345*9712c20fSFrederick Mayle                                    (DwarfTag) 0x505a068b))
346*9712c20fSFrederick Mayle         .WillOnce(Return((DIEHandler*) NULL));
347*9712c20fSFrederick Mayle 
348*9712c20fSFrederick Mayle       // Third child DIE.
349*9712c20fSFrederick Mayle       EXPECT_CALL(mock_root_handler,
350*9712c20fSFrederick Mayle                   FindChildHandler(0x753c964c8ab538aeLL,
351*9712c20fSFrederick Mayle                                    (DwarfTag) 0x8c22970e))
352*9712c20fSFrederick Mayle         .WillOnce(Return(mock_child3_handler));
353*9712c20fSFrederick Mayle       {
354*9712c20fSFrederick Mayle         EXPECT_CALL(*mock_child3_handler,
355*9712c20fSFrederick Mayle                     ProcessAttributeSigned((DwarfAttribute) 0x4e2b7cfb,
356*9712c20fSFrederick Mayle                                            (DwarfForm) 0x610b7ae1,
357*9712c20fSFrederick Mayle                                            0x3ea5c609d7d7560fLL))
358*9712c20fSFrederick Mayle           .WillOnce(Return());
359*9712c20fSFrederick Mayle         EXPECT_CALL(*mock_child3_handler, EndAttributes())
360*9712c20fSFrederick Mayle           .WillOnce(Return(true));
361*9712c20fSFrederick Mayle         EXPECT_CALL(*mock_child3_handler, Finish())
362*9712c20fSFrederick Mayle           .WillOnce(Return());
363*9712c20fSFrederick Mayle       }
364*9712c20fSFrederick Mayle 
365*9712c20fSFrederick Mayle       EXPECT_CALL(mock_root_handler, Finish())
366*9712c20fSFrederick Mayle         .WillOnce(Return());
367*9712c20fSFrederick Mayle     }
368*9712c20fSFrederick Mayle   }
369*9712c20fSFrederick Mayle 
370*9712c20fSFrederick Mayle 
371*9712c20fSFrederick Mayle   // Drive the dispatcher.
372*9712c20fSFrederick Mayle 
373*9712c20fSFrederick Mayle   // Report the CU header.
374*9712c20fSFrederick Mayle   EXPECT_TRUE(die_dispatcher
375*9712c20fSFrederick Mayle               .StartCompilationUnit(0x9ec1e6d05e434a0eLL, 0xeb, 0x21,
376*9712c20fSFrederick Mayle                                     0x47dd3c764275a216LL, 0xa5));
377*9712c20fSFrederick Mayle   // Report the root DIE.
378*9712c20fSFrederick Mayle   {
379*9712c20fSFrederick Mayle     EXPECT_TRUE(die_dispatcher.StartDIE(0x15f0e06bdfe3c372LL,
380*9712c20fSFrederick Mayle                                         (DwarfTag) 0xf5d60c59));
381*9712c20fSFrederick Mayle     die_dispatcher.ProcessAttributeSigned(0x15f0e06bdfe3c372LL,
382*9712c20fSFrederick Mayle                                           (DwarfAttribute) 0xf779a642,
383*9712c20fSFrederick Mayle                                           (DwarfForm) 0x2cb63027,
384*9712c20fSFrederick Mayle                                           0x18e744661769d08fLL);
385*9712c20fSFrederick Mayle 
386*9712c20fSFrederick Mayle     // First child DIE.
387*9712c20fSFrederick Mayle     {
388*9712c20fSFrederick Mayle       EXPECT_TRUE(die_dispatcher.StartDIE(0x149f644f8116fe8cLL,
389*9712c20fSFrederick Mayle                                           (DwarfTag) 0xac2cbd8c));
390*9712c20fSFrederick Mayle       die_dispatcher.ProcessAttributeSigned(0x149f644f8116fe8cLL,
391*9712c20fSFrederick Mayle                                             (DwarfAttribute) 0xa6fd6f65,
392*9712c20fSFrederick Mayle                                             (DwarfForm) 0xe4f64c41,
393*9712c20fSFrederick Mayle                                             0x1b04e5444a55fe67LL);
394*9712c20fSFrederick Mayle 
395*9712c20fSFrederick Mayle       // First grandchild DIE.  Will be skipped.
396*9712c20fSFrederick Mayle       {
397*9712c20fSFrederick Mayle         EXPECT_FALSE(die_dispatcher.StartDIE(0xd68de1ee0bd29419LL,
398*9712c20fSFrederick Mayle                                             (DwarfTag) 0x22f05a15));
399*9712c20fSFrederick Mayle         // First great-grandchild DIE.  Will be skipped without being
400*9712c20fSFrederick Mayle         // mentioned to any handler.
401*9712c20fSFrederick Mayle         {
402*9712c20fSFrederick Mayle           EXPECT_FALSE(die_dispatcher
403*9712c20fSFrederick Mayle                        .StartDIE(0xb3076285d25cac25LL,
404*9712c20fSFrederick Mayle                                  (DwarfTag) 0xcff4061b));
405*9712c20fSFrederick Mayle           die_dispatcher.EndDIE(0xb3076285d25cac25LL);
406*9712c20fSFrederick Mayle         }
407*9712c20fSFrederick Mayle         die_dispatcher.EndDIE(0xd68de1ee0bd29419LL);
408*9712c20fSFrederick Mayle       }
409*9712c20fSFrederick Mayle       die_dispatcher.EndDIE(0x149f644f8116fe8cLL);
410*9712c20fSFrederick Mayle     }
411*9712c20fSFrederick Mayle 
412*9712c20fSFrederick Mayle     // Second child DIE.  Root handler will decline to find a handler for it.
413*9712c20fSFrederick Mayle     {
414*9712c20fSFrederick Mayle       EXPECT_FALSE(die_dispatcher.StartDIE(0x97412be24875de9dLL,
415*9712c20fSFrederick Mayle                                            (DwarfTag) 0x505a068b));
416*9712c20fSFrederick Mayle       die_dispatcher.EndDIE(0x97412be24875de9dLL);
417*9712c20fSFrederick Mayle     }
418*9712c20fSFrederick Mayle 
419*9712c20fSFrederick Mayle     // Third child DIE.
420*9712c20fSFrederick Mayle     {
421*9712c20fSFrederick Mayle       EXPECT_TRUE(die_dispatcher.StartDIE(0x753c964c8ab538aeLL,
422*9712c20fSFrederick Mayle                                           (DwarfTag) 0x8c22970e));
423*9712c20fSFrederick Mayle       die_dispatcher.ProcessAttributeSigned(0x753c964c8ab538aeLL,
424*9712c20fSFrederick Mayle                                             (DwarfAttribute) 0x4e2b7cfb,
425*9712c20fSFrederick Mayle                                             (DwarfForm) 0x610b7ae1,
426*9712c20fSFrederick Mayle                                             0x3ea5c609d7d7560fLL);
427*9712c20fSFrederick Mayle       die_dispatcher.EndDIE(0x753c964c8ab538aeLL);
428*9712c20fSFrederick Mayle     }
429*9712c20fSFrederick Mayle 
430*9712c20fSFrederick Mayle     // Finish the root DIE (and thus the CU).
431*9712c20fSFrederick Mayle     die_dispatcher.EndDIE(0x15f0e06bdfe3c372LL);
432*9712c20fSFrederick Mayle   }
433*9712c20fSFrederick Mayle }
434*9712c20fSFrederick Mayle 
435*9712c20fSFrederick Mayle // The DIEDispatcher destructor is supposed to delete all handlers on
436*9712c20fSFrederick Mayle // the stack, except for the root.
TEST(Dwarf2DIEHandler,FreeHandlersOnStack)437*9712c20fSFrederick Mayle TEST(Dwarf2DIEHandler, FreeHandlersOnStack) {
438*9712c20fSFrederick Mayle   MockRootDIEHandler mock_root_handler;
439*9712c20fSFrederick Mayle   MockDIEHandler *mock_child_handler = new(MockDIEHandler);
440*9712c20fSFrederick Mayle   MockDIEHandler *mock_grandchild_handler = new(MockDIEHandler);
441*9712c20fSFrederick Mayle 
442*9712c20fSFrederick Mayle   {
443*9712c20fSFrederick Mayle     InSequence s;
444*9712c20fSFrederick Mayle 
445*9712c20fSFrederick Mayle     // We'll like the compilation unit header.
446*9712c20fSFrederick Mayle     EXPECT_CALL(mock_root_handler,
447*9712c20fSFrederick Mayle                 StartCompilationUnit(0x87b41ba8381cd71cLL, 0xff, 0x89,
448*9712c20fSFrederick Mayle                                      0x76d392ff393ddda2LL, 0xbf))
449*9712c20fSFrederick Mayle       .WillOnce(Return(true));
450*9712c20fSFrederick Mayle 
451*9712c20fSFrederick Mayle     // Root DIE.
452*9712c20fSFrederick Mayle     {
453*9712c20fSFrederick Mayle       EXPECT_CALL(mock_root_handler,
454*9712c20fSFrederick Mayle                   StartRootDIE(0xbf13b761691ddc91LL, (DwarfTag) 0x98980361))
455*9712c20fSFrederick Mayle         .WillOnce(Return(true));
456*9712c20fSFrederick Mayle       EXPECT_CALL(mock_root_handler, EndAttributes())
457*9712c20fSFrederick Mayle         .WillOnce(Return(true));
458*9712c20fSFrederick Mayle 
459*9712c20fSFrederick Mayle       // Child DIE.
460*9712c20fSFrederick Mayle       EXPECT_CALL(mock_root_handler,
461*9712c20fSFrederick Mayle                   FindChildHandler(0x058f09240c5fc8c9LL,
462*9712c20fSFrederick Mayle                                    (DwarfTag) 0x898bf0d0))
463*9712c20fSFrederick Mayle         .WillOnce(Return(mock_child_handler));
464*9712c20fSFrederick Mayle       {
465*9712c20fSFrederick Mayle         EXPECT_CALL(*mock_child_handler, EndAttributes())
466*9712c20fSFrederick Mayle           .WillOnce(Return(true));
467*9712c20fSFrederick Mayle 
468*9712c20fSFrederick Mayle         // Grandchild DIE.
469*9712c20fSFrederick Mayle         EXPECT_CALL(*mock_child_handler,
470*9712c20fSFrederick Mayle                     FindChildHandler(0x32dc00c9945dc0c8LL,
471*9712c20fSFrederick Mayle                                      (DwarfTag) 0x2802d007))
472*9712c20fSFrederick Mayle           .WillOnce(Return(mock_grandchild_handler));
473*9712c20fSFrederick Mayle         {
474*9712c20fSFrederick Mayle           EXPECT_CALL(*mock_grandchild_handler,
475*9712c20fSFrederick Mayle                       ProcessAttributeSigned((DwarfAttribute) 0x4e2b7cfb,
476*9712c20fSFrederick Mayle                                              (DwarfForm) 0x610b7ae1,
477*9712c20fSFrederick Mayle                                              0x3ea5c609d7d7560fLL))
478*9712c20fSFrederick Mayle             .WillOnce(Return());
479*9712c20fSFrederick Mayle 
480*9712c20fSFrederick Mayle           // At this point, we abandon the traversal, so none of the
481*9712c20fSFrederick Mayle           // usual stuff should get called.
482*9712c20fSFrederick Mayle           EXPECT_CALL(*mock_grandchild_handler, EndAttributes())
483*9712c20fSFrederick Mayle             .Times(0);
484*9712c20fSFrederick Mayle           EXPECT_CALL(*mock_grandchild_handler, Finish())
485*9712c20fSFrederick Mayle             .Times(0);
486*9712c20fSFrederick Mayle         }
487*9712c20fSFrederick Mayle 
488*9712c20fSFrederick Mayle         EXPECT_CALL(*mock_child_handler, Finish())
489*9712c20fSFrederick Mayle           .Times(0);
490*9712c20fSFrederick Mayle       }
491*9712c20fSFrederick Mayle 
492*9712c20fSFrederick Mayle       EXPECT_CALL(mock_root_handler, Finish())
493*9712c20fSFrederick Mayle         .Times(0);
494*9712c20fSFrederick Mayle     }
495*9712c20fSFrederick Mayle   }
496*9712c20fSFrederick Mayle 
497*9712c20fSFrederick Mayle   // The dispatcher.
498*9712c20fSFrederick Mayle   DIEDispatcher die_dispatcher(&mock_root_handler);
499*9712c20fSFrederick Mayle 
500*9712c20fSFrederick Mayle   // Report the CU header.
501*9712c20fSFrederick Mayle   EXPECT_TRUE(die_dispatcher
502*9712c20fSFrederick Mayle               .StartCompilationUnit(0x87b41ba8381cd71cLL, 0xff, 0x89,
503*9712c20fSFrederick Mayle                                     0x76d392ff393ddda2LL, 0xbf));
504*9712c20fSFrederick Mayle   // Report the root DIE.
505*9712c20fSFrederick Mayle   {
506*9712c20fSFrederick Mayle     EXPECT_TRUE(die_dispatcher.StartDIE(0xbf13b761691ddc91LL,
507*9712c20fSFrederick Mayle                                         (DwarfTag) 0x98980361));
508*9712c20fSFrederick Mayle 
509*9712c20fSFrederick Mayle     // Child DIE.
510*9712c20fSFrederick Mayle     {
511*9712c20fSFrederick Mayle       EXPECT_TRUE(die_dispatcher.StartDIE(0x058f09240c5fc8c9LL,
512*9712c20fSFrederick Mayle                                           (DwarfTag) 0x898bf0d0));
513*9712c20fSFrederick Mayle 
514*9712c20fSFrederick Mayle       // Grandchild DIE.
515*9712c20fSFrederick Mayle       {
516*9712c20fSFrederick Mayle         EXPECT_TRUE(die_dispatcher.StartDIE(0x32dc00c9945dc0c8LL,
517*9712c20fSFrederick Mayle                                             (DwarfTag) 0x2802d007));
518*9712c20fSFrederick Mayle         die_dispatcher.ProcessAttributeSigned(0x32dc00c9945dc0c8LL,
519*9712c20fSFrederick Mayle                                               (DwarfAttribute) 0x4e2b7cfb,
520*9712c20fSFrederick Mayle                                               (DwarfForm) 0x610b7ae1,
521*9712c20fSFrederick Mayle                                               0x3ea5c609d7d7560fLL);
522*9712c20fSFrederick Mayle 
523*9712c20fSFrederick Mayle         // Stop the traversal abruptly, so that there will still be
524*9712c20fSFrederick Mayle         // handlers on the stack when the dispatcher is destructed.
525*9712c20fSFrederick Mayle 
526*9712c20fSFrederick Mayle         // No EndDIE call...
527*9712c20fSFrederick Mayle       }
528*9712c20fSFrederick Mayle       // No EndDIE call...
529*9712c20fSFrederick Mayle     }
530*9712c20fSFrederick Mayle     // No EndDIE call...
531*9712c20fSFrederick Mayle   }
532*9712c20fSFrederick Mayle }
533