1e93f7393Sniklas /* Target-dependent code for the ALPHA architecture, for GDB, the GNU Debugger.
2b725ae77Skettenis Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
3b725ae77Skettenis Free Software Foundation, Inc.
4e93f7393Sniklas
5e93f7393Sniklas This file is part of GDB.
6e93f7393Sniklas
7e93f7393Sniklas This program is free software; you can redistribute it and/or modify
8e93f7393Sniklas it under the terms of the GNU General Public License as published by
9e93f7393Sniklas the Free Software Foundation; either version 2 of the License, or
10e93f7393Sniklas (at your option) any later version.
11e93f7393Sniklas
12e93f7393Sniklas This program is distributed in the hope that it will be useful,
13e93f7393Sniklas but WITHOUT ANY WARRANTY; without even the implied warranty of
14e93f7393Sniklas MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15e93f7393Sniklas GNU General Public License for more details.
16e93f7393Sniklas
17e93f7393Sniklas You should have received a copy of the GNU General Public License
18e93f7393Sniklas along with this program; if not, write to the Free Software
19b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
20b725ae77Skettenis Boston, MA 02111-1307, USA. */
21e93f7393Sniklas
22e93f7393Sniklas #include "defs.h"
23b725ae77Skettenis #include "doublest.h"
24e93f7393Sniklas #include "frame.h"
25b725ae77Skettenis #include "frame-unwind.h"
26b725ae77Skettenis #include "frame-base.h"
27b725ae77Skettenis #include "dwarf2-frame.h"
28e93f7393Sniklas #include "inferior.h"
29e93f7393Sniklas #include "symtab.h"
30e93f7393Sniklas #include "value.h"
31e93f7393Sniklas #include "gdbcmd.h"
32e93f7393Sniklas #include "gdbcore.h"
33e93f7393Sniklas #include "dis-asm.h"
34e93f7393Sniklas #include "symfile.h"
35e93f7393Sniklas #include "objfiles.h"
36e93f7393Sniklas #include "gdb_string.h"
37b725ae77Skettenis #include "linespec.h"
38b725ae77Skettenis #include "regcache.h"
39b725ae77Skettenis #include "reggroups.h"
40b725ae77Skettenis #include "arch-utils.h"
41b725ae77Skettenis #include "osabi.h"
42b725ae77Skettenis #include "block.h"
43*63addd46Skettenis #include "infcall.h"
44e93f7393Sniklas
45b725ae77Skettenis #include "elf-bfd.h"
46e93f7393Sniklas
47b725ae77Skettenis #include "alpha-tdep.h"
48e93f7393Sniklas
49e93f7393Sniklas
50b725ae77Skettenis static const char *
alpha_register_name(int regno)51b725ae77Skettenis alpha_register_name (int regno)
52e93f7393Sniklas {
53b725ae77Skettenis static const char * const register_names[] =
54e93f7393Sniklas {
55b725ae77Skettenis "v0", "t0", "t1", "t2", "t3", "t4", "t5", "t6",
56b725ae77Skettenis "t7", "s0", "s1", "s2", "s3", "s4", "s5", "fp",
57b725ae77Skettenis "a0", "a1", "a2", "a3", "a4", "a5", "t8", "t9",
58b725ae77Skettenis "t10", "t11", "ra", "t12", "at", "gp", "sp", "zero",
59b725ae77Skettenis "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
60b725ae77Skettenis "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
61b725ae77Skettenis "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
62b725ae77Skettenis "f24", "f25", "f26", "f27", "f28", "f29", "f30", "fpcr",
63b725ae77Skettenis "pc", "", "unique"
64b725ae77Skettenis };
65e93f7393Sniklas
66b725ae77Skettenis if (regno < 0)
67e93f7393Sniklas return NULL;
68b725ae77Skettenis if (regno >= (sizeof(register_names) / sizeof(*register_names)))
69b725ae77Skettenis return NULL;
70b725ae77Skettenis return register_names[regno];
71e93f7393Sniklas }
72e93f7393Sniklas
73e93f7393Sniklas static int
alpha_cannot_fetch_register(int regno)74b725ae77Skettenis alpha_cannot_fetch_register (int regno)
75e93f7393Sniklas {
76b725ae77Skettenis return regno == ALPHA_ZERO_REGNUM;
77b725ae77Skettenis }
78e93f7393Sniklas
79b725ae77Skettenis static int
alpha_cannot_store_register(int regno)80b725ae77Skettenis alpha_cannot_store_register (int regno)
81b725ae77Skettenis {
82b725ae77Skettenis return regno == ALPHA_ZERO_REGNUM;
83b725ae77Skettenis }
84e93f7393Sniklas
85b725ae77Skettenis static struct type *
alpha_register_type(struct gdbarch * gdbarch,int regno)86b725ae77Skettenis alpha_register_type (struct gdbarch *gdbarch, int regno)
87b725ae77Skettenis {
88b725ae77Skettenis if (regno == ALPHA_SP_REGNUM || regno == ALPHA_GP_REGNUM)
89b725ae77Skettenis return builtin_type_void_data_ptr;
90b725ae77Skettenis if (regno == ALPHA_PC_REGNUM)
91b725ae77Skettenis return builtin_type_void_func_ptr;
92b725ae77Skettenis
93b725ae77Skettenis /* Don't need to worry about little vs big endian until
94b725ae77Skettenis some jerk tries to port to alpha-unicosmk. */
95b725ae77Skettenis if (regno >= ALPHA_FP0_REGNUM && regno < ALPHA_FP0_REGNUM + 31)
96b725ae77Skettenis return builtin_type_ieee_double_little;
97b725ae77Skettenis
98b725ae77Skettenis return builtin_type_int64;
99b725ae77Skettenis }
100b725ae77Skettenis
101b725ae77Skettenis /* Is REGNUM a member of REGGROUP? */
102b725ae77Skettenis
103b725ae77Skettenis static int
alpha_register_reggroup_p(struct gdbarch * gdbarch,int regnum,struct reggroup * group)104b725ae77Skettenis alpha_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
105b725ae77Skettenis struct reggroup *group)
106b725ae77Skettenis {
107b725ae77Skettenis /* Filter out any registers eliminated, but whose regnum is
108b725ae77Skettenis reserved for backward compatibility, e.g. the vfp. */
109b725ae77Skettenis if (REGISTER_NAME (regnum) == NULL || *REGISTER_NAME (regnum) == '\0')
110b725ae77Skettenis return 0;
111b725ae77Skettenis
112b725ae77Skettenis if (group == all_reggroup)
113e93f7393Sniklas return 1;
114e93f7393Sniklas
115b725ae77Skettenis /* Zero should not be saved or restored. Technically it is a general
116b725ae77Skettenis register (just as $f31 would be a float if we represented it), but
117b725ae77Skettenis there's no point displaying it during "info regs", so leave it out
118b725ae77Skettenis of all groups except for "all". */
119b725ae77Skettenis if (regnum == ALPHA_ZERO_REGNUM)
120e93f7393Sniklas return 0;
121e93f7393Sniklas
122b725ae77Skettenis /* All other registers are saved and restored. */
123b725ae77Skettenis if (group == save_reggroup || group == restore_reggroup)
124b725ae77Skettenis return 1;
125e93f7393Sniklas
126b725ae77Skettenis /* All other groups are non-overlapping. */
127e93f7393Sniklas
128b725ae77Skettenis /* Since this is really a PALcode memory slot... */
129b725ae77Skettenis if (regnum == ALPHA_UNIQUE_REGNUM)
130b725ae77Skettenis return group == system_reggroup;
131e93f7393Sniklas
132b725ae77Skettenis /* Force the FPCR to be considered part of the floating point state. */
133b725ae77Skettenis if (regnum == ALPHA_FPCR_REGNUM)
134b725ae77Skettenis return group == float_reggroup;
135b725ae77Skettenis
136b725ae77Skettenis if (regnum >= ALPHA_FP0_REGNUM && regnum < ALPHA_FP0_REGNUM + 31)
137b725ae77Skettenis return group == float_reggroup;
138e93f7393Sniklas else
139b725ae77Skettenis return group == general_reggroup;
140e93f7393Sniklas }
141e93f7393Sniklas
142b725ae77Skettenis static int
alpha_register_byte(int regno)143b725ae77Skettenis alpha_register_byte (int regno)
144e93f7393Sniklas {
145b725ae77Skettenis return (regno * 8);
146b725ae77Skettenis }
147e93f7393Sniklas
148b725ae77Skettenis /* The following represents exactly the conversion performed by
149b725ae77Skettenis the LDS instruction. This applies to both single-precision
150b725ae77Skettenis floating point and 32-bit integers. */
151e93f7393Sniklas
152b725ae77Skettenis static void
alpha_lds(void * out,const void * in)153b725ae77Skettenis alpha_lds (void *out, const void *in)
154b725ae77Skettenis {
155b725ae77Skettenis ULONGEST mem = extract_unsigned_integer (in, 4);
156b725ae77Skettenis ULONGEST frac = (mem >> 0) & 0x7fffff;
157b725ae77Skettenis ULONGEST sign = (mem >> 31) & 1;
158b725ae77Skettenis ULONGEST exp_msb = (mem >> 30) & 1;
159b725ae77Skettenis ULONGEST exp_low = (mem >> 23) & 0x7f;
160b725ae77Skettenis ULONGEST exp, reg;
161b725ae77Skettenis
162b725ae77Skettenis exp = (exp_msb << 10) | exp_low;
163b725ae77Skettenis if (exp_msb)
164b725ae77Skettenis {
165b725ae77Skettenis if (exp_low == 0x7f)
166b725ae77Skettenis exp = 0x7ff;
167b725ae77Skettenis }
168e93f7393Sniklas else
169e93f7393Sniklas {
170b725ae77Skettenis if (exp_low != 0x00)
171b725ae77Skettenis exp |= 0x380;
172b725ae77Skettenis }
173e93f7393Sniklas
174b725ae77Skettenis reg = (sign << 63) | (exp << 52) | (frac << 29);
175b725ae77Skettenis store_unsigned_integer (out, 8, reg);
176b725ae77Skettenis }
177b725ae77Skettenis
178b725ae77Skettenis /* Similarly, this represents exactly the conversion performed by
179b725ae77Skettenis the STS instruction. */
180b725ae77Skettenis
181b725ae77Skettenis static void
alpha_sts(void * out,const void * in)182b725ae77Skettenis alpha_sts (void *out, const void *in)
183e93f7393Sniklas {
184b725ae77Skettenis ULONGEST reg, mem;
185b725ae77Skettenis
186b725ae77Skettenis reg = extract_unsigned_integer (in, 8);
187b725ae77Skettenis mem = ((reg >> 32) & 0xc0000000) | ((reg >> 29) & 0x3fffffff);
188b725ae77Skettenis store_unsigned_integer (out, 4, mem);
189e93f7393Sniklas }
190e93f7393Sniklas
191b725ae77Skettenis /* The alpha needs a conversion between register and memory format if the
192b725ae77Skettenis register is a floating point register and memory format is float, as the
193b725ae77Skettenis register format must be double or memory format is an integer with 4
194b725ae77Skettenis bytes or less, as the representation of integers in floating point
195b725ae77Skettenis registers is different. */
196e93f7393Sniklas
197b725ae77Skettenis static int
alpha_convert_register_p(int regno,struct type * type)198b725ae77Skettenis alpha_convert_register_p (int regno, struct type *type)
199e93f7393Sniklas {
200b725ae77Skettenis return (regno >= ALPHA_FP0_REGNUM && regno < ALPHA_FP0_REGNUM + 31);
201e93f7393Sniklas }
202e93f7393Sniklas
203b725ae77Skettenis static void
alpha_register_to_value(struct frame_info * frame,int regnum,struct type * valtype,void * out)204b725ae77Skettenis alpha_register_to_value (struct frame_info *frame, int regnum,
205b725ae77Skettenis struct type *valtype, void *out)
206b725ae77Skettenis {
207b725ae77Skettenis char in[MAX_REGISTER_SIZE];
208b725ae77Skettenis frame_register_read (frame, regnum, in);
209b725ae77Skettenis switch (TYPE_LENGTH (valtype))
210b725ae77Skettenis {
211b725ae77Skettenis case 4:
212b725ae77Skettenis alpha_sts (out, in);
213b725ae77Skettenis break;
214b725ae77Skettenis case 8:
215b725ae77Skettenis memcpy (out, in, 8);
216b725ae77Skettenis break;
217b725ae77Skettenis default:
218b725ae77Skettenis error ("Cannot retrieve value from floating point register");
219b725ae77Skettenis }
220b725ae77Skettenis }
221b725ae77Skettenis
222b725ae77Skettenis static void
alpha_value_to_register(struct frame_info * frame,int regnum,struct type * valtype,const void * in)223b725ae77Skettenis alpha_value_to_register (struct frame_info *frame, int regnum,
224b725ae77Skettenis struct type *valtype, const void *in)
225b725ae77Skettenis {
226b725ae77Skettenis char out[MAX_REGISTER_SIZE];
227b725ae77Skettenis switch (TYPE_LENGTH (valtype))
228b725ae77Skettenis {
229b725ae77Skettenis case 4:
230b725ae77Skettenis alpha_lds (out, in);
231b725ae77Skettenis break;
232b725ae77Skettenis case 8:
233b725ae77Skettenis memcpy (out, in, 8);
234b725ae77Skettenis break;
235b725ae77Skettenis default:
236b725ae77Skettenis error ("Cannot store value in floating point register");
237b725ae77Skettenis }
238b725ae77Skettenis put_frame_register (frame, regnum, out);
239b725ae77Skettenis }
240b725ae77Skettenis
241b725ae77Skettenis
242e93f7393Sniklas /* The alpha passes the first six arguments in the registers, the rest on
243b725ae77Skettenis the stack. The register arguments are stored in ARG_REG_BUFFER, and
244b725ae77Skettenis then moved into the register file; this simplifies the passing of a
245b725ae77Skettenis large struct which extends from the registers to the stack, plus avoids
246b725ae77Skettenis three ptrace invocations per word.
247b725ae77Skettenis
248b725ae77Skettenis We don't bother tracking which register values should go in integer
249b725ae77Skettenis regs or fp regs; we load the same values into both.
250b725ae77Skettenis
251e93f7393Sniklas If the called function is returning a structure, the address of the
252e93f7393Sniklas structure to be returned is passed as a hidden first argument. */
253e93f7393Sniklas
254b725ae77Skettenis static CORE_ADDR
alpha_push_dummy_call(struct gdbarch * gdbarch,struct value * function,struct regcache * regcache,CORE_ADDR bp_addr,int nargs,struct value ** args,CORE_ADDR sp,int struct_return,CORE_ADDR struct_addr)255*63addd46Skettenis alpha_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
256b725ae77Skettenis struct regcache *regcache, CORE_ADDR bp_addr,
257b725ae77Skettenis int nargs, struct value **args, CORE_ADDR sp,
258b725ae77Skettenis int struct_return, CORE_ADDR struct_addr)
259e93f7393Sniklas {
260b725ae77Skettenis int i;
261e93f7393Sniklas int accumulate_size = struct_return ? 8 : 0;
262b725ae77Skettenis struct alpha_arg
263b725ae77Skettenis {
264b725ae77Skettenis char *contents;
265b725ae77Skettenis int len;
266b725ae77Skettenis int offset;
267b725ae77Skettenis };
268b725ae77Skettenis struct alpha_arg *alpha_args
269b725ae77Skettenis = (struct alpha_arg *) alloca (nargs * sizeof (struct alpha_arg));
270b725ae77Skettenis struct alpha_arg *m_arg;
271b725ae77Skettenis char arg_reg_buffer[ALPHA_REGISTER_SIZE * ALPHA_NUM_ARG_REGS];
272e93f7393Sniklas int required_arg_regs;
273*63addd46Skettenis CORE_ADDR func_addr = find_function_addr (function, NULL);
274e93f7393Sniklas
275b725ae77Skettenis /* The ABI places the address of the called function in T12. */
276b725ae77Skettenis regcache_cooked_write_signed (regcache, ALPHA_T12_REGNUM, func_addr);
277b725ae77Skettenis
278b725ae77Skettenis /* Set the return address register to point to the entry point
279b725ae77Skettenis of the program, where a breakpoint lies in wait. */
280b725ae77Skettenis regcache_cooked_write_signed (regcache, ALPHA_RA_REGNUM, bp_addr);
281b725ae77Skettenis
282b725ae77Skettenis /* Lay out the arguments in memory. */
283e93f7393Sniklas for (i = 0, m_arg = alpha_args; i < nargs; i++, m_arg++)
284e93f7393Sniklas {
285b725ae77Skettenis struct value *arg = args[i];
286e93f7393Sniklas struct type *arg_type = check_typedef (VALUE_TYPE (arg));
287b725ae77Skettenis
288e93f7393Sniklas /* Cast argument to long if necessary as the compiler does it too. */
289e93f7393Sniklas switch (TYPE_CODE (arg_type))
290e93f7393Sniklas {
291e93f7393Sniklas case TYPE_CODE_INT:
292e93f7393Sniklas case TYPE_CODE_BOOL:
293e93f7393Sniklas case TYPE_CODE_CHAR:
294e93f7393Sniklas case TYPE_CODE_RANGE:
295e93f7393Sniklas case TYPE_CODE_ENUM:
296b725ae77Skettenis if (TYPE_LENGTH (arg_type) == 4)
297e93f7393Sniklas {
298b725ae77Skettenis /* 32-bit values must be sign-extended to 64 bits
299b725ae77Skettenis even if the base data type is unsigned. */
300b725ae77Skettenis arg_type = builtin_type_int32;
301b725ae77Skettenis arg = value_cast (arg_type, arg);
302b725ae77Skettenis }
303b725ae77Skettenis if (TYPE_LENGTH (arg_type) < ALPHA_REGISTER_SIZE)
304b725ae77Skettenis {
305b725ae77Skettenis arg_type = builtin_type_int64;
306e93f7393Sniklas arg = value_cast (arg_type, arg);
307e93f7393Sniklas }
308e93f7393Sniklas break;
309b725ae77Skettenis
310b725ae77Skettenis case TYPE_CODE_FLT:
311b725ae77Skettenis /* "float" arguments loaded in registers must be passed in
312b725ae77Skettenis register format, aka "double". */
313b725ae77Skettenis if (accumulate_size < sizeof (arg_reg_buffer)
314b725ae77Skettenis && TYPE_LENGTH (arg_type) == 4)
315b725ae77Skettenis {
316b725ae77Skettenis arg_type = builtin_type_ieee_double_little;
317b725ae77Skettenis arg = value_cast (arg_type, arg);
318b725ae77Skettenis }
319b725ae77Skettenis /* Tru64 5.1 has a 128-bit long double, and passes this by
320b725ae77Skettenis invisible reference. No one else uses this data type. */
321b725ae77Skettenis else if (TYPE_LENGTH (arg_type) == 16)
322b725ae77Skettenis {
323b725ae77Skettenis /* Allocate aligned storage. */
324b725ae77Skettenis sp = (sp & -16) - 16;
325b725ae77Skettenis
326b725ae77Skettenis /* Write the real data into the stack. */
327b725ae77Skettenis write_memory (sp, VALUE_CONTENTS (arg), 16);
328b725ae77Skettenis
329b725ae77Skettenis /* Construct the indirection. */
330b725ae77Skettenis arg_type = lookup_pointer_type (arg_type);
331b725ae77Skettenis arg = value_from_pointer (arg_type, sp);
332b725ae77Skettenis }
333b725ae77Skettenis break;
334b725ae77Skettenis
335b725ae77Skettenis case TYPE_CODE_COMPLEX:
336b725ae77Skettenis /* ??? The ABI says that complex values are passed as two
337b725ae77Skettenis separate scalar values. This distinction only matters
338b725ae77Skettenis for complex float. However, GCC does not implement this. */
339b725ae77Skettenis
340b725ae77Skettenis /* Tru64 5.1 has a 128-bit long double, and passes this by
341b725ae77Skettenis invisible reference. */
342b725ae77Skettenis if (TYPE_LENGTH (arg_type) == 32)
343b725ae77Skettenis {
344b725ae77Skettenis /* Allocate aligned storage. */
345b725ae77Skettenis sp = (sp & -16) - 16;
346b725ae77Skettenis
347b725ae77Skettenis /* Write the real data into the stack. */
348b725ae77Skettenis write_memory (sp, VALUE_CONTENTS (arg), 32);
349b725ae77Skettenis
350b725ae77Skettenis /* Construct the indirection. */
351b725ae77Skettenis arg_type = lookup_pointer_type (arg_type);
352b725ae77Skettenis arg = value_from_pointer (arg_type, sp);
353b725ae77Skettenis }
354b725ae77Skettenis break;
355b725ae77Skettenis
356e93f7393Sniklas default:
357e93f7393Sniklas break;
358e93f7393Sniklas }
359e93f7393Sniklas m_arg->len = TYPE_LENGTH (arg_type);
360e93f7393Sniklas m_arg->offset = accumulate_size;
361e93f7393Sniklas accumulate_size = (accumulate_size + m_arg->len + 7) & ~7;
362e93f7393Sniklas m_arg->contents = VALUE_CONTENTS (arg);
363e93f7393Sniklas }
364e93f7393Sniklas
365e93f7393Sniklas /* Determine required argument register loads, loading an argument register
366e93f7393Sniklas is expensive as it uses three ptrace calls. */
367e93f7393Sniklas required_arg_regs = accumulate_size / 8;
368e93f7393Sniklas if (required_arg_regs > ALPHA_NUM_ARG_REGS)
369e93f7393Sniklas required_arg_regs = ALPHA_NUM_ARG_REGS;
370e93f7393Sniklas
371e93f7393Sniklas /* Make room for the arguments on the stack. */
372b725ae77Skettenis if (accumulate_size < sizeof(arg_reg_buffer))
373b725ae77Skettenis accumulate_size = 0;
374b725ae77Skettenis else
375b725ae77Skettenis accumulate_size -= sizeof(arg_reg_buffer);
376e93f7393Sniklas sp -= accumulate_size;
377e93f7393Sniklas
378b725ae77Skettenis /* Keep sp aligned to a multiple of 16 as the ABI requires. */
379e93f7393Sniklas sp &= ~15;
380e93f7393Sniklas
381e93f7393Sniklas /* `Push' arguments on the stack. */
382e93f7393Sniklas for (i = nargs; m_arg--, --i >= 0;)
383e93f7393Sniklas {
384b725ae77Skettenis char *contents = m_arg->contents;
385b725ae77Skettenis int offset = m_arg->offset;
386b725ae77Skettenis int len = m_arg->len;
387b725ae77Skettenis
388b725ae77Skettenis /* Copy the bytes destined for registers into arg_reg_buffer. */
389b725ae77Skettenis if (offset < sizeof(arg_reg_buffer))
390b725ae77Skettenis {
391b725ae77Skettenis if (offset + len <= sizeof(arg_reg_buffer))
392b725ae77Skettenis {
393b725ae77Skettenis memcpy (arg_reg_buffer + offset, contents, len);
394b725ae77Skettenis continue;
395e93f7393Sniklas }
396b725ae77Skettenis else
397b725ae77Skettenis {
398b725ae77Skettenis int tlen = sizeof(arg_reg_buffer) - offset;
399b725ae77Skettenis memcpy (arg_reg_buffer + offset, contents, tlen);
400b725ae77Skettenis offset += tlen;
401b725ae77Skettenis contents += tlen;
402b725ae77Skettenis len -= tlen;
403b725ae77Skettenis }
404b725ae77Skettenis }
405b725ae77Skettenis
406b725ae77Skettenis /* Everything else goes to the stack. */
407b725ae77Skettenis write_memory (sp + offset - sizeof(arg_reg_buffer), contents, len);
408b725ae77Skettenis }
409b725ae77Skettenis if (struct_return)
410b725ae77Skettenis store_unsigned_integer (arg_reg_buffer, ALPHA_REGISTER_SIZE, struct_addr);
411e93f7393Sniklas
412e93f7393Sniklas /* Load the argument registers. */
413e93f7393Sniklas for (i = 0; i < required_arg_regs; i++)
414e93f7393Sniklas {
415b725ae77Skettenis regcache_cooked_write (regcache, ALPHA_A0_REGNUM + i,
416b725ae77Skettenis arg_reg_buffer + i*ALPHA_REGISTER_SIZE);
417b725ae77Skettenis regcache_cooked_write (regcache, ALPHA_FPA0_REGNUM + i,
418b725ae77Skettenis arg_reg_buffer + i*ALPHA_REGISTER_SIZE);
419e93f7393Sniklas }
420e93f7393Sniklas
421b725ae77Skettenis /* Finally, update the stack pointer. */
422b725ae77Skettenis regcache_cooked_write_signed (regcache, ALPHA_SP_REGNUM, sp);
423b725ae77Skettenis
424b725ae77Skettenis return sp;
425e93f7393Sniklas }
426e93f7393Sniklas
427b725ae77Skettenis /* Extract from REGCACHE the value about to be returned from a function
428b725ae77Skettenis and copy it into VALBUF. */
429b725ae77Skettenis
430b725ae77Skettenis static void
alpha_extract_return_value(struct type * valtype,struct regcache * regcache,void * valbuf)431b725ae77Skettenis alpha_extract_return_value (struct type *valtype, struct regcache *regcache,
432b725ae77Skettenis void *valbuf)
433e93f7393Sniklas {
434b725ae77Skettenis int length = TYPE_LENGTH (valtype);
435b725ae77Skettenis char raw_buffer[ALPHA_REGISTER_SIZE];
436b725ae77Skettenis ULONGEST l;
437e93f7393Sniklas
438b725ae77Skettenis switch (TYPE_CODE (valtype))
439e93f7393Sniklas {
440b725ae77Skettenis case TYPE_CODE_FLT:
441b725ae77Skettenis switch (length)
442b725ae77Skettenis {
443b725ae77Skettenis case 4:
444b725ae77Skettenis regcache_cooked_read (regcache, ALPHA_FP0_REGNUM, raw_buffer);
445b725ae77Skettenis alpha_sts (valbuf, raw_buffer);
446b725ae77Skettenis break;
447b725ae77Skettenis
448b725ae77Skettenis case 8:
449b725ae77Skettenis regcache_cooked_read (regcache, ALPHA_FP0_REGNUM, valbuf);
450b725ae77Skettenis break;
451b725ae77Skettenis
452b725ae77Skettenis case 16:
453b725ae77Skettenis regcache_cooked_read_unsigned (regcache, ALPHA_V0_REGNUM, &l);
454b725ae77Skettenis read_memory (l, valbuf, 16);
455b725ae77Skettenis break;
456b725ae77Skettenis
457b725ae77Skettenis default:
458b725ae77Skettenis internal_error (__FILE__, __LINE__, "unknown floating point width");
459e93f7393Sniklas }
460b725ae77Skettenis break;
461e93f7393Sniklas
462b725ae77Skettenis case TYPE_CODE_COMPLEX:
463b725ae77Skettenis switch (length)
464e93f7393Sniklas {
465b725ae77Skettenis case 8:
466b725ae77Skettenis /* ??? This isn't correct wrt the ABI, but it's what GCC does. */
467b725ae77Skettenis regcache_cooked_read (regcache, ALPHA_FP0_REGNUM, valbuf);
468b725ae77Skettenis break;
469b725ae77Skettenis
470b725ae77Skettenis case 16:
471b725ae77Skettenis regcache_cooked_read (regcache, ALPHA_FP0_REGNUM, valbuf);
472b725ae77Skettenis regcache_cooked_read (regcache, ALPHA_FP0_REGNUM+1,
473b725ae77Skettenis (char *)valbuf + 8);
474b725ae77Skettenis break;
475b725ae77Skettenis
476b725ae77Skettenis case 32:
477b725ae77Skettenis regcache_cooked_read_signed (regcache, ALPHA_V0_REGNUM, &l);
478b725ae77Skettenis read_memory (l, valbuf, 32);
479b725ae77Skettenis break;
480b725ae77Skettenis
481b725ae77Skettenis default:
482b725ae77Skettenis internal_error (__FILE__, __LINE__, "unknown floating point width");
483e93f7393Sniklas }
484b725ae77Skettenis break;
485e93f7393Sniklas
486b725ae77Skettenis default:
487b725ae77Skettenis /* Assume everything else degenerates to an integer. */
488b725ae77Skettenis regcache_cooked_read_unsigned (regcache, ALPHA_V0_REGNUM, &l);
489b725ae77Skettenis store_unsigned_integer (valbuf, length, l);
490e93f7393Sniklas break;
491e93f7393Sniklas }
492b725ae77Skettenis }
493e93f7393Sniklas
494b725ae77Skettenis /* Extract from REGCACHE the address of a structure about to be returned
495b725ae77Skettenis from a function. */
496e93f7393Sniklas
497b725ae77Skettenis static CORE_ADDR
alpha_extract_struct_value_address(struct regcache * regcache)498b725ae77Skettenis alpha_extract_struct_value_address (struct regcache *regcache)
499b725ae77Skettenis {
500b725ae77Skettenis ULONGEST addr;
501b725ae77Skettenis regcache_cooked_read_unsigned (regcache, ALPHA_V0_REGNUM, &addr);
502b725ae77Skettenis return addr;
503b725ae77Skettenis }
504e93f7393Sniklas
505b725ae77Skettenis /* Insert the given value into REGCACHE as if it was being
506b725ae77Skettenis returned by a function. */
507b725ae77Skettenis
508b725ae77Skettenis static void
alpha_store_return_value(struct type * valtype,struct regcache * regcache,const void * valbuf)509b725ae77Skettenis alpha_store_return_value (struct type *valtype, struct regcache *regcache,
510b725ae77Skettenis const void *valbuf)
511b725ae77Skettenis {
512b725ae77Skettenis int length = TYPE_LENGTH (valtype);
513b725ae77Skettenis char raw_buffer[ALPHA_REGISTER_SIZE];
514b725ae77Skettenis ULONGEST l;
515b725ae77Skettenis
516b725ae77Skettenis switch (TYPE_CODE (valtype))
517b725ae77Skettenis {
518b725ae77Skettenis case TYPE_CODE_FLT:
519b725ae77Skettenis switch (length)
520b725ae77Skettenis {
521b725ae77Skettenis case 4:
522b725ae77Skettenis alpha_lds (raw_buffer, valbuf);
523b725ae77Skettenis regcache_cooked_write (regcache, ALPHA_FP0_REGNUM, raw_buffer);
524b725ae77Skettenis break;
525b725ae77Skettenis
526b725ae77Skettenis case 8:
527b725ae77Skettenis regcache_cooked_write (regcache, ALPHA_FP0_REGNUM, valbuf);
528b725ae77Skettenis break;
529b725ae77Skettenis
530b725ae77Skettenis case 16:
531b725ae77Skettenis /* FIXME: 128-bit long doubles are returned like structures:
532b725ae77Skettenis by writing into indirect storage provided by the caller
533b725ae77Skettenis as the first argument. */
534b725ae77Skettenis error ("Cannot set a 128-bit long double return value.");
535b725ae77Skettenis
536b725ae77Skettenis default:
537b725ae77Skettenis internal_error (__FILE__, __LINE__, "unknown floating point width");
538b725ae77Skettenis }
539b725ae77Skettenis break;
540b725ae77Skettenis
541b725ae77Skettenis case TYPE_CODE_COMPLEX:
542b725ae77Skettenis switch (length)
543b725ae77Skettenis {
544b725ae77Skettenis case 8:
545b725ae77Skettenis /* ??? This isn't correct wrt the ABI, but it's what GCC does. */
546b725ae77Skettenis regcache_cooked_write (regcache, ALPHA_FP0_REGNUM, valbuf);
547b725ae77Skettenis break;
548b725ae77Skettenis
549b725ae77Skettenis case 16:
550b725ae77Skettenis regcache_cooked_write (regcache, ALPHA_FP0_REGNUM, valbuf);
551b725ae77Skettenis regcache_cooked_write (regcache, ALPHA_FP0_REGNUM+1,
552b725ae77Skettenis (const char *)valbuf + 8);
553b725ae77Skettenis break;
554b725ae77Skettenis
555b725ae77Skettenis case 32:
556b725ae77Skettenis /* FIXME: 128-bit long doubles are returned like structures:
557b725ae77Skettenis by writing into indirect storage provided by the caller
558b725ae77Skettenis as the first argument. */
559b725ae77Skettenis error ("Cannot set a 128-bit long double return value.");
560b725ae77Skettenis
561b725ae77Skettenis default:
562b725ae77Skettenis internal_error (__FILE__, __LINE__, "unknown floating point width");
563b725ae77Skettenis }
564b725ae77Skettenis break;
565b725ae77Skettenis
566b725ae77Skettenis default:
567b725ae77Skettenis /* Assume everything else degenerates to an integer. */
568b725ae77Skettenis /* 32-bit values must be sign-extended to 64 bits
569b725ae77Skettenis even if the base data type is unsigned. */
570b725ae77Skettenis if (length == 4)
571b725ae77Skettenis valtype = builtin_type_int32;
572b725ae77Skettenis l = unpack_long (valtype, valbuf);
573b725ae77Skettenis regcache_cooked_write_unsigned (regcache, ALPHA_V0_REGNUM, l);
574b725ae77Skettenis break;
575e93f7393Sniklas }
576e93f7393Sniklas }
577b725ae77Skettenis
578e93f7393Sniklas
579b725ae77Skettenis static const unsigned char *
alpha_breakpoint_from_pc(CORE_ADDR * pcptr,int * lenptr)580b725ae77Skettenis alpha_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
581b725ae77Skettenis {
582b725ae77Skettenis static const unsigned char alpha_breakpoint[] =
583b725ae77Skettenis { 0x80, 0, 0, 0 }; /* call_pal bpt */
584b725ae77Skettenis
585b725ae77Skettenis *lenptr = sizeof(alpha_breakpoint);
586b725ae77Skettenis return (alpha_breakpoint);
587b725ae77Skettenis }
588b725ae77Skettenis
589b725ae77Skettenis
590b725ae77Skettenis /* This returns the PC of the first insn after the prologue.
591b725ae77Skettenis If we can't find the prologue, then return 0. */
592b725ae77Skettenis
593b725ae77Skettenis CORE_ADDR
alpha_after_prologue(CORE_ADDR pc)594b725ae77Skettenis alpha_after_prologue (CORE_ADDR pc)
595b725ae77Skettenis {
596b725ae77Skettenis struct symtab_and_line sal;
597b725ae77Skettenis CORE_ADDR func_addr, func_end;
598b725ae77Skettenis
599b725ae77Skettenis if (!find_pc_partial_function (pc, NULL, &func_addr, &func_end))
600b725ae77Skettenis return 0;
601b725ae77Skettenis
602b725ae77Skettenis sal = find_pc_line (func_addr, 0);
603b725ae77Skettenis if (sal.end < func_end)
604b725ae77Skettenis return sal.end;
605b725ae77Skettenis
606b725ae77Skettenis /* The line after the prologue is after the end of the function. In this
607b725ae77Skettenis case, tell the caller to find the prologue the hard way. */
608b725ae77Skettenis return 0;
609b725ae77Skettenis }
610b725ae77Skettenis
611b725ae77Skettenis /* Read an instruction from memory at PC, looking through breakpoints. */
612b725ae77Skettenis
613b725ae77Skettenis unsigned int
alpha_read_insn(CORE_ADDR pc)614b725ae77Skettenis alpha_read_insn (CORE_ADDR pc)
615b725ae77Skettenis {
616b725ae77Skettenis char buf[4];
617b725ae77Skettenis int status;
618b725ae77Skettenis
619*63addd46Skettenis status = deprecated_read_memory_nobpt (pc, buf, 4);
620b725ae77Skettenis if (status)
621b725ae77Skettenis memory_error (status, pc);
622b725ae77Skettenis return extract_unsigned_integer (buf, 4);
623b725ae77Skettenis }
624b725ae77Skettenis
625e93f7393Sniklas /* To skip prologues, I use this predicate. Returns either PC itself
626e93f7393Sniklas if the code at PC does not look like a function prologue; otherwise
627e93f7393Sniklas returns an address that (if we're lucky) follows the prologue. If
628e93f7393Sniklas LENIENT, then we must skip everything which is involved in setting
629e93f7393Sniklas up the frame (it's OK to skip more, just so long as we don't skip
630b725ae77Skettenis anything which might clobber the registers which are being saved. */
631e93f7393Sniklas
632b725ae77Skettenis static CORE_ADDR
alpha_skip_prologue(CORE_ADDR pc)633b725ae77Skettenis alpha_skip_prologue (CORE_ADDR pc)
634e93f7393Sniklas {
635e93f7393Sniklas unsigned long inst;
636e93f7393Sniklas int offset;
637e93f7393Sniklas CORE_ADDR post_prologue_pc;
638e93f7393Sniklas char buf[4];
639e93f7393Sniklas
640e93f7393Sniklas /* Silently return the unaltered pc upon memory errors.
641e93f7393Sniklas This could happen on OSF/1 if decode_line_1 tries to skip the
642e93f7393Sniklas prologue for quickstarted shared library functions when the
643e93f7393Sniklas shared library is not yet mapped in.
644e93f7393Sniklas Reading target memory is slow over serial lines, so we perform
645b725ae77Skettenis this check only if the target has shared libraries (which all
646b725ae77Skettenis Alpha targets do). */
647e93f7393Sniklas if (target_read_memory (pc, buf, 4))
648e93f7393Sniklas return pc;
649e93f7393Sniklas
650e93f7393Sniklas /* See if we can determine the end of the prologue via the symbol table.
651e93f7393Sniklas If so, then return either PC, or the PC after the prologue, whichever
652e93f7393Sniklas is greater. */
653e93f7393Sniklas
654b725ae77Skettenis post_prologue_pc = alpha_after_prologue (pc);
655e93f7393Sniklas if (post_prologue_pc != 0)
656e93f7393Sniklas return max (pc, post_prologue_pc);
657e93f7393Sniklas
658e93f7393Sniklas /* Can't determine prologue from the symbol table, need to examine
659e93f7393Sniklas instructions. */
660e93f7393Sniklas
661e93f7393Sniklas /* Skip the typical prologue instructions. These are the stack adjustment
662e93f7393Sniklas instruction and the instructions that save registers on the stack
663e93f7393Sniklas or in the gcc frame. */
664e93f7393Sniklas for (offset = 0; offset < 100; offset += 4)
665e93f7393Sniklas {
666b725ae77Skettenis inst = alpha_read_insn (pc + offset);
667e93f7393Sniklas
668e93f7393Sniklas if ((inst & 0xffff0000) == 0x27bb0000) /* ldah $gp,n($t12) */
669e93f7393Sniklas continue;
670e93f7393Sniklas if ((inst & 0xffff0000) == 0x23bd0000) /* lda $gp,n($gp) */
671e93f7393Sniklas continue;
672e93f7393Sniklas if ((inst & 0xffff0000) == 0x23de0000) /* lda $sp,n($sp) */
673e93f7393Sniklas continue;
674b725ae77Skettenis if ((inst & 0xffe01fff) == 0x43c0153e) /* subq $sp,n,$sp */
675e93f7393Sniklas continue;
676b725ae77Skettenis
677b725ae77Skettenis if (((inst & 0xfc1f0000) == 0xb41e0000 /* stq reg,n($sp) */
678b725ae77Skettenis || (inst & 0xfc1f0000) == 0x9c1e0000) /* stt reg,n($sp) */
679b725ae77Skettenis && (inst & 0x03e00000) != 0x03e00000) /* reg != $zero */
680b725ae77Skettenis continue;
681b725ae77Skettenis
682b725ae77Skettenis if (inst == 0x47de040f) /* bis sp,sp,fp */
683b725ae77Skettenis continue;
684b725ae77Skettenis if (inst == 0x47fe040f) /* bis zero,sp,fp */
685b725ae77Skettenis continue;
686b725ae77Skettenis
687e93f7393Sniklas break;
688e93f7393Sniklas }
689e93f7393Sniklas return pc + offset;
690e93f7393Sniklas }
691e93f7393Sniklas
692b725ae77Skettenis
693b725ae77Skettenis /* Figure out where the longjmp will land.
694b725ae77Skettenis We expect the first arg to be a pointer to the jmp_buf structure from
695b725ae77Skettenis which we extract the PC (JB_PC) that we will land at. The PC is copied
696b725ae77Skettenis into the "pc". This routine returns true on success. */
697e93f7393Sniklas
698e93f7393Sniklas static int
alpha_get_longjmp_target(CORE_ADDR * pc)699b725ae77Skettenis alpha_get_longjmp_target (CORE_ADDR *pc)
700e93f7393Sniklas {
701b725ae77Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
702b725ae77Skettenis CORE_ADDR jb_addr;
703b725ae77Skettenis char raw_buffer[ALPHA_REGISTER_SIZE];
704e93f7393Sniklas
705b725ae77Skettenis jb_addr = read_register (ALPHA_A0_REGNUM);
706b725ae77Skettenis
707b725ae77Skettenis if (target_read_memory (jb_addr + (tdep->jb_pc * tdep->jb_elt_size),
708b725ae77Skettenis raw_buffer, tdep->jb_elt_size))
709b725ae77Skettenis return 0;
710b725ae77Skettenis
711b725ae77Skettenis *pc = extract_unsigned_integer (raw_buffer, tdep->jb_elt_size);
712b725ae77Skettenis return 1;
713e93f7393Sniklas }
714e93f7393Sniklas
715b725ae77Skettenis
716b725ae77Skettenis /* Frame unwinder for signal trampolines. We use alpha tdep bits that
717b725ae77Skettenis describe the location and shape of the sigcontext structure. After
718b725ae77Skettenis that, all registers are in memory, so it's easy. */
719b725ae77Skettenis /* ??? Shouldn't we be able to do this generically, rather than with
720b725ae77Skettenis OSABI data specific to Alpha? */
721b725ae77Skettenis
722b725ae77Skettenis struct alpha_sigtramp_unwind_cache
723e93f7393Sniklas {
724b725ae77Skettenis CORE_ADDR sigcontext_addr;
725b725ae77Skettenis };
726b725ae77Skettenis
727b725ae77Skettenis static struct alpha_sigtramp_unwind_cache *
alpha_sigtramp_frame_unwind_cache(struct frame_info * next_frame,void ** this_prologue_cache)728b725ae77Skettenis alpha_sigtramp_frame_unwind_cache (struct frame_info *next_frame,
729b725ae77Skettenis void **this_prologue_cache)
730e93f7393Sniklas {
731b725ae77Skettenis struct alpha_sigtramp_unwind_cache *info;
732b725ae77Skettenis struct gdbarch_tdep *tdep;
733b725ae77Skettenis
734b725ae77Skettenis if (*this_prologue_cache)
735b725ae77Skettenis return *this_prologue_cache;
736b725ae77Skettenis
737b725ae77Skettenis info = FRAME_OBSTACK_ZALLOC (struct alpha_sigtramp_unwind_cache);
738b725ae77Skettenis *this_prologue_cache = info;
739b725ae77Skettenis
740b725ae77Skettenis tdep = gdbarch_tdep (current_gdbarch);
741b725ae77Skettenis info->sigcontext_addr = tdep->sigcontext_addr (next_frame);
742b725ae77Skettenis
743b725ae77Skettenis return info;
744e93f7393Sniklas }
745e93f7393Sniklas
746b725ae77Skettenis /* Return the address of REGNUM in a sigtramp frame. Since this is
747b725ae77Skettenis all arithmetic, it doesn't seem worthwhile to cache it. */
748b725ae77Skettenis
749b725ae77Skettenis static CORE_ADDR
alpha_sigtramp_register_address(CORE_ADDR sigcontext_addr,int regnum)750b725ae77Skettenis alpha_sigtramp_register_address (CORE_ADDR sigcontext_addr, int regnum)
751e93f7393Sniklas {
752b725ae77Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
753b725ae77Skettenis
754b725ae77Skettenis if (regnum >= 0 && regnum < 32)
755b725ae77Skettenis return sigcontext_addr + tdep->sc_regs_offset + regnum * 8;
756b725ae77Skettenis else if (regnum >= ALPHA_FP0_REGNUM && regnum < ALPHA_FP0_REGNUM + 32)
757b725ae77Skettenis return sigcontext_addr + tdep->sc_fpregs_offset + regnum * 8;
758b725ae77Skettenis else if (regnum == ALPHA_PC_REGNUM)
759b725ae77Skettenis return sigcontext_addr + tdep->sc_pc_offset;
760b725ae77Skettenis
761b725ae77Skettenis return 0;
762e93f7393Sniklas }
763e93f7393Sniklas
764b725ae77Skettenis /* Given a GDB frame, determine the address of the calling function's
765b725ae77Skettenis frame. This will be used to create a new GDB frame struct. */
766e93f7393Sniklas
767e93f7393Sniklas static void
alpha_sigtramp_frame_this_id(struct frame_info * next_frame,void ** this_prologue_cache,struct frame_id * this_id)768b725ae77Skettenis alpha_sigtramp_frame_this_id (struct frame_info *next_frame,
769b725ae77Skettenis void **this_prologue_cache,
770b725ae77Skettenis struct frame_id *this_id)
771b725ae77Skettenis {
772b725ae77Skettenis struct alpha_sigtramp_unwind_cache *info
773b725ae77Skettenis = alpha_sigtramp_frame_unwind_cache (next_frame, this_prologue_cache);
774b725ae77Skettenis struct gdbarch_tdep *tdep;
775b725ae77Skettenis CORE_ADDR stack_addr, code_addr;
776b725ae77Skettenis
777b725ae77Skettenis /* If the OSABI couldn't locate the sigcontext, give up. */
778b725ae77Skettenis if (info->sigcontext_addr == 0)
779b725ae77Skettenis return;
780b725ae77Skettenis
781b725ae77Skettenis /* If we have dynamic signal trampolines, find their start.
782b725ae77Skettenis If we do not, then we must assume there is a symbol record
783b725ae77Skettenis that can provide the start address. */
784b725ae77Skettenis tdep = gdbarch_tdep (current_gdbarch);
785b725ae77Skettenis if (tdep->dynamic_sigtramp_offset)
786b725ae77Skettenis {
787b725ae77Skettenis int offset;
788b725ae77Skettenis code_addr = frame_pc_unwind (next_frame);
789b725ae77Skettenis offset = tdep->dynamic_sigtramp_offset (code_addr);
790b725ae77Skettenis if (offset >= 0)
791b725ae77Skettenis code_addr -= offset;
792b725ae77Skettenis else
793b725ae77Skettenis code_addr = 0;
794b725ae77Skettenis }
795b725ae77Skettenis else
796b725ae77Skettenis code_addr = frame_func_unwind (next_frame);
797b725ae77Skettenis
798b725ae77Skettenis /* The stack address is trivially read from the sigcontext. */
799b725ae77Skettenis stack_addr = alpha_sigtramp_register_address (info->sigcontext_addr,
800b725ae77Skettenis ALPHA_SP_REGNUM);
801b725ae77Skettenis stack_addr = get_frame_memory_unsigned (next_frame, stack_addr,
802b725ae77Skettenis ALPHA_REGISTER_SIZE);
803b725ae77Skettenis
804b725ae77Skettenis *this_id = frame_id_build (stack_addr, code_addr);
805b725ae77Skettenis }
806b725ae77Skettenis
807b725ae77Skettenis /* Retrieve the value of REGNUM in FRAME. Don't give up! */
808b725ae77Skettenis
809b725ae77Skettenis static void
alpha_sigtramp_frame_prev_register(struct frame_info * next_frame,void ** this_prologue_cache,int regnum,int * optimizedp,enum lval_type * lvalp,CORE_ADDR * addrp,int * realnump,void * bufferp)810b725ae77Skettenis alpha_sigtramp_frame_prev_register (struct frame_info *next_frame,
811b725ae77Skettenis void **this_prologue_cache,
812b725ae77Skettenis int regnum, int *optimizedp,
813b725ae77Skettenis enum lval_type *lvalp, CORE_ADDR *addrp,
814b725ae77Skettenis int *realnump, void *bufferp)
815b725ae77Skettenis {
816b725ae77Skettenis struct alpha_sigtramp_unwind_cache *info
817b725ae77Skettenis = alpha_sigtramp_frame_unwind_cache (next_frame, this_prologue_cache);
818b725ae77Skettenis CORE_ADDR addr;
819b725ae77Skettenis
820b725ae77Skettenis if (info->sigcontext_addr != 0)
821b725ae77Skettenis {
822b725ae77Skettenis /* All integer and fp registers are stored in memory. */
823b725ae77Skettenis addr = alpha_sigtramp_register_address (info->sigcontext_addr, regnum);
824b725ae77Skettenis if (addr != 0)
825b725ae77Skettenis {
826b725ae77Skettenis *optimizedp = 0;
827b725ae77Skettenis *lvalp = lval_memory;
828b725ae77Skettenis *addrp = addr;
829b725ae77Skettenis *realnump = -1;
830b725ae77Skettenis if (bufferp != NULL)
831b725ae77Skettenis get_frame_memory (next_frame, addr, bufferp, ALPHA_REGISTER_SIZE);
832b725ae77Skettenis return;
833b725ae77Skettenis }
834b725ae77Skettenis }
835b725ae77Skettenis
836b725ae77Skettenis /* This extra register may actually be in the sigcontext, but our
837b725ae77Skettenis current description of it in alpha_sigtramp_frame_unwind_cache
838b725ae77Skettenis doesn't include it. Too bad. Fall back on whatever's in the
839b725ae77Skettenis outer frame. */
840b725ae77Skettenis frame_register (next_frame, regnum, optimizedp, lvalp, addrp,
841b725ae77Skettenis realnump, bufferp);
842b725ae77Skettenis }
843b725ae77Skettenis
844b725ae77Skettenis static const struct frame_unwind alpha_sigtramp_frame_unwind = {
845b725ae77Skettenis SIGTRAMP_FRAME,
846b725ae77Skettenis alpha_sigtramp_frame_this_id,
847b725ae77Skettenis alpha_sigtramp_frame_prev_register
848b725ae77Skettenis };
849b725ae77Skettenis
850b725ae77Skettenis static const struct frame_unwind *
alpha_sigtramp_frame_sniffer(struct frame_info * next_frame)851b725ae77Skettenis alpha_sigtramp_frame_sniffer (struct frame_info *next_frame)
852b725ae77Skettenis {
853b725ae77Skettenis CORE_ADDR pc = frame_pc_unwind (next_frame);
854b725ae77Skettenis char *name;
855b725ae77Skettenis
856*63addd46Skettenis /* NOTE: cagney/2004-04-30: Do not copy/clone this code. Instead
857*63addd46Skettenis look at tramp-frame.h and other simplier per-architecture
858*63addd46Skettenis sigtramp unwinders. */
859*63addd46Skettenis
860*63addd46Skettenis /* We shouldn't even bother to try if the OSABI didn't register a
861*63addd46Skettenis sigcontext_addr handler or pc_in_sigtramp hander. */
862*63addd46Skettenis if (gdbarch_tdep (current_gdbarch)->sigcontext_addr == NULL)
863*63addd46Skettenis return NULL;
864*63addd46Skettenis if (gdbarch_tdep (current_gdbarch)->pc_in_sigtramp == NULL)
865b725ae77Skettenis return NULL;
866b725ae77Skettenis
867b725ae77Skettenis /* Otherwise we should be in a signal frame. */
868b725ae77Skettenis find_pc_partial_function (pc, &name, NULL, NULL);
869*63addd46Skettenis if (gdbarch_tdep (current_gdbarch)->pc_in_sigtramp (pc, name))
870b725ae77Skettenis return &alpha_sigtramp_frame_unwind;
871b725ae77Skettenis
872b725ae77Skettenis return NULL;
873b725ae77Skettenis }
874b725ae77Skettenis
875b725ae77Skettenis /* Fallback alpha frame unwinder. Uses instruction scanning and knows
876b725ae77Skettenis something about the traditional layout of alpha stack frames. */
877b725ae77Skettenis
878b725ae77Skettenis struct alpha_heuristic_unwind_cache
879b725ae77Skettenis {
880b725ae77Skettenis CORE_ADDR *saved_regs;
881b725ae77Skettenis CORE_ADDR vfp;
882b725ae77Skettenis CORE_ADDR start_pc;
883b725ae77Skettenis int return_reg;
884b725ae77Skettenis };
885b725ae77Skettenis
886b725ae77Skettenis /* Heuristic_proc_start may hunt through the text section for a long
887b725ae77Skettenis time across a 2400 baud serial line. Allows the user to limit this
888b725ae77Skettenis search. */
889b725ae77Skettenis static unsigned int heuristic_fence_post = 0;
890b725ae77Skettenis
891b725ae77Skettenis /* Attempt to locate the start of the function containing PC. We assume that
892b725ae77Skettenis the previous function ends with an about_to_return insn. Not foolproof by
893b725ae77Skettenis any means, since gcc is happy to put the epilogue in the middle of a
894b725ae77Skettenis function. But we're guessing anyway... */
895b725ae77Skettenis
896b725ae77Skettenis static CORE_ADDR
alpha_heuristic_proc_start(CORE_ADDR pc)897b725ae77Skettenis alpha_heuristic_proc_start (CORE_ADDR pc)
898b725ae77Skettenis {
899b725ae77Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
900b725ae77Skettenis CORE_ADDR last_non_nop = pc;
901b725ae77Skettenis CORE_ADDR fence = pc - heuristic_fence_post;
902b725ae77Skettenis CORE_ADDR orig_pc = pc;
903b725ae77Skettenis CORE_ADDR func;
904b725ae77Skettenis
905b725ae77Skettenis if (pc == 0)
906b725ae77Skettenis return 0;
907b725ae77Skettenis
908b725ae77Skettenis /* First see if we can find the start of the function from minimal
909b725ae77Skettenis symbol information. This can succeed with a binary that doesn't
910b725ae77Skettenis have debug info, but hasn't been stripped. */
911b725ae77Skettenis func = get_pc_function_start (pc);
912b725ae77Skettenis if (func)
913b725ae77Skettenis return func;
914b725ae77Skettenis
915b725ae77Skettenis if (heuristic_fence_post == UINT_MAX
916b725ae77Skettenis || fence < tdep->vm_min_address)
917b725ae77Skettenis fence = tdep->vm_min_address;
918b725ae77Skettenis
919b725ae77Skettenis /* Search back for previous return; also stop at a 0, which might be
920b725ae77Skettenis seen for instance before the start of a code section. Don't include
921b725ae77Skettenis nops, since this usually indicates padding between functions. */
922b725ae77Skettenis for (pc -= 4; pc >= fence; pc -= 4)
923b725ae77Skettenis {
924b725ae77Skettenis unsigned int insn = alpha_read_insn (pc);
925b725ae77Skettenis switch (insn)
926b725ae77Skettenis {
927b725ae77Skettenis case 0: /* invalid insn */
928b725ae77Skettenis case 0x6bfa8001: /* ret $31,($26),1 */
929b725ae77Skettenis return last_non_nop;
930b725ae77Skettenis
931b725ae77Skettenis case 0x2ffe0000: /* unop: ldq_u $31,0($30) */
932b725ae77Skettenis case 0x47ff041f: /* nop: bis $31,$31,$31 */
933b725ae77Skettenis break;
934b725ae77Skettenis
935b725ae77Skettenis default:
936b725ae77Skettenis last_non_nop = pc;
937b725ae77Skettenis break;
938b725ae77Skettenis }
939b725ae77Skettenis }
940b725ae77Skettenis
941b725ae77Skettenis /* It's not clear to me why we reach this point when stopping quietly,
942b725ae77Skettenis but with this test, at least we don't print out warnings for every
943b725ae77Skettenis child forked (eg, on decstation). 22apr93 rich@cygnus.com. */
944b725ae77Skettenis if (stop_soon == NO_STOP_QUIETLY)
945b725ae77Skettenis {
946b725ae77Skettenis static int blurb_printed = 0;
947b725ae77Skettenis
948b725ae77Skettenis if (fence == tdep->vm_min_address)
949b725ae77Skettenis warning ("Hit beginning of text section without finding");
950b725ae77Skettenis else
951b725ae77Skettenis warning ("Hit heuristic-fence-post without finding");
952b725ae77Skettenis warning ("enclosing function for address 0x%s", paddr_nz (orig_pc));
953b725ae77Skettenis
954b725ae77Skettenis if (!blurb_printed)
955b725ae77Skettenis {
956b725ae77Skettenis printf_filtered ("\
957b725ae77Skettenis This warning occurs if you are debugging a function without any symbols\n\
958b725ae77Skettenis (for example, in a stripped executable). In that case, you may wish to\n\
959b725ae77Skettenis increase the size of the search with the `set heuristic-fence-post' command.\n\
960b725ae77Skettenis \n\
961b725ae77Skettenis Otherwise, you told GDB there was a function where there isn't one, or\n\
962b725ae77Skettenis (more likely) you have encountered a bug in GDB.\n");
963b725ae77Skettenis blurb_printed = 1;
964b725ae77Skettenis }
965b725ae77Skettenis }
966b725ae77Skettenis
967b725ae77Skettenis return 0;
968b725ae77Skettenis }
969b725ae77Skettenis
970b725ae77Skettenis static struct alpha_heuristic_unwind_cache *
alpha_heuristic_frame_unwind_cache(struct frame_info * next_frame,void ** this_prologue_cache,CORE_ADDR start_pc)971b725ae77Skettenis alpha_heuristic_frame_unwind_cache (struct frame_info *next_frame,
972b725ae77Skettenis void **this_prologue_cache,
973b725ae77Skettenis CORE_ADDR start_pc)
974b725ae77Skettenis {
975b725ae77Skettenis struct alpha_heuristic_unwind_cache *info;
976b725ae77Skettenis ULONGEST val;
977b725ae77Skettenis CORE_ADDR limit_pc, cur_pc;
978b725ae77Skettenis int frame_reg, frame_size, return_reg, reg;
979b725ae77Skettenis
980b725ae77Skettenis if (*this_prologue_cache)
981b725ae77Skettenis return *this_prologue_cache;
982b725ae77Skettenis
983b725ae77Skettenis info = FRAME_OBSTACK_ZALLOC (struct alpha_heuristic_unwind_cache);
984b725ae77Skettenis *this_prologue_cache = info;
985b725ae77Skettenis info->saved_regs = frame_obstack_zalloc (SIZEOF_FRAME_SAVED_REGS);
986b725ae77Skettenis
987b725ae77Skettenis limit_pc = frame_pc_unwind (next_frame);
988b725ae77Skettenis if (start_pc == 0)
989b725ae77Skettenis start_pc = alpha_heuristic_proc_start (limit_pc);
990b725ae77Skettenis info->start_pc = start_pc;
991b725ae77Skettenis
992b725ae77Skettenis frame_reg = ALPHA_SP_REGNUM;
993b725ae77Skettenis frame_size = 0;
994b725ae77Skettenis return_reg = -1;
995b725ae77Skettenis
996b725ae77Skettenis /* If we've identified a likely place to start, do code scanning. */
997b725ae77Skettenis if (start_pc != 0)
998b725ae77Skettenis {
999b725ae77Skettenis /* Limit the forward search to 50 instructions. */
1000b725ae77Skettenis if (start_pc + 200 < limit_pc)
1001b725ae77Skettenis limit_pc = start_pc + 200;
1002b725ae77Skettenis
1003b725ae77Skettenis for (cur_pc = start_pc; cur_pc < limit_pc; cur_pc += 4)
1004b725ae77Skettenis {
1005b725ae77Skettenis unsigned int word = alpha_read_insn (cur_pc);
1006b725ae77Skettenis
1007b725ae77Skettenis if ((word & 0xffff0000) == 0x23de0000) /* lda $sp,n($sp) */
1008b725ae77Skettenis {
1009b725ae77Skettenis if (word & 0x8000)
1010b725ae77Skettenis {
1011b725ae77Skettenis /* Consider only the first stack allocation instruction
1012b725ae77Skettenis to contain the static size of the frame. */
1013b725ae77Skettenis if (frame_size == 0)
1014b725ae77Skettenis frame_size = (-word) & 0xffff;
1015b725ae77Skettenis }
1016b725ae77Skettenis else
1017b725ae77Skettenis {
1018b725ae77Skettenis /* Exit loop if a positive stack adjustment is found, which
1019b725ae77Skettenis usually means that the stack cleanup code in the function
1020b725ae77Skettenis epilogue is reached. */
1021b725ae77Skettenis break;
1022b725ae77Skettenis }
1023b725ae77Skettenis }
1024b725ae77Skettenis else if ((word & 0xfc1f0000) == 0xb41e0000) /* stq reg,n($sp) */
1025b725ae77Skettenis {
1026b725ae77Skettenis reg = (word & 0x03e00000) >> 21;
1027b725ae77Skettenis
1028b725ae77Skettenis /* Ignore this instruction if we have already encountered
1029b725ae77Skettenis an instruction saving the same register earlier in the
1030b725ae77Skettenis function code. The current instruction does not tell
1031b725ae77Skettenis us where the original value upon function entry is saved.
1032b725ae77Skettenis All it says is that the function we are scanning reused
1033b725ae77Skettenis that register for some computation of its own, and is now
1034b725ae77Skettenis saving its result. */
1035b725ae77Skettenis if (info->saved_regs[reg])
1036b725ae77Skettenis continue;
1037b725ae77Skettenis
1038b725ae77Skettenis if (reg == 31)
1039b725ae77Skettenis continue;
1040b725ae77Skettenis
1041b725ae77Skettenis /* Do not compute the address where the register was saved yet,
1042b725ae77Skettenis because we don't know yet if the offset will need to be
1043b725ae77Skettenis relative to $sp or $fp (we can not compute the address
1044b725ae77Skettenis relative to $sp if $sp is updated during the execution of
1045b725ae77Skettenis the current subroutine, for instance when doing some alloca).
1046b725ae77Skettenis So just store the offset for the moment, and compute the
1047b725ae77Skettenis address later when we know whether this frame has a frame
1048b725ae77Skettenis pointer or not. */
1049b725ae77Skettenis /* Hack: temporarily add one, so that the offset is non-zero
1050b725ae77Skettenis and we can tell which registers have save offsets below. */
1051b725ae77Skettenis info->saved_regs[reg] = (word & 0xffff) + 1;
1052b725ae77Skettenis
1053b725ae77Skettenis /* Starting with OSF/1-3.2C, the system libraries are shipped
1054b725ae77Skettenis without local symbols, but they still contain procedure
1055b725ae77Skettenis descriptors without a symbol reference. GDB is currently
1056b725ae77Skettenis unable to find these procedure descriptors and uses
1057b725ae77Skettenis heuristic_proc_desc instead.
1058b725ae77Skettenis As some low level compiler support routines (__div*, __add*)
1059b725ae77Skettenis use a non-standard return address register, we have to
1060b725ae77Skettenis add some heuristics to determine the return address register,
1061b725ae77Skettenis or stepping over these routines will fail.
1062b725ae77Skettenis Usually the return address register is the first register
1063b725ae77Skettenis saved on the stack, but assembler optimization might
1064b725ae77Skettenis rearrange the register saves.
1065b725ae77Skettenis So we recognize only a few registers (t7, t9, ra) within
1066b725ae77Skettenis the procedure prologue as valid return address registers.
1067b725ae77Skettenis If we encounter a return instruction, we extract the
1068b725ae77Skettenis the return address register from it.
1069b725ae77Skettenis
1070b725ae77Skettenis FIXME: Rewriting GDB to access the procedure descriptors,
1071b725ae77Skettenis e.g. via the minimal symbol table, might obviate this hack. */
1072b725ae77Skettenis if (return_reg == -1
1073b725ae77Skettenis && cur_pc < (start_pc + 80)
1074b725ae77Skettenis && (reg == ALPHA_T7_REGNUM
1075b725ae77Skettenis || reg == ALPHA_T9_REGNUM
1076b725ae77Skettenis || reg == ALPHA_RA_REGNUM))
1077b725ae77Skettenis return_reg = reg;
1078b725ae77Skettenis }
1079b725ae77Skettenis else if ((word & 0xffe0ffff) == 0x6be08001) /* ret zero,reg,1 */
1080b725ae77Skettenis return_reg = (word >> 16) & 0x1f;
1081b725ae77Skettenis else if (word == 0x47de040f) /* bis sp,sp,fp */
1082b725ae77Skettenis frame_reg = ALPHA_GCC_FP_REGNUM;
1083b725ae77Skettenis else if (word == 0x47fe040f) /* bis zero,sp,fp */
1084b725ae77Skettenis frame_reg = ALPHA_GCC_FP_REGNUM;
1085b725ae77Skettenis }
1086b725ae77Skettenis
1087b725ae77Skettenis /* If we haven't found a valid return address register yet, keep
1088b725ae77Skettenis searching in the procedure prologue. */
1089b725ae77Skettenis if (return_reg == -1)
1090b725ae77Skettenis {
1091b725ae77Skettenis while (cur_pc < (limit_pc + 80) && cur_pc < (start_pc + 80))
1092b725ae77Skettenis {
1093b725ae77Skettenis unsigned int word = alpha_read_insn (cur_pc);
1094b725ae77Skettenis
1095b725ae77Skettenis if ((word & 0xfc1f0000) == 0xb41e0000) /* stq reg,n($sp) */
1096b725ae77Skettenis {
1097b725ae77Skettenis reg = (word & 0x03e00000) >> 21;
1098b725ae77Skettenis if (reg == ALPHA_T7_REGNUM
1099b725ae77Skettenis || reg == ALPHA_T9_REGNUM
1100b725ae77Skettenis || reg == ALPHA_RA_REGNUM)
1101b725ae77Skettenis {
1102b725ae77Skettenis return_reg = reg;
1103b725ae77Skettenis break;
1104b725ae77Skettenis }
1105b725ae77Skettenis }
1106b725ae77Skettenis else if ((word & 0xffe0ffff) == 0x6be08001) /* ret zero,reg,1 */
1107b725ae77Skettenis {
1108b725ae77Skettenis return_reg = (word >> 16) & 0x1f;
1109b725ae77Skettenis break;
1110b725ae77Skettenis }
1111b725ae77Skettenis
1112b725ae77Skettenis cur_pc += 4;
1113b725ae77Skettenis }
1114b725ae77Skettenis }
1115b725ae77Skettenis }
1116b725ae77Skettenis
1117b725ae77Skettenis /* Failing that, do default to the customary RA. */
1118b725ae77Skettenis if (return_reg == -1)
1119b725ae77Skettenis return_reg = ALPHA_RA_REGNUM;
1120b725ae77Skettenis info->return_reg = return_reg;
1121b725ae77Skettenis
1122b725ae77Skettenis frame_unwind_unsigned_register (next_frame, frame_reg, &val);
1123b725ae77Skettenis info->vfp = val + frame_size;
1124b725ae77Skettenis
1125b725ae77Skettenis /* Convert offsets to absolute addresses. See above about adding
1126b725ae77Skettenis one to the offsets to make all detected offsets non-zero. */
1127b725ae77Skettenis for (reg = 0; reg < ALPHA_NUM_REGS; ++reg)
1128b725ae77Skettenis if (info->saved_regs[reg])
1129b725ae77Skettenis info->saved_regs[reg] += val - 1;
1130b725ae77Skettenis
1131b725ae77Skettenis return info;
1132b725ae77Skettenis }
1133b725ae77Skettenis
1134b725ae77Skettenis /* Given a GDB frame, determine the address of the calling function's
1135b725ae77Skettenis frame. This will be used to create a new GDB frame struct. */
1136b725ae77Skettenis
1137b725ae77Skettenis static void
alpha_heuristic_frame_this_id(struct frame_info * next_frame,void ** this_prologue_cache,struct frame_id * this_id)1138b725ae77Skettenis alpha_heuristic_frame_this_id (struct frame_info *next_frame,
1139b725ae77Skettenis void **this_prologue_cache,
1140b725ae77Skettenis struct frame_id *this_id)
1141b725ae77Skettenis {
1142b725ae77Skettenis struct alpha_heuristic_unwind_cache *info
1143b725ae77Skettenis = alpha_heuristic_frame_unwind_cache (next_frame, this_prologue_cache, 0);
1144b725ae77Skettenis
1145b725ae77Skettenis *this_id = frame_id_build (info->vfp, info->start_pc);
1146b725ae77Skettenis }
1147b725ae77Skettenis
1148b725ae77Skettenis /* Retrieve the value of REGNUM in FRAME. Don't give up! */
1149b725ae77Skettenis
1150b725ae77Skettenis static void
alpha_heuristic_frame_prev_register(struct frame_info * next_frame,void ** this_prologue_cache,int regnum,int * optimizedp,enum lval_type * lvalp,CORE_ADDR * addrp,int * realnump,void * bufferp)1151b725ae77Skettenis alpha_heuristic_frame_prev_register (struct frame_info *next_frame,
1152b725ae77Skettenis void **this_prologue_cache,
1153b725ae77Skettenis int regnum, int *optimizedp,
1154b725ae77Skettenis enum lval_type *lvalp, CORE_ADDR *addrp,
1155b725ae77Skettenis int *realnump, void *bufferp)
1156b725ae77Skettenis {
1157b725ae77Skettenis struct alpha_heuristic_unwind_cache *info
1158b725ae77Skettenis = alpha_heuristic_frame_unwind_cache (next_frame, this_prologue_cache, 0);
1159b725ae77Skettenis
1160b725ae77Skettenis /* The PC of the previous frame is stored in the link register of
1161b725ae77Skettenis the current frame. Frob regnum so that we pull the value from
1162b725ae77Skettenis the correct place. */
1163b725ae77Skettenis if (regnum == ALPHA_PC_REGNUM)
1164b725ae77Skettenis regnum = info->return_reg;
1165b725ae77Skettenis
1166b725ae77Skettenis /* For all registers known to be saved in the current frame,
1167b725ae77Skettenis do the obvious and pull the value out. */
1168b725ae77Skettenis if (info->saved_regs[regnum])
1169b725ae77Skettenis {
1170b725ae77Skettenis *optimizedp = 0;
1171b725ae77Skettenis *lvalp = lval_memory;
1172b725ae77Skettenis *addrp = info->saved_regs[regnum];
1173b725ae77Skettenis *realnump = -1;
1174b725ae77Skettenis if (bufferp != NULL)
1175b725ae77Skettenis get_frame_memory (next_frame, *addrp, bufferp, ALPHA_REGISTER_SIZE);
1176b725ae77Skettenis return;
1177b725ae77Skettenis }
1178b725ae77Skettenis
1179b725ae77Skettenis /* The stack pointer of the previous frame is computed by popping
1180b725ae77Skettenis the current stack frame. */
1181b725ae77Skettenis if (regnum == ALPHA_SP_REGNUM)
1182b725ae77Skettenis {
1183b725ae77Skettenis *optimizedp = 0;
1184b725ae77Skettenis *lvalp = not_lval;
1185b725ae77Skettenis *addrp = 0;
1186b725ae77Skettenis *realnump = -1;
1187b725ae77Skettenis if (bufferp != NULL)
1188b725ae77Skettenis store_unsigned_integer (bufferp, ALPHA_REGISTER_SIZE, info->vfp);
1189b725ae77Skettenis return;
1190b725ae77Skettenis }
1191b725ae77Skettenis
1192b725ae77Skettenis /* Otherwise assume the next frame has the same register value. */
1193b725ae77Skettenis frame_register (next_frame, regnum, optimizedp, lvalp, addrp,
1194b725ae77Skettenis realnump, bufferp);
1195b725ae77Skettenis }
1196b725ae77Skettenis
1197b725ae77Skettenis static const struct frame_unwind alpha_heuristic_frame_unwind = {
1198b725ae77Skettenis NORMAL_FRAME,
1199b725ae77Skettenis alpha_heuristic_frame_this_id,
1200b725ae77Skettenis alpha_heuristic_frame_prev_register
1201b725ae77Skettenis };
1202b725ae77Skettenis
1203b725ae77Skettenis static const struct frame_unwind *
alpha_heuristic_frame_sniffer(struct frame_info * next_frame)1204b725ae77Skettenis alpha_heuristic_frame_sniffer (struct frame_info *next_frame)
1205b725ae77Skettenis {
1206b725ae77Skettenis return &alpha_heuristic_frame_unwind;
1207b725ae77Skettenis }
1208b725ae77Skettenis
1209b725ae77Skettenis static CORE_ADDR
alpha_heuristic_frame_base_address(struct frame_info * next_frame,void ** this_prologue_cache)1210b725ae77Skettenis alpha_heuristic_frame_base_address (struct frame_info *next_frame,
1211b725ae77Skettenis void **this_prologue_cache)
1212b725ae77Skettenis {
1213b725ae77Skettenis struct alpha_heuristic_unwind_cache *info
1214b725ae77Skettenis = alpha_heuristic_frame_unwind_cache (next_frame, this_prologue_cache, 0);
1215b725ae77Skettenis
1216b725ae77Skettenis return info->vfp;
1217b725ae77Skettenis }
1218b725ae77Skettenis
1219b725ae77Skettenis static const struct frame_base alpha_heuristic_frame_base = {
1220b725ae77Skettenis &alpha_heuristic_frame_unwind,
1221b725ae77Skettenis alpha_heuristic_frame_base_address,
1222b725ae77Skettenis alpha_heuristic_frame_base_address,
1223b725ae77Skettenis alpha_heuristic_frame_base_address
1224b725ae77Skettenis };
1225b725ae77Skettenis
1226b725ae77Skettenis /* Just like reinit_frame_cache, but with the right arguments to be
1227b725ae77Skettenis callable as an sfunc. Used by the "set heuristic-fence-post" command. */
1228b725ae77Skettenis
1229b725ae77Skettenis static void
reinit_frame_cache_sfunc(char * args,int from_tty,struct cmd_list_element * c)1230b725ae77Skettenis reinit_frame_cache_sfunc (char *args, int from_tty, struct cmd_list_element *c)
1231e93f7393Sniklas {
1232e93f7393Sniklas reinit_frame_cache ();
1233e93f7393Sniklas }
1234e93f7393Sniklas
1235b725ae77Skettenis
1236b725ae77Skettenis /* ALPHA stack frames are almost impenetrable. When execution stops,
1237b725ae77Skettenis we basically have to look at symbol information for the function
1238b725ae77Skettenis that we stopped in, which tells us *which* register (if any) is
1239b725ae77Skettenis the base of the frame pointer, and what offset from that register
1240b725ae77Skettenis the frame itself is at.
1241e93f7393Sniklas
1242b725ae77Skettenis This presents a problem when trying to examine a stack in memory
1243b725ae77Skettenis (that isn't executing at the moment), using the "frame" command. We
1244b725ae77Skettenis don't have a PC, nor do we have any registers except SP.
1245b725ae77Skettenis
1246b725ae77Skettenis This routine takes two arguments, SP and PC, and tries to make the
1247b725ae77Skettenis cached frames look as if these two arguments defined a frame on the
1248b725ae77Skettenis cache. This allows the rest of info frame to extract the important
1249b725ae77Skettenis arguments without difficulty. */
1250b725ae77Skettenis
1251b725ae77Skettenis struct frame_info *
alpha_setup_arbitrary_frame(int argc,CORE_ADDR * argv)1252b725ae77Skettenis alpha_setup_arbitrary_frame (int argc, CORE_ADDR *argv)
1253e93f7393Sniklas {
1254b725ae77Skettenis if (argc != 2)
1255b725ae77Skettenis error ("ALPHA frame specifications require two arguments: sp and pc");
1256e93f7393Sniklas
1257b725ae77Skettenis return create_new_frame (argv[0], argv[1]);
1258b725ae77Skettenis }
1259e93f7393Sniklas
1260b725ae77Skettenis /* Assuming NEXT_FRAME->prev is a dummy, return the frame ID of that
1261b725ae77Skettenis dummy frame. The frame ID's base needs to match the TOS value
1262b725ae77Skettenis saved by save_dummy_frame_tos(), and the PC match the dummy frame's
1263b725ae77Skettenis breakpoint. */
1264e93f7393Sniklas
1265b725ae77Skettenis static struct frame_id
alpha_unwind_dummy_id(struct gdbarch * gdbarch,struct frame_info * next_frame)1266b725ae77Skettenis alpha_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
1267b725ae77Skettenis {
1268b725ae77Skettenis ULONGEST base;
1269b725ae77Skettenis frame_unwind_unsigned_register (next_frame, ALPHA_SP_REGNUM, &base);
1270b725ae77Skettenis return frame_id_build (base, frame_pc_unwind (next_frame));
1271b725ae77Skettenis }
1272e93f7393Sniklas
1273b725ae77Skettenis static CORE_ADDR
alpha_unwind_pc(struct gdbarch * gdbarch,struct frame_info * next_frame)1274b725ae77Skettenis alpha_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
1275b725ae77Skettenis {
1276b725ae77Skettenis ULONGEST pc;
1277b725ae77Skettenis frame_unwind_unsigned_register (next_frame, ALPHA_PC_REGNUM, &pc);
1278b725ae77Skettenis return pc;
1279b725ae77Skettenis }
1280b725ae77Skettenis
1281b725ae77Skettenis
1282b725ae77Skettenis /* Helper routines for alpha*-nat.c files to move register sets to and
1283b725ae77Skettenis from core files. The UNIQUE pointer is allowed to be NULL, as most
1284b725ae77Skettenis targets don't supply this value in their core files. */
1285b725ae77Skettenis
1286b725ae77Skettenis void
alpha_supply_int_regs(int regno,const void * r0_r30,const void * pc,const void * unique)1287b725ae77Skettenis alpha_supply_int_regs (int regno, const void *r0_r30,
1288b725ae77Skettenis const void *pc, const void *unique)
1289b725ae77Skettenis {
1290b725ae77Skettenis int i;
1291b725ae77Skettenis
1292b725ae77Skettenis for (i = 0; i < 31; ++i)
1293b725ae77Skettenis if (regno == i || regno == -1)
1294*63addd46Skettenis regcache_raw_supply (current_regcache, i, (const char *)r0_r30 + i*8);
1295b725ae77Skettenis
1296b725ae77Skettenis if (regno == ALPHA_ZERO_REGNUM || regno == -1)
1297*63addd46Skettenis regcache_raw_supply (current_regcache, ALPHA_ZERO_REGNUM, NULL);
1298b725ae77Skettenis
1299b725ae77Skettenis if (regno == ALPHA_PC_REGNUM || regno == -1)
1300*63addd46Skettenis regcache_raw_supply (current_regcache, ALPHA_PC_REGNUM, pc);
1301b725ae77Skettenis
1302b725ae77Skettenis if (regno == ALPHA_UNIQUE_REGNUM || regno == -1)
1303*63addd46Skettenis regcache_raw_supply (current_regcache, ALPHA_UNIQUE_REGNUM, unique);
1304e93f7393Sniklas }
1305e93f7393Sniklas
1306e93f7393Sniklas void
alpha_fill_int_regs(int regno,void * r0_r30,void * pc,void * unique)1307b725ae77Skettenis alpha_fill_int_regs (int regno, void *r0_r30, void *pc, void *unique)
1308b725ae77Skettenis {
1309b725ae77Skettenis int i;
1310b725ae77Skettenis
1311b725ae77Skettenis for (i = 0; i < 31; ++i)
1312b725ae77Skettenis if (regno == i || regno == -1)
1313*63addd46Skettenis regcache_raw_collect (current_regcache, i, (char *)r0_r30 + i*8);
1314b725ae77Skettenis
1315b725ae77Skettenis if (regno == ALPHA_PC_REGNUM || regno == -1)
1316*63addd46Skettenis regcache_raw_collect (current_regcache, ALPHA_PC_REGNUM, pc);
1317b725ae77Skettenis
1318b725ae77Skettenis if (unique && (regno == ALPHA_UNIQUE_REGNUM || regno == -1))
1319*63addd46Skettenis regcache_raw_collect (current_regcache, ALPHA_UNIQUE_REGNUM, unique);
1320b725ae77Skettenis }
1321b725ae77Skettenis
1322b725ae77Skettenis void
alpha_supply_fp_regs(int regno,const void * f0_f30,const void * fpcr)1323b725ae77Skettenis alpha_supply_fp_regs (int regno, const void *f0_f30, const void *fpcr)
1324b725ae77Skettenis {
1325b725ae77Skettenis int i;
1326b725ae77Skettenis
1327b725ae77Skettenis for (i = ALPHA_FP0_REGNUM; i < ALPHA_FP0_REGNUM + 31; ++i)
1328b725ae77Skettenis if (regno == i || regno == -1)
1329*63addd46Skettenis regcache_raw_supply (current_regcache, i,
1330*63addd46Skettenis (const char *)f0_f30 + (i - ALPHA_FP0_REGNUM) * 8);
1331b725ae77Skettenis
1332b725ae77Skettenis if (regno == ALPHA_FPCR_REGNUM || regno == -1)
1333*63addd46Skettenis regcache_raw_supply (current_regcache, ALPHA_FPCR_REGNUM, fpcr);
1334b725ae77Skettenis }
1335b725ae77Skettenis
1336b725ae77Skettenis void
alpha_fill_fp_regs(int regno,void * f0_f30,void * fpcr)1337b725ae77Skettenis alpha_fill_fp_regs (int regno, void *f0_f30, void *fpcr)
1338b725ae77Skettenis {
1339b725ae77Skettenis int i;
1340b725ae77Skettenis
1341b725ae77Skettenis for (i = ALPHA_FP0_REGNUM; i < ALPHA_FP0_REGNUM + 31; ++i)
1342b725ae77Skettenis if (regno == i || regno == -1)
1343*63addd46Skettenis regcache_raw_collect (current_regcache, i,
1344*63addd46Skettenis (char *)f0_f30 + (i - ALPHA_FP0_REGNUM) * 8);
1345b725ae77Skettenis
1346b725ae77Skettenis if (regno == ALPHA_FPCR_REGNUM || regno == -1)
1347*63addd46Skettenis regcache_raw_collect (current_regcache, ALPHA_FPCR_REGNUM, fpcr);
1348b725ae77Skettenis }
1349b725ae77Skettenis
1350b725ae77Skettenis
1351b725ae77Skettenis /* alpha_software_single_step() is called just before we want to resume
1352b725ae77Skettenis the inferior, if we want to single-step it but there is no hardware
1353b725ae77Skettenis or kernel single-step support (NetBSD on Alpha, for example). We find
1354b725ae77Skettenis the target of the coming instruction and breakpoint it.
1355b725ae77Skettenis
1356b725ae77Skettenis single_step is also called just after the inferior stops. If we had
1357b725ae77Skettenis set up a simulated single-step, we undo our damage. */
1358b725ae77Skettenis
1359b725ae77Skettenis static CORE_ADDR
alpha_next_pc(CORE_ADDR pc)1360b725ae77Skettenis alpha_next_pc (CORE_ADDR pc)
1361b725ae77Skettenis {
1362b725ae77Skettenis unsigned int insn;
1363b725ae77Skettenis unsigned int op;
1364b725ae77Skettenis int offset;
1365b725ae77Skettenis LONGEST rav;
1366b725ae77Skettenis
1367b725ae77Skettenis insn = alpha_read_insn (pc);
1368b725ae77Skettenis
1369b725ae77Skettenis /* Opcode is top 6 bits. */
1370b725ae77Skettenis op = (insn >> 26) & 0x3f;
1371b725ae77Skettenis
1372b725ae77Skettenis if (op == 0x1a)
1373b725ae77Skettenis {
1374b725ae77Skettenis /* Jump format: target PC is:
1375b725ae77Skettenis RB & ~3 */
1376b725ae77Skettenis return (read_register ((insn >> 16) & 0x1f) & ~3);
1377b725ae77Skettenis }
1378b725ae77Skettenis
1379b725ae77Skettenis if ((op & 0x30) == 0x30)
1380b725ae77Skettenis {
1381b725ae77Skettenis /* Branch format: target PC is:
1382b725ae77Skettenis (new PC) + (4 * sext(displacement)) */
1383b725ae77Skettenis if (op == 0x30 || /* BR */
1384b725ae77Skettenis op == 0x34) /* BSR */
1385b725ae77Skettenis {
1386b725ae77Skettenis branch_taken:
1387b725ae77Skettenis offset = (insn & 0x001fffff);
1388b725ae77Skettenis if (offset & 0x00100000)
1389b725ae77Skettenis offset |= 0xffe00000;
1390b725ae77Skettenis offset *= 4;
1391b725ae77Skettenis return (pc + 4 + offset);
1392b725ae77Skettenis }
1393b725ae77Skettenis
1394b725ae77Skettenis /* Need to determine if branch is taken; read RA. */
1395b725ae77Skettenis rav = (LONGEST) read_register ((insn >> 21) & 0x1f);
1396b725ae77Skettenis switch (op)
1397b725ae77Skettenis {
1398b725ae77Skettenis case 0x38: /* BLBC */
1399b725ae77Skettenis if ((rav & 1) == 0)
1400b725ae77Skettenis goto branch_taken;
1401b725ae77Skettenis break;
1402b725ae77Skettenis case 0x3c: /* BLBS */
1403b725ae77Skettenis if (rav & 1)
1404b725ae77Skettenis goto branch_taken;
1405b725ae77Skettenis break;
1406b725ae77Skettenis case 0x39: /* BEQ */
1407b725ae77Skettenis if (rav == 0)
1408b725ae77Skettenis goto branch_taken;
1409b725ae77Skettenis break;
1410b725ae77Skettenis case 0x3d: /* BNE */
1411b725ae77Skettenis if (rav != 0)
1412b725ae77Skettenis goto branch_taken;
1413b725ae77Skettenis break;
1414b725ae77Skettenis case 0x3a: /* BLT */
1415b725ae77Skettenis if (rav < 0)
1416b725ae77Skettenis goto branch_taken;
1417b725ae77Skettenis break;
1418b725ae77Skettenis case 0x3b: /* BLE */
1419b725ae77Skettenis if (rav <= 0)
1420b725ae77Skettenis goto branch_taken;
1421b725ae77Skettenis break;
1422b725ae77Skettenis case 0x3f: /* BGT */
1423b725ae77Skettenis if (rav > 0)
1424b725ae77Skettenis goto branch_taken;
1425b725ae77Skettenis break;
1426b725ae77Skettenis case 0x3e: /* BGE */
1427b725ae77Skettenis if (rav >= 0)
1428b725ae77Skettenis goto branch_taken;
1429b725ae77Skettenis break;
1430b725ae77Skettenis
1431b725ae77Skettenis /* ??? Missing floating-point branches. */
1432b725ae77Skettenis }
1433b725ae77Skettenis }
1434b725ae77Skettenis
1435b725ae77Skettenis /* Not a branch or branch not taken; target PC is:
1436b725ae77Skettenis pc + 4 */
1437b725ae77Skettenis return (pc + 4);
1438b725ae77Skettenis }
1439b725ae77Skettenis
1440b725ae77Skettenis void
alpha_software_single_step(enum target_signal sig,int insert_breakpoints_p)1441b725ae77Skettenis alpha_software_single_step (enum target_signal sig, int insert_breakpoints_p)
1442b725ae77Skettenis {
1443b725ae77Skettenis static CORE_ADDR next_pc;
1444b725ae77Skettenis typedef char binsn_quantum[BREAKPOINT_MAX];
1445b725ae77Skettenis static binsn_quantum break_mem;
1446b725ae77Skettenis CORE_ADDR pc;
1447b725ae77Skettenis
1448b725ae77Skettenis if (insert_breakpoints_p)
1449b725ae77Skettenis {
1450b725ae77Skettenis pc = read_pc ();
1451b725ae77Skettenis next_pc = alpha_next_pc (pc);
1452b725ae77Skettenis
1453b725ae77Skettenis target_insert_breakpoint (next_pc, break_mem);
1454b725ae77Skettenis }
1455b725ae77Skettenis else
1456b725ae77Skettenis {
1457b725ae77Skettenis target_remove_breakpoint (next_pc, break_mem);
1458b725ae77Skettenis write_pc (next_pc);
1459b725ae77Skettenis }
1460b725ae77Skettenis }
1461b725ae77Skettenis
1462b725ae77Skettenis
1463b725ae77Skettenis /* Initialize the current architecture based on INFO. If possible, re-use an
1464b725ae77Skettenis architecture from ARCHES, which is a list of architectures already created
1465b725ae77Skettenis during this debugging session.
1466b725ae77Skettenis
1467b725ae77Skettenis Called e.g. at program startup, when reading a core file, and when reading
1468b725ae77Skettenis a binary file. */
1469b725ae77Skettenis
1470b725ae77Skettenis static struct gdbarch *
alpha_gdbarch_init(struct gdbarch_info info,struct gdbarch_list * arches)1471b725ae77Skettenis alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
1472b725ae77Skettenis {
1473b725ae77Skettenis struct gdbarch_tdep *tdep;
1474b725ae77Skettenis struct gdbarch *gdbarch;
1475b725ae77Skettenis
1476b725ae77Skettenis /* Try to determine the ABI of the object we are loading. */
1477b725ae77Skettenis if (info.abfd != NULL && info.osabi == GDB_OSABI_UNKNOWN)
1478b725ae77Skettenis {
1479b725ae77Skettenis /* If it's an ECOFF file, assume it's OSF/1. */
1480b725ae77Skettenis if (bfd_get_flavour (info.abfd) == bfd_target_ecoff_flavour)
1481b725ae77Skettenis info.osabi = GDB_OSABI_OSF1;
1482b725ae77Skettenis }
1483b725ae77Skettenis
1484b725ae77Skettenis /* Find a candidate among extant architectures. */
1485b725ae77Skettenis arches = gdbarch_list_lookup_by_info (arches, &info);
1486b725ae77Skettenis if (arches != NULL)
1487b725ae77Skettenis return arches->gdbarch;
1488b725ae77Skettenis
1489b725ae77Skettenis tdep = xmalloc (sizeof (struct gdbarch_tdep));
1490b725ae77Skettenis gdbarch = gdbarch_alloc (&info, tdep);
1491b725ae77Skettenis
1492b725ae77Skettenis /* Lowest text address. This is used by heuristic_proc_start()
1493b725ae77Skettenis to decide when to stop looking. */
1494*63addd46Skettenis tdep->vm_min_address = (CORE_ADDR) 0x120000000LL;
1495b725ae77Skettenis
1496b725ae77Skettenis tdep->dynamic_sigtramp_offset = NULL;
1497b725ae77Skettenis tdep->sigcontext_addr = NULL;
1498b725ae77Skettenis tdep->sc_pc_offset = 2 * 8;
1499b725ae77Skettenis tdep->sc_regs_offset = 4 * 8;
1500b725ae77Skettenis tdep->sc_fpregs_offset = tdep->sc_regs_offset + 32 * 8 + 8;
1501b725ae77Skettenis
1502b725ae77Skettenis tdep->jb_pc = -1; /* longjmp support not enabled by default */
1503b725ae77Skettenis
1504b725ae77Skettenis /* Type sizes */
1505b725ae77Skettenis set_gdbarch_short_bit (gdbarch, 16);
1506b725ae77Skettenis set_gdbarch_int_bit (gdbarch, 32);
1507b725ae77Skettenis set_gdbarch_long_bit (gdbarch, 64);
1508b725ae77Skettenis set_gdbarch_long_long_bit (gdbarch, 64);
1509b725ae77Skettenis set_gdbarch_float_bit (gdbarch, 32);
1510b725ae77Skettenis set_gdbarch_double_bit (gdbarch, 64);
1511b725ae77Skettenis set_gdbarch_long_double_bit (gdbarch, 64);
1512b725ae77Skettenis set_gdbarch_ptr_bit (gdbarch, 64);
1513b725ae77Skettenis
1514b725ae77Skettenis /* Register info */
1515b725ae77Skettenis set_gdbarch_num_regs (gdbarch, ALPHA_NUM_REGS);
1516b725ae77Skettenis set_gdbarch_sp_regnum (gdbarch, ALPHA_SP_REGNUM);
1517b725ae77Skettenis set_gdbarch_pc_regnum (gdbarch, ALPHA_PC_REGNUM);
1518b725ae77Skettenis set_gdbarch_fp0_regnum (gdbarch, ALPHA_FP0_REGNUM);
1519b725ae77Skettenis
1520b725ae77Skettenis set_gdbarch_register_name (gdbarch, alpha_register_name);
1521b725ae77Skettenis set_gdbarch_deprecated_register_byte (gdbarch, alpha_register_byte);
1522b725ae77Skettenis set_gdbarch_register_type (gdbarch, alpha_register_type);
1523b725ae77Skettenis
1524b725ae77Skettenis set_gdbarch_cannot_fetch_register (gdbarch, alpha_cannot_fetch_register);
1525b725ae77Skettenis set_gdbarch_cannot_store_register (gdbarch, alpha_cannot_store_register);
1526b725ae77Skettenis
1527b725ae77Skettenis set_gdbarch_convert_register_p (gdbarch, alpha_convert_register_p);
1528b725ae77Skettenis set_gdbarch_register_to_value (gdbarch, alpha_register_to_value);
1529b725ae77Skettenis set_gdbarch_value_to_register (gdbarch, alpha_value_to_register);
1530b725ae77Skettenis
1531b725ae77Skettenis set_gdbarch_register_reggroup_p (gdbarch, alpha_register_reggroup_p);
1532b725ae77Skettenis
1533b725ae77Skettenis /* Prologue heuristics. */
1534b725ae77Skettenis set_gdbarch_skip_prologue (gdbarch, alpha_skip_prologue);
1535b725ae77Skettenis
1536b725ae77Skettenis /* Disassembler. */
1537b725ae77Skettenis set_gdbarch_print_insn (gdbarch, print_insn_alpha);
1538b725ae77Skettenis
1539b725ae77Skettenis /* Call info. */
1540b725ae77Skettenis
1541*63addd46Skettenis set_gdbarch_deprecated_use_struct_convention (gdbarch, always_use_struct_convention);
1542b725ae77Skettenis set_gdbarch_extract_return_value (gdbarch, alpha_extract_return_value);
1543b725ae77Skettenis set_gdbarch_store_return_value (gdbarch, alpha_store_return_value);
1544b725ae77Skettenis set_gdbarch_deprecated_extract_struct_value_address (gdbarch, alpha_extract_struct_value_address);
1545b725ae77Skettenis
1546b725ae77Skettenis /* Settings for calling functions in the inferior. */
1547b725ae77Skettenis set_gdbarch_push_dummy_call (gdbarch, alpha_push_dummy_call);
1548b725ae77Skettenis
1549b725ae77Skettenis /* Methods for saving / extracting a dummy frame's ID. */
1550b725ae77Skettenis set_gdbarch_unwind_dummy_id (gdbarch, alpha_unwind_dummy_id);
1551b725ae77Skettenis
1552b725ae77Skettenis /* Return the unwound PC value. */
1553b725ae77Skettenis set_gdbarch_unwind_pc (gdbarch, alpha_unwind_pc);
1554b725ae77Skettenis
1555b725ae77Skettenis set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
1556b725ae77Skettenis set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
1557b725ae77Skettenis
1558b725ae77Skettenis set_gdbarch_breakpoint_from_pc (gdbarch, alpha_breakpoint_from_pc);
1559b725ae77Skettenis set_gdbarch_decr_pc_after_break (gdbarch, 4);
1560b725ae77Skettenis
1561b725ae77Skettenis /* Hook in ABI-specific overrides, if they have been registered. */
1562b725ae77Skettenis gdbarch_init_osabi (info, gdbarch);
1563b725ae77Skettenis
1564b725ae77Skettenis /* Now that we have tuned the configuration, set a few final things
1565b725ae77Skettenis based on what the OS ABI has told us. */
1566b725ae77Skettenis
1567b725ae77Skettenis if (tdep->jb_pc >= 0)
1568b725ae77Skettenis set_gdbarch_get_longjmp_target (gdbarch, alpha_get_longjmp_target);
1569b725ae77Skettenis
1570b725ae77Skettenis frame_unwind_append_sniffer (gdbarch, alpha_sigtramp_frame_sniffer);
1571b725ae77Skettenis frame_unwind_append_sniffer (gdbarch, alpha_heuristic_frame_sniffer);
1572b725ae77Skettenis
1573b725ae77Skettenis frame_base_set_default (gdbarch, &alpha_heuristic_frame_base);
1574b725ae77Skettenis
1575b725ae77Skettenis return gdbarch;
1576b725ae77Skettenis }
1577b725ae77Skettenis
1578b725ae77Skettenis void
alpha_dwarf2_init_abi(struct gdbarch_info info,struct gdbarch * gdbarch)1579b725ae77Skettenis alpha_dwarf2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
1580b725ae77Skettenis {
1581b725ae77Skettenis frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
1582b725ae77Skettenis frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer);
1583b725ae77Skettenis }
1584b725ae77Skettenis
1585b725ae77Skettenis extern initialize_file_ftype _initialize_alpha_tdep; /* -Wmissing-prototypes */
1586b725ae77Skettenis
1587b725ae77Skettenis void
_initialize_alpha_tdep(void)1588b725ae77Skettenis _initialize_alpha_tdep (void)
1589e93f7393Sniklas {
1590e93f7393Sniklas struct cmd_list_element *c;
1591e93f7393Sniklas
1592b725ae77Skettenis gdbarch_register (bfd_arch_alpha, alpha_gdbarch_init, NULL);
1593e93f7393Sniklas
1594e93f7393Sniklas /* Let the user set the fence post for heuristic_proc_start. */
1595e93f7393Sniklas
1596e93f7393Sniklas /* We really would like to have both "0" and "unlimited" work, but
1597e93f7393Sniklas command.c doesn't deal with that. So make it a var_zinteger
1598e93f7393Sniklas because the user can always use "999999" or some such for unlimited. */
1599e93f7393Sniklas c = add_set_cmd ("heuristic-fence-post", class_support, var_zinteger,
1600e93f7393Sniklas (char *) &heuristic_fence_post,
1601e93f7393Sniklas "\
1602e93f7393Sniklas Set the distance searched for the start of a function.\n\
1603e93f7393Sniklas If you are debugging a stripped executable, GDB needs to search through the\n\
1604e93f7393Sniklas program for the start of a function. This command sets the distance of the\n\
1605e93f7393Sniklas search. The only need to set it is when debugging a stripped executable.",
1606e93f7393Sniklas &setlist);
1607e93f7393Sniklas /* We need to throw away the frame cache when we set this, since it
1608e93f7393Sniklas might change our ability to get backtraces. */
1609b725ae77Skettenis set_cmd_sfunc (c, reinit_frame_cache_sfunc);
1610*63addd46Skettenis deprecated_add_show_from_set (c, &showlist);
1611e93f7393Sniklas }
1612