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