1 /* Target-dependent code for Motorola 68HC11 & 68HC12
3 Copyright (C) 1999-2022 Free Software Foundation, Inc.
5 Contributed by Stephane Carrez, stcarrez@nerim.fr
7 This file is part of GDB.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
25 #include "frame-unwind.h"
26 #include "frame-base.h"
27 #include "dwarf2/frame.h"
28 #include "trad-frame.h"
38 #include "arch-utils.h"
40 #include "reggroups.h"
44 #include "opcode/m68hc11.h"
45 #include "elf/m68hc11.h"
48 /* Macros for setting and testing a bit in a minimal symbol.
49 For 68HC11/68HC12 we have two flags that tell which return
50 type the function is using. This is used for prologue and frame
51 analysis to compute correct stack frame layout.
53 The MSB of the minimal symbol's "info" field is used for this purpose.
55 MSYMBOL_SET_RTC Actually sets the "RTC" bit.
56 MSYMBOL_SET_RTI Actually sets the "RTI" bit.
57 MSYMBOL_IS_RTC Tests the "RTC" bit in a minimal symbol.
58 MSYMBOL_IS_RTI Tests the "RTC" bit in a minimal symbol. */
60 #define MSYMBOL_SET_RTC(msym) \
61 (msym)->set_target_flag_1 (true)
63 #define MSYMBOL_SET_RTI(msym) \
64 (msym)->set_target_flag_2 (true)
66 #define MSYMBOL_IS_RTC(msym) \
67 (msym)->target_flag_1 ()
69 #define MSYMBOL_IS_RTI(msym) \
70 (msym)->target_flag_2 ()
72 enum insn_return_kind
{
79 /* Register numbers of various important registers. */
81 #define HARD_X_REGNUM 0
82 #define HARD_D_REGNUM 1
83 #define HARD_Y_REGNUM 2
84 #define HARD_SP_REGNUM 3
85 #define HARD_PC_REGNUM 4
87 #define HARD_A_REGNUM 5
88 #define HARD_B_REGNUM 6
89 #define HARD_CCR_REGNUM 7
91 /* 68HC12 page number register.
92 Note: to keep a compatibility with gcc register naming, we must
93 not have to rename FP and other soft registers. The page register
94 is a real hard register and must therefore be counted by gdbarch_num_regs.
95 For this it has the same number as Z register (which is not used). */
96 #define HARD_PAGE_REGNUM 8
97 #define M68HC11_LAST_HARD_REG (HARD_PAGE_REGNUM)
99 /* Z is replaced by X or Y by gcc during machine reorg.
100 ??? There is no way to get it and even know whether
101 it's in X or Y or in ZS. */
102 #define SOFT_Z_REGNUM 8
104 /* Soft registers. These registers are special. There are treated
105 like normal hard registers by gcc and gdb (ie, within dwarf2 info).
106 They are physically located in memory. */
107 #define SOFT_FP_REGNUM 9
108 #define SOFT_TMP_REGNUM 10
109 #define SOFT_ZS_REGNUM 11
110 #define SOFT_XY_REGNUM 12
111 #define SOFT_UNUSED_REGNUM 13
112 #define SOFT_D1_REGNUM 14
113 #define SOFT_D32_REGNUM (SOFT_D1_REGNUM+31)
114 #define M68HC11_MAX_SOFT_REGS 32
116 #define M68HC11_NUM_REGS (M68HC11_LAST_HARD_REG + 1)
117 #define M68HC11_NUM_PSEUDO_REGS (M68HC11_MAX_SOFT_REGS+5)
118 #define M68HC11_ALL_REGS (M68HC11_NUM_REGS+M68HC11_NUM_PSEUDO_REGS)
120 #define M68HC11_REG_SIZE (2)
122 #define M68HC12_NUM_REGS (9)
123 #define M68HC12_NUM_PSEUDO_REGS ((M68HC11_MAX_SOFT_REGS+5)+1-1)
124 #define M68HC12_HARD_PC_REGNUM (SOFT_D32_REGNUM+1)
126 struct insn_sequence
;
127 struct m68gc11_gdbarch_tdep
: gdbarch_tdep
129 /* Stack pointer correction value. For 68hc11, the stack pointer points
130 to the next push location. An offset of 1 must be applied to obtain
131 the address where the last value is saved. For 68hc12, the stack
132 pointer points to the last value pushed. No offset is necessary. */
133 int stack_correction
= 0;
135 /* Description of instructions in the prologue. */
136 struct insn_sequence
*prologue
= nullptr;
138 /* True if the page memory bank register is available
140 int use_page_register
= 0;
142 /* ELF flags for ABI. */
147 stack_correction (gdbarch
*arch
)
149 m68gc11_gdbarch_tdep
*tdep
= (m68gc11_gdbarch_tdep
*) gdbarch_tdep (arch
);
150 return tdep
->stack_correction
;
154 use_page_register (gdbarch
*arch
)
156 m68gc11_gdbarch_tdep
*tdep
= (m68gc11_gdbarch_tdep
*) gdbarch_tdep (arch
);
157 return tdep
->stack_correction
;
160 struct m68hc11_unwind_cache
162 /* The previous frame's inner most stack address. Used as this
163 frame ID's stack_addr. */
165 /* The frame's base, optionally used by the high-level debug info. */
173 enum insn_return_kind return_kind
;
175 /* Table indicating the location of each and every register. */
176 trad_frame_saved_reg
*saved_regs
;
179 /* Table of registers for 68HC11. This includes the hard registers
180 and the soft registers used by GCC. */
182 m68hc11_register_names
[] =
184 "x", "d", "y", "sp", "pc", "a", "b",
185 "ccr", "page", "frame","tmp", "zs", "xy", 0,
186 "d1", "d2", "d3", "d4", "d5", "d6", "d7",
187 "d8", "d9", "d10", "d11", "d12", "d13", "d14",
188 "d15", "d16", "d17", "d18", "d19", "d20", "d21",
189 "d22", "d23", "d24", "d25", "d26", "d27", "d28",
190 "d29", "d30", "d31", "d32"
193 struct m68hc11_soft_reg
199 static struct m68hc11_soft_reg soft_regs
[M68HC11_ALL_REGS
];
201 #define M68HC11_FP_ADDR soft_regs[SOFT_FP_REGNUM].addr
203 static int soft_min_addr
;
204 static int soft_max_addr
;
205 static int soft_reg_initialized
= 0;
207 /* Look in the symbol table for the address of a pseudo register
208 in memory. If we don't find it, pretend the register is not used
209 and not available. */
211 m68hc11_get_register_info (struct m68hc11_soft_reg
*reg
, const char *name
)
213 struct bound_minimal_symbol msymbol
;
215 msymbol
= lookup_minimal_symbol (name
, NULL
, NULL
);
218 reg
->addr
= msymbol
.value_address ();
219 reg
->name
= xstrdup (name
);
221 /* Keep track of the address range for soft registers. */
222 if (reg
->addr
< (CORE_ADDR
) soft_min_addr
)
223 soft_min_addr
= reg
->addr
;
224 if (reg
->addr
> (CORE_ADDR
) soft_max_addr
)
225 soft_max_addr
= reg
->addr
;
234 /* Initialize the table of soft register addresses according
235 to the symbol table. */
237 m68hc11_initialize_register_info (void)
241 if (soft_reg_initialized
)
244 soft_min_addr
= INT_MAX
;
246 for (i
= 0; i
< M68HC11_ALL_REGS
; i
++)
248 soft_regs
[i
].name
= 0;
251 m68hc11_get_register_info (&soft_regs
[SOFT_FP_REGNUM
], "_.frame");
252 m68hc11_get_register_info (&soft_regs
[SOFT_TMP_REGNUM
], "_.tmp");
253 m68hc11_get_register_info (&soft_regs
[SOFT_ZS_REGNUM
], "_.z");
254 soft_regs
[SOFT_Z_REGNUM
] = soft_regs
[SOFT_ZS_REGNUM
];
255 m68hc11_get_register_info (&soft_regs
[SOFT_XY_REGNUM
], "_.xy");
257 for (i
= SOFT_D1_REGNUM
; i
< M68HC11_MAX_SOFT_REGS
; i
++)
261 xsnprintf (buf
, sizeof (buf
), "_.d%d", i
- SOFT_D1_REGNUM
+ 1);
262 m68hc11_get_register_info (&soft_regs
[i
], buf
);
265 if (soft_regs
[SOFT_FP_REGNUM
].name
== 0)
266 warning (_("No frame soft register found in the symbol table.\n"
267 "Stack backtrace will not work."));
268 soft_reg_initialized
= 1;
271 /* Given an address in memory, return the soft register number if
272 that address corresponds to a soft register. Returns -1 if not. */
274 m68hc11_which_soft_register (CORE_ADDR addr
)
278 if (addr
< soft_min_addr
|| addr
> soft_max_addr
)
281 for (i
= SOFT_FP_REGNUM
; i
< M68HC11_ALL_REGS
; i
++)
283 if (soft_regs
[i
].name
&& soft_regs
[i
].addr
== addr
)
289 /* Fetch a pseudo register. The 68hc11 soft registers are treated like
290 pseudo registers. They are located in memory. Translate the register
291 fetch into a memory read. */
292 static enum register_status
293 m68hc11_pseudo_register_read (struct gdbarch
*gdbarch
,
294 readable_regcache
*regcache
,
295 int regno
, gdb_byte
*buf
)
297 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
299 /* The PC is a pseudo reg only for 68HC12 with the memory bank
301 if (regno
== M68HC12_HARD_PC_REGNUM
)
304 const int regsize
= 4;
305 enum register_status status
;
307 status
= regcache
->cooked_read (HARD_PC_REGNUM
, &pc
);
308 if (status
!= REG_VALID
)
310 if (pc
>= 0x8000 && pc
< 0xc000)
314 regcache
->cooked_read (HARD_PAGE_REGNUM
, &page
);
319 store_unsigned_integer (buf
, regsize
, byte_order
, pc
);
323 m68hc11_initialize_register_info ();
325 /* Fetch a soft register: translate into a memory read. */
326 if (soft_regs
[regno
].name
)
328 target_read_memory (soft_regs
[regno
].addr
, buf
, 2);
338 /* Store a pseudo register. Translate the register store
339 into a memory write. */
341 m68hc11_pseudo_register_write (struct gdbarch
*gdbarch
,
342 struct regcache
*regcache
,
343 int regno
, const gdb_byte
*buf
)
345 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
347 /* The PC is a pseudo reg only for 68HC12 with the memory bank
349 if (regno
== M68HC12_HARD_PC_REGNUM
)
351 const int regsize
= 4;
352 gdb_byte
*tmp
= (gdb_byte
*) alloca (regsize
);
355 memcpy (tmp
, buf
, regsize
);
356 pc
= extract_unsigned_integer (tmp
, regsize
, byte_order
);
360 regcache_cooked_write_unsigned (regcache
, HARD_PAGE_REGNUM
,
363 regcache_cooked_write_unsigned (regcache
, HARD_PC_REGNUM
,
367 regcache_cooked_write_unsigned (regcache
, HARD_PC_REGNUM
, pc
);
371 m68hc11_initialize_register_info ();
373 /* Store a soft register: translate into a memory write. */
374 if (soft_regs
[regno
].name
)
376 const int regsize
= 2;
377 gdb_byte
*tmp
= (gdb_byte
*) alloca (regsize
);
378 memcpy (tmp
, buf
, regsize
);
379 target_write_memory (soft_regs
[regno
].addr
, tmp
, regsize
);
384 m68hc11_register_name (struct gdbarch
*gdbarch
, int reg_nr
)
386 if (reg_nr
== M68HC12_HARD_PC_REGNUM
&& use_page_register (gdbarch
))
389 if (reg_nr
== HARD_PC_REGNUM
&& use_page_register (gdbarch
))
395 if (reg_nr
>= M68HC11_ALL_REGS
)
398 m68hc11_initialize_register_info ();
400 /* If we don't know the address of a soft register, pretend it
402 if (reg_nr
> M68HC11_LAST_HARD_REG
&& soft_regs
[reg_nr
].name
== 0)
405 return m68hc11_register_names
[reg_nr
];
408 constexpr gdb_byte m68hc11_break_insn
[] = {0x0};
410 typedef BP_MANIPULATION (m68hc11_break_insn
) m68hc11_breakpoint
;
412 /* 68HC11 & 68HC12 prologue analysis. */
416 /* 68HC11 opcodes. */
417 #undef M6811_OP_PAGE2
418 #define M6811_OP_PAGE2 (0x18)
419 #define M6811_OP_LDX (0xde)
420 #define M6811_OP_LDX_EXT (0xfe)
421 #define M6811_OP_PSHX (0x3c)
422 #define M6811_OP_STS (0x9f)
423 #define M6811_OP_STS_EXT (0xbf)
424 #define M6811_OP_TSX (0x30)
425 #define M6811_OP_XGDX (0x8f)
426 #define M6811_OP_ADDD (0xc3)
427 #define M6811_OP_TXS (0x35)
428 #define M6811_OP_DES (0x34)
430 /* 68HC12 opcodes. */
431 #define M6812_OP_PAGE2 (0x18)
432 #define M6812_OP_MOVW (0x01)
433 #define M6812_PB_PSHW (0xae)
434 #define M6812_OP_STS (0x5f)
435 #define M6812_OP_STS_EXT (0x7f)
436 #define M6812_OP_LEAS (0x1b)
437 #define M6812_OP_PSHX (0x34)
438 #define M6812_OP_PSHY (0x35)
440 /* Operand extraction. */
441 #define OP_DIRECT (0x100) /* 8-byte direct addressing. */
442 #define OP_IMM_LOW (0x200) /* Low part of 16-bit constant/address. */
443 #define OP_IMM_HIGH (0x300) /* High part of 16-bit constant/address. */
444 #define OP_PBYTE (0x400) /* 68HC12 indexed operand. */
446 /* Identification of the sequence. */
450 P_SAVE_REG
, /* Save a register on the stack. */
451 P_SET_FRAME
, /* Setup the frame pointer. */
452 P_LOCAL_1
, /* Allocate 1 byte for locals. */
453 P_LOCAL_2
, /* Allocate 2 bytes for locals. */
454 P_LOCAL_N
/* Allocate N bytes for locals. */
457 struct insn_sequence
{
458 enum m6811_seq_type type
;
460 unsigned short code
[MAX_CODES
];
463 /* Sequence of instructions in the 68HC11 function prologue. */
464 static struct insn_sequence m6811_prologue
[] = {
465 /* Sequences to save a soft-register. */
466 { P_SAVE_REG
, 3, { M6811_OP_LDX
, OP_DIRECT
,
468 { P_SAVE_REG
, 5, { M6811_OP_PAGE2
, M6811_OP_LDX
, OP_DIRECT
,
469 M6811_OP_PAGE2
, M6811_OP_PSHX
} },
470 { P_SAVE_REG
, 4, { M6811_OP_LDX_EXT
, OP_IMM_HIGH
, OP_IMM_LOW
,
472 { P_SAVE_REG
, 6, { M6811_OP_PAGE2
, M6811_OP_LDX_EXT
, OP_IMM_HIGH
, OP_IMM_LOW
,
473 M6811_OP_PAGE2
, M6811_OP_PSHX
} },
475 /* Sequences to allocate local variables. */
476 { P_LOCAL_N
, 7, { M6811_OP_TSX
,
478 M6811_OP_ADDD
, OP_IMM_HIGH
, OP_IMM_LOW
,
481 { P_LOCAL_N
, 11, { M6811_OP_PAGE2
, M6811_OP_TSX
,
482 M6811_OP_PAGE2
, M6811_OP_XGDX
,
483 M6811_OP_ADDD
, OP_IMM_HIGH
, OP_IMM_LOW
,
484 M6811_OP_PAGE2
, M6811_OP_XGDX
,
485 M6811_OP_PAGE2
, M6811_OP_TXS
} },
486 { P_LOCAL_1
, 1, { M6811_OP_DES
} },
487 { P_LOCAL_2
, 1, { M6811_OP_PSHX
} },
488 { P_LOCAL_2
, 2, { M6811_OP_PAGE2
, M6811_OP_PSHX
} },
490 /* Initialize the frame pointer. */
491 { P_SET_FRAME
, 2, { M6811_OP_STS
, OP_DIRECT
} },
492 { P_SET_FRAME
, 3, { M6811_OP_STS_EXT
, OP_IMM_HIGH
, OP_IMM_LOW
} },
497 /* Sequence of instructions in the 68HC12 function prologue. */
498 static struct insn_sequence m6812_prologue
[] = {
499 { P_SAVE_REG
, 5, { M6812_OP_PAGE2
, M6812_OP_MOVW
, M6812_PB_PSHW
,
500 OP_IMM_HIGH
, OP_IMM_LOW
} },
501 { P_SET_FRAME
, 2, { M6812_OP_STS
, OP_DIRECT
} },
502 { P_SET_FRAME
, 3, { M6812_OP_STS_EXT
, OP_IMM_HIGH
, OP_IMM_LOW
} },
503 { P_LOCAL_N
, 2, { M6812_OP_LEAS
, OP_PBYTE
} },
504 { P_LOCAL_2
, 1, { M6812_OP_PSHX
} },
505 { P_LOCAL_2
, 1, { M6812_OP_PSHY
} },
510 /* Analyze the sequence of instructions starting at the given address.
511 Returns a pointer to the sequence when it is recognized and
512 the optional value (constant/address) associated with it. */
513 static struct insn_sequence
*
514 m68hc11_analyze_instruction (struct gdbarch
*gdbarch
,
515 struct insn_sequence
*seq
, CORE_ADDR pc
,
518 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
519 unsigned char buffer
[MAX_CODES
];
526 for (; seq
->type
!= P_LAST
; seq
++)
529 for (j
= 0; j
< seq
->length
; j
++)
533 buffer
[bufsize
] = read_memory_unsigned_integer (pc
+ bufsize
,
537 /* Continue while we match the opcode. */
538 if (seq
->code
[j
] == buffer
[j
])
541 if ((seq
->code
[j
] & 0xf00) == 0)
544 /* Extract a sequence parameter (address or constant). */
545 switch (seq
->code
[j
])
548 cur_val
= (CORE_ADDR
) buffer
[j
];
552 cur_val
= cur_val
& 0x0ff;
553 cur_val
|= (buffer
[j
] << 8);
558 cur_val
|= buffer
[j
];
562 if ((buffer
[j
] & 0xE0) == 0x80)
564 v
= buffer
[j
] & 0x1f;
568 else if ((buffer
[j
] & 0xfe) == 0xf0)
570 v
= read_memory_unsigned_integer (pc
+ j
+ 1, 1, byte_order
);
574 else if (buffer
[j
] == 0xf2)
576 v
= read_memory_unsigned_integer (pc
+ j
+ 1, 2, byte_order
);
583 /* We have a full match. */
584 if (j
== seq
->length
)
593 /* Return the instruction that the function at the PC is using. */
594 static enum insn_return_kind
595 m68hc11_get_return_insn (CORE_ADDR pc
)
597 struct bound_minimal_symbol sym
;
599 /* A flag indicating that this is a STO_M68HC12_FAR or STO_M68HC12_INTERRUPT
600 function is stored by elfread.c in the high bit of the info field.
601 Use this to decide which instruction the function uses to return. */
602 sym
= lookup_minimal_symbol_by_pc (pc
);
606 if (MSYMBOL_IS_RTC (sym
.minsym
))
608 else if (MSYMBOL_IS_RTI (sym
.minsym
))
614 /* Analyze the function prologue to find some information
616 - the PC of the first line (for m68hc11_skip_prologue)
617 - the offset of the previous frame saved address (from current frame)
618 - the soft registers which are pushed. */
620 m68hc11_scan_prologue (struct gdbarch
*gdbarch
, CORE_ADDR pc
,
621 CORE_ADDR current_pc
, struct m68hc11_unwind_cache
*info
)
626 int found_frame_point
;
629 struct insn_sequence
*seq_table
;
633 if (pc
>= current_pc
)
638 m68hc11_initialize_register_info ();
645 m68gc11_gdbarch_tdep
*tdep
= (m68gc11_gdbarch_tdep
*) gdbarch_tdep (gdbarch
);
646 seq_table
= tdep
->prologue
;
648 /* The 68hc11 stack is as follows:
664 +-----------+ <--- current frame
667 With most processors (like 68K) the previous frame can be computed
668 easily because it is always at a fixed offset (see link/unlink).
669 That is, locals are accessed with negative offsets, arguments are
670 accessed with positive ones. Since 68hc11 only supports offsets
671 in the range [0..255], the frame is defined at the bottom of
672 locals (see picture).
674 The purpose of the analysis made here is to find out the size
675 of locals in this function. An alternative to this is to use
676 DWARF2 info. This would be better but I don't know how to
677 access dwarf2 debug from this function.
679 Walk from the function entry point to the point where we save
680 the frame. While walking instructions, compute the size of bytes
681 which are pushed. This gives us the index to access the previous
684 We limit the search to 128 bytes so that the algorithm is bounded
685 in case of random and wrong code. We also stop and abort if
686 we find an instruction which is not supposed to appear in the
687 prologue (as generated by gcc 2.95, 2.96). */
690 found_frame_point
= 0;
693 while (!done
&& pc
+ 2 < func_end
)
695 struct insn_sequence
*seq
;
698 seq
= m68hc11_analyze_instruction (gdbarch
, seq_table
, pc
, &val
);
702 /* If we are within the instruction group, we can't advance the
703 pc nor the stack offset. Otherwise the caller's stack computed
704 from the current stack can be wrong. */
705 if (pc
+ seq
->length
> current_pc
)
708 pc
= pc
+ seq
->length
;
709 if (seq
->type
== P_SAVE_REG
)
711 if (found_frame_point
)
713 saved_reg
= m68hc11_which_soft_register (val
);
718 if (info
->saved_regs
)
719 info
->saved_regs
[saved_reg
].set_addr (save_addr
);
726 else if (seq
->type
== P_SET_FRAME
)
728 found_frame_point
= 1;
731 else if (seq
->type
== P_LOCAL_1
)
735 else if (seq
->type
== P_LOCAL_2
)
739 else if (seq
->type
== P_LOCAL_N
)
741 /* Stack pointer is decremented for the allocation. */
743 size
-= (int) (val
) | 0xffff0000;
748 if (found_frame_point
== 0)
749 info
->sp_offset
= size
;
751 info
->sp_offset
= -1;
756 m68hc11_skip_prologue (struct gdbarch
*gdbarch
, CORE_ADDR pc
)
758 CORE_ADDR func_addr
, func_end
;
759 struct symtab_and_line sal
;
760 struct m68hc11_unwind_cache tmp_cache
= { 0 };
762 /* If we have line debugging information, then the end of the
763 prologue should be the first assembly instruction of the
764 first source line. */
765 if (find_pc_partial_function (pc
, NULL
, &func_addr
, &func_end
))
767 sal
= find_pc_line (func_addr
, 0);
768 if (sal
.end
&& sal
.end
< func_end
)
772 pc
= m68hc11_scan_prologue (gdbarch
, pc
, (CORE_ADDR
) -1, &tmp_cache
);
776 /* Put here the code to store, into fi->saved_regs, the addresses of
777 the saved registers of frame described by FRAME_INFO. This
778 includes special registers such as pc and fp saved in special ways
779 in the stack frame. sp is even more special: the address we return
780 for it IS the sp for the next frame. */
782 static struct m68hc11_unwind_cache
*
783 m68hc11_frame_unwind_cache (struct frame_info
*this_frame
,
784 void **this_prologue_cache
)
786 struct gdbarch
*gdbarch
= get_frame_arch (this_frame
);
789 struct m68hc11_unwind_cache
*info
;
790 CORE_ADDR current_pc
;
793 if ((*this_prologue_cache
))
794 return (struct m68hc11_unwind_cache
*) (*this_prologue_cache
);
796 info
= FRAME_OBSTACK_ZALLOC (struct m68hc11_unwind_cache
);
797 (*this_prologue_cache
) = info
;
798 info
->saved_regs
= trad_frame_alloc_saved_regs (this_frame
);
800 info
->pc
= get_frame_func (this_frame
);
803 info
->return_kind
= m68hc11_get_return_insn (info
->pc
);
805 /* The SP was moved to the FP. This indicates that a new frame
806 was created. Get THIS frame's FP value by unwinding it from
808 this_base
= get_frame_register_unsigned (this_frame
, SOFT_FP_REGNUM
);
815 current_pc
= get_frame_pc (this_frame
);
817 m68hc11_scan_prologue (gdbarch
, info
->pc
, current_pc
, info
);
819 info
->saved_regs
[HARD_PC_REGNUM
].set_addr (info
->size
);
821 if (info
->sp_offset
!= (CORE_ADDR
) -1)
823 info
->saved_regs
[HARD_PC_REGNUM
].set_addr (info
->sp_offset
);
824 this_base
= get_frame_register_unsigned (this_frame
, HARD_SP_REGNUM
);
825 prev_sp
= this_base
+ info
->sp_offset
+ 2;
826 this_base
+= stack_correction (gdbarch
);
830 /* The FP points at the last saved register. Adjust the FP back
831 to before the first saved register giving the SP. */
832 prev_sp
= this_base
+ info
->size
+ 2;
834 this_base
+= stack_correction (gdbarch
);
835 if (soft_regs
[SOFT_FP_REGNUM
].name
)
836 info
->saved_regs
[SOFT_FP_REGNUM
].set_addr (info
->size
- 2);
839 if (info
->return_kind
== RETURN_RTC
)
842 info
->saved_regs
[HARD_PAGE_REGNUM
].set_addr (info
->size
);
843 info
->saved_regs
[HARD_PC_REGNUM
].set_addr (info
->size
+ 1);
845 else if (info
->return_kind
== RETURN_RTI
)
848 info
->saved_regs
[HARD_CCR_REGNUM
].set_addr (info
->size
);
849 info
->saved_regs
[HARD_D_REGNUM
].set_addr (info
->size
+ 1);
850 info
->saved_regs
[HARD_X_REGNUM
].set_addr (info
->size
+ 3);
851 info
->saved_regs
[HARD_Y_REGNUM
].set_addr (info
->size
+ 5);
852 info
->saved_regs
[HARD_PC_REGNUM
].set_addr (info
->size
+ 7);
855 /* Add 1 here to adjust for the post-decrement nature of the push
857 info
->prev_sp
= prev_sp
;
859 info
->base
= this_base
;
861 /* Adjust all the saved registers so that they contain addresses and not
863 for (i
= 0; i
< gdbarch_num_cooked_regs (gdbarch
); i
++)
864 if (info
->saved_regs
[i
].is_addr ())
866 info
->saved_regs
[i
].set_addr (info
->saved_regs
[i
].addr () + this_base
);
869 /* The previous frame's SP needed to be computed. Save the computed
871 info
->saved_regs
[HARD_SP_REGNUM
].set_value (info
->prev_sp
);
876 /* Given a GDB frame, determine the address of the calling function's
877 frame. This will be used to create a new GDB frame struct. */
880 m68hc11_frame_this_id (struct frame_info
*this_frame
,
881 void **this_prologue_cache
,
882 struct frame_id
*this_id
)
884 struct m68hc11_unwind_cache
*info
885 = m68hc11_frame_unwind_cache (this_frame
, this_prologue_cache
);
890 /* The FUNC is easy. */
891 func
= get_frame_func (this_frame
);
893 /* Hopefully the prologue analysis either correctly determined the
894 frame's base (which is the SP from the previous frame), or set
895 that base to "NULL". */
896 base
= info
->prev_sp
;
900 id
= frame_id_build (base
, func
);
904 static struct value
*
905 m68hc11_frame_prev_register (struct frame_info
*this_frame
,
906 void **this_prologue_cache
, int regnum
)
909 struct m68hc11_unwind_cache
*info
910 = m68hc11_frame_unwind_cache (this_frame
, this_prologue_cache
);
912 value
= trad_frame_get_prev_register (this_frame
, info
->saved_regs
, regnum
);
914 /* Take into account the 68HC12 specific call (PC + page). */
915 if (regnum
== HARD_PC_REGNUM
916 && info
->return_kind
== RETURN_RTC
917 && use_page_register (get_frame_arch (this_frame
)))
919 CORE_ADDR pc
= value_as_long (value
);
920 if (pc
>= 0x08000 && pc
< 0x0c000)
924 release_value (value
);
926 value
= trad_frame_get_prev_register (this_frame
, info
->saved_regs
,
928 page
= value_as_long (value
);
929 release_value (value
);
932 pc
+= ((page
& 0x0ff) << 14);
935 return frame_unwind_got_constant (this_frame
, regnum
, pc
);
942 static const struct frame_unwind m68hc11_frame_unwind
= {
945 default_frame_unwind_stop_reason
,
946 m68hc11_frame_this_id
,
947 m68hc11_frame_prev_register
,
949 default_frame_sniffer
953 m68hc11_frame_base_address (struct frame_info
*this_frame
, void **this_cache
)
955 struct m68hc11_unwind_cache
*info
956 = m68hc11_frame_unwind_cache (this_frame
, this_cache
);
962 m68hc11_frame_args_address (struct frame_info
*this_frame
, void **this_cache
)
965 struct m68hc11_unwind_cache
*info
966 = m68hc11_frame_unwind_cache (this_frame
, this_cache
);
968 addr
= info
->base
+ info
->size
;
969 if (info
->return_kind
== RETURN_RTC
)
971 else if (info
->return_kind
== RETURN_RTI
)
977 static const struct frame_base m68hc11_frame_base
= {
978 &m68hc11_frame_unwind
,
979 m68hc11_frame_base_address
,
980 m68hc11_frame_base_address
,
981 m68hc11_frame_args_address
984 /* Assuming THIS_FRAME is a dummy, return the frame ID of that dummy
985 frame. The frame ID's base needs to match the TOS value saved by
986 save_dummy_frame_tos(), and the PC match the dummy frame's breakpoint. */
988 static struct frame_id
989 m68hc11_dummy_id (struct gdbarch
*gdbarch
, struct frame_info
*this_frame
)
992 CORE_ADDR pc
= get_frame_pc (this_frame
);
994 tos
= get_frame_register_unsigned (this_frame
, SOFT_FP_REGNUM
);
996 return frame_id_build (tos
, pc
);
1000 /* Get and print the register from the given frame. */
1002 m68hc11_print_register (struct gdbarch
*gdbarch
, struct ui_file
*file
,
1003 struct frame_info
*frame
, int regno
)
1007 if (regno
== HARD_PC_REGNUM
|| regno
== HARD_SP_REGNUM
1008 || regno
== SOFT_FP_REGNUM
|| regno
== M68HC12_HARD_PC_REGNUM
)
1009 rval
= get_frame_register_unsigned (frame
, regno
);
1011 rval
= get_frame_register_signed (frame
, regno
);
1013 if (regno
== HARD_A_REGNUM
|| regno
== HARD_B_REGNUM
1014 || regno
== HARD_CCR_REGNUM
|| regno
== HARD_PAGE_REGNUM
)
1016 gdb_printf (file
, "0x%02x ", (unsigned char) rval
);
1017 if (regno
!= HARD_CCR_REGNUM
)
1018 print_longest (file
, 'd', 1, rval
);
1022 m68gc11_gdbarch_tdep
*tdep
1023 = (m68gc11_gdbarch_tdep
*) gdbarch_tdep (gdbarch
);
1025 if (regno
== HARD_PC_REGNUM
&& tdep
->use_page_register
)
1029 page
= get_frame_register_unsigned (frame
, HARD_PAGE_REGNUM
);
1030 gdb_printf (file
, "0x%02x:%04x ", (unsigned) page
,
1035 gdb_printf (file
, "0x%04x ", (unsigned) rval
);
1036 if (regno
!= HARD_PC_REGNUM
&& regno
!= HARD_SP_REGNUM
1037 && regno
!= SOFT_FP_REGNUM
&& regno
!= M68HC12_HARD_PC_REGNUM
)
1038 print_longest (file
, 'd', 1, rval
);
1042 if (regno
== HARD_CCR_REGNUM
)
1046 unsigned char l
= rval
& 0xff;
1048 gdb_printf (file
, "%c%c%c%c%c%c%c%c ",
1049 l
& M6811_S_BIT
? 'S' : '-',
1050 l
& M6811_X_BIT
? 'X' : '-',
1051 l
& M6811_H_BIT
? 'H' : '-',
1052 l
& M6811_I_BIT
? 'I' : '-',
1053 l
& M6811_N_BIT
? 'N' : '-',
1054 l
& M6811_Z_BIT
? 'Z' : '-',
1055 l
& M6811_V_BIT
? 'V' : '-',
1056 l
& M6811_C_BIT
? 'C' : '-');
1057 N
= (l
& M6811_N_BIT
) != 0;
1058 Z
= (l
& M6811_Z_BIT
) != 0;
1059 V
= (l
& M6811_V_BIT
) != 0;
1060 C
= (l
& M6811_C_BIT
) != 0;
1062 /* Print flags following the h8300. */
1064 gdb_printf (file
, "u> ");
1065 else if ((C
| Z
) == 1)
1066 gdb_printf (file
, "u<= ");
1068 gdb_printf (file
, "u< ");
1071 gdb_printf (file
, "!= ");
1073 gdb_printf (file
, "== ");
1076 gdb_printf (file
, ">= ");
1078 gdb_printf (file
, "< ");
1080 if ((Z
| (N
^ V
)) == 0)
1081 gdb_printf (file
, "> ");
1083 gdb_printf (file
, "<= ");
1087 /* Same as 'info reg' but prints the registers in a different way. */
1089 m68hc11_print_registers_info (struct gdbarch
*gdbarch
, struct ui_file
*file
,
1090 struct frame_info
*frame
, int regno
, int cpregs
)
1094 const char *name
= gdbarch_register_name (gdbarch
, regno
);
1096 if (!name
|| !*name
)
1099 gdb_printf (file
, "%-10s ", name
);
1100 m68hc11_print_register (gdbarch
, file
, frame
, regno
);
1101 gdb_printf (file
, "\n");
1107 gdb_printf (file
, "PC=");
1108 m68hc11_print_register (gdbarch
, file
, frame
, HARD_PC_REGNUM
);
1110 gdb_printf (file
, " SP=");
1111 m68hc11_print_register (gdbarch
, file
, frame
, HARD_SP_REGNUM
);
1113 gdb_printf (file
, " FP=");
1114 m68hc11_print_register (gdbarch
, file
, frame
, SOFT_FP_REGNUM
);
1116 gdb_printf (file
, "\nCCR=");
1117 m68hc11_print_register (gdbarch
, file
, frame
, HARD_CCR_REGNUM
);
1119 gdb_printf (file
, "\nD=");
1120 m68hc11_print_register (gdbarch
, file
, frame
, HARD_D_REGNUM
);
1122 gdb_printf (file
, " X=");
1123 m68hc11_print_register (gdbarch
, file
, frame
, HARD_X_REGNUM
);
1125 gdb_printf (file
, " Y=");
1126 m68hc11_print_register (gdbarch
, file
, frame
, HARD_Y_REGNUM
);
1128 m68gc11_gdbarch_tdep
*tdep
= (m68gc11_gdbarch_tdep
*) gdbarch_tdep (gdbarch
);
1130 if (tdep
->use_page_register
)
1132 gdb_printf (file
, "\nPage=");
1133 m68hc11_print_register (gdbarch
, file
, frame
, HARD_PAGE_REGNUM
);
1135 gdb_printf (file
, "\n");
1138 for (i
= SOFT_D1_REGNUM
; i
< M68HC11_ALL_REGS
; i
++)
1140 /* Skip registers which are not defined in the symbol table. */
1141 if (soft_regs
[i
].name
== 0)
1144 gdb_printf (file
, "D%d=", i
- SOFT_D1_REGNUM
+ 1);
1145 m68hc11_print_register (gdbarch
, file
, frame
, i
);
1148 gdb_printf (file
, "\n");
1150 gdb_printf (file
, " ");
1152 if (nr
&& (nr
% 8) != 7)
1153 gdb_printf (file
, "\n");
1158 m68hc11_push_dummy_call (struct gdbarch
*gdbarch
, struct value
*function
,
1159 struct regcache
*regcache
, CORE_ADDR bp_addr
,
1160 int nargs
, struct value
**args
, CORE_ADDR sp
,
1161 function_call_return_method return_method
,
1162 CORE_ADDR struct_addr
)
1164 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
1166 int first_stack_argnum
;
1168 const gdb_byte
*val
;
1171 first_stack_argnum
= 0;
1172 if (return_method
== return_method_struct
)
1173 regcache_cooked_write_unsigned (regcache
, HARD_D_REGNUM
, struct_addr
);
1176 type
= value_type (args
[0]);
1178 /* First argument is passed in D and X registers. */
1179 if (TYPE_LENGTH (type
) <= 4)
1183 v
= extract_unsigned_integer (value_contents (args
[0]).data (),
1184 TYPE_LENGTH (type
), byte_order
);
1185 first_stack_argnum
= 1;
1187 regcache_cooked_write_unsigned (regcache
, HARD_D_REGNUM
, v
);
1188 if (TYPE_LENGTH (type
) > 2)
1191 regcache_cooked_write_unsigned (regcache
, HARD_X_REGNUM
, v
);
1196 for (argnum
= nargs
- 1; argnum
>= first_stack_argnum
; argnum
--)
1198 type
= value_type (args
[argnum
]);
1200 if (TYPE_LENGTH (type
) & 1)
1202 static gdb_byte zero
= 0;
1205 write_memory (sp
, &zero
, 1);
1207 val
= value_contents (args
[argnum
]).data ();
1208 sp
-= TYPE_LENGTH (type
);
1209 write_memory (sp
, val
, TYPE_LENGTH (type
));
1212 /* Store return address. */
1214 store_unsigned_integer (buf
, 2, byte_order
, bp_addr
);
1215 write_memory (sp
, buf
, 2);
1217 /* Finally, update the stack pointer... */
1218 sp
-= stack_correction (gdbarch
);
1219 regcache_cooked_write_unsigned (regcache
, HARD_SP_REGNUM
, sp
);
1221 /* ...and fake a frame pointer. */
1222 regcache_cooked_write_unsigned (regcache
, SOFT_FP_REGNUM
, sp
);
1224 /* DWARF2/GCC uses the stack address *before* the function call as a
1230 /* Return the GDB type object for the "standard" data type
1231 of data in register N. */
1233 static struct type
*
1234 m68hc11_register_type (struct gdbarch
*gdbarch
, int reg_nr
)
1238 case HARD_PAGE_REGNUM
:
1241 case HARD_CCR_REGNUM
:
1242 return builtin_type (gdbarch
)->builtin_uint8
;
1244 case M68HC12_HARD_PC_REGNUM
:
1245 return builtin_type (gdbarch
)->builtin_uint32
;
1248 return builtin_type (gdbarch
)->builtin_uint16
;
1253 m68hc11_store_return_value (struct type
*type
, struct regcache
*regcache
,
1254 const gdb_byte
*valbuf
)
1258 len
= TYPE_LENGTH (type
);
1260 /* First argument is passed in D and X registers. */
1262 regcache
->raw_write_part (HARD_D_REGNUM
, 2 - len
, len
, valbuf
);
1265 regcache
->raw_write_part (HARD_X_REGNUM
, 4 - len
, len
- 2, valbuf
);
1266 regcache
->raw_write (HARD_D_REGNUM
, valbuf
+ (len
- 2));
1269 error (_("return of value > 4 is not supported."));
1273 /* Given a return value in `regcache' with a type `type',
1274 extract and copy its value into `valbuf'. */
1277 m68hc11_extract_return_value (struct type
*type
, struct regcache
*regcache
,
1280 gdb_byte buf
[M68HC11_REG_SIZE
];
1282 regcache
->raw_read (HARD_D_REGNUM
, buf
);
1283 switch (TYPE_LENGTH (type
))
1286 memcpy (valbuf
, buf
+ 1, 1);
1290 memcpy (valbuf
, buf
, 2);
1294 memcpy ((char*) valbuf
+ 1, buf
, 2);
1295 regcache
->raw_read (HARD_X_REGNUM
, buf
);
1296 memcpy (valbuf
, buf
+ 1, 1);
1300 memcpy ((char*) valbuf
+ 2, buf
, 2);
1301 regcache
->raw_read (HARD_X_REGNUM
, buf
);
1302 memcpy (valbuf
, buf
, 2);
1306 error (_("bad size for return value"));
1310 static enum return_value_convention
1311 m68hc11_return_value (struct gdbarch
*gdbarch
, struct value
*function
,
1312 struct type
*valtype
, struct regcache
*regcache
,
1313 gdb_byte
*readbuf
, const gdb_byte
*writebuf
)
1315 if (valtype
->code () == TYPE_CODE_STRUCT
1316 || valtype
->code () == TYPE_CODE_UNION
1317 || valtype
->code () == TYPE_CODE_ARRAY
1318 || TYPE_LENGTH (valtype
) > 4)
1319 return RETURN_VALUE_STRUCT_CONVENTION
;
1322 if (readbuf
!= NULL
)
1323 m68hc11_extract_return_value (valtype
, regcache
, readbuf
);
1324 if (writebuf
!= NULL
)
1325 m68hc11_store_return_value (valtype
, regcache
, writebuf
);
1326 return RETURN_VALUE_REGISTER_CONVENTION
;
1330 /* Test whether the ELF symbol corresponds to a function using rtc or
1334 m68hc11_elf_make_msymbol_special (asymbol
*sym
, struct minimal_symbol
*msym
)
1336 unsigned char flags
;
1338 flags
= ((elf_symbol_type
*)sym
)->internal_elf_sym
.st_other
;
1339 if (flags
& STO_M68HC12_FAR
)
1340 MSYMBOL_SET_RTC (msym
);
1341 if (flags
& STO_M68HC12_INTERRUPT
)
1342 MSYMBOL_SET_RTI (msym
);
1346 /* 68HC11/68HC12 register groups.
1347 Identify real hard registers and soft registers used by gcc. */
1349 static const reggroup
*m68hc11_soft_reggroup
;
1350 static const reggroup
*m68hc11_hard_reggroup
;
1353 m68hc11_init_reggroups (void)
1355 m68hc11_hard_reggroup
= reggroup_new ("hard", USER_REGGROUP
);
1356 m68hc11_soft_reggroup
= reggroup_new ("soft", USER_REGGROUP
);
1360 m68hc11_add_reggroups (struct gdbarch
*gdbarch
)
1362 reggroup_add (gdbarch
, m68hc11_hard_reggroup
);
1363 reggroup_add (gdbarch
, m68hc11_soft_reggroup
);
1367 m68hc11_register_reggroup_p (struct gdbarch
*gdbarch
, int regnum
,
1368 const struct reggroup
*group
)
1370 /* We must save the real hard register as well as gcc
1371 soft registers including the frame pointer. */
1372 if (group
== save_reggroup
|| group
== restore_reggroup
)
1374 return (regnum
<= gdbarch_num_regs (gdbarch
)
1375 || ((regnum
== SOFT_FP_REGNUM
1376 || regnum
== SOFT_TMP_REGNUM
1377 || regnum
== SOFT_ZS_REGNUM
1378 || regnum
== SOFT_XY_REGNUM
)
1379 && m68hc11_register_name (gdbarch
, regnum
)));
1382 /* Group to identify gcc soft registers (d1..dN). */
1383 if (group
== m68hc11_soft_reggroup
)
1385 return regnum
>= SOFT_D1_REGNUM
1386 && m68hc11_register_name (gdbarch
, regnum
);
1389 if (group
== m68hc11_hard_reggroup
)
1391 return regnum
== HARD_PC_REGNUM
|| regnum
== HARD_SP_REGNUM
1392 || regnum
== HARD_X_REGNUM
|| regnum
== HARD_D_REGNUM
1393 || regnum
== HARD_Y_REGNUM
|| regnum
== HARD_CCR_REGNUM
;
1395 return default_register_reggroup_p (gdbarch
, regnum
, group
);
1398 static struct gdbarch
*
1399 m68hc11_gdbarch_init (struct gdbarch_info info
,
1400 struct gdbarch_list
*arches
)
1402 struct gdbarch
*gdbarch
;
1405 soft_reg_initialized
= 0;
1407 /* Extract the elf_flags if available. */
1408 if (info
.abfd
!= NULL
1409 && bfd_get_flavour (info
.abfd
) == bfd_target_elf_flavour
)
1410 elf_flags
= elf_elfheader (info
.abfd
)->e_flags
;
1414 /* Try to find a pre-existing architecture. */
1415 for (arches
= gdbarch_list_lookup_by_info (arches
, &info
);
1417 arches
= gdbarch_list_lookup_by_info (arches
->next
, &info
))
1419 m68gc11_gdbarch_tdep
*tdep
1420 = (m68gc11_gdbarch_tdep
*) gdbarch_tdep (arches
->gdbarch
);
1422 if (tdep
->elf_flags
!= elf_flags
)
1425 return arches
->gdbarch
;
1428 /* Need a new architecture. Fill in a target specific vector. */
1429 m68gc11_gdbarch_tdep
*tdep
= new m68gc11_gdbarch_tdep
;
1430 gdbarch
= gdbarch_alloc (&info
, tdep
);
1431 tdep
->elf_flags
= elf_flags
;
1433 switch (info
.bfd_arch_info
->arch
)
1435 case bfd_arch_m68hc11
:
1436 tdep
->stack_correction
= 1;
1437 tdep
->use_page_register
= 0;
1438 tdep
->prologue
= m6811_prologue
;
1439 set_gdbarch_addr_bit (gdbarch
, 16);
1440 set_gdbarch_num_pseudo_regs (gdbarch
, M68HC11_NUM_PSEUDO_REGS
);
1441 set_gdbarch_pc_regnum (gdbarch
, HARD_PC_REGNUM
);
1442 set_gdbarch_num_regs (gdbarch
, M68HC11_NUM_REGS
);
1445 case bfd_arch_m68hc12
:
1446 tdep
->stack_correction
= 0;
1447 tdep
->use_page_register
= elf_flags
& E_M68HC12_BANKS
;
1448 tdep
->prologue
= m6812_prologue
;
1449 set_gdbarch_addr_bit (gdbarch
, elf_flags
& E_M68HC12_BANKS
? 32 : 16);
1450 set_gdbarch_num_pseudo_regs (gdbarch
,
1451 elf_flags
& E_M68HC12_BANKS
1452 ? M68HC12_NUM_PSEUDO_REGS
1453 : M68HC11_NUM_PSEUDO_REGS
);
1454 set_gdbarch_pc_regnum (gdbarch
, elf_flags
& E_M68HC12_BANKS
1455 ? M68HC12_HARD_PC_REGNUM
: HARD_PC_REGNUM
);
1456 set_gdbarch_num_regs (gdbarch
, elf_flags
& E_M68HC12_BANKS
1457 ? M68HC12_NUM_REGS
: M68HC11_NUM_REGS
);
1464 /* Initially set everything according to the ABI.
1465 Use 16-bit integers since it will be the case for most
1466 programs. The size of these types should normally be set
1467 according to the dwarf2 debug information. */
1468 set_gdbarch_short_bit (gdbarch
, 16);
1469 set_gdbarch_int_bit (gdbarch
, elf_flags
& E_M68HC11_I32
? 32 : 16);
1470 set_gdbarch_float_bit (gdbarch
, 32);
1471 if (elf_flags
& E_M68HC11_F64
)
1473 set_gdbarch_double_bit (gdbarch
, 64);
1474 set_gdbarch_double_format (gdbarch
, floatformats_ieee_double
);
1478 set_gdbarch_double_bit (gdbarch
, 32);
1479 set_gdbarch_double_format (gdbarch
, floatformats_ieee_single
);
1481 set_gdbarch_long_double_bit (gdbarch
, 64);
1482 set_gdbarch_long_bit (gdbarch
, 32);
1483 set_gdbarch_ptr_bit (gdbarch
, 16);
1484 set_gdbarch_long_long_bit (gdbarch
, 64);
1486 /* Characters are unsigned. */
1487 set_gdbarch_char_signed (gdbarch
, 0);
1489 /* Set register info. */
1490 set_gdbarch_fp0_regnum (gdbarch
, -1);
1492 set_gdbarch_sp_regnum (gdbarch
, HARD_SP_REGNUM
);
1493 set_gdbarch_register_name (gdbarch
, m68hc11_register_name
);
1494 set_gdbarch_register_type (gdbarch
, m68hc11_register_type
);
1495 set_gdbarch_pseudo_register_read (gdbarch
, m68hc11_pseudo_register_read
);
1496 set_gdbarch_pseudo_register_write (gdbarch
, m68hc11_pseudo_register_write
);
1498 set_gdbarch_push_dummy_call (gdbarch
, m68hc11_push_dummy_call
);
1500 set_gdbarch_return_value (gdbarch
, m68hc11_return_value
);
1501 set_gdbarch_skip_prologue (gdbarch
, m68hc11_skip_prologue
);
1502 set_gdbarch_inner_than (gdbarch
, core_addr_lessthan
);
1503 set_gdbarch_breakpoint_kind_from_pc (gdbarch
,
1504 m68hc11_breakpoint::kind_from_pc
);
1505 set_gdbarch_sw_breakpoint_from_kind (gdbarch
,
1506 m68hc11_breakpoint::bp_from_kind
);
1508 m68hc11_add_reggroups (gdbarch
);
1509 set_gdbarch_register_reggroup_p (gdbarch
, m68hc11_register_reggroup_p
);
1510 set_gdbarch_print_registers_info (gdbarch
, m68hc11_print_registers_info
);
1512 /* Hook in the DWARF CFI frame unwinder. */
1513 dwarf2_append_unwinders (gdbarch
);
1515 frame_unwind_append_unwinder (gdbarch
, &m68hc11_frame_unwind
);
1516 frame_base_set_default (gdbarch
, &m68hc11_frame_base
);
1518 /* Methods for saving / extracting a dummy frame's ID. The ID's
1519 stack address must match the SP value returned by
1520 PUSH_DUMMY_CALL, and saved by generic_save_dummy_frame_tos. */
1521 set_gdbarch_dummy_id (gdbarch
, m68hc11_dummy_id
);
1523 /* Minsymbol frobbing. */
1524 set_gdbarch_elf_make_msymbol_special (gdbarch
,
1525 m68hc11_elf_make_msymbol_special
);
1527 set_gdbarch_believe_pcc_promotion (gdbarch
, 1);
1532 void _initialize_m68hc11_tdep ();
1534 _initialize_m68hc11_tdep ()
1536 register_gdbarch_init (bfd_arch_m68hc11
, m68hc11_gdbarch_init
);
1537 register_gdbarch_init (bfd_arch_m68hc12
, m68hc11_gdbarch_init
);
1538 m68hc11_init_reggroups ();