OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [alpha-tdep.c] - Blame information for rev 104

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 104 markom
/* Target-dependent code for the ALPHA architecture, for GDB, the GNU Debugger.
2
   Copyright 1993, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
3
 
4
   This file is part of GDB.
5
 
6
   This program is free software; you can redistribute it and/or modify
7
   it under the terms of the GNU General Public License as published by
8
   the Free Software Foundation; either version 2 of the License, or
9
   (at your option) any later version.
10
 
11
   This program is distributed in the hope that it will be useful,
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
   GNU General Public License for more details.
15
 
16
   You should have received a copy of the GNU General Public License
17
   along with this program; if not, write to the Free Software
18
   Foundation, Inc., 59 Temple Place - Suite 330,
19
   Boston, MA 02111-1307, USA.  */
20
 
21
#include "defs.h"
22
#include "frame.h"
23
#include "inferior.h"
24
#include "symtab.h"
25
#include "value.h"
26
#include "gdbcmd.h"
27
#include "gdbcore.h"
28
#include "dis-asm.h"
29
#include "symfile.h"
30
#include "objfiles.h"
31
#include "gdb_string.h"
32
 
33
/* FIXME: Some of this code should perhaps be merged with mips-tdep.c.  */
34
 
35
/* Prototypes for local functions. */
36
 
37
static alpha_extra_func_info_t push_sigtramp_desc PARAMS ((CORE_ADDR low_addr));
38
 
39
static CORE_ADDR read_next_frame_reg PARAMS ((struct frame_info *, int));
40
 
41
static CORE_ADDR heuristic_proc_start PARAMS ((CORE_ADDR));
42
 
43
static alpha_extra_func_info_t heuristic_proc_desc PARAMS ((CORE_ADDR,
44
                                                            CORE_ADDR,
45
                                                      struct frame_info *));
46
 
47
static alpha_extra_func_info_t find_proc_desc PARAMS ((CORE_ADDR,
48
                                                       struct frame_info *));
49
 
50
#if 0
51
static int alpha_in_lenient_prologue PARAMS ((CORE_ADDR, CORE_ADDR));
52
#endif
53
 
54
static void reinit_frame_cache_sfunc PARAMS ((char *, int,
55
                                              struct cmd_list_element *));
56
 
57
static CORE_ADDR after_prologue PARAMS ((CORE_ADDR pc,
58
                                         alpha_extra_func_info_t proc_desc));
59
 
60
static int alpha_in_prologue PARAMS ((CORE_ADDR pc,
61
                                      alpha_extra_func_info_t proc_desc));
62
 
63
static int alpha_about_to_return PARAMS ((CORE_ADDR pc));
64
 
65
void _initialize_alpha_tdep PARAMS ((void));
66
 
67
/* Heuristic_proc_start may hunt through the text section for a long
68
   time across a 2400 baud serial line.  Allows the user to limit this
69
   search.  */
70
static unsigned int heuristic_fence_post = 0;
71
/* *INDENT-OFF* */
72
/* Layout of a stack frame on the alpha:
73
 
74
                |                               |
75
 pdr members:   |  7th ... nth arg,             |
76
                |  `pushed' by caller.          |
77
                |                               |
78
----------------|-------------------------------|<--  old_sp == vfp
79
   ^  ^  ^  ^   |                               |
80
   |  |  |  |   |                               |
81
   |  |localoff |  Copies of 1st .. 6th         |
82
   |  |  |  |   |  argument if necessary.       |
83
   |  |  |  v   |                               |
84
   |  |  |  --- |-------------------------------|<-- FRAME_LOCALS_ADDRESS
85
   |  |  |      |                               |
86
   |  |  |      |  Locals and temporaries.      |
87
   |  |  |      |                               |
88
   |  |  |      |-------------------------------|
89
   |  |  |      |                               |
90
   |-fregoffset |  Saved float registers.       |
91
   |  |  |      |  F9                           |
92
   |  |  |      |   .                           |
93
   |  |  |      |   .                           |
94
   |  |  |      |  F2                           |
95
   |  |  v      |                               |
96
   |  |  -------|-------------------------------|
97
   |  |         |                               |
98
   |  |         |  Saved registers.             |
99
   |  |         |  S6                           |
100
   |-regoffset  |   .                           |
101
   |  |         |   .                           |
102
   |  |         |  S0                           |
103
   |  |         |  pdr.pcreg                    |
104
   |  v         |                               |
105
   |  ----------|-------------------------------|
106
   |            |                               |
107
 frameoffset    |  Argument build area, gets    |
108
   |            |  7th ... nth arg for any      |
109
   |            |  called procedure.            |
110
   v            |                               |
111
   -------------|-------------------------------|<-- sp
112
                |                               |
113
*/
114
/* *INDENT-ON* */
115
 
116
 
117
 
118
#define PROC_LOW_ADDR(proc) ((proc)->pdr.adr)   /* least address */
119
/* These next two fields are kind of being hijacked.  I wonder if
120
   iline is too small for the values it needs to hold, if GDB is
121
   running on a 32-bit host.  */
122
#define PROC_HIGH_ADDR(proc) ((proc)->pdr.iline)        /* upper address bound */
123
#define PROC_DUMMY_FRAME(proc) ((proc)->pdr.cbLineOffset)       /*CALL_DUMMY frame */
124
#define PROC_FRAME_OFFSET(proc) ((proc)->pdr.frameoffset)
125
#define PROC_FRAME_REG(proc) ((proc)->pdr.framereg)
126
#define PROC_REG_MASK(proc) ((proc)->pdr.regmask)
127
#define PROC_FREG_MASK(proc) ((proc)->pdr.fregmask)
128
#define PROC_REG_OFFSET(proc) ((proc)->pdr.regoffset)
129
#define PROC_FREG_OFFSET(proc) ((proc)->pdr.fregoffset)
130
#define PROC_PC_REG(proc) ((proc)->pdr.pcreg)
131
#define PROC_LOCALOFF(proc) ((proc)->pdr.localoff)
132
#define PROC_SYMBOL(proc) (*(struct symbol**)&(proc)->pdr.isym)
133
#define _PROC_MAGIC_ 0x0F0F0F0F
134
#define PROC_DESC_IS_DUMMY(proc) ((proc)->pdr.isym == _PROC_MAGIC_)
135
#define SET_PROC_DESC_IS_DUMMY(proc) ((proc)->pdr.isym = _PROC_MAGIC_)
136
 
137
struct linked_proc_info
138
  {
139
    struct alpha_extra_func_info info;
140
    struct linked_proc_info *next;
141
  }
142
 *linked_proc_desc_table = NULL;
143
 
144
 
145
/* Under GNU/Linux, signal handler invocations can be identified by the
146
   designated code sequence that is used to return from a signal
147
   handler.  In particular, the return address of a signal handler
148
   points to the following sequence (the first instruction is quadword
149
   aligned):
150
 
151
   bis $30,$30,$16
152
   addq $31,0x67,$0
153
   call_pal callsys
154
 
155
   Each instruction has a unique encoding, so we simply attempt to
156
   match the instruction the pc is pointing to with any of the above
157
   instructions.  If there is a hit, we know the offset to the start
158
   of the designated sequence and can then check whether we really are
159
   executing in a designated sequence.  If not, -1 is returned,
160
   otherwise the offset from the start of the desingated sequence is
161
   returned.
162
 
163
   There is a slight chance of false hits: code could jump into the
164
   middle of the designated sequence, in which case there is no
165
   guarantee that we are in the middle of a sigreturn syscall.  Don't
166
   think this will be a problem in praxis, though.
167
 */
168
 
169
#ifndef TM_LINUXALPHA_H
170
/* HACK: Provide a prototype when compiling this file for non
171
   linuxalpha targets. */
172
long alpha_linux_sigtramp_offset PARAMS ((CORE_ADDR pc));
173
#endif
174
long
175
alpha_linux_sigtramp_offset (pc)
176
     CORE_ADDR pc;
177
{
178
  unsigned int i[3], w;
179
  long off;
180
 
181
  if (read_memory_nobpt (pc, (char *) &w, 4) != 0)
182
    return -1;
183
 
184
  off = -1;
185
  switch (w)
186
    {
187
    case 0x47de0410:
188
      off = 0;
189
      break;                    /* bis $30,$30,$16 */
190
    case 0x43ecf400:
191
      off = 4;
192
      break;                    /* addq $31,0x67,$0 */
193
    case 0x00000083:
194
      off = 8;
195
      break;                    /* call_pal callsys */
196
    default:
197
      return -1;
198
    }
199
  pc -= off;
200
  if (pc & 0x7)
201
    {
202
      /* designated sequence is not quadword aligned */
203
      return -1;
204
    }
205
 
206
  if (read_memory_nobpt (pc, (char *) i, sizeof (i)) != 0)
207
    return -1;
208
 
209
  if (i[0] == 0x47de0410 && i[1] == 0x43ecf400 && i[2] == 0x00000083)
210
    return off;
211
 
212
  return -1;
213
}
214
 
215
 
216
/* Under OSF/1, the __sigtramp routine is frameless and has a frame
217
   size of zero, but we are able to backtrace through it.  */
218
CORE_ADDR
219
alpha_osf_skip_sigtramp_frame (frame, pc)
220
     struct frame_info *frame;
221
     CORE_ADDR pc;
222
{
223
  char *name;
224
  find_pc_partial_function (pc, &name, (CORE_ADDR *) NULL, (CORE_ADDR *) NULL);
225
  if (IN_SIGTRAMP (pc, name))
226
    return frame->frame;
227
  else
228
    return 0;
229
}
230
 
231
 
232
/* Dynamically create a signal-handler caller procedure descriptor for
233
   the signal-handler return code starting at address LOW_ADDR.  The
234
   descriptor is added to the linked_proc_desc_table.  */
235
 
236
static alpha_extra_func_info_t
237
push_sigtramp_desc (low_addr)
238
     CORE_ADDR low_addr;
239
{
240
  struct linked_proc_info *link;
241
  alpha_extra_func_info_t proc_desc;
242
 
243
  link = (struct linked_proc_info *)
244
    xmalloc (sizeof (struct linked_proc_info));
245
  link->next = linked_proc_desc_table;
246
  linked_proc_desc_table = link;
247
 
248
  proc_desc = &link->info;
249
 
250
  proc_desc->numargs = 0;
251
  PROC_LOW_ADDR (proc_desc) = low_addr;
252
  PROC_HIGH_ADDR (proc_desc) = low_addr + 3 * 4;
253
  PROC_DUMMY_FRAME (proc_desc) = 0;
254
  PROC_FRAME_OFFSET (proc_desc) = 0x298;        /* sizeof(struct sigcontext_struct) */
255
  PROC_FRAME_REG (proc_desc) = SP_REGNUM;
256
  PROC_REG_MASK (proc_desc) = 0xffff;
257
  PROC_FREG_MASK (proc_desc) = 0xffff;
258
  PROC_PC_REG (proc_desc) = 26;
259
  PROC_LOCALOFF (proc_desc) = 0;
260
  SET_PROC_DESC_IS_DYN_SIGTRAMP (proc_desc);
261
  return (proc_desc);
262
}
263
 
264
 
265
/* Guaranteed to set frame->saved_regs to some values (it never leaves it
266
   NULL).  */
267
 
268
void
269
alpha_find_saved_regs (frame)
270
     struct frame_info *frame;
271
{
272
  int ireg;
273
  CORE_ADDR reg_position;
274
  unsigned long mask;
275
  alpha_extra_func_info_t proc_desc;
276
  int returnreg;
277
 
278
  frame_saved_regs_zalloc (frame);
279
 
280
  /* If it is the frame for __sigtramp, the saved registers are located
281
     in a sigcontext structure somewhere on the stack. __sigtramp
282
     passes a pointer to the sigcontext structure on the stack.
283
     If the stack layout for __sigtramp changes, or if sigcontext offsets
284
     change, we might have to update this code.  */
285
#ifndef SIGFRAME_PC_OFF
286
#define SIGFRAME_PC_OFF         (2 * 8)
287
#define SIGFRAME_REGSAVE_OFF    (4 * 8)
288
#define SIGFRAME_FPREGSAVE_OFF  (SIGFRAME_REGSAVE_OFF + 32 * 8 + 8)
289
#endif
290
  if (frame->signal_handler_caller)
291
    {
292
      CORE_ADDR sigcontext_addr;
293
 
294
      sigcontext_addr = SIGCONTEXT_ADDR (frame);
295
      for (ireg = 0; ireg < 32; ireg++)
296
        {
297
          reg_position = sigcontext_addr + SIGFRAME_REGSAVE_OFF + ireg * 8;
298
          frame->saved_regs[ireg] = reg_position;
299
        }
300
      for (ireg = 0; ireg < 32; ireg++)
301
        {
302
          reg_position = sigcontext_addr + SIGFRAME_FPREGSAVE_OFF + ireg * 8;
303
          frame->saved_regs[FP0_REGNUM + ireg] = reg_position;
304
        }
305
      frame->saved_regs[PC_REGNUM] = sigcontext_addr + SIGFRAME_PC_OFF;
306
      return;
307
    }
308
 
309
  proc_desc = frame->proc_desc;
310
  if (proc_desc == NULL)
311
    /* I'm not sure how/whether this can happen.  Normally when we can't
312
       find a proc_desc, we "synthesize" one using heuristic_proc_desc
313
       and set the saved_regs right away.  */
314
    return;
315
 
316
  /* Fill in the offsets for the registers which gen_mask says
317
     were saved.  */
318
 
319
  reg_position = frame->frame + PROC_REG_OFFSET (proc_desc);
320
  mask = PROC_REG_MASK (proc_desc);
321
 
322
  returnreg = PROC_PC_REG (proc_desc);
323
 
324
  /* Note that RA is always saved first, regardless of its actual
325
     register number.  */
326
  if (mask & (1 << returnreg))
327
    {
328
      frame->saved_regs[returnreg] = reg_position;
329
      reg_position += 8;
330
      mask &= ~(1 << returnreg);        /* Clear bit for RA so we
331
                                           don't save again later. */
332
    }
333
 
334
  for (ireg = 0; ireg <= 31; ++ireg)
335
    if (mask & (1 << ireg))
336
      {
337
        frame->saved_regs[ireg] = reg_position;
338
        reg_position += 8;
339
      }
340
 
341
  /* Fill in the offsets for the registers which float_mask says
342
     were saved.  */
343
 
344
  reg_position = frame->frame + PROC_FREG_OFFSET (proc_desc);
345
  mask = PROC_FREG_MASK (proc_desc);
346
 
347
  for (ireg = 0; ireg <= 31; ++ireg)
348
    if (mask & (1 << ireg))
349
      {
350
        frame->saved_regs[FP0_REGNUM + ireg] = reg_position;
351
        reg_position += 8;
352
      }
353
 
354
  frame->saved_regs[PC_REGNUM] = frame->saved_regs[returnreg];
355
}
356
 
357
static CORE_ADDR
358
read_next_frame_reg (fi, regno)
359
     struct frame_info *fi;
360
     int regno;
361
{
362
  for (; fi; fi = fi->next)
363
    {
364
      /* We have to get the saved sp from the sigcontext
365
         if it is a signal handler frame.  */
366
      if (regno == SP_REGNUM && !fi->signal_handler_caller)
367
        return fi->frame;
368
      else
369
        {
370
          if (fi->saved_regs == NULL)
371
            alpha_find_saved_regs (fi);
372
          if (fi->saved_regs[regno])
373
            return read_memory_integer (fi->saved_regs[regno], 8);
374
        }
375
    }
376
  return read_register (regno);
377
}
378
 
379
CORE_ADDR
380
alpha_frame_saved_pc (frame)
381
     struct frame_info *frame;
382
{
383
  alpha_extra_func_info_t proc_desc = frame->proc_desc;
384
  /* We have to get the saved pc from the sigcontext
385
     if it is a signal handler frame.  */
386
  int pcreg = frame->signal_handler_caller ? PC_REGNUM : frame->pc_reg;
387
 
388
  if (proc_desc && PROC_DESC_IS_DUMMY (proc_desc))
389
    return read_memory_integer (frame->frame - 8, 8);
390
 
391
  return read_next_frame_reg (frame, pcreg);
392
}
393
 
394
CORE_ADDR
395
alpha_saved_pc_after_call (frame)
396
     struct frame_info *frame;
397
{
398
  CORE_ADDR pc = frame->pc;
399
  CORE_ADDR tmp;
400
  alpha_extra_func_info_t proc_desc;
401
  int pcreg;
402
 
403
  /* Skip over shared library trampoline if necessary.  */
404
  tmp = SKIP_TRAMPOLINE_CODE (pc);
405
  if (tmp != 0)
406
    pc = tmp;
407
 
408
  proc_desc = find_proc_desc (pc, frame->next);
409
  pcreg = proc_desc ? PROC_PC_REG (proc_desc) : RA_REGNUM;
410
 
411
  if (frame->signal_handler_caller)
412
    return alpha_frame_saved_pc (frame);
413
  else
414
    return read_register (pcreg);
415
}
416
 
417
 
418
static struct alpha_extra_func_info temp_proc_desc;
419
static struct frame_saved_regs temp_saved_regs;
420
 
421
/* Nonzero if instruction at PC is a return instruction.  "ret
422
   $zero,($ra),1" on alpha. */
423
 
424
static int
425
alpha_about_to_return (pc)
426
     CORE_ADDR pc;
427
{
428
  return read_memory_integer (pc, 4) == 0x6bfa8001;
429
}
430
 
431
 
432
 
433
/* This fencepost looks highly suspicious to me.  Removing it also
434
   seems suspicious as it could affect remote debugging across serial
435
   lines.  */
436
 
437
static CORE_ADDR
438
heuristic_proc_start (pc)
439
     CORE_ADDR pc;
440
{
441
  CORE_ADDR start_pc = pc;
442
  CORE_ADDR fence = start_pc - heuristic_fence_post;
443
 
444
  if (start_pc == 0)
445
    return 0;
446
 
447
  if (heuristic_fence_post == UINT_MAX
448
      || fence < VM_MIN_ADDRESS)
449
    fence = VM_MIN_ADDRESS;
450
 
451
  /* search back for previous return */
452
  for (start_pc -= 4;; start_pc -= 4)
453
    if (start_pc < fence)
454
      {
455
        /* It's not clear to me why we reach this point when
456
           stop_soon_quietly, but with this test, at least we
457
           don't print out warnings for every child forked (eg, on
458
           decstation).  22apr93 rich@cygnus.com.  */
459
        if (!stop_soon_quietly)
460
          {
461
            static int blurb_printed = 0;
462
 
463
            if (fence == VM_MIN_ADDRESS)
464
              warning ("Hit beginning of text section without finding");
465
            else
466
              warning ("Hit heuristic-fence-post without finding");
467
 
468
            warning ("enclosing function for address 0x%s", paddr_nz (pc));
469
            if (!blurb_printed)
470
              {
471
                printf_filtered ("\
472
This warning occurs if you are debugging a function without any symbols\n\
473
(for example, in a stripped executable).  In that case, you may wish to\n\
474
increase the size of the search with the `set heuristic-fence-post' command.\n\
475
\n\
476
Otherwise, you told GDB there was a function where there isn't one, or\n\
477
(more likely) you have encountered a bug in GDB.\n");
478
                blurb_printed = 1;
479
              }
480
          }
481
 
482
        return 0;
483
      }
484
    else if (alpha_about_to_return (start_pc))
485
      break;
486
 
487
  start_pc += 4;                /* skip return */
488
  return start_pc;
489
}
490
 
491
static alpha_extra_func_info_t
492
heuristic_proc_desc (start_pc, limit_pc, next_frame)
493
     CORE_ADDR start_pc, limit_pc;
494
     struct frame_info *next_frame;
495
{
496
  CORE_ADDR sp = read_next_frame_reg (next_frame, SP_REGNUM);
497
  CORE_ADDR cur_pc;
498
  int frame_size;
499
  int has_frame_reg = 0;
500
  unsigned long reg_mask = 0;
501
  int pcreg = -1;
502
 
503
  if (start_pc == 0)
504
    return NULL;
505
  memset (&temp_proc_desc, '\0', sizeof (temp_proc_desc));
506
  memset (&temp_saved_regs, '\0', sizeof (struct frame_saved_regs));
507
  PROC_LOW_ADDR (&temp_proc_desc) = start_pc;
508
 
509
  if (start_pc + 200 < limit_pc)
510
    limit_pc = start_pc + 200;
511
  frame_size = 0;
512
  for (cur_pc = start_pc; cur_pc < limit_pc; cur_pc += 4)
513
    {
514
      char buf[4];
515
      unsigned long word;
516
      int status;
517
 
518
      status = read_memory_nobpt (cur_pc, buf, 4);
519
      if (status)
520
        memory_error (status, cur_pc);
521
      word = extract_unsigned_integer (buf, 4);
522
 
523
      if ((word & 0xffff0000) == 0x23de0000)    /* lda $sp,n($sp) */
524
        {
525
          if (word & 0x8000)
526
            frame_size += (-word) & 0xffff;
527
          else
528
            /* Exit loop if a positive stack adjustment is found, which
529
               usually means that the stack cleanup code in the function
530
               epilogue is reached.  */
531
            break;
532
        }
533
      else if ((word & 0xfc1f0000) == 0xb41e0000        /* stq reg,n($sp) */
534
               && (word & 0xffff0000) != 0xb7fe0000)    /* reg != $zero */
535
        {
536
          int reg = (word & 0x03e00000) >> 21;
537
          reg_mask |= 1 << reg;
538
          temp_saved_regs.regs[reg] = sp + (short) word;
539
 
540
          /* Starting with OSF/1-3.2C, the system libraries are shipped
541
             without local symbols, but they still contain procedure
542
             descriptors without a symbol reference. GDB is currently
543
             unable to find these procedure descriptors and uses
544
             heuristic_proc_desc instead.
545
             As some low level compiler support routines (__div*, __add*)
546
             use a non-standard return address register, we have to
547
             add some heuristics to determine the return address register,
548
             or stepping over these routines will fail.
549
             Usually the return address register is the first register
550
             saved on the stack, but assembler optimization might
551
             rearrange the register saves.
552
             So we recognize only a few registers (t7, t9, ra) within
553
             the procedure prologue as valid return address registers.
554
             If we encounter a return instruction, we extract the
555
             the return address register from it.
556
 
557
             FIXME: Rewriting GDB to access the procedure descriptors,
558
             e.g. via the minimal symbol table, might obviate this hack.  */
559
          if (pcreg == -1
560
              && cur_pc < (start_pc + 80)
561
              && (reg == T7_REGNUM || reg == T9_REGNUM || reg == RA_REGNUM))
562
            pcreg = reg;
563
        }
564
      else if ((word & 0xffe0ffff) == 0x6be08001)       /* ret zero,reg,1 */
565
        pcreg = (word >> 16) & 0x1f;
566
      else if (word == 0x47de040f)      /* bis sp,sp fp */
567
        has_frame_reg = 1;
568
    }
569
  if (pcreg == -1)
570
    {
571
      /* If we haven't found a valid return address register yet,
572
         keep searching in the procedure prologue.  */
573
      while (cur_pc < (limit_pc + 80) && cur_pc < (start_pc + 80))
574
        {
575
          char buf[4];
576
          unsigned long word;
577
 
578
          if (read_memory_nobpt (cur_pc, buf, 4))
579
            break;
580
          cur_pc += 4;
581
          word = extract_unsigned_integer (buf, 4);
582
 
583
          if ((word & 0xfc1f0000) == 0xb41e0000         /* stq reg,n($sp) */
584
              && (word & 0xffff0000) != 0xb7fe0000)     /* reg != $zero */
585
            {
586
              int reg = (word & 0x03e00000) >> 21;
587
              if (reg == T7_REGNUM || reg == T9_REGNUM || reg == RA_REGNUM)
588
                {
589
                  pcreg = reg;
590
                  break;
591
                }
592
            }
593
          else if ((word & 0xffe0ffff) == 0x6be08001)   /* ret zero,reg,1 */
594
            {
595
              pcreg = (word >> 16) & 0x1f;
596
              break;
597
            }
598
        }
599
    }
600
 
601
  if (has_frame_reg)
602
    PROC_FRAME_REG (&temp_proc_desc) = GCC_FP_REGNUM;
603
  else
604
    PROC_FRAME_REG (&temp_proc_desc) = SP_REGNUM;
605
  PROC_FRAME_OFFSET (&temp_proc_desc) = frame_size;
606
  PROC_REG_MASK (&temp_proc_desc) = reg_mask;
607
  PROC_PC_REG (&temp_proc_desc) = (pcreg == -1) ? RA_REGNUM : pcreg;
608
  PROC_LOCALOFF (&temp_proc_desc) = 0;   /* XXX - bogus */
609
  return &temp_proc_desc;
610
}
611
 
612
/* This returns the PC of the first inst after the prologue.  If we can't
613
   find the prologue, then return 0.  */
614
 
615
static CORE_ADDR
616
after_prologue (pc, proc_desc)
617
     CORE_ADDR pc;
618
     alpha_extra_func_info_t proc_desc;
619
{
620
  struct symtab_and_line sal;
621
  CORE_ADDR func_addr, func_end;
622
 
623
  if (!proc_desc)
624
    proc_desc = find_proc_desc (pc, NULL);
625
 
626
  if (proc_desc)
627
    {
628
      if (PROC_DESC_IS_DYN_SIGTRAMP (proc_desc))
629
        return PROC_LOW_ADDR (proc_desc);       /* "prologue" is in kernel */
630
 
631
      /* If function is frameless, then we need to do it the hard way.  I
632
         strongly suspect that frameless always means prologueless... */
633
      if (PROC_FRAME_REG (proc_desc) == SP_REGNUM
634
          && PROC_FRAME_OFFSET (proc_desc) == 0)
635
        return 0;
636
    }
637
 
638
  if (!find_pc_partial_function (pc, NULL, &func_addr, &func_end))
639
    return 0;                    /* Unknown */
640
 
641
  sal = find_pc_line (func_addr, 0);
642
 
643
  if (sal.end < func_end)
644
    return sal.end;
645
 
646
  /* The line after the prologue is after the end of the function.  In this
647
     case, tell the caller to find the prologue the hard way.  */
648
 
649
  return 0;
650
}
651
 
652
/* Return non-zero if we *might* be in a function prologue.  Return zero if we
653
   are definitively *not* in a function prologue.  */
654
 
655
static int
656
alpha_in_prologue (pc, proc_desc)
657
     CORE_ADDR pc;
658
     alpha_extra_func_info_t proc_desc;
659
{
660
  CORE_ADDR after_prologue_pc;
661
 
662
  after_prologue_pc = after_prologue (pc, proc_desc);
663
 
664
  if (after_prologue_pc == 0
665
      || pc < after_prologue_pc)
666
    return 1;
667
  else
668
    return 0;
669
}
670
 
671
static alpha_extra_func_info_t
672
find_proc_desc (pc, next_frame)
673
     CORE_ADDR pc;
674
     struct frame_info *next_frame;
675
{
676
  alpha_extra_func_info_t proc_desc;
677
  struct block *b;
678
  struct symbol *sym;
679
  CORE_ADDR startaddr;
680
 
681
  /* Try to get the proc_desc from the linked call dummy proc_descs
682
     if the pc is in the call dummy.
683
     This is hairy. In the case of nested dummy calls we have to find the
684
     right proc_desc, but we might not yet know the frame for the dummy
685
     as it will be contained in the proc_desc we are searching for.
686
     So we have to find the proc_desc whose frame is closest to the current
687
     stack pointer.  */
688
 
689
  if (PC_IN_CALL_DUMMY (pc, 0, 0))
690
    {
691
      struct linked_proc_info *link;
692
      CORE_ADDR sp = read_next_frame_reg (next_frame, SP_REGNUM);
693
      alpha_extra_func_info_t found_proc_desc = NULL;
694
      long min_distance = LONG_MAX;
695
 
696
      for (link = linked_proc_desc_table; link; link = link->next)
697
        {
698
          long distance = (CORE_ADDR) PROC_DUMMY_FRAME (&link->info) - sp;
699
          if (distance > 0 && distance < min_distance)
700
            {
701
              min_distance = distance;
702
              found_proc_desc = &link->info;
703
            }
704
        }
705
      if (found_proc_desc != NULL)
706
        return found_proc_desc;
707
    }
708
 
709
  b = block_for_pc (pc);
710
 
711
  find_pc_partial_function (pc, NULL, &startaddr, NULL);
712
  if (b == NULL)
713
    sym = NULL;
714
  else
715
    {
716
      if (startaddr > BLOCK_START (b))
717
        /* This is the "pathological" case referred to in a comment in
718
           print_frame_info.  It might be better to move this check into
719
           symbol reading.  */
720
        sym = NULL;
721
      else
722
        sym = lookup_symbol (MIPS_EFI_SYMBOL_NAME, b, LABEL_NAMESPACE,
723
                             0, NULL);
724
    }
725
 
726
  /* If we never found a PDR for this function in symbol reading, then
727
     examine prologues to find the information.  */
728
  if (sym && ((mips_extra_func_info_t) SYMBOL_VALUE (sym))->pdr.framereg == -1)
729
    sym = NULL;
730
 
731
  if (sym)
732
    {
733
      /* IF this is the topmost frame AND
734
       * (this proc does not have debugging information OR
735
       * the PC is in the procedure prologue)
736
       * THEN create a "heuristic" proc_desc (by analyzing
737
       * the actual code) to replace the "official" proc_desc.
738
       */
739
      proc_desc = (alpha_extra_func_info_t) SYMBOL_VALUE (sym);
740
      if (next_frame == NULL)
741
        {
742
          if (PROC_DESC_IS_DUMMY (proc_desc) || alpha_in_prologue (pc, proc_desc))
743
            {
744
              alpha_extra_func_info_t found_heuristic =
745
              heuristic_proc_desc (PROC_LOW_ADDR (proc_desc),
746
                                   pc, next_frame);
747
              if (found_heuristic)
748
                {
749
                  PROC_LOCALOFF (found_heuristic) =
750
                    PROC_LOCALOFF (proc_desc);
751
                  PROC_PC_REG (found_heuristic) = PROC_PC_REG (proc_desc);
752
                  proc_desc = found_heuristic;
753
                }
754
            }
755
        }
756
    }
757
  else
758
    {
759
      long offset;
760
 
761
      /* Is linked_proc_desc_table really necessary?  It only seems to be used
762
         by procedure call dummys.  However, the procedures being called ought
763
         to have their own proc_descs, and even if they don't,
764
         heuristic_proc_desc knows how to create them! */
765
 
766
      register struct linked_proc_info *link;
767
      for (link = linked_proc_desc_table; link; link = link->next)
768
        if (PROC_LOW_ADDR (&link->info) <= pc
769
            && PROC_HIGH_ADDR (&link->info) > pc)
770
          return &link->info;
771
 
772
      /* If PC is inside a dynamically generated sigtramp handler,
773
         create and push a procedure descriptor for that code: */
774
      offset = DYNAMIC_SIGTRAMP_OFFSET (pc);
775
      if (offset >= 0)
776
        return push_sigtramp_desc (pc - offset);
777
 
778
      /* If heuristic_fence_post is non-zero, determine the procedure
779
         start address by examining the instructions.
780
         This allows us to find the start address of static functions which
781
         have no symbolic information, as startaddr would have been set to
782
         the preceding global function start address by the
783
         find_pc_partial_function call above.  */
784
      if (startaddr == 0 || heuristic_fence_post != 0)
785
        startaddr = heuristic_proc_start (pc);
786
 
787
      proc_desc =
788
        heuristic_proc_desc (startaddr, pc, next_frame);
789
    }
790
  return proc_desc;
791
}
792
 
793
alpha_extra_func_info_t cached_proc_desc;
794
 
795
CORE_ADDR
796
alpha_frame_chain (frame)
797
     struct frame_info *frame;
798
{
799
  alpha_extra_func_info_t proc_desc;
800
  CORE_ADDR saved_pc = FRAME_SAVED_PC (frame);
801
 
802
  if (saved_pc == 0 || inside_entry_file (saved_pc))
803
    return 0;
804
 
805
  proc_desc = find_proc_desc (saved_pc, frame);
806
  if (!proc_desc)
807
    return 0;
808
 
809
  cached_proc_desc = proc_desc;
810
 
811
  /* Fetch the frame pointer for a dummy frame from the procedure
812
     descriptor.  */
813
  if (PROC_DESC_IS_DUMMY (proc_desc))
814
    return (CORE_ADDR) PROC_DUMMY_FRAME (proc_desc);
815
 
816
  /* If no frame pointer and frame size is zero, we must be at end
817
     of stack (or otherwise hosed).  If we don't check frame size,
818
     we loop forever if we see a zero size frame.  */
819
  if (PROC_FRAME_REG (proc_desc) == SP_REGNUM
820
      && PROC_FRAME_OFFSET (proc_desc) == 0
821
  /* The previous frame from a sigtramp frame might be frameless
822
     and have frame size zero.  */
823
      && !frame->signal_handler_caller)
824
    return FRAME_PAST_SIGTRAMP_FRAME (frame, saved_pc);
825
  else
826
    return read_next_frame_reg (frame, PROC_FRAME_REG (proc_desc))
827
      + PROC_FRAME_OFFSET (proc_desc);
828
}
829
 
830
void
831
init_extra_frame_info (frame)
832
     struct frame_info *frame;
833
{
834
  /* Use proc_desc calculated in frame_chain */
835
  alpha_extra_func_info_t proc_desc =
836
  frame->next ? cached_proc_desc : find_proc_desc (frame->pc, frame->next);
837
 
838
  frame->saved_regs = NULL;
839
  frame->localoff = 0;
840
  frame->pc_reg = RA_REGNUM;
841
  frame->proc_desc = proc_desc == &temp_proc_desc ? 0 : proc_desc;
842
  if (proc_desc)
843
    {
844
      /* Get the locals offset and the saved pc register from the
845
         procedure descriptor, they are valid even if we are in the
846
         middle of the prologue.  */
847
      frame->localoff = PROC_LOCALOFF (proc_desc);
848
      frame->pc_reg = PROC_PC_REG (proc_desc);
849
 
850
      /* Fixup frame-pointer - only needed for top frame */
851
 
852
      /* Fetch the frame pointer for a dummy frame from the procedure
853
         descriptor.  */
854
      if (PROC_DESC_IS_DUMMY (proc_desc))
855
        frame->frame = (CORE_ADDR) PROC_DUMMY_FRAME (proc_desc);
856
 
857
      /* This may not be quite right, if proc has a real frame register.
858
         Get the value of the frame relative sp, procedure might have been
859
         interrupted by a signal at it's very start.  */
860
      else if (frame->pc == PROC_LOW_ADDR (proc_desc)
861
               && !PROC_DESC_IS_DYN_SIGTRAMP (proc_desc))
862
        frame->frame = read_next_frame_reg (frame->next, SP_REGNUM);
863
      else
864
        frame->frame = read_next_frame_reg (frame->next, PROC_FRAME_REG (proc_desc))
865
          + PROC_FRAME_OFFSET (proc_desc);
866
 
867
      if (proc_desc == &temp_proc_desc)
868
        {
869
          char *name;
870
 
871
          /* Do not set the saved registers for a sigtramp frame,
872
             alpha_find_saved_registers will do that for us.
873
             We can't use frame->signal_handler_caller, it is not yet set.  */
874
          find_pc_partial_function (frame->pc, &name,
875
                                    (CORE_ADDR *) NULL, (CORE_ADDR *) NULL);
876
          if (!IN_SIGTRAMP (frame->pc, name))
877
            {
878
              frame->saved_regs = (CORE_ADDR *)
879
                frame_obstack_alloc (SIZEOF_FRAME_SAVED_REGS);
880
              memcpy (frame->saved_regs, temp_saved_regs.regs, SIZEOF_FRAME_SAVED_REGS);
881
              frame->saved_regs[PC_REGNUM]
882
                = frame->saved_regs[RA_REGNUM];
883
            }
884
        }
885
    }
886
}
887
 
888
/* ALPHA stack frames are almost impenetrable.  When execution stops,
889
   we basically have to look at symbol information for the function
890
   that we stopped in, which tells us *which* register (if any) is
891
   the base of the frame pointer, and what offset from that register
892
   the frame itself is at.
893
 
894
   This presents a problem when trying to examine a stack in memory
895
   (that isn't executing at the moment), using the "frame" command.  We
896
   don't have a PC, nor do we have any registers except SP.
897
 
898
   This routine takes two arguments, SP and PC, and tries to make the
899
   cached frames look as if these two arguments defined a frame on the
900
   cache.  This allows the rest of info frame to extract the important
901
   arguments without difficulty.  */
902
 
903
struct frame_info *
904
setup_arbitrary_frame (argc, argv)
905
     int argc;
906
     CORE_ADDR *argv;
907
{
908
  if (argc != 2)
909
    error ("ALPHA frame specifications require two arguments: sp and pc");
910
 
911
  return create_new_frame (argv[0], argv[1]);
912
}
913
 
914
/* The alpha passes the first six arguments in the registers, the rest on
915
   the stack. The register arguments are eventually transferred to the
916
   argument transfer area immediately below the stack by the called function
917
   anyway. So we `push' at least six arguments on the stack, `reload' the
918
   argument registers and then adjust the stack pointer to point past the
919
   sixth argument. This algorithm simplifies the passing of a large struct
920
   which extends from the registers to the stack.
921
   If the called function is returning a structure, the address of the
922
   structure to be returned is passed as a hidden first argument.  */
923
 
924
CORE_ADDR
925
alpha_push_arguments (nargs, args, sp, struct_return, struct_addr)
926
     int nargs;
927
     value_ptr *args;
928
     CORE_ADDR sp;
929
     int struct_return;
930
     CORE_ADDR struct_addr;
931
{
932
  int i;
933
  int accumulate_size = struct_return ? 8 : 0;
934
  int arg_regs_size = ALPHA_NUM_ARG_REGS * 8;
935
  struct alpha_arg
936
    {
937
      char *contents;
938
      int len;
939
      int offset;
940
    };
941
  struct alpha_arg *alpha_args =
942
  (struct alpha_arg *) alloca (nargs * sizeof (struct alpha_arg));
943
  register struct alpha_arg *m_arg;
944
  char raw_buffer[sizeof (CORE_ADDR)];
945
  int required_arg_regs;
946
 
947
  for (i = 0, m_arg = alpha_args; i < nargs; i++, m_arg++)
948
    {
949
      value_ptr arg = args[i];
950
      struct type *arg_type = check_typedef (VALUE_TYPE (arg));
951
      /* Cast argument to long if necessary as the compiler does it too.  */
952
      switch (TYPE_CODE (arg_type))
953
        {
954
        case TYPE_CODE_INT:
955
        case TYPE_CODE_BOOL:
956
        case TYPE_CODE_CHAR:
957
        case TYPE_CODE_RANGE:
958
        case TYPE_CODE_ENUM:
959
          if (TYPE_LENGTH (arg_type) < TYPE_LENGTH (builtin_type_long))
960
            {
961
              arg_type = builtin_type_long;
962
              arg = value_cast (arg_type, arg);
963
            }
964
          break;
965
        default:
966
          break;
967
        }
968
      m_arg->len = TYPE_LENGTH (arg_type);
969
      m_arg->offset = accumulate_size;
970
      accumulate_size = (accumulate_size + m_arg->len + 7) & ~7;
971
      m_arg->contents = VALUE_CONTENTS (arg);
972
    }
973
 
974
  /* Determine required argument register loads, loading an argument register
975
     is expensive as it uses three ptrace calls.  */
976
  required_arg_regs = accumulate_size / 8;
977
  if (required_arg_regs > ALPHA_NUM_ARG_REGS)
978
    required_arg_regs = ALPHA_NUM_ARG_REGS;
979
 
980
  /* Make room for the arguments on the stack.  */
981
  if (accumulate_size < arg_regs_size)
982
    accumulate_size = arg_regs_size;
983
  sp -= accumulate_size;
984
 
985
  /* Keep sp aligned to a multiple of 16 as the compiler does it too.  */
986
  sp &= ~15;
987
 
988
  /* `Push' arguments on the stack.  */
989
  for (i = nargs; m_arg--, --i >= 0;)
990
    write_memory (sp + m_arg->offset, m_arg->contents, m_arg->len);
991
  if (struct_return)
992
    {
993
      store_address (raw_buffer, sizeof (CORE_ADDR), struct_addr);
994
      write_memory (sp, raw_buffer, sizeof (CORE_ADDR));
995
    }
996
 
997
  /* Load the argument registers.  */
998
  for (i = 0; i < required_arg_regs; i++)
999
    {
1000
      LONGEST val;
1001
 
1002
      val = read_memory_integer (sp + i * 8, 8);
1003
      write_register (A0_REGNUM + i, val);
1004
      write_register (FPA0_REGNUM + i, val);
1005
    }
1006
 
1007
  return sp + arg_regs_size;
1008
}
1009
 
1010
void
1011
alpha_push_dummy_frame ()
1012
{
1013
  int ireg;
1014
  struct linked_proc_info *link;
1015
  alpha_extra_func_info_t proc_desc;
1016
  CORE_ADDR sp = read_register (SP_REGNUM);
1017
  CORE_ADDR save_address;
1018
  char raw_buffer[MAX_REGISTER_RAW_SIZE];
1019
  unsigned long mask;
1020
 
1021
  link = (struct linked_proc_info *) xmalloc (sizeof (struct linked_proc_info));
1022
  link->next = linked_proc_desc_table;
1023
  linked_proc_desc_table = link;
1024
 
1025
  proc_desc = &link->info;
1026
 
1027
  /*
1028
   * The registers we must save are all those not preserved across
1029
   * procedure calls.
1030
   * In addition, we must save the PC and RA.
1031
   *
1032
   * Dummy frame layout:
1033
   *  (high memory)
1034
   *    Saved PC
1035
   *    Saved F30
1036
   *    ...
1037
   *    Saved F0
1038
   *    Saved R29
1039
   *    ...
1040
   *    Saved R0
1041
   *    Saved R26 (RA)
1042
   *    Parameter build area
1043
   *  (low memory)
1044
   */
1045
 
1046
/* MASK(i,j) == (1<<i) + (1<<(i+1)) + ... + (1<<j)). Assume i<=j<31. */
1047
#define MASK(i,j) ((((LONGEST)1 << ((j)+1)) - 1) ^ (((LONGEST)1 << (i)) - 1))
1048
#define GEN_REG_SAVE_MASK (MASK(0,8) | MASK(16,29))
1049
#define GEN_REG_SAVE_COUNT 24
1050
#define FLOAT_REG_SAVE_MASK (MASK(0,1) | MASK(10,30))
1051
#define FLOAT_REG_SAVE_COUNT 23
1052
  /* The special register is the PC as we have no bit for it in the save masks.
1053
     alpha_frame_saved_pc knows where the pc is saved in a dummy frame.  */
1054
#define SPECIAL_REG_SAVE_COUNT 1
1055
 
1056
  PROC_REG_MASK (proc_desc) = GEN_REG_SAVE_MASK;
1057
  PROC_FREG_MASK (proc_desc) = FLOAT_REG_SAVE_MASK;
1058
  /* PROC_REG_OFFSET is the offset from the dummy frame to the saved RA,
1059
     but keep SP aligned to a multiple of 16.  */
1060
  PROC_REG_OFFSET (proc_desc) =
1061
    -((8 * (SPECIAL_REG_SAVE_COUNT
1062
            + GEN_REG_SAVE_COUNT
1063
            + FLOAT_REG_SAVE_COUNT)
1064
       + 15) & ~15);
1065
  PROC_FREG_OFFSET (proc_desc) =
1066
    PROC_REG_OFFSET (proc_desc) + 8 * GEN_REG_SAVE_COUNT;
1067
 
1068
  /* Save general registers.
1069
     The return address register is the first saved register, all other
1070
     registers follow in ascending order.
1071
     The PC is saved immediately below the SP.  */
1072
  save_address = sp + PROC_REG_OFFSET (proc_desc);
1073
  store_address (raw_buffer, 8, read_register (RA_REGNUM));
1074
  write_memory (save_address, raw_buffer, 8);
1075
  save_address += 8;
1076
  mask = PROC_REG_MASK (proc_desc) & 0xffffffffL;
1077
  for (ireg = 0; mask; ireg++, mask >>= 1)
1078
    if (mask & 1)
1079
      {
1080
        if (ireg == RA_REGNUM)
1081
          continue;
1082
        store_address (raw_buffer, 8, read_register (ireg));
1083
        write_memory (save_address, raw_buffer, 8);
1084
        save_address += 8;
1085
      }
1086
 
1087
  store_address (raw_buffer, 8, read_register (PC_REGNUM));
1088
  write_memory (sp - 8, raw_buffer, 8);
1089
 
1090
  /* Save floating point registers.  */
1091
  save_address = sp + PROC_FREG_OFFSET (proc_desc);
1092
  mask = PROC_FREG_MASK (proc_desc) & 0xffffffffL;
1093
  for (ireg = 0; mask; ireg++, mask >>= 1)
1094
    if (mask & 1)
1095
      {
1096
        store_address (raw_buffer, 8, read_register (ireg + FP0_REGNUM));
1097
        write_memory (save_address, raw_buffer, 8);
1098
        save_address += 8;
1099
      }
1100
 
1101
  /* Set and save the frame address for the dummy.
1102
     This is tricky. The only registers that are suitable for a frame save
1103
     are those that are preserved across procedure calls (s0-s6). But if
1104
     a read system call is interrupted and then a dummy call is made
1105
     (see testsuite/gdb.t17/interrupt.exp) the dummy call hangs till the read
1106
     is satisfied. Then it returns with the s0-s6 registers set to the values
1107
     on entry to the read system call and our dummy frame pointer would be
1108
     destroyed. So we save the dummy frame in the proc_desc and handle the
1109
     retrieval of the frame pointer of a dummy specifically. The frame register
1110
     is set to the virtual frame (pseudo) register, it's value will always
1111
     be read as zero and will help us to catch any errors in the dummy frame
1112
     retrieval code.  */
1113
  PROC_DUMMY_FRAME (proc_desc) = sp;
1114
  PROC_FRAME_REG (proc_desc) = FP_REGNUM;
1115
  PROC_FRAME_OFFSET (proc_desc) = 0;
1116
  sp += PROC_REG_OFFSET (proc_desc);
1117
  write_register (SP_REGNUM, sp);
1118
 
1119
  PROC_LOW_ADDR (proc_desc) = CALL_DUMMY_ADDRESS ();
1120
  PROC_HIGH_ADDR (proc_desc) = PROC_LOW_ADDR (proc_desc) + 4;
1121
 
1122
  SET_PROC_DESC_IS_DUMMY (proc_desc);
1123
  PROC_PC_REG (proc_desc) = RA_REGNUM;
1124
}
1125
 
1126
void
1127
alpha_pop_frame ()
1128
{
1129
  register int regnum;
1130
  struct frame_info *frame = get_current_frame ();
1131
  CORE_ADDR new_sp = frame->frame;
1132
 
1133
  alpha_extra_func_info_t proc_desc = frame->proc_desc;
1134
 
1135
  /* we need proc_desc to know how to restore the registers;
1136
     if it is NULL, construct (a temporary) one */
1137
  if (proc_desc == NULL)
1138
    proc_desc = find_proc_desc (frame->pc, frame->next);
1139
 
1140
  /* Question: should we copy this proc_desc and save it in
1141
     frame->proc_desc?  If we do, who will free it?
1142
     For now, we don't save a copy... */
1143
 
1144
  write_register (PC_REGNUM, FRAME_SAVED_PC (frame));
1145
  if (frame->saved_regs == NULL)
1146
    alpha_find_saved_regs (frame);
1147
  if (proc_desc)
1148
    {
1149
      for (regnum = 32; --regnum >= 0;)
1150
        if (PROC_REG_MASK (proc_desc) & (1 << regnum))
1151
          write_register (regnum,
1152
                          read_memory_integer (frame->saved_regs[regnum],
1153
                                               8));
1154
      for (regnum = 32; --regnum >= 0;)
1155
        if (PROC_FREG_MASK (proc_desc) & (1 << regnum))
1156
          write_register (regnum + FP0_REGNUM,
1157
           read_memory_integer (frame->saved_regs[regnum + FP0_REGNUM], 8));
1158
    }
1159
  write_register (SP_REGNUM, new_sp);
1160
  flush_cached_frames ();
1161
 
1162
  if (proc_desc && (PROC_DESC_IS_DUMMY (proc_desc)
1163
                    || PROC_DESC_IS_DYN_SIGTRAMP (proc_desc)))
1164
    {
1165
      struct linked_proc_info *pi_ptr, *prev_ptr;
1166
 
1167
      for (pi_ptr = linked_proc_desc_table, prev_ptr = NULL;
1168
           pi_ptr != NULL;
1169
           prev_ptr = pi_ptr, pi_ptr = pi_ptr->next)
1170
        {
1171
          if (&pi_ptr->info == proc_desc)
1172
            break;
1173
        }
1174
 
1175
      if (pi_ptr == NULL)
1176
        error ("Can't locate dummy extra frame info\n");
1177
 
1178
      if (prev_ptr != NULL)
1179
        prev_ptr->next = pi_ptr->next;
1180
      else
1181
        linked_proc_desc_table = pi_ptr->next;
1182
 
1183
      free (pi_ptr);
1184
    }
1185
}
1186
 
1187
/* To skip prologues, I use this predicate.  Returns either PC itself
1188
   if the code at PC does not look like a function prologue; otherwise
1189
   returns an address that (if we're lucky) follows the prologue.  If
1190
   LENIENT, then we must skip everything which is involved in setting
1191
   up the frame (it's OK to skip more, just so long as we don't skip
1192
   anything which might clobber the registers which are being saved.
1193
   Currently we must not skip more on the alpha, but we might the lenient
1194
   stuff some day.  */
1195
 
1196
CORE_ADDR
1197
alpha_skip_prologue (pc, lenient)
1198
     CORE_ADDR pc;
1199
     int lenient;
1200
{
1201
  unsigned long inst;
1202
  int offset;
1203
  CORE_ADDR post_prologue_pc;
1204
  char buf[4];
1205
 
1206
#ifdef GDB_TARGET_HAS_SHARED_LIBS
1207
  /* Silently return the unaltered pc upon memory errors.
1208
     This could happen on OSF/1 if decode_line_1 tries to skip the
1209
     prologue for quickstarted shared library functions when the
1210
     shared library is not yet mapped in.
1211
     Reading target memory is slow over serial lines, so we perform
1212
     this check only if the target has shared libraries.  */
1213
  if (target_read_memory (pc, buf, 4))
1214
    return pc;
1215
#endif
1216
 
1217
  /* See if we can determine the end of the prologue via the symbol table.
1218
     If so, then return either PC, or the PC after the prologue, whichever
1219
     is greater.  */
1220
 
1221
  post_prologue_pc = after_prologue (pc, NULL);
1222
 
1223
  if (post_prologue_pc != 0)
1224
    return max (pc, post_prologue_pc);
1225
 
1226
  /* Can't determine prologue from the symbol table, need to examine
1227
     instructions.  */
1228
 
1229
  /* Skip the typical prologue instructions. These are the stack adjustment
1230
     instruction and the instructions that save registers on the stack
1231
     or in the gcc frame.  */
1232
  for (offset = 0; offset < 100; offset += 4)
1233
    {
1234
      int status;
1235
 
1236
      status = read_memory_nobpt (pc + offset, buf, 4);
1237
      if (status)
1238
        memory_error (status, pc + offset);
1239
      inst = extract_unsigned_integer (buf, 4);
1240
 
1241
      /* The alpha has no delay slots. But let's keep the lenient stuff,
1242
         we might need it for something else in the future.  */
1243
      if (lenient && 0)
1244
        continue;
1245
 
1246
      if ((inst & 0xffff0000) == 0x27bb0000)    /* ldah $gp,n($t12) */
1247
        continue;
1248
      if ((inst & 0xffff0000) == 0x23bd0000)    /* lda $gp,n($gp) */
1249
        continue;
1250
      if ((inst & 0xffff0000) == 0x23de0000)    /* lda $sp,n($sp) */
1251
        continue;
1252
      if ((inst & 0xffe01fff) == 0x43c0153e)    /* subq $sp,n,$sp */
1253
        continue;
1254
 
1255
      if ((inst & 0xfc1f0000) == 0xb41e0000
1256
          && (inst & 0xffff0000) != 0xb7fe0000)
1257
        continue;               /* stq reg,n($sp) */
1258
      /* reg != $zero */
1259
      if ((inst & 0xfc1f0000) == 0x9c1e0000
1260
          && (inst & 0xffff0000) != 0x9ffe0000)
1261
        continue;               /* stt reg,n($sp) */
1262
      /* reg != $zero */
1263
      if (inst == 0x47de040f)   /* bis sp,sp,fp */
1264
        continue;
1265
 
1266
      break;
1267
    }
1268
  return pc + offset;
1269
}
1270
 
1271
#if 0
1272
/* Is address PC in the prologue (loosely defined) for function at
1273
   STARTADDR?  */
1274
 
1275
static int
1276
alpha_in_lenient_prologue (startaddr, pc)
1277
     CORE_ADDR startaddr;
1278
     CORE_ADDR pc;
1279
{
1280
  CORE_ADDR end_prologue = alpha_skip_prologue (startaddr, 1);
1281
  return pc >= startaddr && pc < end_prologue;
1282
}
1283
#endif
1284
 
1285
/* The alpha needs a conversion between register and memory format if
1286
   the register is a floating point register and
1287
   memory format is float, as the register format must be double
1288
   or
1289
   memory format is an integer with 4 bytes or less, as the representation
1290
   of integers in floating point registers is different. */
1291
void
1292
alpha_register_convert_to_virtual (regnum, valtype, raw_buffer, virtual_buffer)
1293
     int regnum;
1294
     struct type *valtype;
1295
     char *raw_buffer;
1296
     char *virtual_buffer;
1297
{
1298
  if (TYPE_LENGTH (valtype) >= REGISTER_RAW_SIZE (regnum))
1299
    {
1300
      memcpy (virtual_buffer, raw_buffer, REGISTER_VIRTUAL_SIZE (regnum));
1301
      return;
1302
    }
1303
 
1304
  if (TYPE_CODE (valtype) == TYPE_CODE_FLT)
1305
    {
1306
      double d = extract_floating (raw_buffer, REGISTER_RAW_SIZE (regnum));
1307
      store_floating (virtual_buffer, TYPE_LENGTH (valtype), d);
1308
    }
1309
  else if (TYPE_CODE (valtype) == TYPE_CODE_INT && TYPE_LENGTH (valtype) <= 4)
1310
    {
1311
      ULONGEST l;
1312
      l = extract_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (regnum));
1313
      l = ((l >> 32) & 0xc0000000) | ((l >> 29) & 0x3fffffff);
1314
      store_unsigned_integer (virtual_buffer, TYPE_LENGTH (valtype), l);
1315
    }
1316
  else
1317
    error ("Cannot retrieve value from floating point register");
1318
}
1319
 
1320
void
1321
alpha_register_convert_to_raw (valtype, regnum, virtual_buffer, raw_buffer)
1322
     struct type *valtype;
1323
     int regnum;
1324
     char *virtual_buffer;
1325
     char *raw_buffer;
1326
{
1327
  if (TYPE_LENGTH (valtype) >= REGISTER_RAW_SIZE (regnum))
1328
    {
1329
      memcpy (raw_buffer, virtual_buffer, REGISTER_RAW_SIZE (regnum));
1330
      return;
1331
    }
1332
 
1333
  if (TYPE_CODE (valtype) == TYPE_CODE_FLT)
1334
    {
1335
      double d = extract_floating (virtual_buffer, TYPE_LENGTH (valtype));
1336
      store_floating (raw_buffer, REGISTER_RAW_SIZE (regnum), d);
1337
    }
1338
  else if (TYPE_CODE (valtype) == TYPE_CODE_INT && TYPE_LENGTH (valtype) <= 4)
1339
    {
1340
      ULONGEST l;
1341
      if (TYPE_UNSIGNED (valtype))
1342
        l = extract_unsigned_integer (virtual_buffer, TYPE_LENGTH (valtype));
1343
      else
1344
        l = extract_signed_integer (virtual_buffer, TYPE_LENGTH (valtype));
1345
      l = ((l & 0xc0000000) << 32) | ((l & 0x3fffffff) << 29);
1346
      store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (regnum), l);
1347
    }
1348
  else
1349
    error ("Cannot store value in floating point register");
1350
}
1351
 
1352
/* Given a return value in `regbuf' with a type `valtype',
1353
   extract and copy its value into `valbuf'.  */
1354
 
1355
void
1356
alpha_extract_return_value (valtype, regbuf, valbuf)
1357
     struct type *valtype;
1358
     char regbuf[REGISTER_BYTES];
1359
     char *valbuf;
1360
{
1361
  if (TYPE_CODE (valtype) == TYPE_CODE_FLT)
1362
    alpha_register_convert_to_virtual (FP0_REGNUM, valtype,
1363
                                       regbuf + REGISTER_BYTE (FP0_REGNUM),
1364
                                       valbuf);
1365
  else
1366
    memcpy (valbuf, regbuf + REGISTER_BYTE (V0_REGNUM), TYPE_LENGTH (valtype));
1367
}
1368
 
1369
/* Given a return value in `regbuf' with a type `valtype',
1370
   write its value into the appropriate register.  */
1371
 
1372
void
1373
alpha_store_return_value (valtype, valbuf)
1374
     struct type *valtype;
1375
     char *valbuf;
1376
{
1377
  char raw_buffer[MAX_REGISTER_RAW_SIZE];
1378
  int regnum = V0_REGNUM;
1379
  int length = TYPE_LENGTH (valtype);
1380
 
1381
  if (TYPE_CODE (valtype) == TYPE_CODE_FLT)
1382
    {
1383
      regnum = FP0_REGNUM;
1384
      length = REGISTER_RAW_SIZE (regnum);
1385
      alpha_register_convert_to_raw (valtype, regnum, valbuf, raw_buffer);
1386
    }
1387
  else
1388
    memcpy (raw_buffer, valbuf, length);
1389
 
1390
  write_register_bytes (REGISTER_BYTE (regnum), raw_buffer, length);
1391
}
1392
 
1393
/* Just like reinit_frame_cache, but with the right arguments to be
1394
   callable as an sfunc.  */
1395
 
1396
static void
1397
reinit_frame_cache_sfunc (args, from_tty, c)
1398
     char *args;
1399
     int from_tty;
1400
     struct cmd_list_element *c;
1401
{
1402
  reinit_frame_cache ();
1403
}
1404
 
1405
/* This is the definition of CALL_DUMMY_ADDRESS.  It's a heuristic that is used
1406
   to find a convenient place in the text segment to stick a breakpoint to
1407
   detect the completion of a target function call (ala call_function_by_hand).
1408
 */
1409
 
1410
CORE_ADDR
1411
alpha_call_dummy_address ()
1412
{
1413
  CORE_ADDR entry;
1414
  struct minimal_symbol *sym;
1415
 
1416
  entry = entry_point_address ();
1417
 
1418
  if (entry != 0)
1419
    return entry;
1420
 
1421
  sym = lookup_minimal_symbol ("_Prelude", NULL, symfile_objfile);
1422
 
1423
  if (!sym || MSYMBOL_TYPE (sym) != mst_text)
1424
    return 0;
1425
  else
1426
    return SYMBOL_VALUE_ADDRESS (sym) + 4;
1427
}
1428
 
1429
void
1430
_initialize_alpha_tdep ()
1431
{
1432
  struct cmd_list_element *c;
1433
 
1434
  tm_print_insn = print_insn_alpha;
1435
 
1436
  /* Let the user set the fence post for heuristic_proc_start.  */
1437
 
1438
  /* We really would like to have both "0" and "unlimited" work, but
1439
     command.c doesn't deal with that.  So make it a var_zinteger
1440
     because the user can always use "999999" or some such for unlimited.  */
1441
  c = add_set_cmd ("heuristic-fence-post", class_support, var_zinteger,
1442
                   (char *) &heuristic_fence_post,
1443
                   "\
1444
Set the distance searched for the start of a function.\n\
1445
If you are debugging a stripped executable, GDB needs to search through the\n\
1446
program for the start of a function.  This command sets the distance of the\n\
1447
search.  The only need to set it is when debugging a stripped executable.",
1448
                   &setlist);
1449
  /* We need to throw away the frame cache when we set this, since it
1450
     might change our ability to get backtraces.  */
1451
  c->function.sfunc = reinit_frame_cache_sfunc;
1452
  add_show_from_set (c, &showlist);
1453
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.