1 /* Target-dependent code for the Sanyo Xstormy16a (LC590000) processor.
3 Copyright 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
26 #include "arch-utils.h"
34 /* gdbarch target dependent data here. Currently unused for Xstormy16. */
37 /* Extra info which is saved in each frame_info. */
38 struct frame_extra_info
46 /* Xstormy16 has 16 general purpose registers (R0-R15) plus PC.
47 Functions will return their values in register R2-R7 as they fit.
48 Otherwise a hidden pointer to an big enough area is given as argument
49 to the function in r2. Further arguments are beginning in r3 then.
50 R13 is used as frame pointer when GCC compiles w/o optimization
51 R14 is used as "PSW", displaying the CPU status.
52 R15 is used implicitely as stack pointer. */
55 E_R2_REGNUM, E_1ST_ARG_REGNUM = E_R2_REGNUM, E_PTR_RET_REGNUM = E_R2_REGNUM,
60 E_R7_REGNUM, E_LST_ARG_REGNUM = E_R7_REGNUM,
66 E_R13_REGNUM, E_FP_REGNUM = E_R13_REGNUM,
67 E_R14_REGNUM, E_PSW_REGNUM = E_R14_REGNUM,
68 E_R15_REGNUM, E_SP_REGNUM = E_R15_REGNUM,
73 /* Size of instructions, registers, etc. */
76 xstormy16_inst_size = 2,
77 xstormy16_reg_size = 2,
81 /* Size of return datatype which fits into the remaining return registers. */
82 #define E_MAX_RETTYPE_SIZE(regnum) ((E_LST_ARG_REGNUM - (regnum) + 1) \
85 /* Size of return datatype which fits into all return registers. */
88 E_MAX_RETTYPE_SIZE_IN_REGS = E_MAX_RETTYPE_SIZE (E_R2_REGNUM)
92 /* Size of all registers as a whole. */
95 E_ALL_REGS_SIZE = (E_NUM_REGS - 1) * xstormy16_reg_size + xstormy16_pc_size
98 /* Function: xstormy16_register_name
99 Returns the name of the standard Xstormy16 register N. */
102 xstormy16_register_name (int regnum)
104 static char *register_names[] = {
105 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
106 "r8", "r9", "r10", "r11", "r12", "r13",
111 regnum >= sizeof (register_names) / sizeof (register_names[0]))
112 internal_error (__FILE__, __LINE__,
113 "xstormy16_register_name: illegal register number %d",
116 return register_names[regnum];
120 /* Function: xstormy16_register_byte
121 Returns the byte position in the register cache for register N. */
124 xstormy16_register_byte (int regnum)
126 if (regnum < 0 || regnum >= E_NUM_REGS)
127 internal_error (__FILE__, __LINE__,
128 "xstormy16_register_byte: illegal register number %d",
131 /* All registers occupy 2 bytes in the regcache except for PC
132 which is the last one. Therefore the byte position is still
133 simply a multiple of 2. */
134 return regnum * xstormy16_reg_size;
137 /* Function: xstormy16_register_raw_size
138 Returns the number of bytes occupied by the register on the target. */
141 xstormy16_register_raw_size (int regnum)
143 if (regnum < 0 || regnum >= E_NUM_REGS)
144 internal_error (__FILE__, __LINE__,
145 "xstormy16_register_raw_size: illegal register number %d",
147 /* Only the PC has 4 Byte, all other registers 2 Byte. */
148 else if (regnum == E_PC_REGNUM)
149 return xstormy16_pc_size;
151 return xstormy16_reg_size;
154 /* Function: xstormy16_register_virtual_size
155 Returns the number of bytes occupied by the register as represented
156 internally by gdb. */
159 xstormy16_register_virtual_size (int regnum)
161 return xstormy16_register_raw_size (regnum);
164 /* Function: xstormy16_reg_virtual_type
165 Returns the default type for register N. */
168 xstormy16_reg_virtual_type (int regnum)
170 if (regnum < 0 || regnum >= E_NUM_REGS)
171 internal_error (__FILE__, __LINE__,
172 "xstormy16_register_virtual_type: illegal register number %d",
174 else if (regnum == E_PC_REGNUM)
175 return builtin_type_uint32;
177 return builtin_type_uint16;
180 /* Function: xstormy16_get_saved_register
181 Find a register's saved value on the call stack. */
184 xstormy16_get_saved_register (char *raw_buffer,
187 struct frame_info *fi,
188 int regnum, enum lval_type *lval)
190 deprecated_generic_get_saved_register (raw_buffer, optimized, addrp, fi, regnum, lval);
193 /* Function: xstormy16_type_is_scalar
194 Makes the decision if a given type is a scalar types. Scalar
195 types are returned in the registers r2-r7 as they fit. */
198 xstormy16_type_is_scalar (struct type *t)
200 return (TYPE_CODE(t) != TYPE_CODE_STRUCT
201 && TYPE_CODE(t) != TYPE_CODE_UNION
202 && TYPE_CODE(t) != TYPE_CODE_ARRAY);
205 /* Function: xstormy16_extract_return_value
206 Copy the function's return value into VALBUF.
207 This function is called only in the context of "target function calls",
208 ie. when the debugger forces a function to be called in the child, and
209 when the debugger forces a function to return prematurely via the
213 xstormy16_extract_return_value (struct type *type, char *regbuf, char *valbuf)
215 CORE_ADDR return_buffer;
218 if (xstormy16_type_is_scalar (type)
219 && TYPE_LENGTH (type) <= E_MAX_RETTYPE_SIZE_IN_REGS)
221 /* Scalar return values of <= 12 bytes are returned in
222 E_1ST_ARG_REGNUM to E_LST_ARG_REGNUM. */
224 ®buf[DEPRECATED_REGISTER_BYTE (E_1ST_ARG_REGNUM)] + offset,
229 /* Aggregates and return values > 12 bytes are returned in memory,
232 extract_unsigned_integer (regbuf + DEPRECATED_REGISTER_BYTE (E_PTR_RET_REGNUM),
233 DEPRECATED_REGISTER_RAW_SIZE (E_PTR_RET_REGNUM));
235 read_memory (return_buffer, valbuf, TYPE_LENGTH (type));
239 /* Function: xstormy16_push_arguments
240 Setup the function arguments for GDB to call a function in the inferior.
241 Called only in the context of a target function call from the debugger.
242 Returns the value of the SP register after the args are pushed.
246 xstormy16_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
247 int struct_return, CORE_ADDR struct_addr)
249 CORE_ADDR stack_dest = sp;
250 int argreg = E_1ST_ARG_REGNUM;
252 int typelen, slacklen;
255 /* If struct_return is true, then the struct return address will
256 consume one argument-passing register. */
260 /* Arguments are passed in R2-R7 as they fit. If an argument doesn't
261 fit in the remaining registers we're switching over to the stack.
262 No argument is put on stack partially and as soon as we switched
263 over to stack no further argument is put in a register even if it
264 would fit in the remaining unused registers. */
265 for (i = 0; i < nargs && argreg <= E_LST_ARG_REGNUM; i++)
267 typelen = TYPE_LENGTH (VALUE_ENCLOSING_TYPE (args[i]));
268 if (typelen > E_MAX_RETTYPE_SIZE (argreg))
271 /* Put argument into registers wordwise. */
272 val = VALUE_CONTENTS (args[i]);
273 for (j = 0; j < typelen; j += xstormy16_reg_size)
274 write_register (argreg++,
275 extract_unsigned_integer (val + j,
278 xstormy16_reg_size));
285 /* Loop backwards through remaining arguments and push them on the stack,
287 for (j = nargs - 1; j >= i; j--)
289 typelen = TYPE_LENGTH (VALUE_ENCLOSING_TYPE (args[j]));
290 slacklen = typelen & 1;
291 val = alloca (typelen + slacklen);
292 memcpy (val, VALUE_CONTENTS (args[j]), typelen);
293 memset (val + typelen, 0, slacklen);
295 /* Now write this data to the stack. The stack grows upwards. */
296 write_memory (stack_dest, val, typelen + slacklen);
297 stack_dest += typelen + slacklen;
300 /* And that should do it. Return the new stack pointer. */
304 /* Function: xstormy16_push_return_address (pc)
305 Setup the return address for GDB to call a function in the inferior.
306 Called only in the context of a target function call from the debugger.
307 Returns the value of the SP register when the operation is finished
308 (which may or may not be the same as before).
312 xstormy16_push_return_address (CORE_ADDR pc, CORE_ADDR sp)
314 unsigned char buf[xstormy16_pc_size];
316 store_unsigned_integer (buf, xstormy16_pc_size, entry_point_address ());
317 write_memory (sp, buf, xstormy16_pc_size);
318 return sp + xstormy16_pc_size;
321 /* Function: xstormy16_pop_frame
322 Destroy the innermost (Top-Of-Stack) stack frame, restoring the
323 machine state that was in effect before the frame was created.
324 Used in the contexts of the "return" command, and of
325 target function calls from the debugger.
329 xstormy16_pop_frame (void)
331 struct frame_info *fi = get_current_frame ();
335 return; /* paranoia */
337 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), get_frame_base (fi),
338 get_frame_base (fi)))
340 generic_pop_dummy_frame ();
344 /* Restore the saved regs. */
345 for (i = 0; i < NUM_REGS; i++)
346 if (deprecated_get_frame_saved_regs (fi)[i])
349 write_register (i, deprecated_get_frame_saved_regs (fi)[i]);
350 else if (i == E_PC_REGNUM)
351 write_register (i, read_memory_integer (deprecated_get_frame_saved_regs (fi)[i],
354 write_register (i, read_memory_integer (deprecated_get_frame_saved_regs (fi)[i],
355 xstormy16_reg_size));
358 write_register (PC_REGNUM, DEPRECATED_FRAME_SAVED_PC (fi));
359 flush_cached_frames ();
364 /* Function: xstormy16_store_struct_return
365 Copy the (struct) function return value to its destined location.
366 Called only in the context of a target function call from the debugger.
370 xstormy16_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
372 write_register (E_PTR_RET_REGNUM, addr);
375 /* Function: xstormy16_store_return_value
376 Copy the function return value from VALBUF into the
377 proper location for a function return.
378 Called only in the context of the "return" command.
382 xstormy16_store_return_value (struct type *type, char *valbuf)
384 CORE_ADDR return_buffer;
385 char buf[xstormy16_reg_size];
387 if (xstormy16_type_is_scalar (type) && TYPE_LENGTH (type) == 1)
389 /* Add leading zeros to the value. */
390 memset (buf, 0, xstormy16_reg_size);
391 memcpy (buf, valbuf, 1);
392 deprecated_write_register_gen (E_1ST_ARG_REGNUM, buf);
394 else if (xstormy16_type_is_scalar (type) &&
395 TYPE_LENGTH (type) <= E_MAX_RETTYPE_SIZE_IN_REGS)
396 deprecated_write_register_bytes (DEPRECATED_REGISTER_BYTE (E_1ST_ARG_REGNUM),
397 valbuf, TYPE_LENGTH (type));
400 return_buffer = read_register (E_PTR_RET_REGNUM);
401 write_memory (return_buffer, valbuf, TYPE_LENGTH (type));
405 /* Function: xstormy16_extract_struct_value_address
406 Returns the address in which a function should return a struct value.
407 Used in the contexts of the "return" command, and of
408 target function calls from the debugger.
412 xstormy16_extract_struct_value_address (struct regcache *regcache)
414 /* FIXME: cagney/2004-01-17: Does the ABI guarantee that the return
415 address regster is preserved across function calls? Probably
416 not, making this function wrong. */
418 regcache_raw_read_unsigned (regcache, E_PTR_RET_REGNUM, &val);
422 /* Function: xstormy16_use_struct_convention
423 Returns non-zero if the given struct type will be returned using
424 a special convention, rather than the normal function return method.
425 7sed in the contexts of the "return" command, and of
426 target function calls from the debugger.
430 xstormy16_use_struct_convention (int gcc_p, struct type *type)
432 return !xstormy16_type_is_scalar (type)
433 || TYPE_LENGTH (type) > E_MAX_RETTYPE_SIZE_IN_REGS;
436 /* Function: frame_saved_register
437 Returns the value that regnum had in frame fi
438 (saved in fi or in one of its children).
442 xstormy16_frame_saved_register (struct frame_info *fi, int regnum)
444 int size = xstormy16_register_raw_size (regnum);
445 char *buf = (char *) alloca (size);
447 deprecated_generic_get_saved_register (buf, NULL, NULL, fi, regnum, NULL);
448 return (CORE_ADDR) extract_unsigned_integer (buf, size);
451 /* Function: xstormy16_scan_prologue
452 Decode the instructions within the given address range.
453 Decide when we must have reached the end of the function prologue.
454 If a frame_info pointer is provided, fill in its saved_regs etc.
456 Returns the address of the first instruction after the prologue.
460 xstormy16_scan_prologue (CORE_ADDR start_addr, CORE_ADDR end_addr,
461 struct frame_info *fi, int *frameless)
463 CORE_ADDR sp = 0, fp = 0;
465 ULONGEST inst, inst2;
473 /* In a call dummy, don't touch the frame. */
474 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), get_frame_base (fi),
475 get_frame_base (fi)))
478 /* Grab the frame-relative values of SP and FP, needed below.
479 The frame_saved_register function will find them on the
480 stack or in the registers as appropriate. */
481 sp = xstormy16_frame_saved_register (fi, E_SP_REGNUM);
482 fp = xstormy16_frame_saved_register (fi, E_FP_REGNUM);
484 /* Initialize framesize with size of PC put on stack by CALLF inst. */
485 get_frame_extra_info (fi)->framesize = xstormy16_pc_size;
487 for (next_addr = start_addr;
488 next_addr < end_addr; next_addr += xstormy16_inst_size)
490 inst = read_memory_unsigned_integer (next_addr, xstormy16_inst_size);
491 inst2 = read_memory_unsigned_integer (next_addr + xstormy16_inst_size,
492 xstormy16_inst_size);
494 if (inst >= 0x0082 && inst <= 0x008d) /* push r2 .. push r13 */
498 regnum = inst & 0x000f;
499 deprecated_get_frame_saved_regs (fi)[regnum] = get_frame_extra_info (fi)->framesize;
500 get_frame_extra_info (fi)->framesize += xstormy16_reg_size;
504 /* optional stack allocation for args and local vars <= 4 byte */
505 else if (inst == 0x301f || inst == 0x303f) /* inc r15, #0x1/#0x3 */
507 if (fi) /* Record the frame size. */
508 get_frame_extra_info (fi)->framesize += ((inst & 0x0030) >> 4) + 1;
511 /* optional stack allocation for args and local vars > 4 && < 16 byte */
512 else if ((inst & 0xff0f) == 0x510f) /* 51Hf add r15, #0xH */
514 if (fi) /* Record the frame size. */
515 get_frame_extra_info (fi)->framesize += (inst & 0x00f0) >> 4;
518 /* optional stack allocation for args and local vars >= 16 byte */
519 else if (inst == 0x314f && inst2 >= 0x0010) /* 314f HHHH add r15, #0xH */
521 if (fi) /* Record the frame size. */
522 get_frame_extra_info (fi)->framesize += inst2;
523 next_addr += xstormy16_inst_size;
526 else if (inst == 0x46fd) /* mov r13, r15 */
528 if (fi) /* Record that the frame pointer is in use. */
529 get_frame_extra_info (fi)->frameless_p = 0;
534 /* optional copying of args in r2-r7 to r10-r13 */
535 /* Probably only in optimized case but legal action for prologue */
536 else if ((inst & 0xff00) == 0x4600 /* 46SD mov rD, rS */
537 && (inst & 0x00f0) >= 0x0020 && (inst & 0x00f0) <= 0x0070
538 && (inst & 0x000f) >= 0x00a0 && (inst & 0x000f) <= 0x000d)
541 /* optional copying of args in r2-r7 to stack */
542 /* 72DS HHHH mov.b (rD, 0xHHHH), r(S-8) (bit3 always 1, bit2-0 = reg) */
543 /* 73DS HHHH mov.w (rD, 0xHHHH), r(S-8) */
544 else if ((inst & 0xfed8) == 0x72d8 && (inst & 0x0007) >= 2)
548 regnum = inst & 0x0007;
549 /* Only 12 of 16 bits of the argument are used for the
551 offset = (LONGEST) (inst2 & 0x0fff);
555 deprecated_get_frame_saved_regs (fi)[regnum] = get_frame_extra_info (fi)->framesize + offset;
557 next_addr += xstormy16_inst_size;
561 /* 2001-08-10: Not part of the prologue anymore due to change in
562 ABI. r8 and r9 are not used for argument passing anymore. */
564 /* optional copying of r8, r9 to stack */
565 /* 46S7; 73Df HHHH mov.w r7,rS; mov.w (rD, 0xHHHH), r7 D=8,9; S=13,15 */
566 /* 46S7; 72df HHHH mov.w r7,rS; mov.b (rD, 0xHHHH), r7 D=8,9; S=13,15 */
567 else if ((inst & 0xffef) == 0x4687 && (inst2 & 0xfedf) == 0x72df)
569 next_addr += xstormy16_inst_size;
572 regnum = (inst & 0x00f0) >> 4;
574 inst2 = read_memory_unsigned_integer (next_addr
575 + xstormy16_inst_size,
576 xstormy16_inst_size);
577 /* Only 12 of 16 bits of the argument are used for the
579 offset = (LONGEST) (inst2 & 0x0fff);
583 fi->saved_regs[regnum] = fi->extra_info->framesize + offset;
585 next_addr += xstormy16_inst_size;
589 else /* Not a prologue instruction. */
595 /* Special handling for the "saved" address of the SP:
596 The SP is of course never saved on the stack at all, so
597 by convention what we put here is simply the previous
598 _value_ of the SP (as opposed to an address where the
599 previous value would have been pushed). */
600 if (get_frame_extra_info (fi)->frameless_p)
602 deprecated_get_frame_saved_regs (fi)[E_SP_REGNUM] = sp - get_frame_extra_info (fi)->framesize;
603 deprecated_update_frame_base_hack (fi, sp);
607 deprecated_get_frame_saved_regs (fi)[E_SP_REGNUM] = fp - get_frame_extra_info (fi)->framesize;
608 deprecated_update_frame_base_hack (fi, fp);
611 /* So far only offsets to the beginning of the frame are
612 saved in the saved_regs. Now we now the relation between
613 sp, fp and framesize. We know the beginning of the frame
614 so we can translate the register offsets to real addresses. */
615 for (regnum = 0; regnum < E_SP_REGNUM; ++regnum)
616 if (deprecated_get_frame_saved_regs (fi)[regnum])
617 deprecated_get_frame_saved_regs (fi)[regnum] += deprecated_get_frame_saved_regs (fi)[E_SP_REGNUM];
619 /* Save address of PC on stack. */
620 deprecated_get_frame_saved_regs (fi)[E_PC_REGNUM] = deprecated_get_frame_saved_regs (fi)[E_SP_REGNUM];
626 /* Function: xstormy16_skip_prologue
627 If the input address is in a function prologue,
628 returns the address of the end of the prologue;
629 else returns the input address.
631 Note: the input address is likely to be the function start,
632 since this function is mainly used for advancing a breakpoint
633 to the first line, or stepping to the first line when we have
634 stepped into a function call. */
637 xstormy16_skip_prologue (CORE_ADDR pc)
639 CORE_ADDR func_addr = 0, func_end = 0;
642 if (find_pc_partial_function (pc, &func_name, &func_addr, &func_end))
644 struct symtab_and_line sal;
647 /* Don't trust line number debug info in frameless functions. */
649 CORE_ADDR plg_end = xstormy16_scan_prologue (func_addr, func_end,
654 /* Found a function. */
655 sym = lookup_symbol (func_name, NULL, VAR_DOMAIN, NULL, NULL);
656 /* Don't use line number debug info for assembly source files. */
657 if (sym && SYMBOL_LANGUAGE (sym) != language_asm)
659 sal = find_pc_line (func_addr, 0);
660 if (sal.end && sal.end < func_end)
662 /* Found a line number, use it as end of prologue. */
666 /* No useable line symbol. Use result of prologue parsing method. */
670 /* No function symbol -- just return the PC. */
672 return (CORE_ADDR) pc;
675 /* The epilogue is defined here as the area at the end of a function,
676 either on the `ret' instruction itself or after an instruction which
677 destroys the function's stack frame. */
679 xstormy16_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
681 CORE_ADDR addr, func_addr = 0, func_end = 0;
683 if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
685 ULONGEST inst, inst2;
686 CORE_ADDR addr = func_end - xstormy16_inst_size;
688 /* The Xstormy16 epilogue is max. 14 bytes long. */
689 if (pc < func_end - 7 * xstormy16_inst_size)
692 /* Check if we're on a `ret' instruction. Otherwise it's
693 too dangerous to proceed. */
694 inst = read_memory_unsigned_integer (addr, xstormy16_inst_size);
698 while ((addr -= xstormy16_inst_size) >= func_addr)
700 inst = read_memory_unsigned_integer (addr, xstormy16_inst_size);
701 if (inst >= 0x009a && inst <= 0x009d) /* pop r10...r13 */
703 if (inst == 0x305f || inst == 0x307f) /* dec r15, #0x1/#0x3 */
705 inst2 = read_memory_unsigned_integer (addr - xstormy16_inst_size,
706 xstormy16_inst_size);
707 if (inst2 == 0x314f && inst >= 0x8000) /* add r15, neg. value */
709 addr -= xstormy16_inst_size;
720 /* Function: xstormy16_frame_init_saved_regs
721 Set up the 'saved_regs' array.
722 This is a data structure containing the addresses on the stack
723 where each register has been saved, for each stack frame.
724 Registers that have not been saved will have zero here.
725 The stack register is special: rather than the address where the
726 stack register has been saved, saved_regs[SP_REGNUM] will have the
727 actual value of the previous frame's stack register.
729 This function may be called in any context where the saved register
730 values may be needed (backtrace, frame_info, frame_register). On
731 many targets, it is called directly by init_extra_frame_info, in
732 part because the information may be needed immediately by
736 xstormy16_frame_init_saved_regs (struct frame_info *fi)
738 CORE_ADDR func_addr, func_end;
740 if (!deprecated_get_frame_saved_regs (fi))
742 frame_saved_regs_zalloc (fi);
744 /* Find the beginning of this function, so we can analyze its
746 if (find_pc_partial_function (get_frame_pc (fi), NULL, &func_addr, &func_end))
747 xstormy16_scan_prologue (func_addr, get_frame_pc (fi), fi, NULL);
748 /* Else we're out of luck (can't debug completely stripped code).
753 /* Function: xstormy16_frame_saved_pc
754 Returns the return address for the selected frame.
755 Called by frame_info, legacy_frame_chain_valid, and sometimes by
759 xstormy16_frame_saved_pc (struct frame_info *fi)
763 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), get_frame_base (fi),
764 get_frame_base (fi)))
766 saved_pc = deprecated_read_register_dummy (get_frame_pc (fi),
772 saved_pc = read_memory_unsigned_integer (deprecated_get_frame_saved_regs (fi)[E_PC_REGNUM],
779 /* Function: xstormy16_init_extra_frame_info
780 This is the constructor function for the frame_info struct,
781 called whenever a new frame_info is created (from create_new_frame,
782 and from get_prev_frame).
786 xstormy16_init_extra_frame_info (int fromleaf, struct frame_info *fi)
788 if (!get_frame_extra_info (fi))
790 frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
791 get_frame_extra_info (fi)->framesize = 0;
792 get_frame_extra_info (fi)->frameless_p = 1; /* Default frameless, detect framed */
794 /* By default, the fi->frame is set to the value of the FP reg by gdb.
795 This may not always be right; we may be in a frameless function,
796 or we may be in the prologue, before the FP has been set up.
797 Unfortunately, we can't make this determination without first
798 calling scan_prologue, and we can't do that unles we know the
799 get_frame_pc (fi). */
801 if (!get_frame_pc (fi))
803 /* Sometimes we are called from get_prev_frame without
804 the PC being set up first. Long history, don't ask.
805 Fortunately this will never happen from the outermost
806 frame, so we should be able to get the saved pc from
808 if (get_next_frame (fi))
809 deprecated_update_frame_pc_hack (fi, xstormy16_frame_saved_pc (get_next_frame (fi)));
812 /* Take care of the saved_regs right here (non-lazy). */
813 xstormy16_frame_init_saved_regs (fi);
817 /* Function: xstormy16_frame_chain
818 Returns a pointer to the stack frame of the calling function.
819 Called only from get_prev_frame. Needed for backtrace, "up", etc.
823 xstormy16_frame_chain (struct frame_info *fi)
825 if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fi), get_frame_base (fi),
826 get_frame_base (fi)))
828 /* Call dummy's frame is the same as caller's. */
829 return get_frame_base (fi);
833 /* Return computed offset from this frame's fp. */
834 return get_frame_base (fi) - get_frame_extra_info (fi)->framesize;
839 xstormy16_frame_chain_valid (CORE_ADDR chain, struct frame_info *thisframe)
841 return chain < 0x8000 && DEPRECATED_FRAME_SAVED_PC (thisframe) >= 0x8000 &&
842 (get_frame_extra_info (thisframe)->frameless_p ||
843 get_frame_base (thisframe) - get_frame_extra_info (thisframe)->framesize == chain);
846 /* Function: xstormy16_saved_pc_after_call Returns the previous PC
847 immediately after a function call. This function is meant to
848 bypass the regular frame_register() mechanism, ie. it is meant to
849 work even if the frame isn't complete. Called by
850 step_over_function, and sometimes by get_prev_frame. */
853 xstormy16_saved_pc_after_call (struct frame_info *ignore)
855 CORE_ADDR sp, pc, tmp;
857 sp = read_register (E_SP_REGNUM) - xstormy16_pc_size;
858 pc = read_memory_integer (sp, xstormy16_pc_size);
860 /* Skip over jump table entry if necessary. */
861 if ((tmp = SKIP_TRAMPOLINE_CODE (pc)))
867 const static unsigned char *
868 xstormy16_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
870 static unsigned char breakpoint[] = { 0x06, 0x0 };
871 *lenptr = sizeof (breakpoint);
875 /* Given a pointer to a jump table entry, return the address
876 of the function it jumps to. Return 0 if not found. */
878 xstormy16_resolve_jmp_table_entry (CORE_ADDR faddr)
880 struct obj_section *faddr_sect = find_pc_section (faddr);
884 LONGEST inst, inst2, addr;
885 char buf[2 * xstormy16_inst_size];
887 /* Return faddr if it's not pointing into the jump table. */
888 if (strcmp (faddr_sect->the_bfd_section->name, ".plt"))
891 if (!target_read_memory (faddr, buf, sizeof buf))
893 inst = extract_unsigned_integer (buf, xstormy16_inst_size);
894 inst2 = extract_unsigned_integer (buf + xstormy16_inst_size,
895 xstormy16_inst_size);
896 addr = inst2 << 8 | (inst & 0xff);
903 /* Given a function's address, attempt to find (and return) the
904 address of the corresponding jump table entry. Return 0 if
907 xstormy16_find_jmp_table_entry (CORE_ADDR faddr)
909 struct obj_section *faddr_sect = find_pc_section (faddr);
913 struct obj_section *osect;
915 /* Return faddr if it's already a pointer to a jump table entry. */
916 if (!strcmp (faddr_sect->the_bfd_section->name, ".plt"))
919 ALL_OBJFILE_OSECTIONS (faddr_sect->objfile, osect)
921 if (!strcmp (osect->the_bfd_section->name, ".plt"))
925 if (osect < faddr_sect->objfile->sections_end)
928 for (addr = osect->addr;
929 addr < osect->endaddr; addr += 2 * xstormy16_inst_size)
932 LONGEST inst, inst2, faddr2;
933 char buf[2 * xstormy16_inst_size];
935 if (target_read_memory (addr, buf, sizeof buf))
937 inst = extract_unsigned_integer (buf, xstormy16_inst_size);
938 inst2 = extract_unsigned_integer (buf + xstormy16_inst_size,
939 xstormy16_inst_size);
940 faddr2 = inst2 << 8 | (inst & 0xff);
950 xstormy16_skip_trampoline_code (CORE_ADDR pc)
952 int tmp = xstormy16_resolve_jmp_table_entry (pc);
954 if (tmp && tmp != pc)
960 xstormy16_in_solib_call_trampoline (CORE_ADDR pc, char *name)
962 return xstormy16_skip_trampoline_code (pc) != 0;
966 xstormy16_pointer_to_address (struct type *type, const void *buf)
968 enum type_code target = TYPE_CODE (TYPE_TARGET_TYPE (type));
969 CORE_ADDR addr = extract_unsigned_integer (buf, TYPE_LENGTH (type));
971 if (target == TYPE_CODE_FUNC || target == TYPE_CODE_METHOD)
973 CORE_ADDR addr2 = xstormy16_resolve_jmp_table_entry (addr);
982 xstormy16_address_to_pointer (struct type *type, void *buf, CORE_ADDR addr)
984 enum type_code target = TYPE_CODE (TYPE_TARGET_TYPE (type));
986 if (target == TYPE_CODE_FUNC || target == TYPE_CODE_METHOD)
988 CORE_ADDR addr2 = xstormy16_find_jmp_table_entry (addr);
992 store_unsigned_integer (buf, TYPE_LENGTH (type), addr);
996 xstormy16_stack_align (CORE_ADDR addr)
1004 xstormy16_save_dummy_frame_tos (CORE_ADDR sp)
1006 generic_save_dummy_frame_tos (sp - xstormy16_pc_size);
1009 /* Function: xstormy16_gdbarch_init
1010 Initializer function for the xstormy16 gdbarch vector.
1011 Called by gdbarch. Sets up the gdbarch vector(s) for this target. */
1013 static struct gdbarch *
1014 xstormy16_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
1016 static LONGEST call_dummy_words[1] = { 0 };
1017 struct gdbarch_tdep *tdep = NULL;
1018 struct gdbarch *gdbarch;
1020 /* find a candidate among the list of pre-declared architectures. */
1021 arches = gdbarch_list_lookup_by_info (arches, &info);
1023 return (arches->gdbarch);
1026 tdep = (struct gdbarch_tdep *) xmalloc (sizeof (struct gdbarch_tdep));
1029 gdbarch = gdbarch_alloc (&info, 0);
1031 /* NOTE: cagney/2002-12-06: This can be deleted when this arch is
1032 ready to unwind the PC first (see frame.c:get_prev_frame()). */
1033 set_gdbarch_deprecated_init_frame_pc (gdbarch, deprecated_init_frame_pc_default);
1036 * Basic register fields and methods.
1039 set_gdbarch_num_regs (gdbarch, E_NUM_REGS);
1040 set_gdbarch_num_pseudo_regs (gdbarch, 0);
1041 set_gdbarch_sp_regnum (gdbarch, E_SP_REGNUM);
1042 set_gdbarch_deprecated_fp_regnum (gdbarch, E_FP_REGNUM);
1043 set_gdbarch_pc_regnum (gdbarch, E_PC_REGNUM);
1044 set_gdbarch_register_name (gdbarch, xstormy16_register_name);
1045 set_gdbarch_deprecated_register_size (gdbarch, xstormy16_reg_size);
1046 set_gdbarch_deprecated_register_bytes (gdbarch, E_ALL_REGS_SIZE);
1047 set_gdbarch_deprecated_register_byte (gdbarch, xstormy16_register_byte);
1048 set_gdbarch_deprecated_register_raw_size (gdbarch, xstormy16_register_raw_size);
1049 set_gdbarch_deprecated_max_register_raw_size (gdbarch, xstormy16_pc_size);
1050 set_gdbarch_deprecated_register_virtual_size (gdbarch, xstormy16_register_raw_size);
1051 set_gdbarch_deprecated_max_register_virtual_size (gdbarch, 4);
1052 set_gdbarch_deprecated_register_virtual_type (gdbarch, xstormy16_reg_virtual_type);
1057 set_gdbarch_deprecated_init_extra_frame_info (gdbarch,
1058 xstormy16_init_extra_frame_info);
1059 set_gdbarch_deprecated_frame_init_saved_regs (gdbarch,
1060 xstormy16_frame_init_saved_regs);
1061 set_gdbarch_deprecated_frame_chain (gdbarch, xstormy16_frame_chain);
1062 set_gdbarch_deprecated_get_saved_register (gdbarch, xstormy16_get_saved_register);
1063 set_gdbarch_deprecated_saved_pc_after_call (gdbarch, xstormy16_saved_pc_after_call);
1064 set_gdbarch_deprecated_frame_saved_pc (gdbarch, xstormy16_frame_saved_pc);
1065 set_gdbarch_skip_prologue (gdbarch, xstormy16_skip_prologue);
1066 set_gdbarch_deprecated_frame_chain_valid (gdbarch, xstormy16_frame_chain_valid);
1068 set_gdbarch_in_function_epilogue_p (gdbarch,
1069 xstormy16_in_function_epilogue_p);
1074 /* Stack grows up. */
1075 set_gdbarch_inner_than (gdbarch, core_addr_greaterthan);
1076 /* This value is almost never non-zero... */
1077 set_gdbarch_frame_args_skip (gdbarch, 0);
1082 * These values and methods are used when gdb calls a target function. */
1083 set_gdbarch_deprecated_push_return_address (gdbarch, xstormy16_push_return_address);
1084 set_gdbarch_deprecated_extract_return_value (gdbarch, xstormy16_extract_return_value);
1085 set_gdbarch_deprecated_push_arguments (gdbarch, xstormy16_push_arguments);
1086 set_gdbarch_deprecated_pop_frame (gdbarch, xstormy16_pop_frame);
1087 set_gdbarch_deprecated_store_struct_return (gdbarch, xstormy16_store_struct_return);
1088 set_gdbarch_deprecated_store_return_value (gdbarch, xstormy16_store_return_value);
1089 set_gdbarch_extract_struct_value_address (gdbarch, xstormy16_extract_struct_value_address);
1090 set_gdbarch_use_struct_convention (gdbarch,
1091 xstormy16_use_struct_convention);
1092 set_gdbarch_deprecated_call_dummy_words (gdbarch, call_dummy_words);
1093 set_gdbarch_deprecated_sizeof_call_dummy_words (gdbarch, 0);
1094 set_gdbarch_breakpoint_from_pc (gdbarch, xstormy16_breakpoint_from_pc);
1096 set_gdbarch_char_signed (gdbarch, 0);
1097 set_gdbarch_int_bit (gdbarch, 2 * TARGET_CHAR_BIT);
1098 set_gdbarch_ptr_bit (gdbarch, 2 * TARGET_CHAR_BIT);
1099 set_gdbarch_addr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
1100 set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
1102 set_gdbarch_address_to_pointer (gdbarch, xstormy16_address_to_pointer);
1103 set_gdbarch_pointer_to_address (gdbarch, xstormy16_pointer_to_address);
1105 set_gdbarch_deprecated_stack_align (gdbarch, xstormy16_stack_align);
1107 set_gdbarch_deprecated_save_dummy_frame_tos (gdbarch, xstormy16_save_dummy_frame_tos);
1109 set_gdbarch_skip_trampoline_code (gdbarch, xstormy16_skip_trampoline_code);
1111 set_gdbarch_in_solib_call_trampoline (gdbarch,
1112 xstormy16_in_solib_call_trampoline);
1114 /* Should be using push_dummy_call. */
1115 set_gdbarch_deprecated_dummy_write_sp (gdbarch, deprecated_write_sp);
1117 set_gdbarch_print_insn (gdbarch, print_insn_xstormy16);
1122 /* Function: _initialize_xstormy16_tdep
1123 Initializer function for the Sanyo Xstormy16a module.
1124 Called by gdb at start-up. */
1126 extern initialize_file_ftype _initialize_xstormy16_tdep; /* -Wmissing-prototypes */
1129 _initialize_xstormy16_tdep (void)
1131 register_gdbarch_init (bfd_arch_xstormy16, xstormy16_gdbarch_init);