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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [gdb/] [fr30-tdep.c] - Blame information for rev 1774

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

Line No. Rev Author Line
1 578 markom
/* Target-dependent code for the Fujitsu FR30.
2
   Copyright 1999, 2000, 2001 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 "obstack.h"
25
#include "target.h"
26
#include "value.h"
27
#include "bfd.h"
28
#include "gdb_string.h"
29
#include "gdbcore.h"
30
#include "symfile.h"
31
#include "regcache.h"
32
 
33
/* An expression that tells us whether the function invocation represented
34
   by FI does not have a frame on the stack associated with it.  */
35
int
36
fr30_frameless_function_invocation (struct frame_info *fi)
37
{
38
  int frameless;
39
  CORE_ADDR func_start, after_prologue;
40
  func_start = (get_pc_function_start ((fi)->pc) +
41
                FUNCTION_START_OFFSET);
42
  after_prologue = func_start;
43
  after_prologue = SKIP_PROLOGUE (after_prologue);
44
  frameless = (after_prologue == func_start);
45
  return frameless;
46
}
47
 
48
/* Function: pop_frame
49
   This routine gets called when either the user uses the `return'
50
   command, or the call dummy breakpoint gets hit.  */
51
 
52
void
53
fr30_pop_frame (void)
54
{
55
  struct frame_info *frame = get_current_frame ();
56
  int regnum;
57
  CORE_ADDR sp = read_register (SP_REGNUM);
58
 
59
  if (PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
60
    generic_pop_dummy_frame ();
61
  else
62
    {
63
      write_register (PC_REGNUM, FRAME_SAVED_PC (frame));
64
 
65
      for (regnum = 0; regnum < NUM_REGS; regnum++)
66
        if (frame->fsr.regs[regnum] != 0)
67
          {
68
            write_register (regnum,
69
                      read_memory_unsigned_integer (frame->fsr.regs[regnum],
70
                                               REGISTER_RAW_SIZE (regnum)));
71
          }
72
      write_register (SP_REGNUM, sp + frame->framesize);
73
    }
74
  flush_cached_frames ();
75
}
76
 
77
 
78
/* Function: fr30_store_return_value
79
   Put a value where a caller expects to see it.  Used by the 'return'
80
   command.  */
81
void
82
fr30_store_return_value (struct type *type,
83
                         char *valbuf)
84
{
85
  /* Here's how the FR30 returns values (gleaned from gcc/config/
86
     fr30/fr30.h):
87
 
88
     If the return value is 32 bits long or less, it goes in r4.
89
 
90
     If the return value is 64 bits long or less, it goes in r4 (most
91
     significant word) and r5 (least significant word.
92
 
93
     If the function returns a structure, of any size, the caller
94
     passes the function an invisible first argument where the callee
95
     should store the value.  But GDB doesn't let you do that anyway.
96
 
97
     If you're returning a value smaller than a word, it's not really
98
     necessary to zero the upper bytes of the register; the caller is
99
     supposed to ignore them.  However, the FR30 typically keeps its
100
     values extended to the full register width, so we should emulate
101
     that.  */
102
 
103
  /* The FR30 is big-endian, so if we return a small value (like a
104
     short or a char), we need to position it correctly within the
105
     register.  We round the size up to a register boundary, and then
106
     adjust the offset so as to place the value at the right end.  */
107
  int value_size = TYPE_LENGTH (type);
108
  int returned_size = (value_size + FR30_REGSIZE - 1) & ~(FR30_REGSIZE - 1);
109
  int offset = (REGISTER_BYTE (RETVAL_REG)
110
                + (returned_size - value_size));
111
  char *zeros = alloca (returned_size);
112
  memset (zeros, 0, returned_size);
113
 
114
  write_register_bytes (REGISTER_BYTE (RETVAL_REG), zeros, returned_size);
115
  write_register_bytes (offset, valbuf, value_size);
116
}
117
 
118
 
119
/* Function: skip_prologue
120
   Return the address of the first code past the prologue of the function.  */
121
 
122
CORE_ADDR
123
fr30_skip_prologue (CORE_ADDR pc)
124
{
125
  CORE_ADDR func_addr, func_end;
126
 
127
  /* See what the symbol table says */
128
 
129
  if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
130
    {
131
      struct symtab_and_line sal;
132
 
133
      sal = find_pc_line (func_addr, 0);
134
 
135
      if (sal.line != 0 && sal.end < func_end)
136
        {
137
          return sal.end;
138
        }
139
    }
140
 
141
/* Either we didn't find the start of this function (nothing we can do),
142
   or there's no line info, or the line after the prologue is after
143
   the end of the function (there probably isn't a prologue). */
144
 
145
  return pc;
146
}
147
 
148
 
149
/* Function: push_arguments
150
   Setup arguments and RP for a call to the target.  First four args
151
   go in FIRST_ARGREG -> LAST_ARGREG, subsequent args go on stack...
152
   Structs are passed by reference.  XXX not right now Z.R.
153
   64 bit quantities (doubles and long longs) may be split between
154
   the regs and the stack.
155
   When calling a function that returns a struct, a pointer to the struct
156
   is passed in as a secret first argument (always in FIRST_ARGREG).
157
 
158
   Stack space for the args has NOT been allocated: that job is up to us.
159
 */
160
 
161
CORE_ADDR
162
fr30_push_arguments (int nargs, value_ptr *args, CORE_ADDR sp,
163
                     int struct_return, CORE_ADDR struct_addr)
164
{
165
  int argreg;
166
  int argnum;
167
  int stack_offset;
168
  struct stack_arg
169
    {
170
      char *val;
171
      int len;
172
      int offset;
173
    };
174
  struct stack_arg *stack_args =
175
  (struct stack_arg *) alloca (nargs * sizeof (struct stack_arg));
176
  int nstack_args = 0;
177
 
178
  argreg = FIRST_ARGREG;
179
 
180
  /* the struct_return pointer occupies the first parameter-passing reg */
181
  if (struct_return)
182
    write_register (argreg++, struct_addr);
183
 
184
  stack_offset = 0;
185
 
186
  /* Process args from left to right.  Store as many as allowed in
187
     registers, save the rest to be pushed on the stack */
188
  for (argnum = 0; argnum < nargs; argnum++)
189
    {
190
      char *val;
191
      value_ptr arg = args[argnum];
192
      struct type *arg_type = check_typedef (VALUE_TYPE (arg));
193
      struct type *target_type = TYPE_TARGET_TYPE (arg_type);
194
      int len = TYPE_LENGTH (arg_type);
195
      enum type_code typecode = TYPE_CODE (arg_type);
196
      CORE_ADDR regval;
197
      int newarg;
198
 
199
      val = (char *) VALUE_CONTENTS (arg);
200
 
201
      {
202
        /* Copy the argument to general registers or the stack in
203
           register-sized pieces.  Large arguments are split between
204
           registers and stack.  */
205
        while (len > 0)
206
          {
207
            if (argreg <= LAST_ARGREG)
208
              {
209
                int partial_len = len < REGISTER_SIZE ? len : REGISTER_SIZE;
210
                regval = extract_address (val, partial_len);
211
 
212
                /* It's a simple argument being passed in a general
213
                   register.  */
214
                write_register (argreg, regval);
215
                argreg++;
216
                len -= partial_len;
217
                val += partial_len;
218
              }
219
            else
220
              {
221
                /* keep for later pushing */
222
                stack_args[nstack_args].val = val;
223
                stack_args[nstack_args++].len = len;
224
                break;
225
              }
226
          }
227
      }
228
    }
229
  /* now do the real stack pushing, process args right to left */
230
  while (nstack_args--)
231
    {
232
      sp -= stack_args[nstack_args].len;
233
      write_memory (sp, stack_args[nstack_args].val,
234
                    stack_args[nstack_args].len);
235
    }
236
 
237
  /* Return adjusted stack pointer.  */
238
  return sp;
239
}
240
 
241
void _initialize_fr30_tdep (void);
242
 
243
void
244
_initialize_fr30_tdep (void)
245
{
246
  extern int print_insn_fr30 (bfd_vma, disassemble_info *);
247
  tm_print_insn = print_insn_fr30;
248
}
249
 
250
/* Function: check_prologue_cache
251
   Check if prologue for this frame's PC has already been scanned.
252
   If it has, copy the relevant information about that prologue and
253
   return non-zero.  Otherwise do not copy anything and return zero.
254
 
255
   The information saved in the cache includes:
256
   * the frame register number;
257
   * the size of the stack frame;
258
   * the offsets of saved regs (relative to the old SP); and
259
   * the offset from the stack pointer to the frame pointer
260
 
261
   The cache contains only one entry, since this is adequate
262
   for the typical sequence of prologue scan requests we get.
263
   When performing a backtrace, GDB will usually ask to scan
264
   the same function twice in a row (once to get the frame chain,
265
   and once to fill in the extra frame information).
266
 */
267
 
268
static struct frame_info prologue_cache;
269
 
270
static int
271
check_prologue_cache (struct frame_info *fi)
272
{
273
  int i;
274
 
275
  if (fi->pc == prologue_cache.pc)
276
    {
277
      fi->framereg = prologue_cache.framereg;
278
      fi->framesize = prologue_cache.framesize;
279
      fi->frameoffset = prologue_cache.frameoffset;
280
      for (i = 0; i <= NUM_REGS; i++)
281
        fi->fsr.regs[i] = prologue_cache.fsr.regs[i];
282
      return 1;
283
    }
284
  else
285
    return 0;
286
}
287
 
288
 
289
/* Function: save_prologue_cache
290
   Copy the prologue information from fi to the prologue cache.
291
 */
292
 
293
static void
294
save_prologue_cache (struct frame_info *fi)
295
{
296
  int i;
297
 
298
  prologue_cache.pc = fi->pc;
299
  prologue_cache.framereg = fi->framereg;
300
  prologue_cache.framesize = fi->framesize;
301
  prologue_cache.frameoffset = fi->frameoffset;
302
 
303
  for (i = 0; i <= NUM_REGS; i++)
304
    {
305
      prologue_cache.fsr.regs[i] = fi->fsr.regs[i];
306
    }
307
}
308
 
309
 
310
/* Function: scan_prologue
311
   Scan the prologue of the function that contains PC, and record what
312
   we find in PI.  PI->fsr must be zeroed by the called.  Returns the
313
   pc after the prologue.  Note that the addresses saved in pi->fsr
314
   are actually just frame relative (negative offsets from the frame
315
   pointer).  This is because we don't know the actual value of the
316
   frame pointer yet.  In some circumstances, the frame pointer can't
317
   be determined till after we have scanned the prologue.  */
318
 
319
static void
320
fr30_scan_prologue (struct frame_info *fi)
321
{
322
  int sp_offset, fp_offset;
323
  CORE_ADDR prologue_start, prologue_end, current_pc;
324
 
325
  /* Check if this function is already in the cache of frame information. */
326
  if (check_prologue_cache (fi))
327
    return;
328
 
329
  /* Assume there is no frame until proven otherwise.  */
330
  fi->framereg = SP_REGNUM;
331
  fi->framesize = 0;
332
  fi->frameoffset = 0;
333
 
334
  /* Find the function prologue.  If we can't find the function in
335
     the symbol table, peek in the stack frame to find the PC.  */
336
  if (find_pc_partial_function (fi->pc, NULL, &prologue_start, &prologue_end))
337
    {
338
      /* Assume the prologue is everything between the first instruction
339
         in the function and the first source line.  */
340
      struct symtab_and_line sal = find_pc_line (prologue_start, 0);
341
 
342
      if (sal.line == 0) /* no line info, use current PC */
343
        prologue_end = fi->pc;
344
      else if (sal.end < prologue_end)  /* next line begins after fn end */
345
        prologue_end = sal.end; /* (probably means no prologue)  */
346
    }
347
  else
348
    {
349
      /* XXX Z.R. What now??? The following is entirely bogus */
350
      prologue_start = (read_memory_integer (fi->frame, 4) & 0x03fffffc) - 12;
351
      prologue_end = prologue_start + 40;
352
    }
353
 
354
  /* Now search the prologue looking for instructions that set up the
355
     frame pointer, adjust the stack pointer, and save registers.  */
356
 
357
  sp_offset = fp_offset = 0;
358
  for (current_pc = prologue_start; current_pc < prologue_end; current_pc += 2)
359
    {
360
      unsigned int insn;
361
 
362
      insn = read_memory_unsigned_integer (current_pc, 2);
363
 
364
      if ((insn & 0xfe00) == 0x8e00)    /* stm0 or stm1 */
365
        {
366
          int reg, mask = insn & 0xff;
367
 
368
          /* scan in one sweep - create virtual 16-bit mask from either insn's mask */
369
          if ((insn & 0x0100) == 0)
370
            {
371
              mask <<= 8;       /* stm0 - move to upper byte in virtual mask */
372
            }
373
 
374
          /* Calculate offsets of saved registers (to be turned later into addresses). */
375
          for (reg = R4_REGNUM; reg <= R11_REGNUM; reg++)
376
            if (mask & (1 << (15 - reg)))
377
              {
378
                sp_offset -= 4;
379
                fi->fsr.regs[reg] = sp_offset;
380
              }
381
        }
382
      else if ((insn & 0xfff0) == 0x1700)       /* st rx,@-r15 */
383
        {
384
          int reg = insn & 0xf;
385
 
386
          sp_offset -= 4;
387
          fi->fsr.regs[reg] = sp_offset;
388
        }
389
      else if ((insn & 0xff00) == 0x0f00)       /* enter */
390
        {
391
          fp_offset = fi->fsr.regs[FP_REGNUM] = sp_offset - 4;
392
          sp_offset -= 4 * (insn & 0xff);
393
          fi->framereg = FP_REGNUM;
394
        }
395
      else if (insn == 0x1781)  /* st rp,@-sp */
396
        {
397
          sp_offset -= 4;
398
          fi->fsr.regs[RP_REGNUM] = sp_offset;
399
        }
400
      else if (insn == 0x170e)  /* st fp,@-sp */
401
        {
402
          sp_offset -= 4;
403
          fi->fsr.regs[FP_REGNUM] = sp_offset;
404
        }
405
      else if (insn == 0x8bfe)  /* mov sp,fp */
406
        {
407
          fi->framereg = FP_REGNUM;
408
        }
409
      else if ((insn & 0xff00) == 0xa300)       /* addsp xx */
410
        {
411
          sp_offset += 4 * (signed char) (insn & 0xff);
412
        }
413
      else if ((insn & 0xff0f) == 0x9b00 &&     /* ldi:20 xx,r0 */
414
               read_memory_unsigned_integer (current_pc + 4, 2)
415
               == 0xac0f)       /* sub r0,sp */
416
        {
417
          /* large stack adjustment */
418
          sp_offset -= (((insn & 0xf0) << 12) | read_memory_unsigned_integer (current_pc + 2, 2));
419
          current_pc += 4;
420
        }
421
      else if (insn == 0x9f80 &&        /* ldi:32 xx,r0 */
422
               read_memory_unsigned_integer (current_pc + 6, 2)
423
               == 0xac0f)       /* sub r0,sp */
424
        {
425
          /* large stack adjustment */
426
          sp_offset -=
427
            (read_memory_unsigned_integer (current_pc + 2, 2) << 16 |
428
             read_memory_unsigned_integer (current_pc + 4, 2));
429
          current_pc += 6;
430
        }
431
    }
432
 
433
  /* The frame size is just the negative of the offset (from the original SP)
434
     of the last thing thing we pushed on the stack.  The frame offset is
435
     [new FP] - [new SP].  */
436
  fi->framesize = -sp_offset;
437
  fi->frameoffset = fp_offset - sp_offset;
438
 
439
  save_prologue_cache (fi);
440
}
441
 
442
/* Function: init_extra_frame_info
443
   Setup the frame's frame pointer, pc, and frame addresses for saved
444
   registers.  Most of the work is done in scan_prologue().
445
 
446
   Note that when we are called for the last frame (currently active frame),
447
   that fi->pc and fi->frame will already be setup.  However, fi->frame will
448
   be valid only if this routine uses FP.  For previous frames, fi-frame will
449
   always be correct (since that is derived from fr30_frame_chain ()).
450
 
451
   We can be called with the PC in the call dummy under two circumstances.
452
   First, during normal backtracing, second, while figuring out the frame
453
   pointer just prior to calling the target function (see run_stack_dummy).  */
454
 
455
void
456
fr30_init_extra_frame_info (struct frame_info *fi)
457
{
458
  int reg;
459
 
460
  if (fi->next)
461
    fi->pc = FRAME_SAVED_PC (fi->next);
462
 
463
  memset (fi->fsr.regs, '\000', sizeof fi->fsr.regs);
464
 
465
  if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
466
    {
467
      /* We need to setup fi->frame here because run_stack_dummy gets it wrong
468
         by assuming it's always FP.  */
469
      fi->frame = generic_read_register_dummy (fi->pc, fi->frame, SP_REGNUM);
470
      fi->framesize = 0;
471
      fi->frameoffset = 0;
472
      return;
473
    }
474
  fr30_scan_prologue (fi);
475
 
476
  if (!fi->next)                /* this is the innermost frame? */
477
    fi->frame = read_register (fi->framereg);
478
  else
479
    /* not the innermost frame */
480
    /* If we have an FP,  the callee saved it. */
481
    if (fi->framereg == FP_REGNUM)
482
      if (fi->next->fsr.regs[fi->framereg] != 0)
483
        fi->frame = read_memory_integer (fi->next->fsr.regs[fi->framereg], 4);
484
 
485
  /* Calculate actual addresses of saved registers using offsets determined
486
     by fr30_scan_prologue.  */
487
  for (reg = 0; reg < NUM_REGS; reg++)
488
    if (fi->fsr.regs[reg] != 0)
489
      {
490
        fi->fsr.regs[reg] += fi->frame + fi->framesize - fi->frameoffset;
491
      }
492
}
493
 
494
/* Function: find_callers_reg
495
   Find REGNUM on the stack.  Otherwise, it's in an active register.
496
   One thing we might want to do here is to check REGNUM against the
497
   clobber mask, and somehow flag it as invalid if it isn't saved on
498
   the stack somewhere.  This would provide a graceful failure mode
499
   when trying to get the value of caller-saves registers for an inner
500
   frame.  */
501
 
502
CORE_ADDR
503
fr30_find_callers_reg (struct frame_info *fi, int regnum)
504
{
505
  for (; fi; fi = fi->next)
506
    if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
507
      return generic_read_register_dummy (fi->pc, fi->frame, regnum);
508
    else if (fi->fsr.regs[regnum] != 0)
509
      return read_memory_unsigned_integer (fi->fsr.regs[regnum],
510
                                           REGISTER_RAW_SIZE (regnum));
511
 
512
  return read_register (regnum);
513
}
514
 
515
 
516
/* Function: frame_chain
517
   Figure out the frame prior to FI.  Unfortunately, this involves
518
   scanning the prologue of the caller, which will also be done
519
   shortly by fr30_init_extra_frame_info.  For the dummy frame, we
520
   just return the stack pointer that was in use at the time the
521
   function call was made.  */
522
 
523
 
524
CORE_ADDR
525
fr30_frame_chain (struct frame_info *fi)
526
{
527
  CORE_ADDR fn_start, callers_pc, fp;
528
  struct frame_info caller_fi;
529
  int framereg;
530
 
531
  /* is this a dummy frame? */
532
  if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
533
    return fi->frame;           /* dummy frame same as caller's frame */
534
 
535
  /* is caller-of-this a dummy frame? */
536
  callers_pc = FRAME_SAVED_PC (fi);     /* find out who called us: */
537
  fp = fr30_find_callers_reg (fi, FP_REGNUM);
538
  if (PC_IN_CALL_DUMMY (callers_pc, fp, fp))
539
    return fp;                  /* dummy frame's frame may bear no relation to ours */
540
 
541
  if (find_pc_partial_function (fi->pc, 0, &fn_start, 0))
542
    if (fn_start == entry_point_address ())
543
      return 0;                  /* in _start fn, don't chain further */
544
 
545
  framereg = fi->framereg;
546
 
547
  /* If the caller is the startup code, we're at the end of the chain.  */
548
  if (find_pc_partial_function (callers_pc, 0, &fn_start, 0))
549
    if (fn_start == entry_point_address ())
550
      return 0;
551
 
552
  memset (&caller_fi, 0, sizeof (caller_fi));
553
  caller_fi.pc = callers_pc;
554
  fr30_scan_prologue (&caller_fi);
555
  framereg = caller_fi.framereg;
556
 
557
  /* If the caller used a frame register, return its value.
558
     Otherwise, return the caller's stack pointer.  */
559
  if (framereg == FP_REGNUM)
560
    return fr30_find_callers_reg (fi, framereg);
561
  else
562
    return fi->frame + fi->framesize;
563
}
564
 
565
/* Function: frame_saved_pc
566
   Find the caller of this frame.  We do this by seeing if RP_REGNUM
567
   is saved in the stack anywhere, otherwise we get it from the
568
   registers.  If the inner frame is a dummy frame, return its PC
569
   instead of RP, because that's where "caller" of the dummy-frame
570
   will be found.  */
571
 
572
CORE_ADDR
573
fr30_frame_saved_pc (struct frame_info *fi)
574
{
575
  if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
576
    return generic_read_register_dummy (fi->pc, fi->frame, PC_REGNUM);
577
  else
578
    return fr30_find_callers_reg (fi, RP_REGNUM);
579
}
580
 
581
/* Function: fix_call_dummy
582
   Pokes the callee function's address into the CALL_DUMMY assembly stub.
583
   Assumes that the CALL_DUMMY looks like this:
584
   jarl <offset24>, r31
585
   trap
586
 */
587
 
588
int
589
fr30_fix_call_dummy (char *dummy, CORE_ADDR sp, CORE_ADDR fun, int nargs,
590
                     value_ptr *args, struct type *type, int gcc_p)
591
{
592
  long offset24;
593
 
594
  offset24 = (long) fun - (long) entry_point_address ();
595
  offset24 &= 0x3fffff;
596
  offset24 |= 0xff800000;       /* jarl <offset24>, r31 */
597
 
598
  store_unsigned_integer ((unsigned int *) &dummy[2], 2, offset24 & 0xffff);
599
  store_unsigned_integer ((unsigned int *) &dummy[0], 2, offset24 >> 16);
600
  return 0;
601
}

powered by: WebSVN 2.1.0

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