1 /* Target-dependent code for Moxie.
3 Copyright (C) 2009 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 3 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, see <http://www.gnu.org/licenses/>. */
22 #include "frame-unwind.h"
23 #include "frame-base.h"
28 #include "gdb_string.h"
35 #include "arch-utils.h"
37 #include "trad-frame.h"
41 #include "gdb_assert.h"
43 #include "moxie-tdep.h"
45 /* Local functions. */
47 extern void _initialize_moxie_tdep (void);
49 /* Use an invalid address value as 'not available' marker. */
50 enum { REG_UNAVAIL = (CORE_ADDR) -1 };
52 struct moxie_frame_cache
58 CORE_ADDR saved_regs[MOXIE_NUM_REGS];
62 /* Implement the "frame_align" gdbarch method. */
65 moxie_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
67 /* Align to the size of an instruction (so that they can safely be
68 pushed onto the stack. */
72 /* Implement the "breakpoint_from_pc" gdbarch method. */
74 const static unsigned char *
75 moxie_breakpoint_from_pc (struct gdbarch *gdbarch,
76 CORE_ADDR *pcptr, int *lenptr)
78 static unsigned char breakpoint[] = { 0x35, 0x00 };
80 *lenptr = sizeof (breakpoint);
84 /* Moxie register names. */
86 char *moxie_register_names[] = {
87 "$fp", "$sp", "$r0", "$r1", "$r2",
88 "$r3", "$r4", "$r5", "$r6", "$r7",
89 "$r8", "$r9", "$r10", "$r11", "$r12",
90 "$r13", "$pc", "$cc" };
92 /* Implement the "register_name" gdbarch method. */
95 moxie_register_name (struct gdbarch *gdbarch, int reg_nr)
99 if (reg_nr >= MOXIE_NUM_REGS)
101 return moxie_register_names[reg_nr];
104 /* Implement the "register_type" gdbarch method. */
107 moxie_register_type (struct gdbarch *gdbarch, int reg_nr)
109 if (reg_nr == MOXIE_PC_REGNUM)
110 return builtin_type (gdbarch)->builtin_func_ptr;
111 else if (reg_nr == MOXIE_SP_REGNUM || reg_nr == MOXIE_FP_REGNUM)
112 return builtin_type (gdbarch)->builtin_data_ptr;
114 return builtin_type (gdbarch)->builtin_int32;
117 /* Write into appropriate registers a function return value
118 of type TYPE, given in virtual format. */
121 moxie_store_return_value (struct type *type, struct regcache *regcache,
124 struct gdbarch *gdbarch = get_regcache_arch (regcache);
125 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
127 int len = TYPE_LENGTH (type);
129 /* Things always get returned in RET1_REGNUM, RET2_REGNUM. */
130 regval = extract_unsigned_integer (valbuf, len > 4 ? 4 : len, byte_order);
131 regcache_cooked_write_unsigned (regcache, RET1_REGNUM, regval);
134 regval = extract_unsigned_integer ((gdb_byte *) valbuf + 4,
135 len - 4, byte_order);
136 regcache_cooked_write_unsigned (regcache, RET1_REGNUM + 1, regval);
140 /* Decode the instructions within the given address range. Decide
141 when we must have reached the end of the function prologue. If a
142 frame_info pointer is provided, fill in its saved_regs etc.
144 Returns the address of the first instruction after the prologue. */
147 moxie_analyze_prologue (CORE_ADDR start_addr, CORE_ADDR end_addr,
148 struct moxie_frame_cache *cache,
149 struct gdbarch *gdbarch)
151 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
153 ULONGEST inst, inst2;
157 /* Record where the jsra instruction saves the PC and FP. */
158 cache->saved_regs[MOXIE_PC_REGNUM] = -4;
159 cache->saved_regs[MOXIE_FP_REGNUM] = 0;
160 cache->framesize = 0;
162 if (start_addr >= end_addr)
165 for (next_addr = start_addr; next_addr < end_addr; )
167 inst = read_memory_unsigned_integer (next_addr, 2, byte_order);
169 /* Match "push $rN" where N is between 2 and 13 inclusive. */
170 if (inst >= 0x0614 && inst <= 0x061f)
172 regnum = inst & 0x000f;
173 cache->framesize += 4;
174 cache->saved_regs[regnum] = cache->framesize;
178 /* Optional stack allocation for args and local vars <= 4
180 else if (inst == 0x01f0) /* ldi.l $r12, X */
182 offset = read_memory_integer (next_addr + 2, 4, byte_order);
183 inst2 = read_memory_unsigned_integer (next_addr + 6, 2, byte_order);
185 if (inst2 == 0x051f) /* add.l $sp, $r12 */
187 cache->framesize += offset;
190 return (next_addr + 8);
192 else /* This is not a prologue instruction. */
199 /* Find the end of function prologue. */
202 moxie_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
204 CORE_ADDR func_addr = 0, func_end = 0;
207 /* See if we can determine the end of the prologue via the symbol table.
208 If so, then return either PC, or the PC after the prologue, whichever
210 if (find_pc_partial_function (pc, &func_name, &func_addr, &func_end))
212 CORE_ADDR post_prologue_pc
213 = skip_prologue_using_sal (gdbarch, func_addr);
214 if (post_prologue_pc != 0)
215 return max (pc, post_prologue_pc);
218 /* Can't determine prologue from the symbol table, need to examine
220 struct symtab_and_line sal;
222 struct moxie_frame_cache cache;
225 memset (&cache, 0, sizeof cache);
227 plg_end = moxie_analyze_prologue (func_addr,
228 func_end, &cache, gdbarch);
229 /* Found a function. */
230 sym = lookup_symbol (func_name, NULL, VAR_DOMAIN, NULL);
231 /* Don't use line number debug info for assembly source
233 if (sym && SYMBOL_LANGUAGE (sym) != language_asm)
235 sal = find_pc_line (func_addr, 0);
236 if (sal.end && sal.end < func_end)
238 /* Found a line number, use it as end of
243 /* No useable line symbol. Use result of prologue parsing
249 /* No function symbol -- just return the PC. */
250 return (CORE_ADDR) pc;
253 struct moxie_unwind_cache
255 /* The previous frame's inner most stack address. Used as this
256 frame ID's stack_addr. */
258 /* The frame's base, optionally used by the high-level debug info. */
261 /* How far the SP and r13 (FP) have been offset from the start of
262 the stack frame (as defined by the previous frame's stack
267 /* Table indicating the location of each and every register. */
268 struct trad_frame_saved_reg *saved_regs;
271 /* Implement the "read_pc" gdbarch method. */
274 moxie_read_pc (struct regcache *regcache)
278 regcache_cooked_read_unsigned (regcache, MOXIE_PC_REGNUM, &pc);
282 /* Implement the "write_pc" gdbarch method. */
285 moxie_write_pc (struct regcache *regcache, CORE_ADDR val)
287 regcache_cooked_write_unsigned (regcache, MOXIE_PC_REGNUM, val);
290 /* Implement the "unwind_sp" gdbarch method. */
293 moxie_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
295 return frame_unwind_register_unsigned (next_frame, MOXIE_SP_REGNUM);
298 /* Given a return value in `regbuf' with a type `valtype',
299 extract and copy its value into `valbuf'. */
302 moxie_extract_return_value (struct type *type, struct regcache *regcache,
305 struct gdbarch *gdbarch = get_regcache_arch (regcache);
306 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
307 bfd_byte *valbuf = dst;
308 int len = TYPE_LENGTH (type);
311 /* By using store_unsigned_integer we avoid having to do
312 anything special for small big-endian values. */
313 regcache_cooked_read_unsigned (regcache, RET1_REGNUM, &tmp);
314 store_unsigned_integer (valbuf, (len > 4 ? len - 4 : len), byte_order, tmp);
316 /* Ignore return values more than 8 bytes in size because the moxie
317 returns anything more than 8 bytes in the stack. */
320 regcache_cooked_read_unsigned (regcache, RET1_REGNUM + 1, &tmp);
321 store_unsigned_integer (valbuf + len - 4, 4, byte_order, tmp);
325 /* Implement the "return_value" gdbarch method. */
327 static enum return_value_convention
328 moxie_return_value (struct gdbarch *gdbarch, struct type *func_type,
329 struct type *valtype, struct regcache *regcache,
330 gdb_byte *readbuf, const gdb_byte *writebuf)
332 if (TYPE_LENGTH (valtype) > 8)
333 return RETURN_VALUE_STRUCT_CONVENTION;
337 moxie_extract_return_value (valtype, regcache, readbuf);
338 if (writebuf != NULL)
339 moxie_store_return_value (valtype, regcache, writebuf);
340 return RETURN_VALUE_REGISTER_CONVENTION;
344 /* Allocate and initialize a moxie_frame_cache object. */
346 static struct moxie_frame_cache *
347 moxie_alloc_frame_cache (void)
349 struct moxie_frame_cache *cache;
352 cache = FRAME_OBSTACK_ZALLOC (struct moxie_frame_cache);
357 cache->framesize = 0;
358 for (i = 0; i < MOXIE_NUM_REGS; ++i)
359 cache->saved_regs[i] = REG_UNAVAIL;
364 /* Populate a moxie_frame_cache object for this_frame. */
366 static struct moxie_frame_cache *
367 moxie_frame_cache (struct frame_info *this_frame, void **this_cache)
369 struct moxie_frame_cache *cache;
370 CORE_ADDR current_pc;
376 cache = moxie_alloc_frame_cache ();
379 cache->base = get_frame_register_unsigned (this_frame, MOXIE_FP_REGNUM);
380 if (cache->base == 0)
383 cache->pc = get_frame_func (this_frame);
384 current_pc = get_frame_pc (this_frame);
387 struct gdbarch *gdbarch = get_frame_arch (this_frame);
388 moxie_analyze_prologue (cache->pc, current_pc, cache, gdbarch);
391 cache->saved_sp = cache->base - cache->framesize;
393 for (i = 0; i < MOXIE_NUM_REGS; ++i)
394 if (cache->saved_regs[i] != REG_UNAVAIL)
395 cache->saved_regs[i] = cache->base - cache->saved_regs[i];
400 /* Implement the "unwind_pc" gdbarch method. */
403 moxie_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
405 return frame_unwind_register_unsigned (next_frame, MOXIE_PC_REGNUM);
408 /* Given a GDB frame, determine the address of the calling function's
409 frame. This will be used to create a new GDB frame struct. */
412 moxie_frame_this_id (struct frame_info *this_frame,
413 void **this_prologue_cache, struct frame_id *this_id)
415 struct moxie_frame_cache *cache = moxie_frame_cache (this_frame,
416 this_prologue_cache);
418 /* This marks the outermost frame. */
419 if (cache->base == 0)
422 *this_id = frame_id_build (cache->saved_sp, cache->pc);
425 /* Get the value of register regnum in the previous stack frame. */
427 static struct value *
428 moxie_frame_prev_register (struct frame_info *this_frame,
429 void **this_prologue_cache, int regnum)
431 struct moxie_frame_cache *cache = moxie_frame_cache (this_frame,
432 this_prologue_cache);
434 gdb_assert (regnum >= 0);
436 if (regnum == MOXIE_SP_REGNUM && cache->saved_sp)
437 return frame_unwind_got_constant (this_frame, regnum, cache->saved_sp);
439 if (regnum < MOXIE_NUM_REGS && cache->saved_regs[regnum] != REG_UNAVAIL)
440 return frame_unwind_got_memory (this_frame, regnum,
441 cache->saved_regs[regnum]);
443 return frame_unwind_got_register (this_frame, regnum, regnum);
446 static const struct frame_unwind moxie_frame_unwind = {
449 moxie_frame_prev_register,
451 default_frame_sniffer
454 /* Return the base address of this_frame. */
457 moxie_frame_base_address (struct frame_info *this_frame, void **this_cache)
459 struct moxie_frame_cache *cache = moxie_frame_cache (this_frame,
465 static const struct frame_base moxie_frame_base = {
467 moxie_frame_base_address,
468 moxie_frame_base_address,
469 moxie_frame_base_address
472 static struct frame_id
473 moxie_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
475 CORE_ADDR sp = get_frame_register_unsigned (this_frame, MOXIE_SP_REGNUM);
477 return frame_id_build (sp, get_frame_pc (this_frame));
480 /* Read an unsigned integer from the inferior, and adjust
483 moxie_process_readu (CORE_ADDR addr, char *buf,
484 int length, enum bfd_endian byte_order)
486 if (target_read_memory (addr, buf, length))
489 printf_unfiltered (_("Process record: error reading memory at "
490 "addr 0x%s len = %d.\n"),
491 paddress (target_gdbarch, addr), length);
495 return extract_unsigned_integer (buf, length, byte_order);
498 /* Parse the current instruction and record the values of the registers and
499 memory that will be changed in current instruction to "record_arch_list".
500 Return -1 if something wrong. */
503 moxie_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
509 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
511 if (record_debug > 1)
512 fprintf_unfiltered (gdb_stdlog, "Process record: moxie_process_record "
514 paddress (target_gdbarch, addr));
516 inst = (uint16_t) moxie_process_readu (addr, buf, 2, byte_order);
518 /* Decode instruction. */
519 if (inst & (1 << 15))
521 if (inst & (1 << 14))
523 /* This is a Form 3 instruction. */
524 int opcode = (inst >> 10 & 0xf);
532 case 0x04: /* bltu */
533 case 0x05: /* bgtu */
536 case 0x08: /* bgeu */
537 case 0x09: /* bleu */
549 /* This is a Form 2 instruction. */
550 int opcode = (inst >> 12 & 0x3);
557 int reg = (inst >> 8) & 0xf;
558 if (record_arch_list_add_reg (regcache, reg))
564 /* Do nothing until GDB learns about moxie's special
576 /* This is a Form 1 instruction. */
577 int opcode = inst >> 8;
584 case 0x01: /* ldi.l (immediate) */
585 case 0x02: /* mov (register-to-register) */
587 int reg = (inst >> 4) & 0xf;
588 if (record_arch_list_add_reg (regcache, reg))
592 case 0x03: /* jsra */
594 regcache_raw_read (regcache,
595 MOXIE_SP_REGNUM, (gdb_byte *) & tmpu32);
596 tmpu32 = extract_unsigned_integer ((gdb_byte *) & tmpu32,
598 if (record_arch_list_add_reg (regcache, MOXIE_FP_REGNUM)
599 || (record_arch_list_add_reg (regcache,
601 || record_arch_list_add_mem (tmpu32 - 12, 12))
607 if (record_arch_list_add_reg (regcache, MOXIE_FP_REGNUM)
608 || (record_arch_list_add_reg (regcache,
613 case 0x05: /* add.l */
615 int reg = (inst >> 4) & 0xf;
616 if (record_arch_list_add_reg (regcache, reg))
620 case 0x06: /* push */
622 int reg = (inst >> 4) & 0xf;
623 regcache_raw_read (regcache, reg, (gdb_byte *) & tmpu32);
624 tmpu32 = extract_unsigned_integer ((gdb_byte *) & tmpu32,
626 if (record_arch_list_add_reg (regcache, reg)
627 || record_arch_list_add_mem (tmpu32 - 4, 4))
633 int a = (inst >> 4) & 0xf;
635 if (record_arch_list_add_reg (regcache, a)
636 || record_arch_list_add_reg (regcache, b))
640 case 0x08: /* lda.l */
642 int reg = (inst >> 4) & 0xf;
643 if (record_arch_list_add_reg (regcache, reg))
647 case 0x09: /* sta.l */
649 tmpu32 = (uint32_t) moxie_process_readu (addr+2, buf,
651 if (record_arch_list_add_mem (tmpu32, 4))
655 case 0x0a: /* ld.l (register indirect) */
657 int reg = (inst >> 4) & 0xf;
658 if (record_arch_list_add_reg (regcache, reg))
662 case 0x0b: /* st.l */
664 int reg = (inst >> 4) & 0xf;
665 regcache_raw_read (regcache, reg, (gdb_byte *) & tmpu32);
666 tmpu32 = extract_unsigned_integer ((gdb_byte *) & tmpu32,
668 if (record_arch_list_add_mem (tmpu32, 4))
672 case 0x0c: /* ldo.l */
674 int reg = (inst >> 4) & 0xf;
675 if (record_arch_list_add_reg (regcache, reg))
679 case 0x0d: /* sto.l */
681 int reg = (inst >> 4) & 0xf;
682 uint32_t offset = (uint32_t) moxie_process_readu (addr+2, buf, 4,
684 regcache_raw_read (regcache, reg, (gdb_byte *) & tmpu32);
685 tmpu32 = extract_unsigned_integer ((gdb_byte *) & tmpu32,
688 if (record_arch_list_add_mem (tmpu32, 4))
694 if (record_arch_list_add_reg (regcache, MOXIE_CC_REGNUM))
714 regcache_raw_read (regcache,
715 MOXIE_SP_REGNUM, (gdb_byte *) & tmpu32);
716 tmpu32 = extract_unsigned_integer ((gdb_byte *) & tmpu32,
718 if (record_arch_list_add_reg (regcache, MOXIE_FP_REGNUM)
719 || (record_arch_list_add_reg (regcache,
721 || record_arch_list_add_mem (tmpu32 - 12, 12))
725 case 0x1a: /* jmpa */
730 case 0x1b: /* ldi.b (immediate) */
731 case 0x1c: /* ld.b (register indirect) */
732 case 0x1d: /* lda.b */
734 int reg = (inst >> 4) & 0xf;
735 if (record_arch_list_add_reg (regcache, reg))
739 case 0x1e: /* st.b */
741 int reg = (inst >> 4) & 0xf;
742 regcache_raw_read (regcache, reg, (gdb_byte *) & tmpu32);
743 tmpu32 = extract_unsigned_integer ((gdb_byte *) & tmpu32,
745 if (record_arch_list_add_mem (tmpu32, 1))
749 case 0x1f: /* sta.b */
751 tmpu32 = moxie_process_readu (addr+2, (char *) buf,
753 if (record_arch_list_add_mem (tmpu32, 1))
757 case 0x20: /* ldi.s (immediate) */
758 case 0x21: /* ld.s (register indirect) */
759 case 0x22: /* lda.s */
761 int reg = (inst >> 4) & 0xf;
762 if (record_arch_list_add_reg (regcache, reg))
766 case 0x23: /* st.s */
768 int reg = (inst >> 4) & 0xf;
769 regcache_raw_read (regcache, reg, (gdb_byte *) & tmpu32);
770 tmpu32 = extract_unsigned_integer ((gdb_byte *) & tmpu32,
772 if (record_arch_list_add_mem (tmpu32, 2))
776 case 0x24: /* sta.s */
778 tmpu32 = moxie_process_readu (addr+2, (char *) buf,
780 if (record_arch_list_add_mem (tmpu32, 2))
790 case 0x27: /* lshr */
791 case 0x28: /* ashl */
792 case 0x29: /* sub.l */
796 case 0x2d: /* ashr */
798 case 0x2f: /* mul.l */
800 int reg = (inst >> 4) & 0xf;
801 if (record_arch_list_add_reg (regcache, reg))
807 /* We currently implement support for libgloss'
810 int inum = moxie_process_readu (addr+2, (char *) buf,
815 case 0x1: /* SYS_exit */
820 case 0x2: /* SYS_open */
822 if (record_arch_list_add_reg (regcache, RET1_REGNUM))
826 case 0x4: /* SYS_read */
828 uint32_t length, ptr;
830 /* Read buffer pointer is in $r1. */
831 regcache_raw_read (regcache, 3, (gdb_byte *) & ptr);
832 ptr = extract_unsigned_integer ((gdb_byte *) & ptr,
835 /* String length is at 0x12($fp) */
836 regcache_raw_read (regcache,
837 MOXIE_FP_REGNUM, (gdb_byte *) & tmpu32);
838 tmpu32 = extract_unsigned_integer ((gdb_byte *) & tmpu32,
840 length = moxie_process_readu (tmpu32+20, (char *) buf,
843 if (record_arch_list_add_mem (ptr, length))
847 case 0x5: /* SYS_write */
849 if (record_arch_list_add_reg (regcache, RET1_REGNUM))
858 case 0x31: /* div.l */
859 case 0x32: /* udiv.l */
860 case 0x33: /* mod.l */
861 case 0x34: /* umod.l */
863 int reg = (inst >> 4) & 0xf;
864 if (record_arch_list_add_reg (regcache, reg))
871 case 0x36: /* ldo.b */
873 int reg = (inst >> 4) & 0xf;
874 if (record_arch_list_add_reg (regcache, reg))
878 case 0x37: /* sto.b */
880 int reg = (inst >> 4) & 0xf;
881 uint32_t offset = (uint32_t) moxie_process_readu (addr+2, buf, 4,
883 regcache_raw_read (regcache, reg, (gdb_byte *) & tmpu32);
884 tmpu32 = extract_unsigned_integer ((gdb_byte *) & tmpu32,
887 if (record_arch_list_add_mem (tmpu32, 1))
891 case 0x38: /* ldo.s */
893 int reg = (inst >> 4) & 0xf;
894 if (record_arch_list_add_reg (regcache, reg))
898 case 0x39: /* sto.s */
900 int reg = (inst >> 4) & 0xf;
901 uint32_t offset = (uint32_t) moxie_process_readu (addr+2, buf, 4,
903 regcache_raw_read (regcache, reg, (gdb_byte *) & tmpu32);
904 tmpu32 = extract_unsigned_integer ((gdb_byte *) & tmpu32,
907 if (record_arch_list_add_mem (tmpu32, 2))
917 if (record_arch_list_add_reg (regcache, MOXIE_PC_REGNUM))
919 if (record_arch_list_add_end ())
924 /* Allocate and initialize the moxie gdbarch object. */
926 static struct gdbarch *
927 moxie_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
929 struct gdbarch *gdbarch;
930 struct gdbarch_tdep *tdep;
932 /* If there is already a candidate, use it. */
933 arches = gdbarch_list_lookup_by_info (arches, &info);
935 return arches->gdbarch;
937 /* Allocate space for the new architecture. */
938 tdep = XMALLOC (struct gdbarch_tdep);
939 gdbarch = gdbarch_alloc (&info, tdep);
941 set_gdbarch_read_pc (gdbarch, moxie_read_pc);
942 set_gdbarch_write_pc (gdbarch, moxie_write_pc);
943 set_gdbarch_unwind_sp (gdbarch, moxie_unwind_sp);
945 set_gdbarch_num_regs (gdbarch, MOXIE_NUM_REGS);
946 set_gdbarch_sp_regnum (gdbarch, MOXIE_SP_REGNUM);
947 set_gdbarch_pc_regnum (gdbarch, MOXIE_PC_REGNUM);
948 set_gdbarch_register_name (gdbarch, moxie_register_name);
949 set_gdbarch_register_type (gdbarch, moxie_register_type);
951 set_gdbarch_return_value (gdbarch, moxie_return_value);
953 set_gdbarch_skip_prologue (gdbarch, moxie_skip_prologue);
954 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
955 set_gdbarch_breakpoint_from_pc (gdbarch, moxie_breakpoint_from_pc);
956 set_gdbarch_frame_align (gdbarch, moxie_frame_align);
958 frame_base_set_default (gdbarch, &moxie_frame_base);
960 /* Methods for saving / extracting a dummy frame's ID. The ID's
961 stack address must match the SP value returned by
962 PUSH_DUMMY_CALL, and saved by generic_save_dummy_frame_tos. */
963 set_gdbarch_dummy_id (gdbarch, moxie_dummy_id);
965 set_gdbarch_unwind_pc (gdbarch, moxie_unwind_pc);
967 set_gdbarch_print_insn (gdbarch, print_insn_moxie);
969 /* Hook in ABI-specific overrides, if they have been registered. */
970 gdbarch_init_osabi (info, gdbarch);
972 /* Hook in the default unwinders. */
973 frame_unwind_append_unwinder (gdbarch, &moxie_frame_unwind);
975 /* Support simple overlay manager. */
976 set_gdbarch_overlay_update (gdbarch, simple_overlay_update);
978 /* Support reverse debugging. */
979 set_gdbarch_process_record (gdbarch, moxie_process_record);
984 /* Register this machine's init routine. */
987 _initialize_moxie_tdep (void)
989 register_gdbarch_init (bfd_arch_moxie, moxie_gdbarch_init);