[binutils, ARM, 12/16] Scalar Low Overhead loop instructions for Armv8.1-M Mainline
[binutils-gdb.git] / gdb / nds32-tdep.c
blob801b2dadcae08b38f1e70c9d4f3dce98d8192a95
1 /* Target-dependent code for the NDS32 architecture, for GDB.
3 Copyright (C) 2013-2019 Free Software Foundation, Inc.
4 Contributed by Andes Technology Corporation.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 #include "defs.h"
22 #include "frame.h"
23 #include "frame-unwind.h"
24 #include "frame-base.h"
25 #include "symtab.h"
26 #include "gdbtypes.h"
27 #include "gdbcore.h"
28 #include "value.h"
29 #include "reggroups.h"
30 #include "inferior.h"
31 #include "osabi.h"
32 #include "arch-utils.h"
33 #include "regcache.h"
34 #include "dis-asm.h"
35 #include "user-regs.h"
36 #include "elf-bfd.h"
37 #include "dwarf2-frame.h"
38 #include "remote.h"
39 #include "target-descriptions.h"
41 #include "nds32-tdep.h"
42 #include "elf/nds32.h"
43 #include "opcode/nds32.h"
44 #include <algorithm>
46 #include "features/nds32.c"
48 /* Simple macros for instruction analysis. */
49 #define CHOP_BITS(insn, n) (insn & ~__MASK (n))
50 #define N32_LSMW_ENABLE4(insn) (((insn) >> 6) & 0xf)
51 #define N32_SMW_ADM \
52 N32_TYPE4 (LSMW, 0, 0, 0, 1, (N32_LSMW_ADM << 2) | N32_LSMW_LSMW)
53 #define N32_LMW_BIM \
54 N32_TYPE4 (LSMW, 0, 0, 0, 0, (N32_LSMW_BIM << 2) | N32_LSMW_LSMW)
55 #define N32_FLDI_SP \
56 N32_TYPE2 (LDC, 0, REG_SP, 0)
58 /* Use an invalid address value as 'not available' marker. */
59 enum { REG_UNAVAIL = (CORE_ADDR) -1 };
61 /* Use an impossible value as invalid offset. */
62 enum { INVALID_OFFSET = (CORE_ADDR) -1 };
64 /* Instruction groups for NDS32 epilogue analysis. */
65 enum
67 /* Instructions used everywhere, not only in epilogue. */
68 INSN_NORMAL,
69 /* Instructions used to reset sp for local vars, arguments, etc. */
70 INSN_RESET_SP,
71 /* Instructions used to recover saved regs and to recover padding. */
72 INSN_RECOVER,
73 /* Instructions used to return to the caller. */
74 INSN_RETURN,
75 /* Instructions used to recover saved regs and to return to the caller. */
76 INSN_RECOVER_RETURN,
79 static const char *const nds32_register_names[] =
81 /* 32 GPRs. */
82 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
83 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
84 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
85 "r24", "r25", "r26", "r27", "fp", "gp", "lp", "sp",
86 /* PC. */
87 "pc",
90 static const char *const nds32_fdr_register_names[] =
92 "fd0", "fd1", "fd2", "fd3", "fd4", "fd5", "fd6", "fd7",
93 "fd8", "fd9", "fd10", "fd11", "fd12", "fd13", "fd14", "fd15",
94 "fd16", "fd17", "fd18", "fd19", "fd20", "fd21", "fd22", "fd23",
95 "fd24", "fd25", "fd26", "fd27", "fd28", "fd29", "fd30", "fd31"
98 static const char *const nds32_fsr_register_names[] =
100 "fs0", "fs1", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7",
101 "fs8", "fs9", "fs10", "fs11", "fs12", "fs13", "fs14", "fs15",
102 "fs16", "fs17", "fs18", "fs19", "fs20", "fs21", "fs22", "fs23",
103 "fs24", "fs25", "fs26", "fs27", "fs28", "fs29", "fs30", "fs31"
106 /* The number of registers for four FPU configuration options. */
107 const int num_fdr_map[] = { 4, 8, 16, 32 };
108 const int num_fsr_map[] = { 8, 16, 32, 32 };
110 /* Aliases for registers. */
111 static const struct
113 const char *name;
114 const char *alias;
115 } nds32_register_aliases[] =
117 {"r15", "ta"},
118 {"r26", "p0"},
119 {"r27", "p1"},
120 {"fp", "r28"},
121 {"gp", "r29"},
122 {"lp", "r30"},
123 {"sp", "r31"},
125 {"cr0", "cpu_ver"},
126 {"cr1", "icm_cfg"},
127 {"cr2", "dcm_cfg"},
128 {"cr3", "mmu_cfg"},
129 {"cr4", "msc_cfg"},
130 {"cr5", "core_id"},
131 {"cr6", "fucop_exist"},
132 {"cr7", "msc_cfg2"},
134 {"ir0", "psw"},
135 {"ir1", "ipsw"},
136 {"ir2", "p_psw"},
137 {"ir3", "ivb"},
138 {"ir4", "eva"},
139 {"ir5", "p_eva"},
140 {"ir6", "itype"},
141 {"ir7", "p_itype"},
142 {"ir8", "merr"},
143 {"ir9", "ipc"},
144 {"ir10", "p_ipc"},
145 {"ir11", "oipc"},
146 {"ir12", "p_p0"},
147 {"ir13", "p_p1"},
148 {"ir14", "int_mask"},
149 {"ir15", "int_pend"},
150 {"ir16", "sp_usr"},
151 {"ir17", "sp_priv"},
152 {"ir18", "int_pri"},
153 {"ir19", "int_ctrl"},
154 {"ir20", "sp_usr1"},
155 {"ir21", "sp_priv1"},
156 {"ir22", "sp_usr2"},
157 {"ir23", "sp_priv2"},
158 {"ir24", "sp_usr3"},
159 {"ir25", "sp_priv3"},
160 {"ir26", "int_mask2"},
161 {"ir27", "int_pend2"},
162 {"ir28", "int_pri2"},
163 {"ir29", "int_trigger"},
165 {"mr0", "mmu_ctl"},
166 {"mr1", "l1_pptb"},
167 {"mr2", "tlb_vpn"},
168 {"mr3", "tlb_data"},
169 {"mr4", "tlb_misc"},
170 {"mr5", "vlpt_idx"},
171 {"mr6", "ilmb"},
172 {"mr7", "dlmb"},
173 {"mr8", "cache_ctl"},
174 {"mr9", "hsmp_saddr"},
175 {"mr10", "hsmp_eaddr"},
176 {"mr11", "bg_region"},
178 {"dr0", "bpc0"},
179 {"dr1", "bpc1"},
180 {"dr2", "bpc2"},
181 {"dr3", "bpc3"},
182 {"dr4", "bpc4"},
183 {"dr5", "bpc5"},
184 {"dr6", "bpc6"},
185 {"dr7", "bpc7"},
186 {"dr8", "bpa0"},
187 {"dr9", "bpa1"},
188 {"dr10", "bpa2"},
189 {"dr11", "bpa3"},
190 {"dr12", "bpa4"},
191 {"dr13", "bpa5"},
192 {"dr14", "bpa6"},
193 {"dr15", "bpa7"},
194 {"dr16", "bpam0"},
195 {"dr17", "bpam1"},
196 {"dr18", "bpam2"},
197 {"dr19", "bpam3"},
198 {"dr20", "bpam4"},
199 {"dr21", "bpam5"},
200 {"dr22", "bpam6"},
201 {"dr23", "bpam7"},
202 {"dr24", "bpv0"},
203 {"dr25", "bpv1"},
204 {"dr26", "bpv2"},
205 {"dr27", "bpv3"},
206 {"dr28", "bpv4"},
207 {"dr29", "bpv5"},
208 {"dr30", "bpv6"},
209 {"dr31", "bpv7"},
210 {"dr32", "bpcid0"},
211 {"dr33", "bpcid1"},
212 {"dr34", "bpcid2"},
213 {"dr35", "bpcid3"},
214 {"dr36", "bpcid4"},
215 {"dr37", "bpcid5"},
216 {"dr38", "bpcid6"},
217 {"dr39", "bpcid7"},
218 {"dr40", "edm_cfg"},
219 {"dr41", "edmsw"},
220 {"dr42", "edm_ctl"},
221 {"dr43", "edm_dtr"},
222 {"dr44", "bpmtc"},
223 {"dr45", "dimbr"},
224 {"dr46", "tecr0"},
225 {"dr47", "tecr1"},
227 {"hspr0", "hsp_ctl"},
228 {"hspr1", "sp_bound"},
229 {"hspr2", "sp_bound_priv"},
231 {"pfr0", "pfmc0"},
232 {"pfr1", "pfmc1"},
233 {"pfr2", "pfmc2"},
234 {"pfr3", "pfm_ctl"},
235 {"pfr4", "pft_ctl"},
237 {"dmar0", "dma_cfg"},
238 {"dmar1", "dma_gcsw"},
239 {"dmar2", "dma_chnsel"},
240 {"dmar3", "dma_act"},
241 {"dmar4", "dma_setup"},
242 {"dmar5", "dma_isaddr"},
243 {"dmar6", "dma_esaddr"},
244 {"dmar7", "dma_tcnt"},
245 {"dmar8", "dma_status"},
246 {"dmar9", "dma_2dset"},
247 {"dmar10", "dma_2dsctl"},
248 {"dmar11", "dma_rcnt"},
249 {"dmar12", "dma_hstatus"},
251 {"racr0", "prusr_acc_ctl"},
252 {"fucpr", "fucop_ctl"},
254 {"idr0", "sdz_ctl"},
255 {"idr1", "misc_ctl"},
256 {"idr2", "ecc_misc"},
258 {"secur0", "sfcr"},
259 {"secur1", "sign"},
260 {"secur2", "isign"},
261 {"secur3", "p_isign"},
264 /* Value of a register alias. BATON is the regnum of the corresponding
265 register. */
267 static struct value *
268 value_of_nds32_reg (struct frame_info *frame, const void *baton)
270 return value_of_register ((int) (intptr_t) baton, frame);
273 /* Implement the "frame_align" gdbarch method. */
275 static CORE_ADDR
276 nds32_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
278 /* 8-byte aligned. */
279 return align_down (sp, 8);
282 /* The same insn machine code is used for little-endian and big-endian. */
283 constexpr gdb_byte nds32_break_insn[] = { 0xEA, 0x00 };
285 typedef BP_MANIPULATION (nds32_break_insn) nds32_breakpoint;
287 /* Implement the "dwarf2_reg_to_regnum" gdbarch method. */
289 static int
290 nds32_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, int num)
292 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
293 const int FSR = 38;
294 const int FDR = FSR + 32;
296 if (num >= 0 && num < 32)
298 /* General-purpose registers (R0 - R31). */
299 return num;
301 else if (num >= FSR && num < FSR + 32)
303 /* Single precision floating-point registers (FS0 - FS31). */
304 return num - FSR + tdep->fs0_regnum;
306 else if (num >= FDR && num < FDR + 32)
308 /* Double precision floating-point registers (FD0 - FD31). */
309 return num - FDR + NDS32_FD0_REGNUM;
312 /* No match, return a inaccessible register number. */
313 return -1;
316 /* NDS32 register groups. */
317 static struct reggroup *nds32_cr_reggroup;
318 static struct reggroup *nds32_ir_reggroup;
319 static struct reggroup *nds32_mr_reggroup;
320 static struct reggroup *nds32_dr_reggroup;
321 static struct reggroup *nds32_pfr_reggroup;
322 static struct reggroup *nds32_hspr_reggroup;
323 static struct reggroup *nds32_dmar_reggroup;
324 static struct reggroup *nds32_racr_reggroup;
325 static struct reggroup *nds32_idr_reggroup;
326 static struct reggroup *nds32_secur_reggroup;
328 static void
329 nds32_init_reggroups (void)
331 nds32_cr_reggroup = reggroup_new ("cr", USER_REGGROUP);
332 nds32_ir_reggroup = reggroup_new ("ir", USER_REGGROUP);
333 nds32_mr_reggroup = reggroup_new ("mr", USER_REGGROUP);
334 nds32_dr_reggroup = reggroup_new ("dr", USER_REGGROUP);
335 nds32_pfr_reggroup = reggroup_new ("pfr", USER_REGGROUP);
336 nds32_hspr_reggroup = reggroup_new ("hspr", USER_REGGROUP);
337 nds32_dmar_reggroup = reggroup_new ("dmar", USER_REGGROUP);
338 nds32_racr_reggroup = reggroup_new ("racr", USER_REGGROUP);
339 nds32_idr_reggroup = reggroup_new ("idr", USER_REGGROUP);
340 nds32_secur_reggroup = reggroup_new ("secur", USER_REGGROUP);
343 static void
344 nds32_add_reggroups (struct gdbarch *gdbarch)
346 /* Add pre-defined register groups. */
347 reggroup_add (gdbarch, general_reggroup);
348 reggroup_add (gdbarch, float_reggroup);
349 reggroup_add (gdbarch, system_reggroup);
350 reggroup_add (gdbarch, all_reggroup);
351 reggroup_add (gdbarch, save_reggroup);
352 reggroup_add (gdbarch, restore_reggroup);
354 /* Add NDS32 register groups. */
355 reggroup_add (gdbarch, nds32_cr_reggroup);
356 reggroup_add (gdbarch, nds32_ir_reggroup);
357 reggroup_add (gdbarch, nds32_mr_reggroup);
358 reggroup_add (gdbarch, nds32_dr_reggroup);
359 reggroup_add (gdbarch, nds32_pfr_reggroup);
360 reggroup_add (gdbarch, nds32_hspr_reggroup);
361 reggroup_add (gdbarch, nds32_dmar_reggroup);
362 reggroup_add (gdbarch, nds32_racr_reggroup);
363 reggroup_add (gdbarch, nds32_idr_reggroup);
364 reggroup_add (gdbarch, nds32_secur_reggroup);
367 /* Implement the "register_reggroup_p" gdbarch method. */
369 static int
370 nds32_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
371 struct reggroup *reggroup)
373 const char *reg_name;
374 const char *group_name;
375 int ret;
377 if (reggroup == all_reggroup)
378 return 1;
380 /* General reggroup contains only GPRs and PC. */
381 if (reggroup == general_reggroup)
382 return regnum <= NDS32_PC_REGNUM;
384 if (reggroup == float_reggroup || reggroup == save_reggroup
385 || reggroup == restore_reggroup)
387 ret = tdesc_register_in_reggroup_p (gdbarch, regnum, reggroup);
388 if (ret != -1)
389 return ret;
391 return default_register_reggroup_p (gdbarch, regnum, reggroup);
394 if (reggroup == system_reggroup)
395 return (regnum > NDS32_PC_REGNUM)
396 && !nds32_register_reggroup_p (gdbarch, regnum, float_reggroup);
398 /* The NDS32 reggroup contains registers whose name is prefixed
399 by reggroup name. */
400 reg_name = gdbarch_register_name (gdbarch, regnum);
401 group_name = reggroup_name (reggroup);
402 return !strncmp (reg_name, group_name, strlen (group_name));
405 /* Implement the "pseudo_register_type" tdesc_arch_data method. */
407 static struct type *
408 nds32_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
410 regnum -= gdbarch_num_regs (gdbarch);
412 /* Currently, only FSRs could be defined as pseudo registers. */
413 if (regnum < gdbarch_num_pseudo_regs (gdbarch))
414 return arch_float_type (gdbarch, -1, "builtin_type_ieee_single",
415 floatformats_ieee_single);
417 warning (_("Unknown nds32 pseudo register %d."), regnum);
418 return NULL;
421 /* Implement the "pseudo_register_name" tdesc_arch_data method. */
423 static const char *
424 nds32_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
426 regnum -= gdbarch_num_regs (gdbarch);
428 /* Currently, only FSRs could be defined as pseudo registers. */
429 if (regnum < gdbarch_num_pseudo_regs (gdbarch))
430 return nds32_fsr_register_names[regnum];
432 warning (_("Unknown nds32 pseudo register %d."), regnum);
433 return NULL;
436 /* Implement the "pseudo_register_read" gdbarch method. */
438 static enum register_status
439 nds32_pseudo_register_read (struct gdbarch *gdbarch,
440 readable_regcache *regcache, int regnum,
441 gdb_byte *buf)
443 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
444 gdb_byte reg_buf[8];
445 int offset, fdr_regnum;
446 enum register_status status;
448 /* This function is registered in nds32_gdbarch_init only after these are
449 set. */
450 gdb_assert (tdep->fpu_freg != -1);
451 gdb_assert (tdep->use_pseudo_fsrs != 0);
453 regnum -= gdbarch_num_regs (gdbarch);
455 /* Currently, only FSRs could be defined as pseudo registers. */
456 if (regnum < gdbarch_num_pseudo_regs (gdbarch))
458 /* fs0 is always the most significant half of fd0. */
459 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
460 offset = (regnum & 1) ? 4 : 0;
461 else
462 offset = (regnum & 1) ? 0 : 4;
464 fdr_regnum = NDS32_FD0_REGNUM + (regnum >> 1);
465 status = regcache->raw_read (fdr_regnum, reg_buf);
466 if (status == REG_VALID)
467 memcpy (buf, reg_buf + offset, 4);
469 return status;
472 gdb_assert_not_reached ("invalid pseudo register number");
475 /* Implement the "pseudo_register_write" gdbarch method. */
477 static void
478 nds32_pseudo_register_write (struct gdbarch *gdbarch,
479 struct regcache *regcache, int regnum,
480 const gdb_byte *buf)
482 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
483 gdb_byte reg_buf[8];
484 int offset, fdr_regnum;
486 /* This function is registered in nds32_gdbarch_init only after these are
487 set. */
488 gdb_assert (tdep->fpu_freg != -1);
489 gdb_assert (tdep->use_pseudo_fsrs != 0);
491 regnum -= gdbarch_num_regs (gdbarch);
493 /* Currently, only FSRs could be defined as pseudo registers. */
494 if (regnum < gdbarch_num_pseudo_regs (gdbarch))
496 /* fs0 is always the most significant half of fd0. */
497 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
498 offset = (regnum & 1) ? 4 : 0;
499 else
500 offset = (regnum & 1) ? 0 : 4;
502 fdr_regnum = NDS32_FD0_REGNUM + (regnum >> 1);
503 regcache->raw_read (fdr_regnum, reg_buf);
504 memcpy (reg_buf + offset, buf, 4);
505 regcache->raw_write (fdr_regnum, reg_buf);
506 return;
509 gdb_assert_not_reached ("invalid pseudo register number");
512 /* Helper function for NDS32 ABI. Return true if FPRs can be used
513 to pass function arguments and return value. */
515 static int
516 nds32_abi_use_fpr (int elf_abi)
518 return elf_abi == E_NDS_ABI_V2FP_PLUS;
521 /* Helper function for NDS32 ABI. Return true if GPRs and stack
522 can be used together to pass an argument. */
524 static int
525 nds32_abi_split (int elf_abi)
527 return elf_abi == E_NDS_ABI_AABI;
530 #define NDS32_NUM_SAVED_REGS (NDS32_LP_REGNUM + 1)
532 struct nds32_frame_cache
534 /* The previous frame's inner most stack address. Used as this
535 frame ID's stack_addr. */
536 CORE_ADDR prev_sp;
538 /* The frame's base, optionally used by the high-level debug info. */
539 CORE_ADDR base;
541 /* During prologue analysis, keep how far the SP and FP have been offset
542 from the start of the stack frame (as defined by the previous frame's
543 stack pointer).
544 During epilogue analysis, keep how far the SP has been offset from the
545 current stack pointer. */
546 CORE_ADDR sp_offset;
547 CORE_ADDR fp_offset;
549 /* The address of the first instruction in this function. */
550 CORE_ADDR pc;
552 /* Saved registers. */
553 CORE_ADDR saved_regs[NDS32_NUM_SAVED_REGS];
556 /* Allocate and initialize a frame cache. */
558 static struct nds32_frame_cache *
559 nds32_alloc_frame_cache (void)
561 struct nds32_frame_cache *cache;
562 int i;
564 cache = FRAME_OBSTACK_ZALLOC (struct nds32_frame_cache);
566 /* Initialize fp_offset to check if FP is set in prologue. */
567 cache->fp_offset = INVALID_OFFSET;
569 /* Saved registers. We initialize these to -1 since zero is a valid
570 offset. */
571 for (i = 0; i < NDS32_NUM_SAVED_REGS; i++)
572 cache->saved_regs[i] = REG_UNAVAIL;
574 return cache;
577 /* Helper function for instructions used to push multiple words. */
579 static void
580 nds32_push_multiple_words (struct nds32_frame_cache *cache, int rb, int re,
581 int enable4)
583 CORE_ADDR sp_offset = cache->sp_offset;
584 int i;
586 /* Check LP, GP, FP in enable4. */
587 for (i = 1; i <= 3; i++)
589 if ((enable4 >> i) & 0x1)
591 sp_offset += 4;
592 cache->saved_regs[NDS32_SP_REGNUM - i] = sp_offset;
596 /* Skip case where re == rb == sp. */
597 if ((rb < REG_FP) && (re < REG_FP))
599 for (i = re; i >= rb; i--)
601 sp_offset += 4;
602 cache->saved_regs[i] = sp_offset;
606 /* For sp, update the offset. */
607 cache->sp_offset = sp_offset;
610 /* Analyze the instructions within the given address range. If CACHE
611 is non-NULL, fill it in. Return the first address beyond the given
612 address range. If CACHE is NULL, return the first address not
613 recognized as a prologue instruction. */
615 static CORE_ADDR
616 nds32_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
617 CORE_ADDR limit_pc, struct nds32_frame_cache *cache)
619 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
620 int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
621 /* Current scanning status. */
622 int in_prologue_bb = 0;
623 int val_ta = 0;
624 uint32_t insn, insn_len;
626 for (; pc < limit_pc; pc += insn_len)
628 insn = read_memory_unsigned_integer (pc, 4, BFD_ENDIAN_BIG);
630 if ((insn & 0x80000000) == 0)
632 /* 32-bit instruction */
633 insn_len = 4;
635 if (CHOP_BITS (insn, 15) == N32_TYPE2 (ADDI, REG_SP, REG_SP, 0))
637 /* addi $sp, $sp, imm15s */
638 int imm15s = N32_IMM15S (insn);
640 if (imm15s < 0)
642 if (cache != NULL)
643 cache->sp_offset += -imm15s;
645 in_prologue_bb = 1;
646 continue;
649 else if (CHOP_BITS (insn, 15) == N32_TYPE2 (ADDI, REG_FP, REG_SP, 0))
651 /* addi $fp, $sp, imm15s */
652 int imm15s = N32_IMM15S (insn);
654 if (imm15s > 0)
656 if (cache != NULL)
657 cache->fp_offset = cache->sp_offset - imm15s;
659 in_prologue_bb = 1;
660 continue;
663 else if ((insn & ~(__MASK (19) << 6)) == N32_SMW_ADM
664 && N32_RA5 (insn) == REG_SP)
666 /* smw.adm Rb, [$sp], Re, enable4 */
667 if (cache != NULL)
668 nds32_push_multiple_words (cache, N32_RT5 (insn),
669 N32_RB5 (insn),
670 N32_LSMW_ENABLE4 (insn));
671 in_prologue_bb = 1;
672 continue;
674 else if (insn == N32_ALU1 (ADD, REG_SP, REG_SP, REG_TA)
675 || insn == N32_ALU1 (ADD, REG_SP, REG_TA, REG_SP))
677 /* add $sp, $sp, $ta */
678 /* add $sp, $ta, $sp */
679 if (val_ta < 0)
681 if (cache != NULL)
682 cache->sp_offset += -val_ta;
684 in_prologue_bb = 1;
685 continue;
688 else if (CHOP_BITS (insn, 20) == N32_TYPE1 (MOVI, REG_TA, 0))
690 /* movi $ta, imm20s */
691 if (cache != NULL)
692 val_ta = N32_IMM20S (insn);
694 continue;
696 else if (CHOP_BITS (insn, 20) == N32_TYPE1 (SETHI, REG_TA, 0))
698 /* sethi $ta, imm20u */
699 if (cache != NULL)
700 val_ta = N32_IMM20U (insn) << 12;
702 continue;
704 else if (CHOP_BITS (insn, 15) == N32_TYPE2 (ORI, REG_TA, REG_TA, 0))
706 /* ori $ta, $ta, imm15u */
707 if (cache != NULL)
708 val_ta |= N32_IMM15U (insn);
710 continue;
712 else if (CHOP_BITS (insn, 15) == N32_TYPE2 (ADDI, REG_TA, REG_TA, 0))
714 /* addi $ta, $ta, imm15s */
715 if (cache != NULL)
716 val_ta += N32_IMM15S (insn);
718 continue;
720 if (insn == N32_ALU1 (ADD, REG_GP, REG_TA, REG_GP)
721 || insn == N32_ALU1 (ADD, REG_GP, REG_GP, REG_TA))
723 /* add $gp, $ta, $gp */
724 /* add $gp, $gp, $ta */
725 in_prologue_bb = 1;
726 continue;
728 else if (CHOP_BITS (insn, 20) == N32_TYPE1 (MOVI, REG_GP, 0))
730 /* movi $gp, imm20s */
731 in_prologue_bb = 1;
732 continue;
734 else if (CHOP_BITS (insn, 20) == N32_TYPE1 (SETHI, REG_GP, 0))
736 /* sethi $gp, imm20u */
737 in_prologue_bb = 1;
738 continue;
740 else if (CHOP_BITS (insn, 15) == N32_TYPE2 (ORI, REG_GP, REG_GP, 0))
742 /* ori $gp, $gp, imm15u */
743 in_prologue_bb = 1;
744 continue;
746 else
748 /* Jump/Branch insns never appear in prologue basic block.
749 The loop can be escaped early when these insns are met. */
750 if (in_prologue_bb == 1)
752 int op = N32_OP6 (insn);
754 if (op == N32_OP6_JI
755 || op == N32_OP6_JREG
756 || op == N32_OP6_BR1
757 || op == N32_OP6_BR2
758 || op == N32_OP6_BR3)
759 break;
763 if (abi_use_fpr && N32_OP6 (insn) == N32_OP6_SDC
764 && __GF (insn, 12, 3) == 0)
766 /* For FPU insns, CP (bit [13:14]) should be CP0, and only
767 normal form (bit [12] == 0) is used. */
769 /* fsdi FDt, [$sp + (imm12s << 2)] */
770 if (N32_RA5 (insn) == REG_SP)
771 continue;
774 /* The optimizer might shove anything into the prologue, if
775 we build up cache (cache != NULL) from analyzing prologue,
776 we just skip what we don't recognize and analyze further to
777 make cache as complete as possible. However, if we skip
778 prologue, we'll stop immediately on unrecognized
779 instruction. */
780 if (cache == NULL)
781 break;
783 else
785 /* 16-bit instruction */
786 insn_len = 2;
788 insn >>= 16;
790 if (CHOP_BITS (insn, 10) == N16_TYPE10 (ADDI10S, 0))
792 /* addi10s.sp */
793 int imm10s = N16_IMM10S (insn);
795 if (imm10s < 0)
797 if (cache != NULL)
798 cache->sp_offset += -imm10s;
800 in_prologue_bb = 1;
801 continue;
804 else if (__GF (insn, 7, 8) == N16_T25_PUSH25)
806 /* push25 */
807 if (cache != NULL)
809 int imm8u = (insn & 0x1f) << 3;
810 int re = (insn >> 5) & 0x3;
811 const int reg_map[] = { 6, 8, 10, 14 };
813 /* Operation 1 -- smw.adm R6, [$sp], Re, #0xe */
814 nds32_push_multiple_words (cache, 6, reg_map[re], 0xe);
816 /* Operation 2 -- sp = sp - (imm5u << 3) */
817 cache->sp_offset += imm8u;
820 in_prologue_bb = 1;
821 continue;
823 else if (insn == N16_TYPE5 (ADD5PC, REG_GP))
825 /* add5.pc $gp */
826 in_prologue_bb = 1;
827 continue;
829 else if (CHOP_BITS (insn, 5) == N16_TYPE55 (MOVI55, REG_GP, 0))
831 /* movi55 $gp, imm5s */
832 in_prologue_bb = 1;
833 continue;
835 else
837 /* Jump/Branch insns never appear in prologue basic block.
838 The loop can be escaped early when these insns are met. */
839 if (in_prologue_bb == 1)
841 uint32_t insn5 = CHOP_BITS (insn, 5);
842 uint32_t insn8 = CHOP_BITS (insn, 8);
843 uint32_t insn38 = CHOP_BITS (insn, 11);
845 if (insn5 == N16_TYPE5 (JR5, 0)
846 || insn5 == N16_TYPE5 (JRAL5, 0)
847 || insn5 == N16_TYPE5 (RET5, 0)
848 || insn8 == N16_TYPE8 (J8, 0)
849 || insn8 == N16_TYPE8 (BEQZS8, 0)
850 || insn8 == N16_TYPE8 (BNEZS8, 0)
851 || insn38 == N16_TYPE38 (BEQZ38, 0, 0)
852 || insn38 == N16_TYPE38 (BNEZ38, 0, 0)
853 || insn38 == N16_TYPE38 (BEQS38, 0, 0)
854 || insn38 == N16_TYPE38 (BNES38, 0, 0))
855 break;
859 /* The optimizer might shove anything into the prologue, if
860 we build up cache (cache != NULL) from analyzing prologue,
861 we just skip what we don't recognize and analyze further to
862 make cache as complete as possible. However, if we skip
863 prologue, we'll stop immediately on unrecognized
864 instruction. */
865 if (cache == NULL)
866 break;
870 return pc;
873 /* Implement the "skip_prologue" gdbarch method.
875 Find the end of function prologue. */
877 static CORE_ADDR
878 nds32_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
880 CORE_ADDR func_addr, limit_pc;
882 /* See if we can determine the end of the prologue via the symbol table.
883 If so, then return either PC, or the PC after the prologue, whichever
884 is greater. */
885 if (find_pc_partial_function (pc, NULL, &func_addr, NULL))
887 CORE_ADDR post_prologue_pc
888 = skip_prologue_using_sal (gdbarch, func_addr);
889 if (post_prologue_pc != 0)
890 return std::max (pc, post_prologue_pc);
893 /* Can't determine prologue from the symbol table, need to examine
894 instructions. */
896 /* Find an upper limit on the function prologue using the debug
897 information. If the debug information could not be used to provide
898 that bound, then use an arbitrary large number as the upper bound. */
899 limit_pc = skip_prologue_using_sal (gdbarch, pc);
900 if (limit_pc == 0)
901 limit_pc = pc + 128; /* Magic. */
903 /* Find the end of prologue. */
904 return nds32_analyze_prologue (gdbarch, pc, limit_pc, NULL);
907 /* Allocate and fill in *THIS_CACHE with information about the prologue of
908 *THIS_FRAME. Do not do this if *THIS_CACHE was already allocated. Return
909 a pointer to the current nds32_frame_cache in *THIS_CACHE. */
911 static struct nds32_frame_cache *
912 nds32_frame_cache (struct frame_info *this_frame, void **this_cache)
914 struct gdbarch *gdbarch = get_frame_arch (this_frame);
915 struct nds32_frame_cache *cache;
916 CORE_ADDR current_pc;
917 ULONGEST prev_sp;
918 ULONGEST this_base;
919 int i;
921 if (*this_cache)
922 return (struct nds32_frame_cache *) *this_cache;
924 cache = nds32_alloc_frame_cache ();
925 *this_cache = cache;
927 cache->pc = get_frame_func (this_frame);
928 current_pc = get_frame_pc (this_frame);
929 nds32_analyze_prologue (gdbarch, cache->pc, current_pc, cache);
931 /* Compute the previous frame's stack pointer (which is also the
932 frame's ID's stack address), and this frame's base pointer. */
933 if (cache->fp_offset != INVALID_OFFSET)
935 /* FP is set in prologue, so it can be used to calculate other info. */
936 this_base = get_frame_register_unsigned (this_frame, NDS32_FP_REGNUM);
937 prev_sp = this_base + cache->fp_offset;
939 else
941 this_base = get_frame_register_unsigned (this_frame, NDS32_SP_REGNUM);
942 prev_sp = this_base + cache->sp_offset;
945 cache->prev_sp = prev_sp;
946 cache->base = this_base;
948 /* Adjust all the saved registers such that they contain addresses
949 instead of offsets. */
950 for (i = 0; i < NDS32_NUM_SAVED_REGS; i++)
951 if (cache->saved_regs[i] != REG_UNAVAIL)
952 cache->saved_regs[i] = cache->prev_sp - cache->saved_regs[i];
954 return cache;
957 /* Implement the "this_id" frame_unwind method.
959 Our frame ID for a normal frame is the current function's starting
960 PC and the caller's SP when we were called. */
962 static void
963 nds32_frame_this_id (struct frame_info *this_frame,
964 void **this_cache, struct frame_id *this_id)
966 struct nds32_frame_cache *cache = nds32_frame_cache (this_frame, this_cache);
968 /* This marks the outermost frame. */
969 if (cache->prev_sp == 0)
970 return;
972 *this_id = frame_id_build (cache->prev_sp, cache->pc);
975 /* Implement the "prev_register" frame_unwind method. */
977 static struct value *
978 nds32_frame_prev_register (struct frame_info *this_frame, void **this_cache,
979 int regnum)
981 struct nds32_frame_cache *cache = nds32_frame_cache (this_frame, this_cache);
983 if (regnum == NDS32_SP_REGNUM)
984 return frame_unwind_got_constant (this_frame, regnum, cache->prev_sp);
986 /* The PC of the previous frame is stored in the LP register of
987 the current frame. */
988 if (regnum == NDS32_PC_REGNUM)
989 regnum = NDS32_LP_REGNUM;
991 if (regnum < NDS32_NUM_SAVED_REGS && cache->saved_regs[regnum] != REG_UNAVAIL)
992 return frame_unwind_got_memory (this_frame, regnum,
993 cache->saved_regs[regnum]);
995 return frame_unwind_got_register (this_frame, regnum, regnum);
998 static const struct frame_unwind nds32_frame_unwind =
1000 NORMAL_FRAME,
1001 default_frame_unwind_stop_reason,
1002 nds32_frame_this_id,
1003 nds32_frame_prev_register,
1004 NULL,
1005 default_frame_sniffer,
1008 /* Return the frame base address of *THIS_FRAME. */
1010 static CORE_ADDR
1011 nds32_frame_base_address (struct frame_info *this_frame, void **this_cache)
1013 struct nds32_frame_cache *cache = nds32_frame_cache (this_frame, this_cache);
1015 return cache->base;
1018 static const struct frame_base nds32_frame_base =
1020 &nds32_frame_unwind,
1021 nds32_frame_base_address,
1022 nds32_frame_base_address,
1023 nds32_frame_base_address
1026 /* Helper function for instructions used to pop multiple words. */
1028 static void
1029 nds32_pop_multiple_words (struct nds32_frame_cache *cache, int rb, int re,
1030 int enable4)
1032 CORE_ADDR sp_offset = cache->sp_offset;
1033 int i;
1035 /* Skip case where re == rb == sp. */
1036 if ((rb < REG_FP) && (re < REG_FP))
1038 for (i = rb; i <= re; i++)
1040 cache->saved_regs[i] = sp_offset;
1041 sp_offset += 4;
1045 /* Check FP, GP, LP in enable4. */
1046 for (i = 3; i >= 1; i--)
1048 if ((enable4 >> i) & 0x1)
1050 cache->saved_regs[NDS32_SP_REGNUM - i] = sp_offset;
1051 sp_offset += 4;
1055 /* For sp, update the offset. */
1056 cache->sp_offset = sp_offset;
1059 /* The instruction sequences in NDS32 epilogue are
1061 INSN_RESET_SP (optional)
1062 (If exists, this must be the first instruction in epilogue
1063 and the stack has not been destroyed.).
1064 INSN_RECOVER (optional).
1065 INSN_RETURN/INSN_RECOVER_RETURN (required). */
1067 /* Helper function for analyzing the given 32-bit INSN. If CACHE is non-NULL,
1068 the necessary information will be recorded. */
1070 static inline int
1071 nds32_analyze_epilogue_insn32 (int abi_use_fpr, uint32_t insn,
1072 struct nds32_frame_cache *cache)
1074 if (CHOP_BITS (insn, 15) == N32_TYPE2 (ADDI, REG_SP, REG_SP, 0)
1075 && N32_IMM15S (insn) > 0)
1076 /* addi $sp, $sp, imm15s */
1077 return INSN_RESET_SP;
1078 else if (CHOP_BITS (insn, 15) == N32_TYPE2 (ADDI, REG_SP, REG_FP, 0)
1079 && N32_IMM15S (insn) < 0)
1080 /* addi $sp, $fp, imm15s */
1081 return INSN_RESET_SP;
1082 else if ((insn & ~(__MASK (19) << 6)) == N32_LMW_BIM
1083 && N32_RA5 (insn) == REG_SP)
1085 /* lmw.bim Rb, [$sp], Re, enable4 */
1086 if (cache != NULL)
1087 nds32_pop_multiple_words (cache, N32_RT5 (insn),
1088 N32_RB5 (insn), N32_LSMW_ENABLE4 (insn));
1090 return INSN_RECOVER;
1092 else if (insn == N32_JREG (JR, 0, REG_LP, 0, 1))
1093 /* ret $lp */
1094 return INSN_RETURN;
1095 else if (insn == N32_ALU1 (ADD, REG_SP, REG_SP, REG_TA)
1096 || insn == N32_ALU1 (ADD, REG_SP, REG_TA, REG_SP))
1097 /* add $sp, $sp, $ta */
1098 /* add $sp, $ta, $sp */
1099 return INSN_RESET_SP;
1100 else if (abi_use_fpr
1101 && (insn & ~(__MASK (5) << 20 | __MASK (13))) == N32_FLDI_SP)
1103 if (__GF (insn, 12, 1) == 0)
1104 /* fldi FDt, [$sp + (imm12s << 2)] */
1105 return INSN_RECOVER;
1106 else
1108 /* fldi.bi FDt, [$sp], (imm12s << 2) */
1109 int offset = N32_IMM12S (insn) << 2;
1111 if (offset == 8 || offset == 12)
1113 if (cache != NULL)
1114 cache->sp_offset += offset;
1116 return INSN_RECOVER;
1121 return INSN_NORMAL;
1124 /* Helper function for analyzing the given 16-bit INSN. If CACHE is non-NULL,
1125 the necessary information will be recorded. */
1127 static inline int
1128 nds32_analyze_epilogue_insn16 (uint32_t insn, struct nds32_frame_cache *cache)
1130 if (insn == N16_TYPE5 (RET5, REG_LP))
1131 /* ret5 $lp */
1132 return INSN_RETURN;
1133 else if (CHOP_BITS (insn, 10) == N16_TYPE10 (ADDI10S, 0))
1135 /* addi10s.sp */
1136 int imm10s = N16_IMM10S (insn);
1138 if (imm10s > 0)
1140 if (cache != NULL)
1141 cache->sp_offset += imm10s;
1143 return INSN_RECOVER;
1146 else if (__GF (insn, 7, 8) == N16_T25_POP25)
1148 /* pop25 */
1149 if (cache != NULL)
1151 int imm8u = (insn & 0x1f) << 3;
1152 int re = (insn >> 5) & 0x3;
1153 const int reg_map[] = { 6, 8, 10, 14 };
1155 /* Operation 1 -- sp = sp + (imm5u << 3) */
1156 cache->sp_offset += imm8u;
1158 /* Operation 2 -- lmw.bim R6, [$sp], Re, #0xe */
1159 nds32_pop_multiple_words (cache, 6, reg_map[re], 0xe);
1162 /* Operation 3 -- ret $lp */
1163 return INSN_RECOVER_RETURN;
1166 return INSN_NORMAL;
1169 /* Analyze a reasonable amount of instructions from the given PC to find
1170 the instruction used to return to the caller. Return 1 if the 'return'
1171 instruction could be found, 0 otherwise.
1173 If CACHE is non-NULL, fill it in. */
1175 static int
1176 nds32_analyze_epilogue (struct gdbarch *gdbarch, CORE_ADDR pc,
1177 struct nds32_frame_cache *cache)
1179 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1180 int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
1181 CORE_ADDR limit_pc;
1182 uint32_t insn, insn_len;
1183 int insn_type = INSN_NORMAL;
1185 if (abi_use_fpr)
1186 limit_pc = pc + 48;
1187 else
1188 limit_pc = pc + 16;
1190 for (; pc < limit_pc; pc += insn_len)
1192 insn = read_memory_unsigned_integer (pc, 4, BFD_ENDIAN_BIG);
1194 if ((insn & 0x80000000) == 0)
1196 /* 32-bit instruction */
1197 insn_len = 4;
1199 insn_type = nds32_analyze_epilogue_insn32 (abi_use_fpr, insn, cache);
1200 if (insn_type == INSN_RETURN)
1201 return 1;
1202 else if (insn_type == INSN_RECOVER)
1203 continue;
1205 else
1207 /* 16-bit instruction */
1208 insn_len = 2;
1210 insn >>= 16;
1211 insn_type = nds32_analyze_epilogue_insn16 (insn, cache);
1212 if (insn_type == INSN_RETURN || insn_type == INSN_RECOVER_RETURN)
1213 return 1;
1214 else if (insn_type == INSN_RECOVER)
1215 continue;
1218 /* Stop the scan if this is an unexpected instruction. */
1219 break;
1222 return 0;
1225 /* Implement the "stack_frame_destroyed_p" gdbarch method. */
1227 static int
1228 nds32_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR addr)
1230 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1231 int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
1232 int insn_type = INSN_NORMAL;
1233 int ret_found = 0;
1234 uint32_t insn;
1236 insn = read_memory_unsigned_integer (addr, 4, BFD_ENDIAN_BIG);
1238 if ((insn & 0x80000000) == 0)
1240 /* 32-bit instruction */
1242 insn_type = nds32_analyze_epilogue_insn32 (abi_use_fpr, insn, NULL);
1244 else
1246 /* 16-bit instruction */
1248 insn >>= 16;
1249 insn_type = nds32_analyze_epilogue_insn16 (insn, NULL);
1252 if (insn_type == INSN_NORMAL || insn_type == INSN_RESET_SP)
1253 return 0;
1255 /* Search the required 'return' instruction within the following reasonable
1256 instructions. */
1257 ret_found = nds32_analyze_epilogue (gdbarch, addr, NULL);
1258 if (ret_found == 0)
1259 return 0;
1261 /* Scan backwards to make sure that the last instruction has adjusted
1262 stack. Both a 16-bit and a 32-bit instruction will be tried. This is
1263 just a heuristic, so the false positives will be acceptable. */
1264 insn = read_memory_unsigned_integer (addr - 2, 4, BFD_ENDIAN_BIG);
1266 /* Only 16-bit instructions are possible at addr - 2. */
1267 if ((insn & 0x80000000) != 0)
1269 /* This may be a 16-bit instruction or part of a 32-bit instruction. */
1271 insn_type = nds32_analyze_epilogue_insn16 (insn >> 16, NULL);
1272 if (insn_type == INSN_RECOVER)
1273 return 1;
1276 insn = read_memory_unsigned_integer (addr - 4, 4, BFD_ENDIAN_BIG);
1278 /* If this is a 16-bit instruction at addr - 4, then there must be another
1279 16-bit instruction at addr - 2, so only 32-bit instructions need to
1280 be analyzed here. */
1281 if ((insn & 0x80000000) == 0)
1283 /* This may be a 32-bit instruction or part of a 32-bit instruction. */
1285 insn_type = nds32_analyze_epilogue_insn32 (abi_use_fpr, insn, NULL);
1286 if (insn_type == INSN_RECOVER || insn_type == INSN_RESET_SP)
1287 return 1;
1290 return 0;
1293 /* Implement the "sniffer" frame_unwind method. */
1295 static int
1296 nds32_epilogue_frame_sniffer (const struct frame_unwind *self,
1297 struct frame_info *this_frame, void **this_cache)
1299 if (frame_relative_level (this_frame) == 0)
1300 return nds32_stack_frame_destroyed_p (get_frame_arch (this_frame),
1301 get_frame_pc (this_frame));
1302 else
1303 return 0;
1306 /* Allocate and fill in *THIS_CACHE with information needed to unwind
1307 *THIS_FRAME within epilogue. Do not do this if *THIS_CACHE was already
1308 allocated. Return a pointer to the current nds32_frame_cache in
1309 *THIS_CACHE. */
1311 static struct nds32_frame_cache *
1312 nds32_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache)
1314 struct gdbarch *gdbarch = get_frame_arch (this_frame);
1315 struct nds32_frame_cache *cache;
1316 CORE_ADDR current_pc, current_sp;
1317 int i;
1319 if (*this_cache)
1320 return (struct nds32_frame_cache *) *this_cache;
1322 cache = nds32_alloc_frame_cache ();
1323 *this_cache = cache;
1325 cache->pc = get_frame_func (this_frame);
1326 current_pc = get_frame_pc (this_frame);
1327 nds32_analyze_epilogue (gdbarch, current_pc, cache);
1329 current_sp = get_frame_register_unsigned (this_frame, NDS32_SP_REGNUM);
1330 cache->prev_sp = current_sp + cache->sp_offset;
1332 /* Adjust all the saved registers such that they contain addresses
1333 instead of offsets. */
1334 for (i = 0; i < NDS32_NUM_SAVED_REGS; i++)
1335 if (cache->saved_regs[i] != REG_UNAVAIL)
1336 cache->saved_regs[i] = current_sp + cache->saved_regs[i];
1338 return cache;
1341 /* Implement the "this_id" frame_unwind method. */
1343 static void
1344 nds32_epilogue_frame_this_id (struct frame_info *this_frame,
1345 void **this_cache, struct frame_id *this_id)
1347 struct nds32_frame_cache *cache
1348 = nds32_epilogue_frame_cache (this_frame, this_cache);
1350 /* This marks the outermost frame. */
1351 if (cache->prev_sp == 0)
1352 return;
1354 *this_id = frame_id_build (cache->prev_sp, cache->pc);
1357 /* Implement the "prev_register" frame_unwind method. */
1359 static struct value *
1360 nds32_epilogue_frame_prev_register (struct frame_info *this_frame,
1361 void **this_cache, int regnum)
1363 struct nds32_frame_cache *cache
1364 = nds32_epilogue_frame_cache (this_frame, this_cache);
1366 if (regnum == NDS32_SP_REGNUM)
1367 return frame_unwind_got_constant (this_frame, regnum, cache->prev_sp);
1369 /* The PC of the previous frame is stored in the LP register of
1370 the current frame. */
1371 if (regnum == NDS32_PC_REGNUM)
1372 regnum = NDS32_LP_REGNUM;
1374 if (regnum < NDS32_NUM_SAVED_REGS && cache->saved_regs[regnum] != REG_UNAVAIL)
1375 return frame_unwind_got_memory (this_frame, regnum,
1376 cache->saved_regs[regnum]);
1378 return frame_unwind_got_register (this_frame, regnum, regnum);
1381 static const struct frame_unwind nds32_epilogue_frame_unwind =
1383 NORMAL_FRAME,
1384 default_frame_unwind_stop_reason,
1385 nds32_epilogue_frame_this_id,
1386 nds32_epilogue_frame_prev_register,
1387 NULL,
1388 nds32_epilogue_frame_sniffer
1391 /* Implement the "dummy_id" gdbarch method. */
1393 static struct frame_id
1394 nds32_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
1396 CORE_ADDR sp = get_frame_register_unsigned (this_frame, NDS32_SP_REGNUM);
1398 return frame_id_build (sp, get_frame_pc (this_frame));
1401 /* Implement the "unwind_pc" gdbarch method. */
1403 static CORE_ADDR
1404 nds32_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
1406 return frame_unwind_register_unsigned (next_frame, NDS32_PC_REGNUM);
1409 /* Implement the "unwind_sp" gdbarch method. */
1411 static CORE_ADDR
1412 nds32_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
1414 return frame_unwind_register_unsigned (next_frame, NDS32_SP_REGNUM);
1417 /* Floating type and struct type that has only one floating type member
1418 can pass value using FPU registers (when FPU ABI is used). */
1420 static int
1421 nds32_check_calling_use_fpr (struct type *type)
1423 struct type *t;
1424 enum type_code typecode;
1426 t = type;
1427 while (1)
1429 t = check_typedef (t);
1430 typecode = TYPE_CODE (t);
1431 if (typecode != TYPE_CODE_STRUCT)
1432 break;
1433 else if (TYPE_NFIELDS (t) != 1)
1434 return 0;
1435 else
1436 t = TYPE_FIELD_TYPE (t, 0);
1439 return typecode == TYPE_CODE_FLT;
1442 /* Return the alignment (in bytes) of the given type. */
1444 static int
1445 nds32_type_align (struct type *type)
1447 int n;
1448 int align;
1449 int falign;
1451 type = check_typedef (type);
1452 switch (TYPE_CODE (type))
1454 default:
1455 /* Should never happen. */
1456 internal_error (__FILE__, __LINE__, _("unknown type alignment"));
1457 return 4;
1459 case TYPE_CODE_PTR:
1460 case TYPE_CODE_ENUM:
1461 case TYPE_CODE_INT:
1462 case TYPE_CODE_FLT:
1463 case TYPE_CODE_SET:
1464 case TYPE_CODE_RANGE:
1465 case TYPE_CODE_REF:
1466 case TYPE_CODE_CHAR:
1467 case TYPE_CODE_BOOL:
1468 return TYPE_LENGTH (type);
1470 case TYPE_CODE_ARRAY:
1471 case TYPE_CODE_COMPLEX:
1472 return nds32_type_align (TYPE_TARGET_TYPE (type));
1474 case TYPE_CODE_STRUCT:
1475 case TYPE_CODE_UNION:
1476 align = 1;
1477 for (n = 0; n < TYPE_NFIELDS (type); n++)
1479 falign = nds32_type_align (TYPE_FIELD_TYPE (type, n));
1480 if (falign > align)
1481 align = falign;
1483 return align;
1487 /* Implement the "push_dummy_call" gdbarch method. */
1489 static CORE_ADDR
1490 nds32_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
1491 struct regcache *regcache, CORE_ADDR bp_addr,
1492 int nargs, struct value **args, CORE_ADDR sp,
1493 function_call_return_method return_method,
1494 CORE_ADDR struct_addr)
1496 const int REND = 6; /* End for register offset. */
1497 int goff = 0; /* Current gpr offset for argument. */
1498 int foff = 0; /* Current fpr offset for argument. */
1499 int soff = 0; /* Current stack offset for argument. */
1500 int i;
1501 ULONGEST regval;
1502 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1503 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1504 struct type *func_type = value_type (function);
1505 int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
1506 int abi_split = nds32_abi_split (tdep->elf_abi);
1508 /* Set the return address. For the NDS32, the return breakpoint is
1509 always at BP_ADDR. */
1510 regcache_cooked_write_unsigned (regcache, NDS32_LP_REGNUM, bp_addr);
1512 /* If STRUCT_RETURN is true, then the struct return address (in
1513 STRUCT_ADDR) will consume the first argument-passing register.
1514 Both adjust the register count and store that value. */
1515 if (return_method == return_method_struct)
1517 regcache_cooked_write_unsigned (regcache, NDS32_R0_REGNUM, struct_addr);
1518 goff++;
1521 /* Now make sure there's space on the stack */
1522 for (i = 0; i < nargs; i++)
1524 struct type *type = value_type (args[i]);
1525 int align = nds32_type_align (type);
1527 /* If align is zero, it may be an empty struct.
1528 Just ignore the argument of empty struct. */
1529 if (align == 0)
1530 continue;
1532 sp -= TYPE_LENGTH (type);
1533 sp = align_down (sp, align);
1536 /* Stack must be 8-byte aligned. */
1537 sp = align_down (sp, 8);
1539 soff = 0;
1540 for (i = 0; i < nargs; i++)
1542 const gdb_byte *val;
1543 int align, len;
1544 struct type *type;
1545 int calling_use_fpr;
1546 int use_fpr = 0;
1548 type = value_type (args[i]);
1549 calling_use_fpr = nds32_check_calling_use_fpr (type);
1550 len = TYPE_LENGTH (type);
1551 align = nds32_type_align (type);
1552 val = value_contents (args[i]);
1554 /* The size of a composite type larger than 4 bytes will be rounded
1555 up to the nearest multiple of 4. */
1556 if (len > 4)
1557 len = align_up (len, 4);
1559 /* Variadic functions are handled differently between AABI and ABI2FP+.
1561 For AABI, the caller pushes arguments in registers, callee stores
1562 unnamed arguments in stack, and then va_arg fetch arguments in stack.
1563 Therefore, we don't have to handle variadic functions specially.
1565 For ABI2FP+, the caller pushes only named arguments in registers
1566 and pushes all unnamed arguments in stack. */
1568 if (abi_use_fpr && TYPE_VARARGS (func_type)
1569 && i >= TYPE_NFIELDS (func_type))
1570 goto use_stack;
1572 /* Try to use FPRs to pass arguments only when
1573 1. The program is built using toolchain with FPU support.
1574 2. The type of this argument can use FPR to pass value. */
1575 use_fpr = abi_use_fpr && calling_use_fpr;
1577 if (use_fpr)
1579 if (tdep->fpu_freg == -1)
1580 goto error_no_fpr;
1582 /* Adjust alignment. */
1583 if ((align >> 2) > 0)
1584 foff = align_up (foff, align >> 2);
1586 if (foff < REND)
1588 switch (len)
1590 case 4:
1591 regcache->cooked_write (tdep->fs0_regnum + foff, val);
1592 foff++;
1593 break;
1594 case 8:
1595 regcache->cooked_write (NDS32_FD0_REGNUM + (foff >> 1), val);
1596 foff += 2;
1597 break;
1598 default:
1599 /* Long double? */
1600 internal_error (__FILE__, __LINE__,
1601 "Do not know how to handle %d-byte double.\n",
1602 len);
1603 break;
1605 continue;
1608 else
1611 When passing arguments using GPRs,
1613 * A composite type not larger than 4 bytes is passed in $rN.
1614 The format is as if the value is loaded with load instruction
1615 of corresponding size (e.g., LB, LH, LW).
1617 For example,
1620 31 0
1621 LITTLE: [x x b a]
1622 BIG: [x x a b]
1624 * Otherwise, a composite type is passed in consecutive registers.
1625 The size is rounded up to the nearest multiple of 4.
1626 The successive registers hold the parts of the argument as if
1627 were loaded using lmw instructions.
1629 For example,
1631 r0 r1
1632 31 0 31 0
1633 LITTLE: [d c b a] [x x x e]
1634 BIG: [a b c d] [e x x x]
1637 /* Adjust alignment. */
1638 if ((align >> 2) > 0)
1639 goff = align_up (goff, align >> 2);
1641 if (len <= (REND - goff) * 4)
1643 /* This argument can be passed wholly via GPRs. */
1644 while (len > 0)
1646 regval = extract_unsigned_integer (val, (len > 4) ? 4 : len,
1647 byte_order);
1648 regcache_cooked_write_unsigned (regcache,
1649 NDS32_R0_REGNUM + goff,
1650 regval);
1651 len -= 4;
1652 val += 4;
1653 goff++;
1655 continue;
1657 else if (abi_split)
1659 /* Some parts of this argument can be passed via GPRs. */
1660 while (goff < REND)
1662 regval = extract_unsigned_integer (val, (len > 4) ? 4 : len,
1663 byte_order);
1664 regcache_cooked_write_unsigned (regcache,
1665 NDS32_R0_REGNUM + goff,
1666 regval);
1667 len -= 4;
1668 val += 4;
1669 goff++;
1674 use_stack:
1676 When pushing (split parts of) an argument into stack,
1678 * A composite type not larger than 4 bytes is copied to different
1679 base address.
1680 In little-endian, the first byte of this argument is aligned
1681 at the low address of the next free word.
1682 In big-endian, the last byte of this argument is aligned
1683 at the high address of the next free word.
1685 For example,
1687 sp [ - ] [ c ] hi
1688 [ c ] [ b ]
1689 [ b ] [ a ]
1690 [ a ] [ - ] lo
1691 LITTLE BIG
1694 /* Adjust alignment. */
1695 soff = align_up (soff, align);
1697 while (len > 0)
1699 int rlen = (len > 4) ? 4 : len;
1701 if (byte_order == BFD_ENDIAN_BIG)
1702 write_memory (sp + soff + 4 - rlen, val, rlen);
1703 else
1704 write_memory (sp + soff, val, rlen);
1706 len -= 4;
1707 val += 4;
1708 soff += 4;
1712 /* Finally, update the SP register. */
1713 regcache_cooked_write_unsigned (regcache, NDS32_SP_REGNUM, sp);
1715 return sp;
1717 error_no_fpr:
1718 /* If use_fpr, but no floating-point register exists,
1719 then it is an error. */
1720 error (_("Fail to call. FPU registers are required."));
1723 /* Read, for architecture GDBARCH, a function return value of TYPE
1724 from REGCACHE, and copy that into VALBUF. */
1726 static void
1727 nds32_extract_return_value (struct gdbarch *gdbarch, struct type *type,
1728 struct regcache *regcache, gdb_byte *valbuf)
1730 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1731 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1732 int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
1733 int calling_use_fpr;
1734 int len;
1736 calling_use_fpr = nds32_check_calling_use_fpr (type);
1737 len = TYPE_LENGTH (type);
1739 if (abi_use_fpr && calling_use_fpr)
1741 if (len == 4)
1742 regcache->cooked_read (tdep->fs0_regnum, valbuf);
1743 else if (len == 8)
1744 regcache->cooked_read (NDS32_FD0_REGNUM, valbuf);
1745 else
1746 internal_error (__FILE__, __LINE__,
1747 _("Cannot extract return value of %d bytes "
1748 "long floating-point."), len);
1750 else
1753 When returning result,
1755 * A composite type not larger than 4 bytes is returned in $r0.
1756 The format is as if the result is loaded with load instruction
1757 of corresponding size (e.g., LB, LH, LW).
1759 For example,
1762 31 0
1763 LITTLE: [x x b a]
1764 BIG: [x x a b]
1766 * Otherwise, a composite type not larger than 8 bytes is returned
1767 in $r0 and $r1.
1768 In little-endian, the first word is loaded in $r0.
1769 In big-endian, the last word is loaded in $r1.
1771 For example,
1773 r0 r1
1774 31 0 31 0
1775 LITTLE: [d c b a] [x x x e]
1776 BIG: [x x x a] [b c d e]
1779 ULONGEST tmp;
1781 if (len < 4)
1783 /* By using store_unsigned_integer we avoid having to do
1784 anything special for small big-endian values. */
1785 regcache_cooked_read_unsigned (regcache, NDS32_R0_REGNUM, &tmp);
1786 store_unsigned_integer (valbuf, len, byte_order, tmp);
1788 else if (len == 4)
1790 regcache->cooked_read (NDS32_R0_REGNUM, valbuf);
1792 else if (len < 8)
1794 int len1, len2;
1796 len1 = byte_order == BFD_ENDIAN_BIG ? len - 4 : 4;
1797 len2 = len - len1;
1799 regcache_cooked_read_unsigned (regcache, NDS32_R0_REGNUM, &tmp);
1800 store_unsigned_integer (valbuf, len1, byte_order, tmp);
1802 regcache_cooked_read_unsigned (regcache, NDS32_R0_REGNUM + 1, &tmp);
1803 store_unsigned_integer (valbuf + len1, len2, byte_order, tmp);
1805 else
1807 regcache->cooked_read (NDS32_R0_REGNUM, valbuf);
1808 regcache->cooked_read (NDS32_R0_REGNUM + 1, valbuf + 4);
1813 /* Write, for architecture GDBARCH, a function return value of TYPE
1814 from VALBUF into REGCACHE. */
1816 static void
1817 nds32_store_return_value (struct gdbarch *gdbarch, struct type *type,
1818 struct regcache *regcache, const gdb_byte *valbuf)
1820 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1821 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1822 int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
1823 int calling_use_fpr;
1824 int len;
1826 calling_use_fpr = nds32_check_calling_use_fpr (type);
1827 len = TYPE_LENGTH (type);
1829 if (abi_use_fpr && calling_use_fpr)
1831 if (len == 4)
1832 regcache->cooked_write (tdep->fs0_regnum, valbuf);
1833 else if (len == 8)
1834 regcache->cooked_write (NDS32_FD0_REGNUM, valbuf);
1835 else
1836 internal_error (__FILE__, __LINE__,
1837 _("Cannot store return value of %d bytes "
1838 "long floating-point."), len);
1840 else
1842 ULONGEST regval;
1844 if (len < 4)
1846 regval = extract_unsigned_integer (valbuf, len, byte_order);
1847 regcache_cooked_write_unsigned (regcache, NDS32_R0_REGNUM, regval);
1849 else if (len == 4)
1851 regcache->cooked_write (NDS32_R0_REGNUM, valbuf);
1853 else if (len < 8)
1855 int len1, len2;
1857 len1 = byte_order == BFD_ENDIAN_BIG ? len - 4 : 4;
1858 len2 = len - len1;
1860 regval = extract_unsigned_integer (valbuf, len1, byte_order);
1861 regcache_cooked_write_unsigned (regcache, NDS32_R0_REGNUM, regval);
1863 regval = extract_unsigned_integer (valbuf + len1, len2, byte_order);
1864 regcache_cooked_write_unsigned (regcache, NDS32_R0_REGNUM + 1,
1865 regval);
1867 else
1869 regcache->cooked_write (NDS32_R0_REGNUM, valbuf);
1870 regcache->cooked_write (NDS32_R0_REGNUM + 1, valbuf + 4);
1875 /* Implement the "return_value" gdbarch method.
1877 Determine, for architecture GDBARCH, how a return value of TYPE
1878 should be returned. If it is supposed to be returned in registers,
1879 and READBUF is non-zero, read the appropriate value from REGCACHE,
1880 and copy it into READBUF. If WRITEBUF is non-zero, write the value
1881 from WRITEBUF into REGCACHE. */
1883 static enum return_value_convention
1884 nds32_return_value (struct gdbarch *gdbarch, struct value *func_type,
1885 struct type *type, struct regcache *regcache,
1886 gdb_byte *readbuf, const gdb_byte *writebuf)
1888 if (TYPE_LENGTH (type) > 8)
1890 return RETURN_VALUE_STRUCT_CONVENTION;
1892 else
1894 if (readbuf != NULL)
1895 nds32_extract_return_value (gdbarch, type, regcache, readbuf);
1896 if (writebuf != NULL)
1897 nds32_store_return_value (gdbarch, type, regcache, writebuf);
1899 return RETURN_VALUE_REGISTER_CONVENTION;
1903 /* Implement the "get_longjmp_target" gdbarch method. */
1905 static int
1906 nds32_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
1908 gdb_byte buf[4];
1909 CORE_ADDR jb_addr;
1910 struct gdbarch *gdbarch = get_frame_arch (frame);
1911 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1913 jb_addr = get_frame_register_unsigned (frame, NDS32_R0_REGNUM);
1915 if (target_read_memory (jb_addr + 11 * 4, buf, 4))
1916 return 0;
1918 *pc = extract_unsigned_integer (buf, 4, byte_order);
1919 return 1;
1922 /* Validate the given TDESC, and fixed-number some registers in it.
1923 Return 0 if the given TDESC does not contain the required feature
1924 or not contain required registers. */
1926 static int
1927 nds32_validate_tdesc_p (const struct target_desc *tdesc,
1928 struct tdesc_arch_data *tdesc_data,
1929 int *fpu_freg, int *use_pseudo_fsrs)
1931 const struct tdesc_feature *feature;
1932 int i, valid_p;
1934 feature = tdesc_find_feature (tdesc, "org.gnu.gdb.nds32.core");
1935 if (feature == NULL)
1936 return 0;
1938 valid_p = 1;
1939 /* Validate and fixed-number R0-R10. */
1940 for (i = NDS32_R0_REGNUM; i <= NDS32_R0_REGNUM + 10; i++)
1941 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
1942 nds32_register_names[i]);
1944 /* Validate R15. */
1945 valid_p &= tdesc_unnumbered_register (feature,
1946 nds32_register_names[NDS32_TA_REGNUM]);
1948 /* Validate and fixed-number FP, GP, LP, SP, PC. */
1949 for (i = NDS32_FP_REGNUM; i <= NDS32_PC_REGNUM; i++)
1950 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
1951 nds32_register_names[i]);
1953 if (!valid_p)
1954 return 0;
1956 /* Fixed-number R11-R27. */
1957 for (i = NDS32_R0_REGNUM + 11; i <= NDS32_R0_REGNUM + 27; i++)
1958 tdesc_numbered_register (feature, tdesc_data, i, nds32_register_names[i]);
1960 feature = tdesc_find_feature (tdesc, "org.gnu.gdb.nds32.fpu");
1961 if (feature != NULL)
1963 int num_fdr_regs, num_fsr_regs, fs0_regnum, num_listed_fsr;
1964 int freg = -1;
1966 /* Guess FPU configuration via listed registers. */
1967 if (tdesc_unnumbered_register (feature, "fd31"))
1968 freg = 3;
1969 else if (tdesc_unnumbered_register (feature, "fd15"))
1970 freg = 2;
1971 else if (tdesc_unnumbered_register (feature, "fd7"))
1972 freg = 1;
1973 else if (tdesc_unnumbered_register (feature, "fd3"))
1974 freg = 0;
1976 if (freg == -1)
1977 /* Required FDR is not found. */
1978 return 0;
1979 else
1980 *fpu_freg = freg;
1982 /* Validate and fixed-number required FDRs. */
1983 num_fdr_regs = num_fdr_map[freg];
1984 for (i = 0; i < num_fdr_regs; i++)
1985 valid_p &= tdesc_numbered_register (feature, tdesc_data,
1986 NDS32_FD0_REGNUM + i,
1987 nds32_fdr_register_names[i]);
1988 if (!valid_p)
1989 return 0;
1991 /* Count the number of listed FSRs, and fixed-number them if present. */
1992 num_fsr_regs = num_fsr_map[freg];
1993 fs0_regnum = NDS32_FD0_REGNUM + num_fdr_regs;
1994 num_listed_fsr = 0;
1995 for (i = 0; i < num_fsr_regs; i++)
1996 num_listed_fsr += tdesc_numbered_register (feature, tdesc_data,
1997 fs0_regnum + i,
1998 nds32_fsr_register_names[i]);
2000 if (num_listed_fsr == 0)
2001 /* No required FSRs are listed explicitly, make them pseudo registers
2002 of FDRs. */
2003 *use_pseudo_fsrs = 1;
2004 else if (num_listed_fsr == num_fsr_regs)
2005 /* All required FSRs are listed explicitly. */
2006 *use_pseudo_fsrs = 0;
2007 else
2008 /* Some required FSRs are missing. */
2009 return 0;
2012 return 1;
2015 /* Initialize the current architecture based on INFO. If possible,
2016 re-use an architecture from ARCHES, which is a list of
2017 architectures already created during this debugging session.
2019 Called e.g. at program startup, when reading a core file, and when
2020 reading a binary file. */
2022 static struct gdbarch *
2023 nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
2025 struct gdbarch *gdbarch;
2026 struct gdbarch_tdep *tdep;
2027 struct gdbarch_list *best_arch;
2028 struct tdesc_arch_data *tdesc_data = NULL;
2029 const struct target_desc *tdesc = info.target_desc;
2030 int elf_abi = E_NDS_ABI_AABI;
2031 int fpu_freg = -1;
2032 int use_pseudo_fsrs = 0;
2033 int i, num_regs, maxregs;
2035 /* Extract the elf_flags if available. */
2036 if (info.abfd && bfd_get_flavour (info.abfd) == bfd_target_elf_flavour)
2037 elf_abi = elf_elfheader (info.abfd)->e_flags & EF_NDS_ABI;
2039 /* If there is already a candidate, use it. */
2040 for (best_arch = gdbarch_list_lookup_by_info (arches, &info);
2041 best_arch != NULL;
2042 best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
2044 struct gdbarch_tdep *idep = gdbarch_tdep (best_arch->gdbarch);
2046 if (idep->elf_abi != elf_abi)
2047 continue;
2049 /* Found a match. */
2050 break;
2053 if (best_arch != NULL)
2054 return best_arch->gdbarch;
2056 if (!tdesc_has_registers (tdesc))
2057 tdesc = tdesc_nds32;
2059 tdesc_data = tdesc_data_alloc ();
2061 if (!nds32_validate_tdesc_p (tdesc, tdesc_data, &fpu_freg, &use_pseudo_fsrs))
2063 tdesc_data_cleanup (tdesc_data);
2064 return NULL;
2067 /* Allocate space for the new architecture. */
2068 tdep = XCNEW (struct gdbarch_tdep);
2069 tdep->fpu_freg = fpu_freg;
2070 tdep->use_pseudo_fsrs = use_pseudo_fsrs;
2071 tdep->fs0_regnum = -1;
2072 tdep->elf_abi = elf_abi;
2074 gdbarch = gdbarch_alloc (&info, tdep);
2076 set_gdbarch_wchar_bit (gdbarch, 16);
2077 set_gdbarch_wchar_signed (gdbarch, 0);
2079 if (fpu_freg == -1)
2080 num_regs = NDS32_NUM_REGS;
2081 else if (use_pseudo_fsrs == 1)
2083 set_gdbarch_pseudo_register_read (gdbarch, nds32_pseudo_register_read);
2084 set_gdbarch_pseudo_register_write (gdbarch, nds32_pseudo_register_write);
2085 set_tdesc_pseudo_register_name (gdbarch, nds32_pseudo_register_name);
2086 set_tdesc_pseudo_register_type (gdbarch, nds32_pseudo_register_type);
2087 set_gdbarch_num_pseudo_regs (gdbarch, num_fsr_map[fpu_freg]);
2089 num_regs = NDS32_NUM_REGS + num_fdr_map[fpu_freg];
2091 else
2092 num_regs = NDS32_NUM_REGS + num_fdr_map[fpu_freg] + num_fsr_map[fpu_freg];
2094 set_gdbarch_num_regs (gdbarch, num_regs);
2095 tdesc_use_registers (gdbarch, tdesc, tdesc_data);
2097 /* Cache the register number of fs0. */
2098 if (fpu_freg != -1)
2099 tdep->fs0_regnum = user_reg_map_name_to_regnum (gdbarch, "fs0", -1);
2101 /* Add NDS32 register aliases. To avoid search in user register name space,
2102 user_reg_map_name_to_regnum is not used. */
2103 maxregs = gdbarch_num_cooked_regs (gdbarch);
2104 for (i = 0; i < ARRAY_SIZE (nds32_register_aliases); i++)
2106 int regnum, j;
2108 regnum = -1;
2109 /* Search register name space. */
2110 for (j = 0; j < maxregs; j++)
2112 const char *regname = gdbarch_register_name (gdbarch, j);
2114 if (regname != NULL
2115 && strcmp (regname, nds32_register_aliases[i].name) == 0)
2117 regnum = j;
2118 break;
2122 /* Try next alias entry if the given name can not be found in register
2123 name space. */
2124 if (regnum == -1)
2125 continue;
2127 user_reg_add (gdbarch, nds32_register_aliases[i].alias,
2128 value_of_nds32_reg, (const void *) (intptr_t) regnum);
2131 nds32_add_reggroups (gdbarch);
2133 /* Hook in ABI-specific overrides, if they have been registered. */
2134 info.tdesc_data = tdesc_data;
2135 gdbarch_init_osabi (info, gdbarch);
2137 /* Override tdesc_register callbacks for system registers. */
2138 set_gdbarch_register_reggroup_p (gdbarch, nds32_register_reggroup_p);
2140 set_gdbarch_sp_regnum (gdbarch, NDS32_SP_REGNUM);
2141 set_gdbarch_pc_regnum (gdbarch, NDS32_PC_REGNUM);
2142 set_gdbarch_unwind_sp (gdbarch, nds32_unwind_sp);
2143 set_gdbarch_unwind_pc (gdbarch, nds32_unwind_pc);
2144 set_gdbarch_stack_frame_destroyed_p (gdbarch, nds32_stack_frame_destroyed_p);
2145 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, nds32_dwarf2_reg_to_regnum);
2147 set_gdbarch_push_dummy_call (gdbarch, nds32_push_dummy_call);
2148 set_gdbarch_return_value (gdbarch, nds32_return_value);
2149 set_gdbarch_dummy_id (gdbarch, nds32_dummy_id);
2151 set_gdbarch_skip_prologue (gdbarch, nds32_skip_prologue);
2152 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
2153 set_gdbarch_breakpoint_kind_from_pc (gdbarch,
2154 nds32_breakpoint::kind_from_pc);
2155 set_gdbarch_sw_breakpoint_from_kind (gdbarch,
2156 nds32_breakpoint::bp_from_kind);
2158 set_gdbarch_frame_align (gdbarch, nds32_frame_align);
2159 frame_base_set_default (gdbarch, &nds32_frame_base);
2161 /* Handle longjmp. */
2162 set_gdbarch_get_longjmp_target (gdbarch, nds32_get_longjmp_target);
2164 /* The order of appending is the order it check frame. */
2165 dwarf2_append_unwinders (gdbarch);
2166 frame_unwind_append_unwinder (gdbarch, &nds32_epilogue_frame_unwind);
2167 frame_unwind_append_unwinder (gdbarch, &nds32_frame_unwind);
2169 return gdbarch;
2172 void
2173 _initialize_nds32_tdep (void)
2175 /* Initialize gdbarch. */
2176 register_gdbarch_init (bfd_arch_nds32, nds32_gdbarch_init);
2178 initialize_tdesc_nds32 ();
2179 nds32_init_reggroups ();