xref: /dflybsd-src/contrib/gdb-7/gdb/dwarf2-frame-tailcall.c (revision a45ae5f869d9cfcb3e41dbab486e10bfa9e336bf)
1*a45ae5f8SJohn Marino /* Virtual tail call frames unwinder for GDB.
2*a45ae5f8SJohn Marino 
3*a45ae5f8SJohn Marino    Copyright (C) 2010-2012 Free Software Foundation, Inc.
4*a45ae5f8SJohn Marino 
5*a45ae5f8SJohn Marino    This file is part of GDB.
6*a45ae5f8SJohn Marino 
7*a45ae5f8SJohn Marino    This program is free software; you can redistribute it and/or modify
8*a45ae5f8SJohn Marino    it under the terms of the GNU General Public License as published by
9*a45ae5f8SJohn Marino    the Free Software Foundation; either version 3 of the License, or
10*a45ae5f8SJohn Marino    (at your option) any later version.
11*a45ae5f8SJohn Marino 
12*a45ae5f8SJohn Marino    This program is distributed in the hope that it will be useful,
13*a45ae5f8SJohn Marino    but WITHOUT ANY WARRANTY; without even the implied warranty of
14*a45ae5f8SJohn Marino    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*a45ae5f8SJohn Marino    GNU General Public License for more details.
16*a45ae5f8SJohn Marino 
17*a45ae5f8SJohn Marino    You should have received a copy of the GNU General Public License
18*a45ae5f8SJohn Marino    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19*a45ae5f8SJohn Marino 
20*a45ae5f8SJohn Marino #include "defs.h"
21*a45ae5f8SJohn Marino #include "gdb_assert.h"
22*a45ae5f8SJohn Marino #include "frame.h"
23*a45ae5f8SJohn Marino #include "dwarf2-frame-tailcall.h"
24*a45ae5f8SJohn Marino #include "dwarf2loc.h"
25*a45ae5f8SJohn Marino #include "frame-unwind.h"
26*a45ae5f8SJohn Marino #include "block.h"
27*a45ae5f8SJohn Marino #include "hashtab.h"
28*a45ae5f8SJohn Marino #include "exceptions.h"
29*a45ae5f8SJohn Marino #include "gdbtypes.h"
30*a45ae5f8SJohn Marino #include "regcache.h"
31*a45ae5f8SJohn Marino #include "value.h"
32*a45ae5f8SJohn Marino #include "dwarf2-frame.h"
33*a45ae5f8SJohn Marino 
34*a45ae5f8SJohn Marino /* Contains struct tailcall_cache indexed by next_bottom_frame.  */
35*a45ae5f8SJohn Marino static htab_t cache_htab;
36*a45ae5f8SJohn Marino 
37*a45ae5f8SJohn Marino /* Associate structure of the unwinder to call_site_chain.  Lifetime of this
38*a45ae5f8SJohn Marino    structure is maintained by REFC decremented by dealloc_cache, all of them
39*a45ae5f8SJohn Marino    get deleted during reinit_frame_cache.  */
40*a45ae5f8SJohn Marino struct tailcall_cache
41*a45ae5f8SJohn Marino {
42*a45ae5f8SJohn Marino   /* It must be the first one of this struct.  It is the furthest callee.  */
43*a45ae5f8SJohn Marino   struct frame_info *next_bottom_frame;
44*a45ae5f8SJohn Marino 
45*a45ae5f8SJohn Marino   /* Reference count.  The whole chain of virtual tail call frames shares one
46*a45ae5f8SJohn Marino      tailcall_cache.  */
47*a45ae5f8SJohn Marino   int refc;
48*a45ae5f8SJohn Marino 
49*a45ae5f8SJohn Marino   /* Associated found virtual taill call frames chain, it is never NULL.  */
50*a45ae5f8SJohn Marino   struct call_site_chain *chain;
51*a45ae5f8SJohn Marino 
52*a45ae5f8SJohn Marino   /* Cached pretended_chain_levels result.  */
53*a45ae5f8SJohn Marino   int chain_levels;
54*a45ae5f8SJohn Marino 
55*a45ae5f8SJohn Marino   /* Unwound PC from the top (caller) frame, as it is not contained
56*a45ae5f8SJohn Marino      in CHAIN.  */
57*a45ae5f8SJohn Marino   CORE_ADDR prev_pc;
58*a45ae5f8SJohn Marino 
59*a45ae5f8SJohn Marino   /* Compensate SP in caller frames appropriately.  prev_sp and
60*a45ae5f8SJohn Marino      entry_cfa_sp_offset are valid only if PREV_SP_P.  PREV_SP is SP at the top
61*a45ae5f8SJohn Marino      (caller) frame.  ENTRY_CFA_SP_OFFSET is shift of SP in tail call frames
62*a45ae5f8SJohn Marino      against next_bottom_frame SP.  */
63*a45ae5f8SJohn Marino   unsigned prev_sp_p : 1;
64*a45ae5f8SJohn Marino   CORE_ADDR prev_sp;
65*a45ae5f8SJohn Marino   LONGEST entry_cfa_sp_offset;
66*a45ae5f8SJohn Marino };
67*a45ae5f8SJohn Marino 
68*a45ae5f8SJohn Marino /* hash_f for htab_create_alloc of cache_htab.  */
69*a45ae5f8SJohn Marino 
70*a45ae5f8SJohn Marino static hashval_t
71*a45ae5f8SJohn Marino cache_hash (const void *arg)
72*a45ae5f8SJohn Marino {
73*a45ae5f8SJohn Marino   const struct tailcall_cache *cache = arg;
74*a45ae5f8SJohn Marino 
75*a45ae5f8SJohn Marino   return htab_hash_pointer (cache->next_bottom_frame);
76*a45ae5f8SJohn Marino }
77*a45ae5f8SJohn Marino 
78*a45ae5f8SJohn Marino /* eq_f for htab_create_alloc of cache_htab.  */
79*a45ae5f8SJohn Marino 
80*a45ae5f8SJohn Marino static int
81*a45ae5f8SJohn Marino cache_eq (const void *arg1, const void *arg2)
82*a45ae5f8SJohn Marino {
83*a45ae5f8SJohn Marino   const struct tailcall_cache *cache1 = arg1;
84*a45ae5f8SJohn Marino   const struct tailcall_cache *cache2 = arg2;
85*a45ae5f8SJohn Marino 
86*a45ae5f8SJohn Marino   return cache1->next_bottom_frame == cache2->next_bottom_frame;
87*a45ae5f8SJohn Marino }
88*a45ae5f8SJohn Marino 
89*a45ae5f8SJohn Marino /* Create new tailcall_cache for NEXT_BOTTOM_FRAME, NEXT_BOTTOM_FRAME must not
90*a45ae5f8SJohn Marino    yet have been indexed by cache_htab.  Caller holds one reference of the new
91*a45ae5f8SJohn Marino    tailcall_cache.  */
92*a45ae5f8SJohn Marino 
93*a45ae5f8SJohn Marino static struct tailcall_cache *
94*a45ae5f8SJohn Marino cache_new_ref1 (struct frame_info *next_bottom_frame)
95*a45ae5f8SJohn Marino {
96*a45ae5f8SJohn Marino   struct tailcall_cache *cache;
97*a45ae5f8SJohn Marino   void **slot;
98*a45ae5f8SJohn Marino 
99*a45ae5f8SJohn Marino   cache = xzalloc (sizeof (*cache));
100*a45ae5f8SJohn Marino 
101*a45ae5f8SJohn Marino   cache->next_bottom_frame = next_bottom_frame;
102*a45ae5f8SJohn Marino   cache->refc = 1;
103*a45ae5f8SJohn Marino 
104*a45ae5f8SJohn Marino   slot = htab_find_slot (cache_htab, cache, INSERT);
105*a45ae5f8SJohn Marino   gdb_assert (*slot == NULL);
106*a45ae5f8SJohn Marino   *slot = cache;
107*a45ae5f8SJohn Marino 
108*a45ae5f8SJohn Marino   return cache;
109*a45ae5f8SJohn Marino }
110*a45ae5f8SJohn Marino 
111*a45ae5f8SJohn Marino /* Create new reference to CACHE.  */
112*a45ae5f8SJohn Marino 
113*a45ae5f8SJohn Marino static void
114*a45ae5f8SJohn Marino cache_ref (struct tailcall_cache *cache)
115*a45ae5f8SJohn Marino {
116*a45ae5f8SJohn Marino   gdb_assert (cache->refc > 0);
117*a45ae5f8SJohn Marino 
118*a45ae5f8SJohn Marino   cache->refc++;
119*a45ae5f8SJohn Marino }
120*a45ae5f8SJohn Marino 
121*a45ae5f8SJohn Marino /* Drop reference to CACHE, possibly fully freeing it and unregistering it from
122*a45ae5f8SJohn Marino    cache_htab.  */
123*a45ae5f8SJohn Marino 
124*a45ae5f8SJohn Marino static void
125*a45ae5f8SJohn Marino cache_unref (struct tailcall_cache *cache)
126*a45ae5f8SJohn Marino {
127*a45ae5f8SJohn Marino   gdb_assert (cache->refc > 0);
128*a45ae5f8SJohn Marino 
129*a45ae5f8SJohn Marino   if (!--cache->refc)
130*a45ae5f8SJohn Marino     {
131*a45ae5f8SJohn Marino       gdb_assert (htab_find_slot (cache_htab, cache, NO_INSERT) != NULL);
132*a45ae5f8SJohn Marino       htab_remove_elt (cache_htab, cache);
133*a45ae5f8SJohn Marino 
134*a45ae5f8SJohn Marino       xfree (cache->chain);
135*a45ae5f8SJohn Marino       xfree (cache);
136*a45ae5f8SJohn Marino     }
137*a45ae5f8SJohn Marino }
138*a45ae5f8SJohn Marino 
139*a45ae5f8SJohn Marino /* Return 1 if FI is a non-bottom (not the callee) tail call frame.  Otherwise
140*a45ae5f8SJohn Marino    return 0.  */
141*a45ae5f8SJohn Marino 
142*a45ae5f8SJohn Marino static int
143*a45ae5f8SJohn Marino frame_is_tailcall (struct frame_info *fi)
144*a45ae5f8SJohn Marino {
145*a45ae5f8SJohn Marino   return frame_unwinder_is (fi, &dwarf2_tailcall_frame_unwind);
146*a45ae5f8SJohn Marino }
147*a45ae5f8SJohn Marino 
148*a45ae5f8SJohn Marino /* Try to find tailcall_cache in cache_htab if FI is a part of its virtual tail
149*a45ae5f8SJohn Marino    call chain.  Otherwise return NULL.  No new reference is created.  */
150*a45ae5f8SJohn Marino 
151*a45ae5f8SJohn Marino static struct tailcall_cache *
152*a45ae5f8SJohn Marino cache_find (struct frame_info *fi)
153*a45ae5f8SJohn Marino {
154*a45ae5f8SJohn Marino   struct tailcall_cache *cache;
155*a45ae5f8SJohn Marino   void **slot;
156*a45ae5f8SJohn Marino 
157*a45ae5f8SJohn Marino   while (frame_is_tailcall (fi))
158*a45ae5f8SJohn Marino     {
159*a45ae5f8SJohn Marino       fi = get_next_frame (fi);
160*a45ae5f8SJohn Marino       gdb_assert (fi != NULL);
161*a45ae5f8SJohn Marino     }
162*a45ae5f8SJohn Marino 
163*a45ae5f8SJohn Marino   slot = htab_find_slot (cache_htab, &fi, NO_INSERT);
164*a45ae5f8SJohn Marino   if (slot == NULL)
165*a45ae5f8SJohn Marino     return NULL;
166*a45ae5f8SJohn Marino 
167*a45ae5f8SJohn Marino   cache = *slot;
168*a45ae5f8SJohn Marino   gdb_assert (cache != NULL);
169*a45ae5f8SJohn Marino   return cache;
170*a45ae5f8SJohn Marino }
171*a45ae5f8SJohn Marino 
172*a45ae5f8SJohn Marino /* Number of virtual frames between THIS_FRAME and CACHE->NEXT_BOTTOM_FRAME.
173*a45ae5f8SJohn Marino    If THIS_FRAME is CACHE-> NEXT_BOTTOM_FRAME return -1.  */
174*a45ae5f8SJohn Marino 
175*a45ae5f8SJohn Marino static int
176*a45ae5f8SJohn Marino existing_next_levels (struct frame_info *this_frame,
177*a45ae5f8SJohn Marino 		      struct tailcall_cache *cache)
178*a45ae5f8SJohn Marino {
179*a45ae5f8SJohn Marino   int retval = (frame_relative_level (this_frame)
180*a45ae5f8SJohn Marino 		- frame_relative_level (cache->next_bottom_frame) - 1);
181*a45ae5f8SJohn Marino 
182*a45ae5f8SJohn Marino   gdb_assert (retval >= -1);
183*a45ae5f8SJohn Marino 
184*a45ae5f8SJohn Marino   return retval;
185*a45ae5f8SJohn Marino }
186*a45ae5f8SJohn Marino 
187*a45ae5f8SJohn Marino /* The number of virtual tail call frames in CHAIN.  With no virtual tail call
188*a45ae5f8SJohn Marino    frames the function would return 0 (but CHAIN does not exist in such
189*a45ae5f8SJohn Marino    case).  */
190*a45ae5f8SJohn Marino 
191*a45ae5f8SJohn Marino static int
192*a45ae5f8SJohn Marino pretended_chain_levels (struct call_site_chain *chain)
193*a45ae5f8SJohn Marino {
194*a45ae5f8SJohn Marino   int chain_levels;
195*a45ae5f8SJohn Marino 
196*a45ae5f8SJohn Marino   gdb_assert (chain != NULL);
197*a45ae5f8SJohn Marino 
198*a45ae5f8SJohn Marino   if (chain->callers == chain->length && chain->callees == chain->length)
199*a45ae5f8SJohn Marino     return chain->length;
200*a45ae5f8SJohn Marino 
201*a45ae5f8SJohn Marino   chain_levels = chain->callers + chain->callees;
202*a45ae5f8SJohn Marino   gdb_assert (chain_levels < chain->length);
203*a45ae5f8SJohn Marino 
204*a45ae5f8SJohn Marino   return chain_levels;
205*a45ae5f8SJohn Marino }
206*a45ae5f8SJohn Marino 
207*a45ae5f8SJohn Marino /* Implementation of frame_this_id_ftype.  THIS_CACHE must be already
208*a45ae5f8SJohn Marino    initialized with tailcall_cache, THIS_FRAME must be a part of THIS_CACHE.
209*a45ae5f8SJohn Marino 
210*a45ae5f8SJohn Marino    Specific virtual tail call frames are tracked by INLINE_DEPTH.  */
211*a45ae5f8SJohn Marino 
212*a45ae5f8SJohn Marino static void
213*a45ae5f8SJohn Marino tailcall_frame_this_id (struct frame_info *this_frame, void **this_cache,
214*a45ae5f8SJohn Marino 			struct frame_id *this_id)
215*a45ae5f8SJohn Marino {
216*a45ae5f8SJohn Marino   struct tailcall_cache *cache = *this_cache;
217*a45ae5f8SJohn Marino   struct frame_info *next_frame;
218*a45ae5f8SJohn Marino 
219*a45ae5f8SJohn Marino   /* Tail call does not make sense for a sentinel frame.  */
220*a45ae5f8SJohn Marino   next_frame = get_next_frame (this_frame);
221*a45ae5f8SJohn Marino   gdb_assert (next_frame != NULL);
222*a45ae5f8SJohn Marino 
223*a45ae5f8SJohn Marino   *this_id = get_frame_id (next_frame);
224*a45ae5f8SJohn Marino   (*this_id).code_addr = get_frame_pc (this_frame);
225*a45ae5f8SJohn Marino   (*this_id).code_addr_p = 1;
226*a45ae5f8SJohn Marino   (*this_id).inline_depth = (cache->chain_levels
227*a45ae5f8SJohn Marino 			     - existing_next_levels (this_frame, cache));
228*a45ae5f8SJohn Marino   gdb_assert ((*this_id).inline_depth > 0);
229*a45ae5f8SJohn Marino }
230*a45ae5f8SJohn Marino 
231*a45ae5f8SJohn Marino /* Find PC to be unwound from THIS_FRAME.  THIS_FRAME must be a part of
232*a45ae5f8SJohn Marino    CACHE.  */
233*a45ae5f8SJohn Marino 
234*a45ae5f8SJohn Marino static CORE_ADDR
235*a45ae5f8SJohn Marino pretend_pc (struct frame_info *this_frame, struct tailcall_cache *cache)
236*a45ae5f8SJohn Marino {
237*a45ae5f8SJohn Marino   int next_levels = existing_next_levels (this_frame, cache);
238*a45ae5f8SJohn Marino   struct call_site_chain *chain = cache->chain;
239*a45ae5f8SJohn Marino   int caller_no;
240*a45ae5f8SJohn Marino 
241*a45ae5f8SJohn Marino   gdb_assert (chain != NULL);
242*a45ae5f8SJohn Marino 
243*a45ae5f8SJohn Marino   next_levels++;
244*a45ae5f8SJohn Marino   gdb_assert (next_levels >= 0);
245*a45ae5f8SJohn Marino 
246*a45ae5f8SJohn Marino   if (next_levels < chain->callees)
247*a45ae5f8SJohn Marino     return chain->call_site[chain->length - next_levels - 1]->pc;
248*a45ae5f8SJohn Marino   next_levels -= chain->callees;
249*a45ae5f8SJohn Marino 
250*a45ae5f8SJohn Marino   /* Otherwise CHAIN->CALLEES are already covered by CHAIN->CALLERS.  */
251*a45ae5f8SJohn Marino   if (chain->callees != chain->length)
252*a45ae5f8SJohn Marino     {
253*a45ae5f8SJohn Marino       if (next_levels < chain->callers)
254*a45ae5f8SJohn Marino 	return chain->call_site[chain->callers - next_levels - 1]->pc;
255*a45ae5f8SJohn Marino       next_levels -= chain->callers;
256*a45ae5f8SJohn Marino     }
257*a45ae5f8SJohn Marino 
258*a45ae5f8SJohn Marino   gdb_assert (next_levels == 0);
259*a45ae5f8SJohn Marino   return cache->prev_pc;
260*a45ae5f8SJohn Marino }
261*a45ae5f8SJohn Marino 
262*a45ae5f8SJohn Marino /* Implementation of frame_prev_register_ftype.  If no specific register
263*a45ae5f8SJohn Marino    override is supplied NULL is returned (this is incompatible with
264*a45ae5f8SJohn Marino    frame_prev_register_ftype semantics).  next_bottom_frame and tail call
265*a45ae5f8SJohn Marino    frames unwind the NULL case differently.  */
266*a45ae5f8SJohn Marino 
267*a45ae5f8SJohn Marino struct value *
268*a45ae5f8SJohn Marino dwarf2_tailcall_prev_register_first (struct frame_info *this_frame,
269*a45ae5f8SJohn Marino 				     void **tailcall_cachep, int regnum)
270*a45ae5f8SJohn Marino {
271*a45ae5f8SJohn Marino   struct gdbarch *this_gdbarch = get_frame_arch (this_frame);
272*a45ae5f8SJohn Marino   struct tailcall_cache *cache = *tailcall_cachep;
273*a45ae5f8SJohn Marino   CORE_ADDR addr;
274*a45ae5f8SJohn Marino 
275*a45ae5f8SJohn Marino   if (regnum == gdbarch_pc_regnum (this_gdbarch))
276*a45ae5f8SJohn Marino     addr = pretend_pc (this_frame, cache);
277*a45ae5f8SJohn Marino   else if (cache->prev_sp_p && regnum == gdbarch_sp_regnum (this_gdbarch))
278*a45ae5f8SJohn Marino     {
279*a45ae5f8SJohn Marino       int next_levels = existing_next_levels (this_frame, cache);
280*a45ae5f8SJohn Marino 
281*a45ae5f8SJohn Marino       if (next_levels == cache->chain_levels - 1)
282*a45ae5f8SJohn Marino 	addr = cache->prev_sp;
283*a45ae5f8SJohn Marino       else
284*a45ae5f8SJohn Marino 	addr = dwarf2_frame_cfa (this_frame) - cache->entry_cfa_sp_offset;
285*a45ae5f8SJohn Marino     }
286*a45ae5f8SJohn Marino   else
287*a45ae5f8SJohn Marino     return NULL;
288*a45ae5f8SJohn Marino 
289*a45ae5f8SJohn Marino   return frame_unwind_got_address (this_frame, regnum, addr);
290*a45ae5f8SJohn Marino }
291*a45ae5f8SJohn Marino 
292*a45ae5f8SJohn Marino /* Implementation of frame_prev_register_ftype for tail call frames.  Register
293*a45ae5f8SJohn Marino    set of virtual tail call frames is assumed to be the one of the top (caller)
294*a45ae5f8SJohn Marino    frame - assume unchanged register value for NULL from
295*a45ae5f8SJohn Marino    dwarf2_tailcall_prev_register_first.  */
296*a45ae5f8SJohn Marino 
297*a45ae5f8SJohn Marino static struct value *
298*a45ae5f8SJohn Marino tailcall_frame_prev_register (struct frame_info *this_frame,
299*a45ae5f8SJohn Marino 			       void **this_cache, int regnum)
300*a45ae5f8SJohn Marino {
301*a45ae5f8SJohn Marino   struct tailcall_cache *cache = *this_cache;
302*a45ae5f8SJohn Marino   struct value *val;
303*a45ae5f8SJohn Marino 
304*a45ae5f8SJohn Marino   gdb_assert (this_frame != cache->next_bottom_frame);
305*a45ae5f8SJohn Marino 
306*a45ae5f8SJohn Marino   val = dwarf2_tailcall_prev_register_first (this_frame, this_cache, regnum);
307*a45ae5f8SJohn Marino   if (val)
308*a45ae5f8SJohn Marino     return val;
309*a45ae5f8SJohn Marino 
310*a45ae5f8SJohn Marino   return frame_unwind_got_register (this_frame, regnum, regnum);
311*a45ae5f8SJohn Marino }
312*a45ae5f8SJohn Marino 
313*a45ae5f8SJohn Marino /* Implementation of frame_sniffer_ftype.  It will never find a new chain, use
314*a45ae5f8SJohn Marino    dwarf2_tailcall_sniffer_first for the bottom (callee) frame.  It will find
315*a45ae5f8SJohn Marino    all the predecessing virtual tail call frames, it will return false when
316*a45ae5f8SJohn Marino    there exist no more tail call frames in this chain.  */
317*a45ae5f8SJohn Marino 
318*a45ae5f8SJohn Marino static int
319*a45ae5f8SJohn Marino tailcall_frame_sniffer (const struct frame_unwind *self,
320*a45ae5f8SJohn Marino 			 struct frame_info *this_frame, void **this_cache)
321*a45ae5f8SJohn Marino {
322*a45ae5f8SJohn Marino   struct frame_info *next_frame;
323*a45ae5f8SJohn Marino   int next_levels;
324*a45ae5f8SJohn Marino   struct tailcall_cache *cache;
325*a45ae5f8SJohn Marino 
326*a45ae5f8SJohn Marino   /* Inner tail call element does not make sense for a sentinel frame.  */
327*a45ae5f8SJohn Marino   next_frame = get_next_frame (this_frame);
328*a45ae5f8SJohn Marino   if (next_frame == NULL)
329*a45ae5f8SJohn Marino     return 0;
330*a45ae5f8SJohn Marino 
331*a45ae5f8SJohn Marino   cache = cache_find (next_frame);
332*a45ae5f8SJohn Marino   if (cache == NULL)
333*a45ae5f8SJohn Marino     return 0;
334*a45ae5f8SJohn Marino 
335*a45ae5f8SJohn Marino   cache_ref (cache);
336*a45ae5f8SJohn Marino 
337*a45ae5f8SJohn Marino   next_levels = existing_next_levels (this_frame, cache);
338*a45ae5f8SJohn Marino 
339*a45ae5f8SJohn Marino   /* NEXT_LEVELS is -1 only in dwarf2_tailcall_sniffer_first.  */
340*a45ae5f8SJohn Marino   gdb_assert (next_levels >= 0);
341*a45ae5f8SJohn Marino   gdb_assert (next_levels <= cache->chain_levels);
342*a45ae5f8SJohn Marino 
343*a45ae5f8SJohn Marino   if (next_levels == cache->chain_levels)
344*a45ae5f8SJohn Marino     {
345*a45ae5f8SJohn Marino       cache_unref (cache);
346*a45ae5f8SJohn Marino       return 0;
347*a45ae5f8SJohn Marino     }
348*a45ae5f8SJohn Marino 
349*a45ae5f8SJohn Marino   *this_cache = cache;
350*a45ae5f8SJohn Marino   return 1;
351*a45ae5f8SJohn Marino }
352*a45ae5f8SJohn Marino 
353*a45ae5f8SJohn Marino /* The initial "sniffer" whether THIS_FRAME is a bottom (callee) frame of a new
354*a45ae5f8SJohn Marino    chain to create.  Keep TAILCALL_CACHEP NULL if it did not find any chain,
355*a45ae5f8SJohn Marino    initialize it otherwise.  No tail call chain is created if there are no
356*a45ae5f8SJohn Marino    unambiguous virtual tail call frames to report.
357*a45ae5f8SJohn Marino 
358*a45ae5f8SJohn Marino    ENTRY_CFA_SP_OFFSETP is NULL if no special SP handling is possible,
359*a45ae5f8SJohn Marino    otherwise *ENTRY_CFA_SP_OFFSETP is the number of bytes to subtract from tail
360*a45ae5f8SJohn Marino    call frames frame base to get the SP value there - to simulate return
361*a45ae5f8SJohn Marino    address pushed on the stack.  */
362*a45ae5f8SJohn Marino 
363*a45ae5f8SJohn Marino void
364*a45ae5f8SJohn Marino dwarf2_tailcall_sniffer_first (struct frame_info *this_frame,
365*a45ae5f8SJohn Marino 			       void **tailcall_cachep,
366*a45ae5f8SJohn Marino 			       const LONGEST *entry_cfa_sp_offsetp)
367*a45ae5f8SJohn Marino {
368*a45ae5f8SJohn Marino   CORE_ADDR prev_pc = 0, prev_sp = 0;	/* GCC warning.  */
369*a45ae5f8SJohn Marino   int prev_sp_p = 0;
370*a45ae5f8SJohn Marino   CORE_ADDR this_pc, pc;
371*a45ae5f8SJohn Marino   struct gdbarch *prev_gdbarch;
372*a45ae5f8SJohn Marino   struct call_site_chain *chain = NULL;
373*a45ae5f8SJohn Marino   struct frame_info *fi;
374*a45ae5f8SJohn Marino   struct tailcall_cache *cache;
375*a45ae5f8SJohn Marino   volatile struct gdb_exception except;
376*a45ae5f8SJohn Marino 
377*a45ae5f8SJohn Marino   gdb_assert (*tailcall_cachep == NULL);
378*a45ae5f8SJohn Marino 
379*a45ae5f8SJohn Marino   this_pc = get_frame_pc (this_frame);
380*a45ae5f8SJohn Marino 
381*a45ae5f8SJohn Marino   /* Catch any unwinding errors.  */
382*a45ae5f8SJohn Marino   TRY_CATCH (except, RETURN_MASK_ERROR)
383*a45ae5f8SJohn Marino     {
384*a45ae5f8SJohn Marino       int sp_regnum;
385*a45ae5f8SJohn Marino 
386*a45ae5f8SJohn Marino       prev_gdbarch = frame_unwind_arch (this_frame);
387*a45ae5f8SJohn Marino 
388*a45ae5f8SJohn Marino       /* Simulate frame_unwind_pc without setting this_frame->prev_pc.p.  */
389*a45ae5f8SJohn Marino       prev_pc = gdbarch_unwind_pc (prev_gdbarch, this_frame);
390*a45ae5f8SJohn Marino 
391*a45ae5f8SJohn Marino       /* call_site_find_chain can throw an exception.  */
392*a45ae5f8SJohn Marino       chain = call_site_find_chain (prev_gdbarch, prev_pc, this_pc);
393*a45ae5f8SJohn Marino 
394*a45ae5f8SJohn Marino       if (entry_cfa_sp_offsetp == NULL)
395*a45ae5f8SJohn Marino 	break;
396*a45ae5f8SJohn Marino       sp_regnum = gdbarch_sp_regnum (prev_gdbarch);
397*a45ae5f8SJohn Marino       if (sp_regnum == -1)
398*a45ae5f8SJohn Marino 	break;
399*a45ae5f8SJohn Marino       prev_sp = frame_unwind_register_unsigned (this_frame, sp_regnum);
400*a45ae5f8SJohn Marino       prev_sp_p = 1;
401*a45ae5f8SJohn Marino     }
402*a45ae5f8SJohn Marino   if (except.reason < 0)
403*a45ae5f8SJohn Marino     {
404*a45ae5f8SJohn Marino       if (entry_values_debug)
405*a45ae5f8SJohn Marino 	exception_print (gdb_stdout, except);
406*a45ae5f8SJohn Marino       return;
407*a45ae5f8SJohn Marino     }
408*a45ae5f8SJohn Marino 
409*a45ae5f8SJohn Marino   /* Ambiguous unwind or unambiguous unwind verified as matching.  */
410*a45ae5f8SJohn Marino   if (chain == NULL || chain->length == 0)
411*a45ae5f8SJohn Marino     {
412*a45ae5f8SJohn Marino       xfree (chain);
413*a45ae5f8SJohn Marino       return;
414*a45ae5f8SJohn Marino     }
415*a45ae5f8SJohn Marino 
416*a45ae5f8SJohn Marino   cache = cache_new_ref1 (this_frame);
417*a45ae5f8SJohn Marino   *tailcall_cachep = cache;
418*a45ae5f8SJohn Marino   cache->chain = chain;
419*a45ae5f8SJohn Marino   cache->prev_pc = prev_pc;
420*a45ae5f8SJohn Marino   cache->chain_levels = pretended_chain_levels (chain);
421*a45ae5f8SJohn Marino   cache->prev_sp_p = prev_sp_p;
422*a45ae5f8SJohn Marino   if (cache->prev_sp_p)
423*a45ae5f8SJohn Marino     {
424*a45ae5f8SJohn Marino       cache->prev_sp = prev_sp;
425*a45ae5f8SJohn Marino       cache->entry_cfa_sp_offset = *entry_cfa_sp_offsetp;
426*a45ae5f8SJohn Marino     }
427*a45ae5f8SJohn Marino   gdb_assert (cache->chain_levels > 0);
428*a45ae5f8SJohn Marino }
429*a45ae5f8SJohn Marino 
430*a45ae5f8SJohn Marino /* Implementation of frame_dealloc_cache_ftype.  It can be called even for the
431*a45ae5f8SJohn Marino    bottom chain frame from dwarf2_frame_dealloc_cache which is not a real
432*a45ae5f8SJohn Marino    TAILCALL_FRAME.  */
433*a45ae5f8SJohn Marino 
434*a45ae5f8SJohn Marino static void
435*a45ae5f8SJohn Marino tailcall_frame_dealloc_cache (struct frame_info *self, void *this_cache)
436*a45ae5f8SJohn Marino {
437*a45ae5f8SJohn Marino   struct tailcall_cache *cache = this_cache;
438*a45ae5f8SJohn Marino 
439*a45ae5f8SJohn Marino   cache_unref (cache);
440*a45ae5f8SJohn Marino }
441*a45ae5f8SJohn Marino 
442*a45ae5f8SJohn Marino /* Implementation of frame_prev_arch_ftype.  We assume all the virtual tail
443*a45ae5f8SJohn Marino    call frames have gdbarch of the bottom (callee) frame.  */
444*a45ae5f8SJohn Marino 
445*a45ae5f8SJohn Marino static struct gdbarch *
446*a45ae5f8SJohn Marino tailcall_frame_prev_arch (struct frame_info *this_frame,
447*a45ae5f8SJohn Marino 			  void **this_prologue_cache)
448*a45ae5f8SJohn Marino {
449*a45ae5f8SJohn Marino   struct tailcall_cache *cache = *this_prologue_cache;
450*a45ae5f8SJohn Marino 
451*a45ae5f8SJohn Marino   return get_frame_arch (cache->next_bottom_frame);
452*a45ae5f8SJohn Marino }
453*a45ae5f8SJohn Marino 
454*a45ae5f8SJohn Marino /* Virtual tail call frame unwinder if dwarf2_tailcall_sniffer_first finds
455*a45ae5f8SJohn Marino    a chain to create.  */
456*a45ae5f8SJohn Marino 
457*a45ae5f8SJohn Marino const struct frame_unwind dwarf2_tailcall_frame_unwind =
458*a45ae5f8SJohn Marino {
459*a45ae5f8SJohn Marino   TAILCALL_FRAME,
460*a45ae5f8SJohn Marino   default_frame_unwind_stop_reason,
461*a45ae5f8SJohn Marino   tailcall_frame_this_id,
462*a45ae5f8SJohn Marino   tailcall_frame_prev_register,
463*a45ae5f8SJohn Marino   NULL,
464*a45ae5f8SJohn Marino   tailcall_frame_sniffer,
465*a45ae5f8SJohn Marino   tailcall_frame_dealloc_cache,
466*a45ae5f8SJohn Marino   tailcall_frame_prev_arch
467*a45ae5f8SJohn Marino };
468*a45ae5f8SJohn Marino 
469*a45ae5f8SJohn Marino /* Provide a prototype to silence -Wmissing-prototypes.  */
470*a45ae5f8SJohn Marino extern initialize_file_ftype _initialize_tailcall_frame;
471*a45ae5f8SJohn Marino 
472*a45ae5f8SJohn Marino void
473*a45ae5f8SJohn Marino _initialize_tailcall_frame (void)
474*a45ae5f8SJohn Marino {
475*a45ae5f8SJohn Marino   cache_htab = htab_create_alloc (50, cache_hash, cache_eq, NULL, xcalloc,
476*a45ae5f8SJohn Marino 				  xfree);
477*a45ae5f8SJohn Marino }
478