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