]> Git Repo - binutils.git/blob - gdb/i960-tdep.c
* cadillac.c, cadillac-patches: Rename to energize.c and
[binutils.git] / gdb / i960-tdep.c
1 /* Target-machine dependent code for the Intel 960
2    Copyright (C) 1991 Free Software Foundation, Inc.
3    Contributed by Intel Corporation.
4    examine_prologue and other parts contributed by Wind River Systems.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
21
22 /* Miscellaneous i80960-dependent routines.
23    Most are called from macros defined in "tm-i960.h".  */
24
25 #include "defs.h"
26 #include <signal.h>
27 #include "symtab.h"
28 #include "value.h"
29 #include "frame.h"
30 #include "ieee-float.h"
31
32 /* Structure of i960 extended floating point format.  */
33
34 const struct ext_format ext_format_i960 = {
35 /* tot sbyte smask expbyte manbyte */
36    12, 9,    0x80, 9,8,    4,0,         /* i960 */
37 };
38
39 /* gdb960 is always running on a non-960 host.  Check its characteristics.
40    This routine must be called as part of gdb initialization.  */
41
42 static void
43 check_host()
44 {
45         int i;
46
47         static struct typestruct {
48                 int hostsize;           /* Size of type on host         */
49                 int i960size;           /* Size of type on i960         */
50                 char *typename;         /* Name of type, for error msg  */
51         } types[] = {
52                 { sizeof(short),  2, "short" },
53                 { sizeof(int),    4, "int" },
54                 { sizeof(long),   4, "long" },
55                 { sizeof(float),  4, "float" },
56                 { sizeof(double), 8, "double" },
57                 { sizeof(char *), 4, "pointer" },
58         };
59 #define TYPELEN (sizeof(types) / sizeof(struct typestruct))
60
61         /* Make sure that host type sizes are same as i960
62          */
63         for ( i = 0; i < TYPELEN; i++ ){
64                 if ( types[i].hostsize != types[i].i960size ){
65                         printf("sizeof(%s) != %d:  PROCEED AT YOUR OWN RISK!\n",
66                                         types[i].typename, types[i].i960size );
67                 }
68
69         }
70 }
71 \f
72 /* Examine an i960 function prologue, recording the addresses at which
73    registers are saved explicitly by the prologue code, and returning
74    the address of the first instruction after the prologue (but not
75    after the instruction at address LIMIT, as explained below).
76
77    LIMIT places an upper bound on addresses of the instructions to be
78    examined.  If the prologue code scan reaches LIMIT, the scan is
79    aborted and LIMIT is returned.  This is used, when examining the
80    prologue for the current frame, to keep examine_prologue () from
81    claiming that a given register has been saved when in fact the
82    instruction that saves it has not yet been executed.  LIMIT is used
83    at other times to stop the scan when we hit code after the true
84    function prologue (e.g. for the first source line) which might
85    otherwise be mistaken for function prologue.
86
87    The format of the function prologue matched by this routine is
88    derived from examination of the source to gcc960 1.21, particularly
89    the routine i960_function_prologue ().  A "regular expression" for
90    the function prologue is given below:
91
92    (lda LRn, g14
93     mov g14, g[0-7]
94     (mov 0, g14) | (lda 0, g14))?
95
96    (mov[qtl]? g[0-15], r[4-15])*
97    ((addo [1-31], sp, sp) | (lda n(sp), sp))?
98    (st[qtl]? g[0-15], n(fp))*
99
100    (cmpobne 0, g14, LFn
101     mov sp, g14
102     lda 0x30(sp), sp
103     LFn: stq g0, (g14)
104     stq g4, 0x10(g14)
105     stq g8, 0x20(g14))?
106
107    (st g14, n(fp))?
108    (mov g13,r[4-15])?
109 */
110
111 /* Macros for extracting fields from i960 instructions.  */
112
113 #define BITMASK(pos, width) (((0x1 << (width)) - 1) << (pos))
114 #define EXTRACT_FIELD(val, pos, width) ((val) >> (pos) & BITMASK (0, width))
115
116 #define REG_SRC1(insn)    EXTRACT_FIELD (insn, 0, 5)
117 #define REG_SRC2(insn)    EXTRACT_FIELD (insn, 14, 5)
118 #define REG_SRCDST(insn)  EXTRACT_FIELD (insn, 19, 5)
119 #define MEM_SRCDST(insn)  EXTRACT_FIELD (insn, 19, 5)
120 #define MEMA_OFFSET(insn) EXTRACT_FIELD (insn, 0, 12)
121
122 /* Fetch the instruction at ADDR, returning 0 if ADDR is beyond LIM or
123    is not the address of a valid instruction, the address of the next
124    instruction beyond ADDR otherwise.  *PWORD1 receives the first word
125    of the instruction, and (for two-word instructions), *PWORD2 receives
126    the second.  */
127
128 #define NEXT_PROLOGUE_INSN(addr, lim, pword1, pword2) \
129   (((addr) < (lim)) ? next_insn (addr, pword1, pword2) : 0)
130
131 static CORE_ADDR
132 examine_prologue (ip, limit, frame_addr, fsr)
133      register CORE_ADDR ip;
134      register CORE_ADDR limit;
135      FRAME_ADDR frame_addr;
136      struct frame_saved_regs *fsr;
137 {
138   register CORE_ADDR next_ip;
139   register int src, dst;
140   register unsigned int *pcode;
141   unsigned int insn1, insn2;
142   int size;
143   int within_leaf_prologue;
144   CORE_ADDR save_addr;
145   static unsigned int varargs_prologue_code [] =
146     {
147        0x3507a00c,      /* cmpobne 0x0, g14, LFn */
148        0x5cf01601,      /* mov sp, g14           */
149        0x8c086030,      /* lda 0x30(sp), sp      */
150        0xb2879000,      /* LFn: stq  g0, (g14)   */
151        0xb2a7a010,      /* stq g4, 0x10(g14)     */
152        0xb2c7a020       /* stq g8, 0x20(g14)     */
153     };
154
155   /* Accept a leaf procedure prologue code fragment if present.
156      Note that ip might point to either the leaf or non-leaf
157      entry point; we look for the non-leaf entry point first:  */
158
159   within_leaf_prologue = 0;
160   if ((next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn1, &insn2))
161       && ((insn1 & 0xfffff000) == 0x8cf00000         /* lda LRx, g14 (MEMA) */
162           || (insn1 & 0xfffffc60) == 0x8cf03000))    /* lda LRx, g14 (MEMB) */
163     {
164       within_leaf_prologue = 1;
165       next_ip = NEXT_PROLOGUE_INSN (next_ip, limit, &insn1, &insn2);
166     }
167
168   /* Now look for the prologue code at a leaf entry point:  */
169
170   if (next_ip
171       && (insn1 & 0xff87ffff) == 0x5c80161e         /* mov g14, gx */
172       && REG_SRCDST (insn1) <= G0_REGNUM + 7)
173     {
174       within_leaf_prologue = 1;
175       if ((next_ip = NEXT_PROLOGUE_INSN (next_ip, limit, &insn1, &insn2))
176           && (insn1 == 0x8cf00000                   /* lda 0, g14 */
177               || insn1 == 0x5cf01e00))              /* mov 0, g14 */
178         {
179           ip = next_ip;
180           next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn1, &insn2);
181           within_leaf_prologue = 0;
182         }
183     }
184
185   /* If something that looks like the beginning of a leaf prologue
186      has been seen, but the remainder of the prologue is missing, bail.
187      We don't know what we've got.  */
188
189   if (within_leaf_prologue)
190     return (ip);
191           
192   /* Accept zero or more instances of "mov[qtl]? gx, ry", where y >= 4.
193      This may cause us to mistake the moving of a register
194      parameter to a local register for the saving of a callee-saved
195      register, but that can't be helped, since with the
196      "-fcall-saved" flag, any register can be made callee-saved.  */
197
198   while (next_ip
199          && (insn1 & 0xfc802fb0) == 0x5c000610
200          && (dst = REG_SRCDST (insn1)) >= (R0_REGNUM + 4))
201     {
202       src = REG_SRC1 (insn1);
203       size = EXTRACT_FIELD (insn1, 24, 2) + 1;
204       save_addr = frame_addr + ((dst - R0_REGNUM) * 4);
205       while (size--)
206         {
207           fsr->regs[src++] = save_addr;
208           save_addr += 4;
209         }
210       ip = next_ip;
211       next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn1, &insn2);
212     }
213
214   /* Accept an optional "addo n, sp, sp" or "lda n(sp), sp".  */
215
216   if (next_ip &&
217       ((insn1 & 0xffffffe0) == 0x59084800       /* addo n, sp, sp */
218        || (insn1 & 0xfffff000) == 0x8c086000    /* lda n(sp), sp (MEMA) */
219        || (insn1 & 0xfffffc60) == 0x8c087400))  /* lda n(sp), sp (MEMB) */
220     {
221       ip = next_ip;
222       next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn1, &insn2);
223     }
224
225   /* Accept zero or more instances of "st[qtl]? gx, n(fp)".  
226      This may cause us to mistake the copying of a register
227      parameter to the frame for the saving of a callee-saved
228      register, but that can't be helped, since with the
229      "-fcall-saved" flag, any register can be made callee-saved.
230      We can, however, refuse to accept a save of register g14,
231      since that is matched explicitly below.  */
232
233   while (next_ip &&
234          ((insn1 & 0xf787f000) == 0x9287e000      /* stl? gx, n(fp) (MEMA) */
235           || (insn1 & 0xf787fc60) == 0x9287f400   /* stl? gx, n(fp) (MEMB) */
236           || (insn1 & 0xef87f000) == 0xa287e000   /* st[tq] gx, n(fp) (MEMA) */
237           || (insn1 & 0xef87fc60) == 0xa287f400)  /* st[tq] gx, n(fp) (MEMB) */
238          && ((src = MEM_SRCDST (insn1)) != G14_REGNUM))
239     {
240       save_addr = frame_addr + ((insn1 & BITMASK (12, 1))
241                                 ? insn2 : MEMA_OFFSET (insn1));
242       size = (insn1 & BITMASK (29, 1)) ? ((insn1 & BITMASK (28, 1)) ? 4 : 3)
243                                        : ((insn1 & BITMASK (27, 1)) ? 2 : 1);
244       while (size--)
245         {
246           fsr->regs[src++] = save_addr;
247           save_addr += 4;
248         }
249       ip = next_ip;
250       next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn1, &insn2);
251     }
252
253   /* Accept the varargs prologue code if present.  */
254
255   size = sizeof (varargs_prologue_code) / sizeof (int);
256   pcode = varargs_prologue_code;
257   while (size-- && next_ip && *pcode++ == insn1)
258     {
259       ip = next_ip;
260       next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn1, &insn2);
261     }
262
263   /* Accept an optional "st g14, n(fp)".  */
264
265   if (next_ip &&
266       ((insn1 & 0xfffff000) == 0x92f7e000        /* st g14, n(fp) (MEMA) */
267        || (insn1 & 0xfffffc60) == 0x92f7f400))   /* st g14, n(fp) (MEMB) */
268     {
269       fsr->regs[G14_REGNUM] = frame_addr + ((insn1 & BITMASK (12, 1))
270                                             ? insn2 : MEMA_OFFSET (insn1));
271       ip = next_ip;
272       next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn1, &insn2);
273     }
274
275   /* Accept zero or one instance of "mov g13, ry", where y >= 4.
276      This is saving the address where a struct should be returned.  */
277
278   if (next_ip
279       && (insn1 & 0xff802fbf) == 0x5c00061d
280       && (dst = REG_SRCDST (insn1)) >= (R0_REGNUM + 4))
281     {
282       save_addr = frame_addr + ((dst - R0_REGNUM) * 4);
283       fsr->regs[G0_REGNUM+13] = save_addr;
284       ip = next_ip;
285 #if 0  /* We'll need this once there is a subsequent instruction examined. */
286       next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn1, &insn2);
287 #endif
288     }
289
290   return (ip);
291 }
292
293 /* Given an ip value corresponding to the start of a function,
294    return the ip of the first instruction after the function 
295    prologue.  */
296
297 CORE_ADDR
298 skip_prologue (ip)
299      CORE_ADDR (ip);
300 {
301   struct frame_saved_regs saved_regs_dummy;
302   struct symtab_and_line sal;
303   CORE_ADDR limit;
304
305   sal = find_pc_line (ip, 0);
306   limit = (sal.end) ? sal.end : 0xffffffff;
307
308   return (examine_prologue (ip, limit, (FRAME_ADDR) 0, &saved_regs_dummy));
309 }
310
311 /* Put here the code to store, into a struct frame_saved_regs,
312    the addresses of the saved registers of frame described by FRAME_INFO.
313    This includes special registers such as pc and fp saved in special
314    ways in the stack frame.  sp is even more special:
315    the address we return for it IS the sp for the next frame.
316
317    We cache the result of doing this in the frame_cache_obstack, since
318    it is fairly expensive.  */
319
320 void
321 frame_find_saved_regs (fi, fsr)
322      struct frame_info *fi;
323      struct frame_saved_regs *fsr;
324 {
325   register CORE_ADDR next_addr;
326   register CORE_ADDR *saved_regs;
327   register int regnum;
328   register struct frame_saved_regs *cache_fsr;
329   extern struct obstack frame_cache_obstack;
330   CORE_ADDR ip;
331   struct symtab_and_line sal;
332   CORE_ADDR limit;
333
334   if (!fi->fsr)
335     {
336       cache_fsr = (struct frame_saved_regs *)
337                   obstack_alloc (&frame_cache_obstack,
338                                  sizeof (struct frame_saved_regs));
339       bzero (cache_fsr, sizeof (struct frame_saved_regs));
340       fi->fsr = cache_fsr;
341
342       /* Find the start and end of the function prologue.  If the PC
343          is in the function prologue, we only consider the part that
344          has executed already.  */
345          
346       ip = get_pc_function_start (fi->pc);
347       sal = find_pc_line (ip, 0);
348       limit = (sal.end && sal.end < fi->pc) ? sal.end: fi->pc;
349
350       examine_prologue (ip, limit, fi->frame, cache_fsr);
351
352       /* Record the addresses at which the local registers are saved.
353          Strictly speaking, we should only do this for non-leaf procedures,
354          but no one will ever look at these values if it is a leaf procedure,
355          since local registers are always caller-saved.  */
356
357       next_addr = (CORE_ADDR) fi->frame;
358       saved_regs = cache_fsr->regs;
359       for (regnum = R0_REGNUM; regnum <= R15_REGNUM; regnum++)
360         {
361           *saved_regs++ = next_addr;
362           next_addr += 4;
363         }
364
365       cache_fsr->regs[FP_REGNUM] = cache_fsr->regs[PFP_REGNUM];
366     }
367
368   *fsr = *fi->fsr;
369
370   /* Fetch the value of the sp from memory every time, since it
371      is conceivable that it has changed since the cache was flushed.  
372      This unfortunately undoes much of the savings from caching the 
373      saved register values.  I suggest adding an argument to 
374      get_frame_saved_regs () specifying the register number we're
375      interested in (or -1 for all registers).  This would be passed
376      through to FRAME_FIND_SAVED_REGS (), permitting more efficient
377      computation of saved register addresses (e.g., on the i960,
378      we don't have to examine the prologue to find local registers). 
379         -- [email protected] 
380      FIXME, we don't need to refetch this, since the cache is cleared
381      every time the child process is restarted.  If GDB itself
382      modifies SP, it has to clear the cache by hand (does it?).  -gnu */
383
384   fsr->regs[SP_REGNUM] = read_memory_integer (fsr->regs[SP_REGNUM], 4);
385 }
386
387 /* Return the address of the argument block for the frame
388    described by FI.  Returns 0 if the address is unknown.  */
389
390 CORE_ADDR
391 frame_args_address (fi, must_be_correct)
392      struct frame_info *fi;
393 {
394   register FRAME frame;
395   struct frame_saved_regs fsr;
396   CORE_ADDR ap;
397
398   /* If g14 was saved in the frame by the function prologue code, return
399      the saved value.  If the frame is current and we are being sloppy,
400      return the value of g14.  Otherwise, return zero.  */
401
402   frame = FRAME_INFO_ID (fi);
403   get_frame_saved_regs (fi, &fsr);
404   if (fsr.regs[G14_REGNUM])
405     ap = read_memory_integer (fsr.regs[G14_REGNUM],4);
406   else {
407     if (must_be_correct)
408       return 0;                 /* Don't cache this result */
409     if (get_next_frame (frame))
410       ap = 0;
411     else
412       ap = read_register (G14_REGNUM);
413   }
414   fi->arg_pointer = ap;         /* Cache it for next time */
415   return ap;
416 }
417
418 /* Return the address of the return struct for the frame
419    described by FI.  Returns 0 if the address is unknown.  */
420
421 CORE_ADDR
422 frame_struct_result_address (fi)
423      struct frame_info *fi;
424 {
425   register FRAME frame;
426   struct frame_saved_regs fsr;
427   CORE_ADDR ap;
428
429   /* If the frame is non-current, check to see if g14 was saved in the
430      frame by the function prologue code; return the saved value if so,
431      zero otherwise.  If the frame is current, return the value of g14.
432
433      FIXME, shouldn't this use the saved value as long as we are past
434      the function prologue, and only use the current value if we have
435      no saved value and are at TOS?   -- [email protected] */
436
437   frame = FRAME_INFO_ID (fi);
438   if (get_next_frame (frame)) {
439     get_frame_saved_regs (fi, &fsr);
440     if (fsr.regs[G13_REGNUM])
441       ap = read_memory_integer (fsr.regs[G13_REGNUM],4);
442     else
443       ap = 0;
444   } else {
445     ap = read_register (G13_REGNUM);
446   }
447   return ap;
448 }
449
450 /* Return address to which the currently executing leafproc will return,
451    or 0 if ip is not in a leafproc (or if we can't tell if it is).
452   
453    Do this by finding the starting address of the routine in which ip lies.
454    If the instruction there is "mov g14, gx" (where x is in [0,7]), this
455    is a leafproc and the return address is in register gx.  Well, this is
456    true unless the return address points at a RET instruction in the current
457    procedure, which indicates that we have a 'dual entry' routine that
458    has been entered through the CALL entry point.  */
459
460 CORE_ADDR
461 leafproc_return (ip)
462      CORE_ADDR ip;      /* ip from currently executing function */
463 {
464   register struct minimal_symbol *msymbol;
465   char *p;
466   int dst;
467   unsigned int insn1, insn2;
468   CORE_ADDR return_addr;
469   char *index ();
470
471   if ((msymbol = lookup_minimal_symbol_by_pc (ip)) != NULL)
472     {
473       if ((p = index (msymbol -> name, '.')) && !strcmp (p, ".lf"))
474         {
475           if (next_insn (msymbol -> address, &insn1, &insn2)
476               && (insn1 & 0xff87ffff) == 0x5c80161e       /* mov g14, gx */
477               && (dst = REG_SRCDST (insn1)) <= G0_REGNUM + 7)
478             {
479               /* Get the return address.  If the "mov g14, gx" 
480                  instruction hasn't been executed yet, read
481                  the return address from g14; otherwise, read it
482                  from the register into which g14 was moved.  */
483
484               return_addr = read_register ((ip == msymbol->address)
485                                            ? G14_REGNUM : dst);
486
487               /* We know we are in a leaf procedure, but we don't know
488                  whether the caller actually did a "bal" to the ".lf"
489                  entry point, or a normal "call" to the non-leaf entry
490                  point one instruction before.  In the latter case, the
491                  return address will be the address of a "ret"
492                  instruction within the procedure itself.  We test for
493                  this below.  */
494
495               if (!next_insn (return_addr, &insn1, &insn2)
496                   || (insn1 & 0xff000000) != 0xa000000   /* ret */
497                   || lookup_minimal_symbol_by_pc (return_addr) != msymbol)
498                 return (return_addr);
499             }
500         }
501     }
502   
503   return (0);
504 }
505
506 /* Immediately after a function call, return the saved pc.
507    Can't go through the frames for this because on some machines
508    the new frame is not set up until the new function executes
509    some instructions. 
510    On the i960, the frame *is* set up immediately after the call,
511    unless the function is a leaf procedure.  */
512
513 CORE_ADDR
514 saved_pc_after_call (frame)
515      FRAME frame;
516 {
517   CORE_ADDR saved_pc;
518   CORE_ADDR get_frame_pc ();
519
520   saved_pc = leafproc_return (get_frame_pc (frame));
521   if (!saved_pc)
522     saved_pc = FRAME_SAVED_PC (frame);
523
524   return (saved_pc);
525 }
526
527 /* Discard from the stack the innermost frame,
528    restoring all saved registers.  */
529
530 pop_frame ()
531 {
532   register struct frame_info *current_fi, *prev_fi;
533   register int i;
534   CORE_ADDR save_addr;
535   CORE_ADDR leaf_return_addr;
536   struct frame_saved_regs fsr;
537   char local_regs_buf[16 * 4];
538
539   current_fi = get_frame_info (get_current_frame ());
540
541   /* First, undo what the hardware does when we return.
542      If this is a non-leaf procedure, restore local registers from
543      the save area in the calling frame.  Otherwise, load the return
544      address obtained from leafproc_return () into the rip.  */
545
546   leaf_return_addr = leafproc_return (current_fi->pc);
547   if (!leaf_return_addr)
548     {
549       /* Non-leaf procedure.  Restore local registers, incl IP.  */
550       prev_fi = get_frame_info (get_prev_frame (FRAME_INFO_ID (current_fi)));
551       read_memory (prev_fi->frame, local_regs_buf, sizeof (local_regs_buf));
552       write_register_bytes (REGISTER_BYTE (R0_REGNUM), local_regs_buf, 
553                             sizeof (local_regs_buf));
554
555       /* Restore frame pointer.  */
556       write_register (FP_REGNUM, prev_fi->frame);
557     }
558   else
559     {
560       /* Leaf procedure.  Just restore the return address into the IP.  */
561       write_register (RIP_REGNUM, leaf_return_addr);
562     }
563
564   /* Now restore any global regs that the current function had saved. */
565   get_frame_saved_regs (current_fi, &fsr);
566   for (i = G0_REGNUM; i < G14_REGNUM; i++)
567     {
568       if (save_addr = fsr.regs[i])
569         write_register (i, read_memory_integer (save_addr, 4));
570     }
571
572   /* Flush the frame cache, create a frame for the new innermost frame,
573      and make it the current frame.  */
574
575   flush_cached_frames ();
576   set_current_frame (create_new_frame (read_register (FP_REGNUM), read_pc ()));
577 }
578
579 /* Print out text describing a "signal number" with which the i80960 halted.
580   
581    See the file "fault.c" in the nindy monitor source code for a list
582    of stop codes.  */
583
584 void
585 print_fault( siggnal )
586     int siggnal;        /* Signal number, as returned by target_wait() */
587 {
588         static char unknown[] = "Unknown fault or trace";
589         static char *sigmsgs[] = {
590                 /* FAULTS */
591                 "parallel fault",       /* 0x00 */
592                 unknown,                /* 0x01 */
593                 "operation fault",      /* 0x02 */
594                 "arithmetic fault",     /* 0x03 */
595                 "floating point fault", /* 0x04 */
596                 "constraint fault",     /* 0x05 */
597                 "virtual memory fault", /* 0x06 */
598                 "protection fault",     /* 0x07 */
599                 "machine fault",        /* 0x08 */
600                 "structural fault",     /* 0x09 */
601                 "type fault",           /* 0x0a */
602                 "reserved (0xb) fault", /* 0x0b */
603                 "process fault",        /* 0x0c */
604                 "descriptor fault",     /* 0x0d */
605                 "event fault",          /* 0x0e */
606                 "reserved (0xf) fault", /* 0x0f */
607
608                 /* TRACES */
609                 "single-step trace",    /* 0x10 */
610                 "branch trace",         /* 0x11 */
611                 "call trace",           /* 0x12 */
612                 "return trace",         /* 0x13 */
613                 "pre-return trace",     /* 0x14 */
614                 "supervisor call trace",/* 0x15 */
615                 "breakpoint trace",     /* 0x16 */
616         };
617 #       define NUMMSGS ((int)( sizeof(sigmsgs) / sizeof(sigmsgs[0]) ))
618
619         if (siggnal < NSIG) {
620               printf ("\nProgram received signal %d, %s\n",
621                       siggnal, safe_strsignal (siggnal));
622         } else {
623                 /* The various target_wait()s bias the 80960 "signal number"
624                    by adding NSIG to it, so it won't get confused with any
625                    of the Unix signals elsewhere in GDB.  We need to
626                    "unbias" it before using it.  */
627                 siggnal -= NSIG;
628
629                 printf("Program stopped for reason #%d: %s.\n", siggnal,
630                                 (siggnal < NUMMSGS && siggnal >= 0)?
631                                 sigmsgs[siggnal] : unknown );
632         }
633 }
634
635 /* Initialization stub */
636
637 _initialize_i960_tdep ()
638 {
639   check_host ();
640 }
This page took 0.058382 seconds and 4 git commands to generate.