Automatic date update in version.in
[binutils-gdb/blckswan.git] / gdb / m68hc11-tdep.c
blob98f1367423eb48ff6eccf0bae616c78744f017a3
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/>. */
23 #include "defs.h"
24 #include "frame.h"
25 #include "frame-unwind.h"
26 #include "frame-base.h"
27 #include "dwarf2/frame.h"
28 #include "trad-frame.h"
29 #include "symtab.h"
30 #include "gdbtypes.h"
31 #include "gdbcmd.h"
32 #include "gdbcore.h"
33 #include "value.h"
34 #include "inferior.h"
35 #include "dis-asm.h"
36 #include "symfile.h"
37 #include "objfiles.h"
38 #include "arch-utils.h"
39 #include "regcache.h"
40 #include "reggroups.h"
41 #include "gdbarch.h"
43 #include "target.h"
44 #include "opcode/m68hc11.h"
45 #include "elf/m68hc11.h"
46 #include "elf-bfd.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 {
73 RETURN_RTS,
74 RETURN_RTC,
75 RETURN_RTI
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
139 and must be used. */
140 int use_page_register = 0;
142 /* ELF flags for ABI. */
143 int elf_flags = 0;
146 static int
147 stack_correction (gdbarch *arch)
149 m68gc11_gdbarch_tdep *tdep = (m68gc11_gdbarch_tdep *) gdbarch_tdep (arch);
150 return tdep->stack_correction;
153 static int
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. */
164 CORE_ADDR prev_sp;
165 /* The frame's base, optionally used by the high-level debug info. */
166 CORE_ADDR base;
167 CORE_ADDR pc;
168 int size;
169 int prologue_type;
170 CORE_ADDR return_pc;
171 CORE_ADDR sp_offset;
172 int frameless;
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. */
181 static const char *
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
195 const char *name;
196 CORE_ADDR addr;
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. */
210 static void
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);
216 if (msymbol.minsym)
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;
227 else
229 reg->name = 0;
230 reg->addr = 0;
234 /* Initialize the table of soft register addresses according
235 to the symbol table. */
236 static void
237 m68hc11_initialize_register_info (void)
239 int i;
241 if (soft_reg_initialized)
242 return;
244 soft_min_addr = INT_MAX;
245 soft_max_addr = 0;
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++)
259 char buf[10];
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. */
273 static int
274 m68hc11_which_soft_register (CORE_ADDR addr)
276 int i;
278 if (addr < soft_min_addr || addr > soft_max_addr)
279 return -1;
281 for (i = SOFT_FP_REGNUM; i < M68HC11_ALL_REGS; i++)
283 if (soft_regs[i].name && soft_regs[i].addr == addr)
284 return i;
286 return -1;
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
300 addressing mode. */
301 if (regno == M68HC12_HARD_PC_REGNUM)
303 ULONGEST pc;
304 const int regsize = 4;
305 enum register_status status;
307 status = regcache->cooked_read (HARD_PC_REGNUM, &pc);
308 if (status != REG_VALID)
309 return status;
310 if (pc >= 0x8000 && pc < 0xc000)
312 ULONGEST page;
314 regcache->cooked_read (HARD_PAGE_REGNUM, &page);
315 pc -= 0x8000;
316 pc += (page << 14);
317 pc += 0x1000000;
319 store_unsigned_integer (buf, regsize, byte_order, pc);
320 return REG_VALID;
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);
330 else
332 memset (buf, 0, 2);
335 return REG_VALID;
338 /* Store a pseudo register. Translate the register store
339 into a memory write. */
340 static void
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
348 addressing mode. */
349 if (regno == M68HC12_HARD_PC_REGNUM)
351 const int regsize = 4;
352 gdb_byte *tmp = (gdb_byte *) alloca (regsize);
353 CORE_ADDR pc;
355 memcpy (tmp, buf, regsize);
356 pc = extract_unsigned_integer (tmp, regsize, byte_order);
357 if (pc >= 0x1000000)
359 pc -= 0x1000000;
360 regcache_cooked_write_unsigned (regcache, HARD_PAGE_REGNUM,
361 (pc >> 14) & 0x0ff);
362 pc &= 0x03fff;
363 regcache_cooked_write_unsigned (regcache, HARD_PC_REGNUM,
364 pc + 0x8000);
366 else
367 regcache_cooked_write_unsigned (regcache, HARD_PC_REGNUM, pc);
368 return;
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);
383 static const char *
384 m68hc11_register_name (struct gdbarch *gdbarch, int reg_nr)
386 if (reg_nr == M68HC12_HARD_PC_REGNUM && use_page_register (gdbarch))
387 return "pc";
389 if (reg_nr == HARD_PC_REGNUM && use_page_register (gdbarch))
390 return "ppc";
392 if (reg_nr < 0)
393 return NULL;
395 if (reg_nr >= M68HC11_ALL_REGS)
396 return NULL;
398 m68hc11_initialize_register_info ();
400 /* If we don't know the address of a soft register, pretend it
401 does not exist. */
402 if (reg_nr > M68HC11_LAST_HARD_REG && soft_regs[reg_nr].name == 0)
403 return NULL;
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. */
414 #define MAX_CODES 12
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. */
447 enum m6811_seq_type
449 P_LAST = 0,
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;
459 unsigned length;
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,
467 M6811_OP_PSHX } },
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,
471 M6811_OP_PSHX } },
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,
477 M6811_OP_XGDX,
478 M6811_OP_ADDD, OP_IMM_HIGH, OP_IMM_LOW,
479 M6811_OP_XGDX,
480 M6811_OP_TXS } },
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 } },
493 { P_LAST, 0, { 0 } }
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 } },
506 { P_LAST, 0 }
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,
516 CORE_ADDR *val)
518 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
519 unsigned char buffer[MAX_CODES];
520 unsigned bufsize;
521 unsigned j;
522 CORE_ADDR cur_val;
523 short v = 0;
525 bufsize = 0;
526 for (; seq->type != P_LAST; seq++)
528 cur_val = 0;
529 for (j = 0; j < seq->length; j++)
531 if (bufsize < j + 1)
533 buffer[bufsize] = read_memory_unsigned_integer (pc + bufsize,
534 1, byte_order);
535 bufsize++;
537 /* Continue while we match the opcode. */
538 if (seq->code[j] == buffer[j])
539 continue;
541 if ((seq->code[j] & 0xf00) == 0)
542 break;
544 /* Extract a sequence parameter (address or constant). */
545 switch (seq->code[j])
547 case OP_DIRECT:
548 cur_val = (CORE_ADDR) buffer[j];
549 break;
551 case OP_IMM_HIGH:
552 cur_val = cur_val & 0x0ff;
553 cur_val |= (buffer[j] << 8);
554 break;
556 case OP_IMM_LOW:
557 cur_val &= 0x0ff00;
558 cur_val |= buffer[j];
559 break;
561 case OP_PBYTE:
562 if ((buffer[j] & 0xE0) == 0x80)
564 v = buffer[j] & 0x1f;
565 if (v & 0x10)
566 v |= 0xfff0;
568 else if ((buffer[j] & 0xfe) == 0xf0)
570 v = read_memory_unsigned_integer (pc + j + 1, 1, byte_order);
571 if (buffer[j] & 1)
572 v |= 0xff00;
574 else if (buffer[j] == 0xf2)
576 v = read_memory_unsigned_integer (pc + j + 1, 2, byte_order);
578 cur_val = v;
579 break;
583 /* We have a full match. */
584 if (j == seq->length)
586 *val = cur_val;
587 return seq;
590 return 0;
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);
603 if (sym.minsym == 0)
604 return RETURN_RTS;
606 if (MSYMBOL_IS_RTC (sym.minsym))
607 return RETURN_RTC;
608 else if (MSYMBOL_IS_RTI (sym.minsym))
609 return RETURN_RTI;
610 else
611 return RETURN_RTS;
614 /* Analyze the function prologue to find some information
615 about the function:
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. */
619 static CORE_ADDR
620 m68hc11_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
621 CORE_ADDR current_pc, struct m68hc11_unwind_cache *info)
623 LONGEST save_addr;
624 CORE_ADDR func_end;
625 int size;
626 int found_frame_point;
627 int saved_reg;
628 int done = 0;
629 struct insn_sequence *seq_table;
631 info->size = 0;
632 info->sp_offset = 0;
633 if (pc >= current_pc)
634 return current_pc;
636 size = 0;
638 m68hc11_initialize_register_info ();
639 if (pc == 0)
641 info->size = 0;
642 return pc;
645 m68gc11_gdbarch_tdep *tdep = (m68gc11_gdbarch_tdep *) gdbarch_tdep (gdbarch);
646 seq_table = tdep->prologue;
648 /* The 68hc11 stack is as follows:
652 +-----------+
654 | args |
656 +-----------+
657 | PC-return |
658 +-----------+
659 | Old frame |
660 +-----------+
662 | Locals |
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
682 frame.
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). */
689 func_end = pc + 128;
690 found_frame_point = 0;
691 info->size = 0;
692 save_addr = 0;
693 while (!done && pc + 2 < func_end)
695 struct insn_sequence *seq;
696 CORE_ADDR val;
698 seq = m68hc11_analyze_instruction (gdbarch, seq_table, pc, &val);
699 if (seq == 0)
700 break;
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)
706 break;
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);
714 if (saved_reg < 0)
715 break;
717 save_addr -= 2;
718 if (info->saved_regs)
719 info->saved_regs[saved_reg].set_addr (save_addr);
721 else
723 size += 2;
726 else if (seq->type == P_SET_FRAME)
728 found_frame_point = 1;
729 info->size = size;
731 else if (seq->type == P_LOCAL_1)
733 size += 1;
735 else if (seq->type == P_LOCAL_2)
737 size += 2;
739 else if (seq->type == P_LOCAL_N)
741 /* Stack pointer is decremented for the allocation. */
742 if (val & 0x8000)
743 size -= (int) (val) | 0xffff0000;
744 else
745 size -= val;
748 if (found_frame_point == 0)
749 info->sp_offset = size;
750 else
751 info->sp_offset = -1;
752 return pc;
755 static CORE_ADDR
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)
769 return sal.end;
772 pc = m68hc11_scan_prologue (gdbarch, pc, (CORE_ADDR) -1, &tmp_cache);
773 return pc;
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);
787 ULONGEST prev_sp;
788 ULONGEST this_base;
789 struct m68hc11_unwind_cache *info;
790 CORE_ADDR current_pc;
791 int i;
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);
802 info->size = 0;
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
807 the next frame. */
808 this_base = get_frame_register_unsigned (this_frame, SOFT_FP_REGNUM);
809 if (this_base == 0)
811 info->base = 0;
812 return info;
815 current_pc = get_frame_pc (this_frame);
816 if (info->pc != 0)
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);
828 else
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)
841 prev_sp += 1;
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)
847 prev_sp += 7;
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
856 instruction. */
857 info->prev_sp = prev_sp;
859 info->base = this_base;
861 /* Adjust all the saved registers so that they contain addresses and not
862 offsets. */
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
870 value. */
871 info->saved_regs[HARD_SP_REGNUM].set_value (info->prev_sp);
873 return info;
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. */
879 static void
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);
886 CORE_ADDR base;
887 CORE_ADDR func;
888 struct frame_id id;
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;
897 if (base == 0)
898 return;
900 id = frame_id_build (base, func);
901 (*this_id) = id;
904 static struct value *
905 m68hc11_frame_prev_register (struct frame_info *this_frame,
906 void **this_prologue_cache, int regnum)
908 struct value *value;
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)
922 CORE_ADDR page;
924 release_value (value);
926 value = trad_frame_get_prev_register (this_frame, info->saved_regs,
927 HARD_PAGE_REGNUM);
928 page = value_as_long (value);
929 release_value (value);
931 pc -= 0x08000;
932 pc += ((page & 0x0ff) << 14);
933 pc += 0x1000000;
935 return frame_unwind_got_constant (this_frame, regnum, pc);
939 return value;
942 static const struct frame_unwind m68hc11_frame_unwind = {
943 "m68hc11 prologue",
944 NORMAL_FRAME,
945 default_frame_unwind_stop_reason,
946 m68hc11_frame_this_id,
947 m68hc11_frame_prev_register,
948 NULL,
949 default_frame_sniffer
952 static CORE_ADDR
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);
958 return info->base;
961 static CORE_ADDR
962 m68hc11_frame_args_address (struct frame_info *this_frame, void **this_cache)
964 CORE_ADDR addr;
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)
970 addr += 1;
971 else if (info->return_kind == RETURN_RTI)
972 addr += 7;
974 return addr;
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)
991 ULONGEST tos;
992 CORE_ADDR pc = get_frame_pc (this_frame);
994 tos = get_frame_register_unsigned (this_frame, SOFT_FP_REGNUM);
995 tos += 2;
996 return frame_id_build (tos, pc);
1000 /* Get and print the register from the given frame. */
1001 static void
1002 m68hc11_print_register (struct gdbarch *gdbarch, struct ui_file *file,
1003 struct frame_info *frame, int regno)
1005 LONGEST rval;
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);
1010 else
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);
1020 else
1022 m68gc11_gdbarch_tdep *tdep
1023 = (m68gc11_gdbarch_tdep *) gdbarch_tdep (gdbarch);
1025 if (regno == HARD_PC_REGNUM && tdep->use_page_register)
1027 ULONGEST page;
1029 page = get_frame_register_unsigned (frame, HARD_PAGE_REGNUM);
1030 gdb_printf (file, "0x%02x:%04x ", (unsigned) page,
1031 (unsigned) rval);
1033 else
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)
1044 /* CCR register */
1045 int C, Z, N, V;
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. */
1063 if ((C | Z) == 0)
1064 gdb_printf (file, "u> ");
1065 else if ((C | Z) == 1)
1066 gdb_printf (file, "u<= ");
1067 else if (C == 0)
1068 gdb_printf (file, "u< ");
1070 if (Z == 0)
1071 gdb_printf (file, "!= ");
1072 else
1073 gdb_printf (file, "== ");
1075 if ((N ^ V) == 0)
1076 gdb_printf (file, ">= ");
1077 else
1078 gdb_printf (file, "< ");
1080 if ((Z | (N ^ V)) == 0)
1081 gdb_printf (file, "> ");
1082 else
1083 gdb_printf (file, "<= ");
1087 /* Same as 'info reg' but prints the registers in a different way. */
1088 static void
1089 m68hc11_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
1090 struct frame_info *frame, int regno, int cpregs)
1092 if (regno >= 0)
1094 const char *name = gdbarch_register_name (gdbarch, regno);
1096 if (!name || !*name)
1097 return;
1099 gdb_printf (file, "%-10s ", name);
1100 m68hc11_print_register (gdbarch, file, frame, regno);
1101 gdb_printf (file, "\n");
1103 else
1105 int i, nr;
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");
1137 nr = 0;
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)
1142 continue;
1144 gdb_printf (file, "D%d=", i - SOFT_D1_REGNUM + 1);
1145 m68hc11_print_register (gdbarch, file, frame, i);
1146 nr++;
1147 if ((nr % 8) == 7)
1148 gdb_printf (file, "\n");
1149 else
1150 gdb_printf (file, " ");
1152 if (nr && (nr % 8) != 7)
1153 gdb_printf (file, "\n");
1157 static CORE_ADDR
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);
1165 int argnum;
1166 int first_stack_argnum;
1167 struct type *type;
1168 const gdb_byte *val;
1169 gdb_byte buf[2];
1171 first_stack_argnum = 0;
1172 if (return_method == return_method_struct)
1173 regcache_cooked_write_unsigned (regcache, HARD_D_REGNUM, struct_addr);
1174 else if (nargs > 0)
1176 type = value_type (args[0]);
1178 /* First argument is passed in D and X registers. */
1179 if (TYPE_LENGTH (type) <= 4)
1181 ULONGEST v;
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)
1190 v >>= 16;
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;
1204 sp--;
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. */
1213 sp -= 2;
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
1225 frame's CFA. */
1226 return sp + 2;
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)
1236 switch (reg_nr)
1238 case HARD_PAGE_REGNUM:
1239 case HARD_A_REGNUM:
1240 case HARD_B_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;
1247 default:
1248 return builtin_type (gdbarch)->builtin_uint16;
1252 static void
1253 m68hc11_store_return_value (struct type *type, struct regcache *regcache,
1254 const gdb_byte *valbuf)
1256 int len;
1258 len = TYPE_LENGTH (type);
1260 /* First argument is passed in D and X registers. */
1261 if (len <= 2)
1262 regcache->raw_write_part (HARD_D_REGNUM, 2 - len, len, valbuf);
1263 else if (len <= 4)
1265 regcache->raw_write_part (HARD_X_REGNUM, 4 - len, len - 2, valbuf);
1266 regcache->raw_write (HARD_D_REGNUM, valbuf + (len - 2));
1268 else
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'. */
1276 static void
1277 m68hc11_extract_return_value (struct type *type, struct regcache *regcache,
1278 void *valbuf)
1280 gdb_byte buf[M68HC11_REG_SIZE];
1282 regcache->raw_read (HARD_D_REGNUM, buf);
1283 switch (TYPE_LENGTH (type))
1285 case 1:
1286 memcpy (valbuf, buf + 1, 1);
1287 break;
1289 case 2:
1290 memcpy (valbuf, buf, 2);
1291 break;
1293 case 3:
1294 memcpy ((char*) valbuf + 1, buf, 2);
1295 regcache->raw_read (HARD_X_REGNUM, buf);
1296 memcpy (valbuf, buf + 1, 1);
1297 break;
1299 case 4:
1300 memcpy ((char*) valbuf + 2, buf, 2);
1301 regcache->raw_read (HARD_X_REGNUM, buf);
1302 memcpy (valbuf, buf, 2);
1303 break;
1305 default:
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;
1320 else
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
1331 rti to return. */
1333 static void
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;
1352 static void
1353 m68hc11_init_reggroups (void)
1355 m68hc11_hard_reggroup = reggroup_new ("hard", USER_REGGROUP);
1356 m68hc11_soft_reggroup = reggroup_new ("soft", USER_REGGROUP);
1359 static void
1360 m68hc11_add_reggroups (struct gdbarch *gdbarch)
1362 reggroup_add (gdbarch, m68hc11_hard_reggroup);
1363 reggroup_add (gdbarch, m68hc11_soft_reggroup);
1366 static int
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;
1403 int elf_flags;
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;
1411 else
1412 elf_flags = 0;
1414 /* Try to find a pre-existing architecture. */
1415 for (arches = gdbarch_list_lookup_by_info (arches, &info);
1416 arches != NULL;
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)
1423 continue;
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);
1443 break;
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);
1458 break;
1460 default:
1461 break;
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);
1476 else
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);
1529 return gdbarch;
1532 void _initialize_m68hc11_tdep ();
1533 void
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 ();