xref: /openbsd-src/gnu/usr.bin/binutils/gdb/alpha-tdep.c (revision 63addd46c1e40ca0f49488ddcdc4ab598023b0c1)
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