GDB (xrefs)

/tmp/gdb-8.1/gdb/nds32-tdep.c
Go to the documentation of this file.
1 /* Target-dependent code for the NDS32 architecture, for GDB.
2
3 Copyright (C) 2013-2018 Free Software Foundation, Inc.
4 Contributed by Andes Technology Corporation.
5
6 This file is part of GDB.
7
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.
12
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.
17
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/>. */
20
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"
40
41 #include "nds32-tdep.h"
42 #include "elf/nds32.h"
43 #include "opcode/nds32.h"
44 #include <algorithm>
45
46 #include "features/nds32.c"
47
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)
57
58 /* Use an invalid address value as 'not available' marker. */
59 enum { REG_UNAVAIL = (CORE_ADDR) -1 };
60
61 /* Use an impossible value as invalid offset. */
62 enum { INVALID_OFFSET = (CORE_ADDR) -1 };
63
64 /* Instruction groups for NDS32 epilogue analysis. */
65 enum
66 {
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,
77 };
78
79 static const char *const nds32_register_names[] =
80 {
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",
88 };
89
90 static const char *const nds32_fdr_register_names[] =
91 {
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"
96 };
97
98 static const char *const nds32_fsr_register_names[] =
99 {
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"
104 };
105
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 };
109
110 /* Aliases for registers. */
111 static const struct
112 {
113 const char *name;
114 const char *alias;
115 } nds32_register_aliases[] =
116 {
117 {"r15", "ta"},
118 {"r26", "p0"},
119 {"r27", "p1"},
120 {"fp", "r28"},
121 {"gp", "r29"},
122 {"lp", "r30"},
123 {"sp", "r31"},
124
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"},
133
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"},
164
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"},
177
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"},
226
227 {"hspr0", "hsp_ctl"},
228 {"hspr1", "sp_bound"},
229 {"hspr2", "sp_bound_priv"},
230
231 {"pfr0", "pfmc0"},
232 {"pfr1", "pfmc1"},
233 {"pfr2", "pfmc2"},
234 {"pfr3", "pfm_ctl"},
235 {"pfr4", "pft_ctl"},
236
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"},
250
251 {"racr0", "prusr_acc_ctl"},
252 {"fucpr", "fucop_ctl"},
253
254 {"idr0", "sdz_ctl"},
255 {"idr1", "misc_ctl"},
256 {"idr2", "ecc_misc"},
257
258 {"secur0", "sfcr"},
259 {"secur1", "sign"},
260 {"secur2", "isign"},
261 {"secur3", "p_isign"},
262 };
263
264 /* Value of a register alias. BATON is the regnum of the corresponding
265 register. */
266
267 static struct value *
268 value_of_nds32_reg (struct frame_info *frame, const void *baton)
269 {
270 return value_of_register ((int) (intptr_t) baton, frame);
271 }
272
273 /* Implement the "frame_align" gdbarch method. */
274
275 static CORE_ADDR
276 nds32_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
277 {
278 /* 8-byte aligned. */
279 return align_down (sp, 8);
280 }
281
282 /* The same insn machine code is used for little-endian and big-endian. */
283 constexpr gdb_byte nds32_break_insn[] = { 0xEA, 0x00 };
284
285 typedef BP_MANIPULATION (nds32_break_insn) nds32_breakpoint;
286
287 /* Implement the "dwarf2_reg_to_regnum" gdbarch method. */
288
289 static int
290 nds32_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, int num)
291 {
292 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
293 const int FSR = 38;
294 const int FDR = FSR + 32;
295
296 if (num >= 0 && num < 32)
297 {
298 /* General-purpose registers (R0 - R31). */
299 return num;
300 }
301 else if (num >= FSR && num < FSR + 32)
302 {
303 /* Single precision floating-point registers (FS0 - FS31). */
304 return num - FSR + tdep->fs0_regnum;
305 }
306 else if (num >= FDR && num < FDR + 32)
307 {
308 /* Double precision floating-point registers (FD0 - FD31). */
309 return num - FDR + NDS32_FD0_REGNUM;
310 }
311
312 /* No match, return a inaccessible register number. */
313 return -1;
314 }
315
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;
327
328 static void
329 nds32_init_reggroups (void)
330 {
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);
341 }
342
343 static void
344 nds32_add_reggroups (struct gdbarch *gdbarch)
345 {
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);
353
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);
365 }
366
367 /* Implement the "register_reggroup_p" gdbarch method. */
368
369 static int
370 nds32_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
371 struct reggroup *reggroup)
372 {
373 const char *reg_name;
374 const char *group_name;
375 int ret;
376
377 if (reggroup == all_reggroup)
378 return 1;
379
380 /* General reggroup contains only GPRs and PC. */
381 if (reggroup == general_reggroup)
382 return regnum <= NDS32_PC_REGNUM;
383
384 if (reggroup == float_reggroup || reggroup == save_reggroup
385 || reggroup == restore_reggroup)
386 {
387 ret = tdesc_register_in_reggroup_p (gdbarch, regnum, reggroup);
388 if (ret != -1)
389 return ret;
390
391 return default_register_reggroup_p (gdbarch, regnum, reggroup);
392 }
393
394 if (reggroup == system_reggroup)
395 return (regnum > NDS32_PC_REGNUM)
396 && !nds32_register_reggroup_p (gdbarch, regnum, float_reggroup);
397
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));
403 }
404
405 /* Implement the "pseudo_register_type" tdesc_arch_data method. */
406
407 static struct type *
408 nds32_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
409 {
410 regnum -= gdbarch_num_regs (gdbarch);
411
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);
416
417 warning (_("Unknown nds32 pseudo register %d."), regnum);
418 return NULL;
419 }
420
421 /* Implement the "pseudo_register_name" tdesc_arch_data method. */
422
423 static const char *
424 nds32_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
425 {
426 regnum -= gdbarch_num_regs (gdbarch);
427
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];
431
432 warning (_("Unknown nds32 pseudo register %d."), regnum);
433 return NULL;
434 }
435
436 /* Implement the "pseudo_register_read" gdbarch method. */
437
438 static enum register_status
439 nds32_pseudo_register_read (struct gdbarch *gdbarch,
440 struct regcache *regcache, int regnum,
441 gdb_byte *buf)
442 {
443 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
444 gdb_byte reg_buf[8];
445 int offset, fdr_regnum;
446 enum register_status status;
447
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);
452
453 regnum -= gdbarch_num_regs (gdbarch);
454
455 /* Currently, only FSRs could be defined as pseudo registers. */
456 if (regnum < gdbarch_num_pseudo_regs (gdbarch))
457 {
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;
463
464 fdr_regnum = NDS32_FD0_REGNUM + (regnum >> 1);
465 status = regcache_raw_read (regcache, fdr_regnum, reg_buf);
466 if (status == REG_VALID)
467 memcpy (buf, reg_buf + offset, 4);
468
469 return status;
470 }
471
472 gdb_assert_not_reached ("invalid pseudo register number");
473 }
474
475 /* Implement the "pseudo_register_write" gdbarch method. */
476
477 static void
478 nds32_pseudo_register_write (struct gdbarch *gdbarch,
479 struct regcache *regcache, int regnum,
480 const gdb_byte *buf)
481 {
482 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
483 gdb_byte reg_buf[8];
484 int offset, fdr_regnum;
485
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);
490
491 regnum -= gdbarch_num_regs (gdbarch);
492
493 /* Currently, only FSRs could be defined as pseudo registers. */
494 if (regnum < gdbarch_num_pseudo_regs (gdbarch))
495 {
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;
501
502 fdr_regnum = NDS32_FD0_REGNUM + (regnum >> 1);
503 regcache_raw_read (regcache, fdr_regnum, reg_buf);
504 memcpy (reg_buf + offset, buf, 4);
505 regcache_raw_write (regcache, fdr_regnum, reg_buf);
506 return;
507 }
508
509 gdb_assert_not_reached ("invalid pseudo register number");
510 }
511
512 /* Helper function for NDS32 ABI. Return true if FPRs can be used
513 to pass function arguments and return value. */
514
515 static int
516 nds32_abi_use_fpr (int elf_abi)
517 {
518 return elf_abi == E_NDS_ABI_V2FP_PLUS;
519 }
520
521 /* Helper function for NDS32 ABI. Return true if GPRs and stack
522 can be used together to pass an argument. */
523
524 static int
525 nds32_abi_split (int elf_abi)
526 {
527 return elf_abi == E_NDS_ABI_AABI;
528 }
529
530 #define NDS32_NUM_SAVED_REGS (NDS32_LP_REGNUM + 1)
531
532 struct nds32_frame_cache
533 {
534 /* The previous frame's inner most stack address. Used as this
535 frame ID's stack_addr. */
536 CORE_ADDR prev_sp;
537
538 /* The frame's base, optionally used by the high-level debug info. */
539 CORE_ADDR base;
540
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;
548
549 /* The address of the first instruction in this function. */
550 CORE_ADDR pc;
551
552 /* Saved registers. */
553 CORE_ADDR saved_regs[NDS32_NUM_SAVED_REGS];
554 };
555
556 /* Allocate and initialize a frame cache. */
557
558 static struct nds32_frame_cache *
559 nds32_alloc_frame_cache (void)
560 {
561 struct nds32_frame_cache *cache;
562 int i;
563
564 cache = FRAME_OBSTACK_ZALLOC (struct nds32_frame_cache);
565
566 /* Initialize fp_offset to check if FP is set in prologue. */
567 cache->fp_offset = INVALID_OFFSET;
568
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;
573
574 return cache;
575 }
576
577 /* Helper function for instructions used to push multiple words. */
578
579 static void
580 nds32_push_multiple_words (struct nds32_frame_cache *cache, int rb, int re,
581 int enable4)
582 {
583 CORE_ADDR sp_offset = cache->sp_offset;
584 int i;
585
586 /* Check LP, GP, FP in enable4. */
587 for (i = 1; i <= 3; i++)
588 {
589 if ((enable4 >> i) & 0x1)
590 {
591 sp_offset += 4;
592 cache->saved_regs[NDS32_SP_REGNUM - i] = sp_offset;
593 }
594 }
595
596 /* Skip case where re == rb == sp. */
597 if ((rb < REG_FP) && (re < REG_FP))
598 {
599 for (i = re; i >= rb; i--)
600 {
601 sp_offset += 4;
602 cache->saved_regs[i] = sp_offset;
603 }
604 }
605
606 /* For sp, update the offset. */
607 cache->sp_offset = sp_offset;
608 }
609
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. */
614
615 static CORE_ADDR
616 nds32_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
617 CORE_ADDR limit_pc, struct nds32_frame_cache *cache)
618 {
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;
625
626 for (; pc < limit_pc; pc += insn_len)
627 {
628 insn = read_memory_unsigned_integer (pc, 4, BFD_ENDIAN_BIG);
629
630 if ((insn & 0x80000000) == 0)
631 {
632 /* 32-bit instruction */
633 insn_len = 4;
634
635 if (CHOP_BITS (insn, 15) == N32_TYPE2 (ADDI, REG_SP, REG_SP, 0))
636 {
637 /* addi $sp, $sp, imm15s */
638 int imm15s = N32_IMM15S (insn);
639
640 if (imm15s < 0)
641 {
642 if (cache != NULL)
643 cache->sp_offset += -imm15s;
644
645 in_prologue_bb = 1;
646 continue;
647 }
648 }
649 else if (CHOP_BITS (insn, 15) == N32_TYPE2 (ADDI, REG_FP, REG_SP, 0))
650 {
651 /* addi $fp, $sp, imm15s */
652 int imm15s = N32_IMM15S (insn);
653
654 if (imm15s > 0)
655 {
656 if (cache != NULL)
657 cache->fp_offset = cache->sp_offset - imm15s;
658
659 in_prologue_bb = 1;
660 continue;
661 }
662 }
663 else if ((insn & ~(__MASK (19) << 6)) == N32_SMW_ADM
664 && N32_RA5 (insn) == REG_SP)
665 {
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;
673 }
674 else if (insn == N32_ALU1 (ADD, REG_SP, REG_SP, REG_TA)
675 || insn == N32_ALU1 (ADD, REG_SP, REG_TA, REG_SP))
676 {
677 /* add $sp, $sp, $ta */
678 /* add $sp, $ta, $sp */
679 if (val_ta < 0)
680 {
681 if (cache != NULL)
682 cache->sp_offset += -val_ta;
683
684 in_prologue_bb = 1;
685 continue;
686 }
687 }
688 else if (CHOP_BITS (insn, 20) == N32_TYPE1 (MOVI, REG_TA, 0))
689 {
690 /* movi $ta, imm20s */
691 if (cache != NULL)
692 val_ta = N32_IMM20S (insn);
693
694 continue;
695 }
696 else if (CHOP_BITS (insn, 20) == N32_TYPE1 (SETHI, REG_TA, 0))
697 {
698 /* sethi $ta, imm20u */
699 if (cache != NULL)
700 val_ta = N32_IMM20U (insn) << 12;
701
702 continue;
703 }
704 else if (CHOP_BITS (insn, 15) == N32_TYPE2 (ORI, REG_TA, REG_TA, 0))
705 {
706 /* ori $ta, $ta, imm15u */
707 if (cache != NULL)
708 val_ta |= N32_IMM15U (insn);
709
710 continue;
711 }
712 else if (CHOP_BITS (insn, 15) == N32_TYPE2 (ADDI, REG_TA, REG_TA, 0))
713 {
714 /* addi $ta, $ta, imm15s */
715 if (cache != NULL)
716 val_ta += N32_IMM15S (insn);
717
718 continue;
719 }
720 if (insn == N32_ALU1 (ADD, REG_GP, REG_TA, REG_GP)
721 || insn == N32_ALU1 (ADD, REG_GP, REG_GP, REG_TA))
722 {
723 /* add $gp, $ta, $gp */
724 /* add $gp, $gp, $ta */
725 in_prologue_bb = 1;
726 continue;
727 }
728 else if (CHOP_BITS (insn, 20) == N32_TYPE1 (MOVI, REG_GP, 0))
729 {
730 /* movi $gp, imm20s */
731 in_prologue_bb = 1;
732 continue;
733 }
734 else if (CHOP_BITS (insn, 20) == N32_TYPE1 (SETHI, REG_GP, 0))
735 {
736 /* sethi $gp, imm20u */
737 in_prologue_bb = 1;
738 continue;
739 }
740 else if (CHOP_BITS (insn, 15) == N32_TYPE2 (ORI, REG_GP, REG_GP, 0))
741 {
742 /* ori $gp, $gp, imm15u */
743 in_prologue_bb = 1;
744 continue;
745 }
746 else
747 {
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)
751 {
752 int op = N32_OP6 (insn);
753
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;
760 }
761 }
762
763 if (abi_use_fpr && N32_OP6 (insn) == N32_OP6_SDC
764 && __GF (insn, 12, 3) == 0)
765 {
766 /* For FPU insns, CP (bit [13:14]) should be CP0, and only
767 normal form (bit [12] == 0) is used. */
768
769 /* fsdi FDt, [$sp + (imm12s << 2)] */
770 if (N32_RA5 (insn) == REG_SP)
771 continue;
772 }
773
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;
782 }
783 else
784 {
785 /* 16-bit instruction */
786 insn_len = 2;
787
788 insn >>= 16;
789
790 if (CHOP_BITS (insn, 10) == N16_TYPE10 (ADDI10S, 0))
791 {
792 /* addi10s.sp */
793 int imm10s = N16_IMM10S (insn);
794
795 if (imm10s < 0)
796 {
797 if (cache != NULL)
798 cache->sp_offset += -imm10s;
799
800 in_prologue_bb = 1;
801 continue;
802 }
803 }
804 else if (__GF (insn, 7, 8) == N16_T25_PUSH25)
805 {
806 /* push25 */
807 if (cache != NULL)
808 {
809 int imm8u = (insn & 0x1f) << 3;
810 int re = (insn >> 5) & 0x3;
811 const int reg_map[] = { 6, 8, 10, 14 };
812
813 /* Operation 1 -- smw.adm R6, [$sp], Re, #0xe */
814 nds32_push_multiple_words (cache, 6, reg_map[re], 0xe);
815
816 /* Operation 2 -- sp = sp - (imm5u << 3) */
817 cache->sp_offset += imm8u;
818 }
819
820 in_prologue_bb = 1;
821 continue;
822 }
823 else if (insn == N16_TYPE5 (ADD5PC, REG_GP))
824 {
825 /* add5.pc $gp */
826 in_prologue_bb = 1;
827 continue;
828 }
829 else if (CHOP_BITS (insn, 5) == N16_TYPE55 (MOVI55, REG_GP, 0))
830 {
831 /* movi55 $gp, imm5s */
832 in_prologue_bb = 1;
833 continue;
834 }
835 else
836 {
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)
840 {
841 uint32_t insn5 = CHOP_BITS (insn, 5);
842 uint32_t insn8 = CHOP_BITS (insn, 8);
843 uint32_t insn38 = CHOP_BITS (insn, 11);
844
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;
856 }
857 }
858
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;
867 }
868 }
869
870 return pc;
871 }
872
873 /* Implement the "skip_prologue" gdbarch method.
874
875 Find the end of function prologue. */
876
877 static CORE_ADDR
878 nds32_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
879 {
880 CORE_ADDR func_addr, limit_pc;
881
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))
886 {
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);
891 }
892
893 /* Can't determine prologue from the symbol table, need to examine
894 instructions. */
895
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. */
902
903 /* Find the end of prologue. */
904 return nds32_analyze_prologue (gdbarch, pc, limit_pc, NULL);
905 }
906
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. */
910
911 static struct nds32_frame_cache *
912 nds32_frame_cache (struct frame_info *this_frame, void **this_cache)
913 {
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;
920
921 if (*this_cache)
922 return (struct nds32_frame_cache *) *this_cache;
923
924 cache = nds32_alloc_frame_cache ();
925 *this_cache = cache;
926
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);
930
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)
934 {
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;
938 }
939 else
940 {
941 this_base = get_frame_register_unsigned (this_frame, NDS32_SP_REGNUM);
942 prev_sp = this_base + cache->sp_offset;
943 }
944
945 cache->prev_sp = prev_sp;
946 cache->base = this_base;
947
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];
953
954 return cache;
955 }
956
957 /* Implement the "this_id" frame_unwind method.
958
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. */
961
962 static void
963 nds32_frame_this_id (struct frame_info *this_frame,
964 void **this_cache, struct frame_id *this_id)
965 {
966 struct nds32_frame_cache *cache = nds32_frame_cache (this_frame, this_cache);
967
968 /* This marks the outermost frame. */
969 if (cache->prev_sp == 0)
970 return;
971
972 *this_id = frame_id_build (cache->prev_sp, cache->pc);
973 }
974
975 /* Implement the "prev_register" frame_unwind method. */
976
977 static struct value *
978 nds32_frame_prev_register (struct frame_info *this_frame, void **this_cache,
979 int regnum)
980 {
981 struct nds32_frame_cache *cache = nds32_frame_cache (this_frame, this_cache);
982
983 if (regnum == NDS32_SP_REGNUM)
984 return frame_unwind_got_constant (this_frame, regnum, cache->prev_sp);
985
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;
990
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]);
994
995 return frame_unwind_got_register (this_frame, regnum, regnum);
996 }
997
998 static const struct frame_unwind nds32_frame_unwind =
999 {
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,
1006 };
1007
1008 /* Return the frame base address of *THIS_FRAME. */
1009
1010 static CORE_ADDR
1011 nds32_frame_base_address (struct frame_info *this_frame, void **this_cache)
1012 {
1013 struct nds32_frame_cache *cache = nds32_frame_cache (this_frame, this_cache);
1014
1015 return cache->base;
1016 }
1017
1018 static const struct frame_base nds32_frame_base =
1019 {
1020 &nds32_frame_unwind,
1021 nds32_frame_base_address,
1022 nds32_frame_base_address,
1023 nds32_frame_base_address
1024 };
1025
1026 /* Helper function for instructions used to pop multiple words. */
1027
1028 static void
1029 nds32_pop_multiple_words (struct nds32_frame_cache *cache, int rb, int re,
1030 int enable4)
1031 {
1032 CORE_ADDR sp_offset = cache->sp_offset;
1033 int i;
1034
1035 /* Skip case where re == rb == sp. */
1036 if ((rb < REG_FP) && (re < REG_FP))
1037 {
1038 for (i = rb; i <= re; i++)
1039 {
1040 cache->saved_regs[i] = sp_offset;
1041 sp_offset += 4;
1042 }
1043 }
1044
1045 /* Check FP, GP, LP in enable4. */
1046 for (i = 3; i >= 1; i--)
1047 {
1048 if ((enable4 >> i) & 0x1)
1049 {
1050 cache->saved_regs[NDS32_SP_REGNUM - i] = sp_offset;
1051 sp_offset += 4;
1052 }
1053 }
1054
1055 /* For sp, update the offset. */
1056 cache->sp_offset = sp_offset;
1057 }
1058
1059 /* The instruction sequences in NDS32 epilogue are
1060
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). */
1066
1067 /* Helper function for analyzing the given 32-bit INSN. If CACHE is non-NULL,
1068 the necessary information will be recorded. */
1069
1070 static inline int
1071 nds32_analyze_epilogue_insn32 (int abi_use_fpr, uint32_t insn,
1072 struct nds32_frame_cache *cache)
1073 {
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)
1084 {
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));
1089
1090 return INSN_RECOVER;
1091 }
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)
1102 {
1103 if (__GF (insn, 12, 1) == 0)
1104 /* fldi FDt, [$sp + (imm12s << 2)] */
1105 return INSN_RECOVER;
1106 else
1107 {
1108 /* fldi.bi FDt, [$sp], (imm12s << 2) */
1109 int offset = N32_IMM12S (insn) << 2;
1110
1111 if (offset == 8 || offset == 12)
1112 {
1113 if (cache != NULL)
1114 cache->sp_offset += offset;
1115
1116 return INSN_RECOVER;
1117 }
1118 }
1119 }
1120
1121 return INSN_NORMAL;
1122 }
1123
1124 /* Helper function for analyzing the given 16-bit INSN. If CACHE is non-NULL,
1125 the necessary information will be recorded. */
1126
1127 static inline int
1128 nds32_analyze_epilogue_insn16 (uint32_t insn, struct nds32_frame_cache *cache)
1129 {
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))
1134 {
1135 /* addi10s.sp */
1136 int imm10s = N16_IMM10S (insn);
1137
1138 if (imm10s > 0)
1139 {
1140 if (cache != NULL)
1141 cache->sp_offset += imm10s;
1142
1143 return INSN_RECOVER;
1144 }
1145 }
1146 else if (__GF (insn, 7, 8) == N16_T25_POP25)
1147 {
1148 /* pop25 */
1149 if (cache != NULL)
1150 {
1151 int imm8u = (insn & 0x1f) << 3;
1152 int re = (insn >> 5) & 0x3;
1153 const int reg_map[] = { 6, 8, 10, 14 };
1154
1155 /* Operation 1 -- sp = sp + (imm5u << 3) */
1156 cache->sp_offset += imm8u;
1157
1158 /* Operation 2 -- lmw.bim R6, [$sp], Re, #0xe */
1159 nds32_pop_multiple_words (cache, 6, reg_map[re], 0xe);
1160 }
1161
1162 /* Operation 3 -- ret $lp */
1163 return INSN_RECOVER_RETURN;
1164 }
1165
1166 return INSN_NORMAL;
1167 }
1168
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.
1172
1173 If CACHE is non-NULL, fill it in. */
1174
1175 static int
1176 nds32_analyze_epilogue (struct gdbarch *gdbarch, CORE_ADDR pc,
1177 struct nds32_frame_cache *cache)
1178 {
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;
1184
1185 if (abi_use_fpr)
1186 limit_pc = pc + 48;
1187 else
1188 limit_pc = pc + 16;
1189
1190 for (; pc < limit_pc; pc += insn_len)
1191 {
1192 insn = read_memory_unsigned_integer (pc, 4, BFD_ENDIAN_BIG);
1193
1194 if ((insn & 0x80000000) == 0)
1195 {
1196 /* 32-bit instruction */
1197 insn_len = 4;
1198
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;
1204 }
1205 else
1206 {
1207 /* 16-bit instruction */
1208 insn_len = 2;
1209
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;
1216 }
1217
1218 /* Stop the scan if this is an unexpected instruction. */
1219 break;
1220 }
1221
1222 return 0;
1223 }
1224
1225 /* Implement the "stack_frame_destroyed_p" gdbarch method. */
1226
1227 static int
1228 nds32_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR addr)
1229 {
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;
1235
1236 insn = read_memory_unsigned_integer (addr, 4, BFD_ENDIAN_BIG);
1237
1238 if ((insn & 0x80000000) == 0)
1239 {
1240 /* 32-bit instruction */
1241
1242 insn_type = nds32_analyze_epilogue_insn32 (abi_use_fpr, insn, NULL);
1243 }
1244 else
1245 {
1246 /* 16-bit instruction */
1247
1248 insn >>= 16;
1249 insn_type = nds32_analyze_epilogue_insn16 (insn, NULL);
1250 }
1251
1252 if (insn_type == INSN_NORMAL || insn_type == INSN_RESET_SP)
1253 return 0;
1254
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;
1260
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);
1265
1266 /* Only 16-bit instructions are possible at addr - 2. */
1267 if ((insn & 0x80000000) != 0)
1268 {
1269 /* This may be a 16-bit instruction or part of a 32-bit instruction. */
1270
1271 insn_type = nds32_analyze_epilogue_insn16 (insn >> 16, NULL);
1272 if (insn_type == INSN_RECOVER)
1273 return 1;
1274 }
1275
1276 insn = read_memory_unsigned_integer (addr - 4, 4, BFD_ENDIAN_BIG);
1277
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)
1282 {
1283 /* This may be a 32-bit instruction or part of a 32-bit instruction. */
1284
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;
1288 }
1289
1290 return 0;
1291 }
1292
1293 /* Implement the "sniffer" frame_unwind method. */
1294
1295 static int
1296 nds32_epilogue_frame_sniffer (const struct frame_unwind *self,
1297 struct frame_info *this_frame, void **this_cache)
1298 {
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;
1304 }
1305
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. */
1310
1311 static struct nds32_frame_cache *
1312 nds32_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache)
1313 {
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;
1318
1319 if (*this_cache)
1320 return (struct nds32_frame_cache *) *this_cache;
1321
1322 cache = nds32_alloc_frame_cache ();
1323 *this_cache = cache;
1324
1325 cache->pc = get_frame_func (this_frame);
1326 current_pc = get_frame_pc (this_frame);
1327 nds32_analyze_epilogue (gdbarch, current_pc, cache);
1328
1329 current_sp = get_frame_register_unsigned (this_frame, NDS32_SP_REGNUM);
1330 cache->prev_sp = current_sp + cache->sp_offset;
1331
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];
1337
1338 return cache;
1339 }
1340
1341 /* Implement the "this_id" frame_unwind method. */
1342
1343 static void
1344 nds32_epilogue_frame_this_id (struct frame_info *this_frame,
1345 void **this_cache, struct frame_id *this_id)
1346 {
1347 struct nds32_frame_cache *cache
1348 = nds32_epilogue_frame_cache (this_frame, this_cache);
1349
1350 /* This marks the outermost frame. */
1351 if (cache->prev_sp == 0)
1352 return;
1353
1354 *this_id = frame_id_build (cache->prev_sp, cache->pc);
1355 }
1356
1357 /* Implement the "prev_register" frame_unwind method. */
1358
1359 static struct value *
1360 nds32_epilogue_frame_prev_register (struct frame_info *this_frame,
1361 void **this_cache, int regnum)
1362 {
1363 struct nds32_frame_cache *cache
1364 = nds32_epilogue_frame_cache (this_frame, this_cache);
1365
1366 if (regnum == NDS32_SP_REGNUM)
1367 return frame_unwind_got_constant (this_frame, regnum, cache->prev_sp);
1368
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;
1373
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]);
1377
1378 return frame_unwind_got_register (this_frame, regnum, regnum);
1379 }
1380
1381 static const struct frame_unwind nds32_epilogue_frame_unwind =
1382 {
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
1389 };
1390
1391 /* Implement the "dummy_id" gdbarch method. */
1392
1393 static struct frame_id
1394 nds32_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
1395 {
1396 CORE_ADDR sp = get_frame_register_unsigned (this_frame, NDS32_SP_REGNUM);
1397
1398 return frame_id_build (sp, get_frame_pc (this_frame));
1399 }
1400
1401 /* Implement the "unwind_pc" gdbarch method. */
1402
1403 static CORE_ADDR
1404 nds32_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
1405 {
1406 return frame_unwind_register_unsigned (next_frame, NDS32_PC_REGNUM);
1407 }
1408
1409 /* Implement the "unwind_sp" gdbarch method. */
1410
1411 static CORE_ADDR
1412 nds32_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
1413 {
1414 return frame_unwind_register_unsigned (next_frame, NDS32_SP_REGNUM);
1415 }
1416
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). */
1419
1420 static int
1421 nds32_check_calling_use_fpr (struct type *type)
1422 {
1423 struct type *t;
1424 enum type_code typecode;
1425
1426 t = type;
1427 while (1)
1428 {
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);
1437 }
1438
1439 return typecode == TYPE_CODE_FLT;
1440 }
1441
1442 /* Return the alignment (in bytes) of the given type. */
1443
1444 static int
1445 nds32_type_align (struct type *type)
1446 {
1447 int n;
1448 int align;
1449 int falign;
1450
1451 type = check_typedef (type);
1452 switch (TYPE_CODE (type))
1453 {
1454 default:
1455 /* Should never happen. */
1456 internal_error (__FILE__, __LINE__, _("unknown type alignment"));
1457 return 4;
1458
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);
1469
1470 case TYPE_CODE_ARRAY:
1471 case TYPE_CODE_COMPLEX:
1472 return nds32_type_align (TYPE_TARGET_TYPE (type));
1473
1474 case TYPE_CODE_STRUCT:
1475 case TYPE_CODE_UNION:
1476 align = 1;
1477 for (n = 0; n < TYPE_NFIELDS (type); n++)
1478 {
1479 falign = nds32_type_align (TYPE_FIELD_TYPE (type, n));
1480 if (falign > align)
1481 align = falign;
1482 }
1483 return align;
1484 }
1485 }
1486
1487 /* Implement the "push_dummy_call" gdbarch method. */
1488
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 int struct_return, CORE_ADDR struct_addr)
1494 {
1495 const int REND = 6; /* End for register offset. */
1496 int goff = 0; /* Current gpr offset for argument. */
1497 int foff = 0; /* Current fpr offset for argument. */
1498 int soff = 0; /* Current stack offset for argument. */
1499 int i;
1500 ULONGEST regval;
1501 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1502 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1503 struct type *func_type = value_type (function);
1504 int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
1505 int abi_split = nds32_abi_split (tdep->elf_abi);
1506
1507 /* Set the return address. For the NDS32, the return breakpoint is
1508 always at BP_ADDR. */
1509 regcache_cooked_write_unsigned (regcache, NDS32_LP_REGNUM, bp_addr);
1510
1511 /* If STRUCT_RETURN is true, then the struct return address (in
1512 STRUCT_ADDR) will consume the first argument-passing register.
1513 Both adjust the register count and store that value. */
1514 if (struct_return)
1515 {
1516 regcache_cooked_write_unsigned (regcache, NDS32_R0_REGNUM, struct_addr);
1517 goff++;
1518 }
1519
1520 /* Now make sure there's space on the stack */
1521 for (i = 0; i < nargs; i++)
1522 {
1523 struct type *type = value_type (args[i]);
1524 int align = nds32_type_align (type);
1525
1526 /* If align is zero, it may be an empty struct.
1527 Just ignore the argument of empty struct. */
1528 if (align == 0)
1529 continue;
1530
1531 sp -= TYPE_LENGTH (type);
1532 sp = align_down (sp, align);
1533 }
1534
1535 /* Stack must be 8-byte aligned. */
1536 sp = align_down (sp, 8);
1537
1538 soff = 0;
1539 for (i = 0; i < nargs; i++)
1540 {
1541 const gdb_byte *val;
1542 int align, len;
1543 struct type *type;
1544 int calling_use_fpr;
1545 int use_fpr = 0;
1546
1547 type = value_type (args[i]);
1548 calling_use_fpr = nds32_check_calling_use_fpr (type);
1549 len = TYPE_LENGTH (type);
1550 align = nds32_type_align (type);
1551 val = value_contents (args[i]);
1552
1553 /* The size of a composite type larger than 4 bytes will be rounded
1554 up to the nearest multiple of 4. */
1555 if (len > 4)
1556 len = align_up (len, 4);
1557
1558 /* Variadic functions are handled differently between AABI and ABI2FP+.
1559
1560 For AABI, the caller pushes arguments in registers, callee stores
1561 unnamed arguments in stack, and then va_arg fetch arguments in stack.
1562 Therefore, we don't have to handle variadic functions specially.
1563
1564 For ABI2FP+, the caller pushes only named arguments in registers
1565 and pushes all unnamed arguments in stack. */
1566
1567 if (abi_use_fpr && TYPE_VARARGS (func_type)
1568 && i >= TYPE_NFIELDS (func_type))
1569 goto use_stack;
1570
1571 /* Try to use FPRs to pass arguments only when
1572 1. The program is built using toolchain with FPU support.
1573 2. The type of this argument can use FPR to pass value. */
1574 use_fpr = abi_use_fpr && calling_use_fpr;
1575
1576 if (use_fpr)
1577 {
1578 if (tdep->fpu_freg == -1)
1579 goto error_no_fpr;
1580
1581 /* Adjust alignment. */
1582 if ((align >> 2) > 0)
1583 foff = align_up (foff, align >> 2);
1584
1585 if (foff < REND)
1586 {
1587 switch (len)
1588 {
1589 case 4:
1590 regcache_cooked_write (regcache,
1591 tdep->fs0_regnum + foff, val);
1592 foff++;
1593 break;
1594 case 8:
1595 regcache_cooked_write (regcache,
1596 NDS32_FD0_REGNUM + (foff >> 1), val);
1597 foff += 2;
1598 break;
1599 default:
1600 /* Long double? */
1601 internal_error (__FILE__, __LINE__,
1602 "Do not know how to handle %d-byte double.\n",
1603 len);
1604 break;
1605 }
1606 continue;
1607 }
1608 }
1609 else
1610 {
1611 /*
1612 When passing arguments using GPRs,
1613
1614 * A composite type not larger than 4 bytes is passed in $rN.
1615 The format is as if the value is loaded with load instruction
1616 of corresponding size (e.g., LB, LH, LW).
1617
1618 For example,
1619
1620 r0
1621 31 0
1622 LITTLE: [x x b a]
1623 BIG: [x x a b]
1624
1625 * Otherwise, a composite type is passed in consecutive registers.
1626 The size is rounded up to the nearest multiple of 4.
1627 The successive registers hold the parts of the argument as if
1628 were loaded using lmw instructions.
1629
1630 For example,
1631
1632 r0 r1
1633 31 0 31 0
1634 LITTLE: [d c b a] [x x x e]
1635 BIG: [a b c d] [e x x x]
1636 */
1637
1638 /* Adjust alignment. */
1639 if ((align >> 2) > 0)
1640 goff = align_up (goff, align >> 2);
1641
1642 if (len <= (REND - goff) * 4)
1643 {
1644 /* This argument can be passed wholly via GPRs. */
1645 while (len > 0)
1646 {
1647 regval = extract_unsigned_integer (val, (len > 4) ? 4 : len,
1648 byte_order);
1649 regcache_cooked_write_unsigned (regcache,
1650 NDS32_R0_REGNUM + goff,
1651 regval);
1652 len -= 4;
1653 val += 4;
1654 goff++;
1655 }
1656 continue;
1657 }
1658 else if (abi_split)
1659 {
1660 /* Some parts of this argument can be passed via GPRs. */
1661 while (goff < REND)
1662 {
1663 regval = extract_unsigned_integer (val, (len > 4) ? 4 : len,
1664 byte_order);
1665 regcache_cooked_write_unsigned (regcache,
1666 NDS32_R0_REGNUM + goff,
1667 regval);
1668 len -= 4;
1669 val += 4;
1670 goff++;
1671 }
1672 }
1673 }
1674
1675 use_stack:
1676 /*
1677 When pushing (split parts of) an argument into stack,
1678
1679 * A composite type not larger than 4 bytes is copied to different
1680 base address.
1681 In little-endian, the first byte of this argument is aligned
1682 at the low address of the next free word.
1683 In big-endian, the last byte of this argument is aligned
1684 at the high address of the next free word.
1685
1686 For example,
1687
1688 sp [ - ] [ c ] hi
1689 [ c ] [ b ]
1690 [ b ] [ a ]
1691 [ a ] [ - ] lo
1692 LITTLE BIG
1693 */
1694
1695 /* Adjust alignment. */
1696 soff = align_up (soff, align);
1697
1698 while (len > 0)
1699 {
1700 int rlen = (len > 4) ? 4 : len;
1701
1702 if (byte_order == BFD_ENDIAN_BIG)
1703 write_memory (sp + soff + 4 - rlen, val, rlen);
1704 else
1705 write_memory (sp + soff, val, rlen);
1706
1707 len -= 4;
1708 val += 4;
1709 soff += 4;
1710 }
1711 }
1712
1713 /* Finally, update the SP register. */
1714 regcache_cooked_write_unsigned (regcache, NDS32_SP_REGNUM, sp);
1715
1716 return sp;
1717
1718 error_no_fpr:
1719 /* If use_fpr, but no floating-point register exists,
1720 then it is an error. */
1721 error (_("Fail to call. FPU registers are required."));
1722 }
1723
1724 /* Read, for architecture GDBARCH, a function return value of TYPE
1725 from REGCACHE, and copy that into VALBUF. */
1726
1727 static void
1728 nds32_extract_return_value (struct gdbarch *gdbarch, struct type *type,
1729 struct regcache *regcache, gdb_byte *valbuf)
1730 {
1731 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1732 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1733 int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
1734 int calling_use_fpr;
1735 int len;
1736
1737 calling_use_fpr = nds32_check_calling_use_fpr (type);
1738 len = TYPE_LENGTH (type);
1739
1740 if (abi_use_fpr && calling_use_fpr)
1741 {
1742 if (len == 4)
1743 regcache_cooked_read (regcache, tdep->fs0_regnum, valbuf);
1744 else if (len == 8)
1745 regcache_cooked_read (regcache, NDS32_FD0_REGNUM, valbuf);
1746 else
1747 internal_error (__FILE__, __LINE__,
1748 _("Cannot extract return value of %d bytes "
1749 "long floating-point."), len);
1750 }
1751 else
1752 {
1753 /*
1754 When returning result,
1755
1756 * A composite type not larger than 4 bytes is returned in $r0.
1757 The format is as if the result is loaded with load instruction
1758 of corresponding size (e.g., LB, LH, LW).
1759
1760 For example,
1761
1762 r0
1763 31 0
1764 LITTLE: [x x b a]
1765 BIG: [x x a b]
1766
1767 * Otherwise, a composite type not larger than 8 bytes is returned
1768 in $r0 and $r1.
1769 In little-endian, the first word is loaded in $r0.
1770 In big-endian, the last word is loaded in $r1.
1771
1772 For example,
1773
1774 r0 r1
1775 31 0 31 0
1776 LITTLE: [d c b a] [x x x e]
1777 BIG: [x x x a] [b c d e]
1778 */
1779
1780 ULONGEST tmp;
1781
1782 if (len < 4)
1783 {
1784 /* By using store_unsigned_integer we avoid having to do
1785 anything special for small big-endian values. */
1786 regcache_cooked_read_unsigned (regcache, NDS32_R0_REGNUM, &tmp);
1787 store_unsigned_integer (valbuf, len, byte_order, tmp);
1788 }
1789 else if (len == 4)
1790 {
1791 regcache_cooked_read (regcache, NDS32_R0_REGNUM, valbuf);
1792 }
1793 else if (len < 8)
1794 {
1795 int len1, len2;
1796
1797 len1 = byte_order == BFD_ENDIAN_BIG ? len - 4 : 4;
1798 len2 = len - len1;
1799
1800 regcache_cooked_read_unsigned (regcache, NDS32_R0_REGNUM, &tmp);
1801 store_unsigned_integer (valbuf, len1, byte_order, tmp);
1802
1803 regcache_cooked_read_unsigned (regcache, NDS32_R0_REGNUM + 1, &tmp);
1804 store_unsigned_integer (valbuf + len1, len2, byte_order, tmp);
1805 }
1806 else
1807 {
1808 regcache_cooked_read (regcache, NDS32_R0_REGNUM, valbuf);
1809 regcache_cooked_read (regcache, NDS32_R0_REGNUM + 1, valbuf + 4);
1810 }
1811 }
1812 }
1813
1814 /* Write, for architecture GDBARCH, a function return value of TYPE
1815 from VALBUF into REGCACHE. */
1816
1817 static void
1818 nds32_store_return_value (struct gdbarch *gdbarch, struct type *type,
1819 struct regcache *regcache, const gdb_byte *valbuf)
1820 {
1821 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1822 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1823 int abi_use_fpr = nds32_abi_use_fpr (tdep->elf_abi);
1824 int calling_use_fpr;
1825 int len;
1826
1827 calling_use_fpr = nds32_check_calling_use_fpr (type);
1828 len = TYPE_LENGTH (type);
1829
1830 if (abi_use_fpr && calling_use_fpr)
1831 {
1832 if (len == 4)
1833 regcache_cooked_write (regcache, tdep->fs0_regnum, valbuf);
1834 else if (len == 8)
1835 regcache_cooked_write (regcache, NDS32_FD0_REGNUM, valbuf);
1836 else
1837 internal_error (__FILE__, __LINE__,
1838 _("Cannot store return value of %d bytes "
1839 "long floating-point."), len);
1840 }
1841 else
1842 {
1843 ULONGEST regval;
1844
1845 if (len < 4)
1846 {
1847 regval = extract_unsigned_integer (valbuf, len, byte_order);
1848 regcache_cooked_write_unsigned (regcache, NDS32_R0_REGNUM, regval);
1849 }
1850 else if (len == 4)
1851 {
1852 regcache_cooked_write (regcache, NDS32_R0_REGNUM, valbuf);
1853 }
1854 else if (len < 8)
1855 {
1856 int len1, len2;
1857
1858 len1 = byte_order == BFD_ENDIAN_BIG ? len - 4 : 4;
1859 len2 = len - len1;
1860
1861 regval = extract_unsigned_integer (valbuf, len1, byte_order);
1862 regcache_cooked_write_unsigned (regcache, NDS32_R0_REGNUM, regval);
1863
1864 regval = extract_unsigned_integer (valbuf + len1, len2, byte_order);
1865 regcache_cooked_write_unsigned (regcache, NDS32_R0_REGNUM + 1,
1866 regval);
1867 }
1868 else
1869 {
1870 regcache_cooked_write (regcache, NDS32_R0_REGNUM, valbuf);
1871 regcache_cooked_write (regcache, NDS32_R0_REGNUM + 1, valbuf + 4);
1872 }
1873 }
1874 }
1875
1876 /* Implement the "return_value" gdbarch method.
1877
1878 Determine, for architecture GDBARCH, how a return value of TYPE
1879 should be returned. If it is supposed to be returned in registers,
1880 and READBUF is non-zero, read the appropriate value from REGCACHE,
1881 and copy it into READBUF. If WRITEBUF is non-zero, write the value
1882 from WRITEBUF into REGCACHE. */
1883
1884 static enum return_value_convention
1885 nds32_return_value (struct gdbarch *gdbarch, struct value *func_type,
1886 struct type *type, struct regcache *regcache,
1887 gdb_byte *readbuf, const gdb_byte *writebuf)
1888 {
1889 if (TYPE_LENGTH (type) > 8)
1890 {
1891 return RETURN_VALUE_STRUCT_CONVENTION;
1892 }
1893 else
1894 {
1895 if (readbuf != NULL)
1896 nds32_extract_return_value (gdbarch, type, regcache, readbuf);
1897 if (writebuf != NULL)
1898 nds32_store_return_value (gdbarch, type, regcache, writebuf);
1899
1900 return RETURN_VALUE_REGISTER_CONVENTION;
1901 }
1902 }
1903
1904 /* Implement the "get_longjmp_target" gdbarch method. */
1905
1906 static int
1907 nds32_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
1908 {
1909 gdb_byte buf[4];
1910 CORE_ADDR jb_addr;
1911 struct gdbarch *gdbarch = get_frame_arch (frame);
1912 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1913
1914 jb_addr = get_frame_register_unsigned (frame, NDS32_R0_REGNUM);
1915
1916 if (target_read_memory (jb_addr + 11 * 4, buf, 4))
1917 return 0;
1918
1919 *pc = extract_unsigned_integer (buf, 4, byte_order);
1920 return 1;
1921 }
1922
1923 /* Validate the given TDESC, and fixed-number some registers in it.
1924 Return 0 if the given TDESC does not contain the required feature
1925 or not contain required registers. */
1926
1927 static int
1928 nds32_validate_tdesc_p (const struct target_desc *tdesc,
1929 struct tdesc_arch_data *tdesc_data,
1930 int *fpu_freg, int *use_pseudo_fsrs)
1931 {
1932 const struct tdesc_feature *feature;
1933 int i, valid_p;
1934
1935 feature = tdesc_find_feature (tdesc, "org.gnu.gdb.nds32.core");
1936 if (feature == NULL)
1937 return 0;
1938
1939 valid_p = 1;
1940 /* Validate and fixed-number R0-R10. */
1941 for (i = NDS32_R0_REGNUM; i <= NDS32_R0_REGNUM + 10; i++)
1942 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
1943 nds32_register_names[i]);
1944
1945 /* Validate R15. */
1946 valid_p &= tdesc_unnumbered_register (feature,
1947 nds32_register_names[NDS32_TA_REGNUM]);
1948
1949 /* Validate and fixed-number FP, GP, LP, SP, PC. */
1950 for (i = NDS32_FP_REGNUM; i <= NDS32_PC_REGNUM; i++)
1951 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
1952 nds32_register_names[i]);
1953
1954 if (!valid_p)
1955 return 0;
1956
1957 /* Fixed-number R11-R27. */
1958 for (i = NDS32_R0_REGNUM + 11; i <= NDS32_R0_REGNUM + 27; i++)
1959 tdesc_numbered_register (feature, tdesc_data, i, nds32_register_names[i]);
1960
1961 feature = tdesc_find_feature (tdesc, "org.gnu.gdb.nds32.fpu");
1962 if (feature != NULL)
1963 {
1964 int num_fdr_regs, num_fsr_regs, fs0_regnum, num_listed_fsr;
1965 int freg = -1;
1966
1967 /* Guess FPU configuration via listed registers. */
1968 if (tdesc_unnumbered_register (feature, "fd31"))
1969 freg = 3;
1970 else if (tdesc_unnumbered_register (feature, "fd15"))
1971 freg = 2;
1972 else if (tdesc_unnumbered_register (feature, "fd7"))
1973 freg = 1;
1974 else if (tdesc_unnumbered_register (feature, "fd3"))
1975 freg = 0;
1976
1977 if (freg == -1)
1978 /* Required FDR is not found. */
1979 return 0;
1980 else
1981 *fpu_freg = freg;
1982
1983 /* Validate and fixed-number required FDRs. */
1984 num_fdr_regs = num_fdr_map[freg];
1985 for (i = 0; i < num_fdr_regs; i++)
1986 valid_p &= tdesc_numbered_register (feature, tdesc_data,
1987 NDS32_FD0_REGNUM + i,
1988 nds32_fdr_register_names[i]);
1989 if (!valid_p)
1990 return 0;
1991
1992 /* Count the number of listed FSRs, and fixed-number them if present. */
1993 num_fsr_regs = num_fsr_map[freg];
1994 fs0_regnum = NDS32_FD0_REGNUM + num_fdr_regs;
1995 num_listed_fsr = 0;
1996 for (i = 0; i < num_fsr_regs; i++)
1997 num_listed_fsr += tdesc_numbered_register (feature, tdesc_data,
1998 fs0_regnum + i,
1999 nds32_fsr_register_names[i]);
2000
2001 if (num_listed_fsr == 0)
2002 /* No required FSRs are listed explicitly, make them pseudo registers
2003 of FDRs. */
2004 *use_pseudo_fsrs = 1;
2005 else if (num_listed_fsr == num_fsr_regs)
2006 /* All required FSRs are listed explicitly. */
2007 *use_pseudo_fsrs = 0;
2008 else
2009 /* Some required FSRs are missing. */
2010 return 0;
2011 }
2012
2013 return 1;
2014 }
2015
2016 /* Initialize the current architecture based on INFO. If possible,
2017 re-use an architecture from ARCHES, which is a list of
2018 architectures already created during this debugging session.
2019
2020 Called e.g. at program startup, when reading a core file, and when
2021 reading a binary file. */
2022
2023 static struct gdbarch *
2024 nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
2025 {
2026 struct gdbarch *gdbarch;
2027 struct gdbarch_tdep *tdep;
2028 struct gdbarch_list *best_arch;
2029 struct tdesc_arch_data *tdesc_data = NULL;
2030 const struct target_desc *tdesc = info.target_desc;
2031 int elf_abi = E_NDS_ABI_AABI;
2032 int fpu_freg = -1;
2033 int use_pseudo_fsrs = 0;
2034 int i, num_regs, maxregs;
2035
2036 /* Extract the elf_flags if available. */
2037 if (info.abfd && bfd_get_flavour (info.abfd) == bfd_target_elf_flavour)
2038 elf_abi = elf_elfheader (info.abfd)->e_flags & EF_NDS_ABI;
2039
2040 /* If there is already a candidate, use it. */
2041 for (best_arch = gdbarch_list_lookup_by_info (arches, &info);
2042 best_arch != NULL;
2043 best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
2044 {
2045 struct gdbarch_tdep *idep = gdbarch_tdep (best_arch->gdbarch);
2046
2047 if (idep->elf_abi != elf_abi)
2048 continue;
2049
2050 /* Found a match. */
2051 break;
2052 }
2053
2054 if (best_arch != NULL)
2055 return best_arch->gdbarch;
2056
2057 if (!tdesc_has_registers (tdesc))
2058 tdesc = tdesc_nds32;
2059
2060 tdesc_data = tdesc_data_alloc ();
2061
2062 if (!nds32_validate_tdesc_p (tdesc, tdesc_data, &fpu_freg, &use_pseudo_fsrs))
2063 {
2064 tdesc_data_cleanup (tdesc_data);
2065 return NULL;
2066 }
2067
2068 /* Allocate space for the new architecture. */
2069 tdep = XCNEW (struct gdbarch_tdep);
2070 tdep->fpu_freg = fpu_freg;
2071 tdep->use_pseudo_fsrs = use_pseudo_fsrs;
2072 tdep->fs0_regnum = -1;
2073 tdep->elf_abi = elf_abi;
2074
2075 gdbarch = gdbarch_alloc (&info, tdep);
2076
2077 set_gdbarch_wchar_bit (gdbarch, 16);
2078 set_gdbarch_wchar_signed (gdbarch, 0);
2079
2080 if (fpu_freg == -1)
2081 num_regs = NDS32_NUM_REGS;
2082 else if (use_pseudo_fsrs == 1)
2083 {
2084 set_gdbarch_pseudo_register_read (gdbarch, nds32_pseudo_register_read);
2085 set_gdbarch_pseudo_register_write (gdbarch, nds32_pseudo_register_write);
2086 set_tdesc_pseudo_register_name (gdbarch, nds32_pseudo_register_name);
2087 set_tdesc_pseudo_register_type (gdbarch, nds32_pseudo_register_type);
2088 set_gdbarch_num_pseudo_regs (gdbarch, num_fsr_map[fpu_freg]);
2089
2090 num_regs = NDS32_NUM_REGS + num_fdr_map[fpu_freg];
2091 }
2092 else
2093 num_regs = NDS32_NUM_REGS + num_fdr_map[fpu_freg] + num_fsr_map[fpu_freg];
2094
2095 set_gdbarch_num_regs (gdbarch, num_regs);
2096 tdesc_use_registers (gdbarch, tdesc, tdesc_data);
2097
2098 /* Cache the register number of fs0. */
2099 if (fpu_freg != -1)
2100 tdep->fs0_regnum = user_reg_map_name_to_regnum (gdbarch, "fs0", -1);
2101
2102 /* Add NDS32 register aliases. To avoid search in user register name space,
2103 user_reg_map_name_to_regnum is not used. */
2104 maxregs = (gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch));
2105 for (i = 0; i < ARRAY_SIZE (nds32_register_aliases); i++)
2106 {
2107 int regnum, j;
2108
2109 regnum = -1;
2110 /* Search register name space. */
2111 for (j = 0; j < maxregs; j++)
2112 {
2113 const char *regname = gdbarch_register_name (gdbarch, j);
2114
2115 if (regname != NULL
2116 && strcmp (regname, nds32_register_aliases[i].name) == 0)
2117 {
2118 regnum = j;
2119 break;
2120 }
2121 }
2122
2123 /* Try next alias entry if the given name can not be found in register
2124 name space. */
2125 if (regnum == -1)
2126 continue;
2127
2128 user_reg_add (gdbarch, nds32_register_aliases[i].alias,
2129 value_of_nds32_reg, (const void *) (intptr_t) regnum);
2130 }
2131
2132 nds32_add_reggroups (gdbarch);
2133
2134 /* Hook in ABI-specific overrides, if they have been registered. */
2135 info.tdesc_data = tdesc_data;
2136 gdbarch_init_osabi (info, gdbarch);
2137
2138 /* Override tdesc_register callbacks for system registers. */
2139 set_gdbarch_register_reggroup_p (gdbarch, nds32_register_reggroup_p);
2140
2141 set_gdbarch_sp_regnum (gdbarch, NDS32_SP_REGNUM);
2142 set_gdbarch_pc_regnum (gdbarch, NDS32_PC_REGNUM);
2143 set_gdbarch_unwind_sp (gdbarch, nds32_unwind_sp);
2144 set_gdbarch_unwind_pc (gdbarch, nds32_unwind_pc);
2145 set_gdbarch_stack_frame_destroyed_p (gdbarch, nds32_stack_frame_destroyed_p);
2146 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, nds32_dwarf2_reg_to_regnum);
2147
2148 set_gdbarch_push_dummy_call (gdbarch, nds32_push_dummy_call);
2149 set_gdbarch_return_value (gdbarch, nds32_return_value);
2150 set_gdbarch_dummy_id (gdbarch, nds32_dummy_id);
2151
2152 set_gdbarch_skip_prologue (gdbarch, nds32_skip_prologue);
2153 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
2154 set_gdbarch_breakpoint_kind_from_pc (gdbarch,
2155 nds32_breakpoint::kind_from_pc);
2156 set_gdbarch_sw_breakpoint_from_kind (gdbarch,
2157 nds32_breakpoint::bp_from_kind);
2158
2159 set_gdbarch_frame_align (gdbarch, nds32_frame_align);
2160 frame_base_set_default (gdbarch, &nds32_frame_base);
2161
2162 /* Handle longjmp. */
2163 set_gdbarch_get_longjmp_target (gdbarch, nds32_get_longjmp_target);
2164
2165 /* The order of appending is the order it check frame. */
2166 dwarf2_append_unwinders (gdbarch);
2167 frame_unwind_append_unwinder (gdbarch, &nds32_epilogue_frame_unwind);
2168 frame_unwind_append_unwinder (gdbarch, &nds32_frame_unwind);
2169
2170 return gdbarch;
2171 }
2172
2173 void
2174 _initialize_nds32_tdep (void)
2175 {
2176 /* Initialize gdbarch. */
2177 register_gdbarch_init (bfd_arch_nds32, nds32_gdbarch_init);
2178
2179 initialize_tdesc_nds32 ();
2180 nds32_init_reggroups ();
2181 }
reggroup_add
void reggroup_add(struct gdbarch *gdbarch, struct reggroup *group)
Definition: reggroups.c:117
set_gdbarch_num_regs
void set_gdbarch_num_regs(struct gdbarch *gdbarch, int num_regs)
Definition: gdbarch.c:2050
gdbarch
Definition: gdbarch.c:127
set_gdbarch_frame_align
void set_gdbarch_frame_align(struct gdbarch *gdbarch, gdbarch_frame_align_ftype frame_align)
Definition: gdbarch.c:3151
nds32_return_value
static enum return_value_convention nds32_return_value(struct gdbarch *gdbarch, struct value *func_type, struct type *type, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf)
Definition: nds32-tdep.c:1885
TYPE_CODE_BOOL
Definition: gdbtypes.h:164
nds32_cr_reggroup
static struct reggroup * nds32_cr_reggroup
Definition: nds32-tdep.c:317
BP_MANIPULATION
typedef BP_MANIPULATION(nds32_break_insn)
Definition: nds32-tdep.c:285
type_code
type_code
Definition: gdbtypes.h:80
NDS32_LP_REGNUM
Definition: nds32-tdep.h:32
TYPE_CODE_ARRAY
Definition: gdbtypes.h:104
nds32_pfr_reggroup
static struct reggroup * nds32_pfr_reggroup
Definition: nds32-tdep.c:321
nds32_frame_prev_register
static struct value * nds32_frame_prev_register(struct frame_info *this_frame, void **this_cache, int regnum)
Definition: nds32-tdep.c:978
nds32.c
N32_LSMW_ENABLE4
#define N32_LSMW_ENABLE4(insn)
Definition: nds32-tdep.c:50
frame_id_build
struct frame_id frame_id_build(CORE_ADDR stack_addr, CORE_ADDR code_addr)
Definition: frame.c:624
ADD
Definition: aarch64-insn.h:74
set_gdbarch_get_longjmp_target
void set_gdbarch_get_longjmp_target(struct gdbarch *gdbarch, gdbarch_get_longjmp_target_ftype get_longjmp_target)
Definition: gdbarch.c:2572
tdesc_register_in_reggroup_p
int tdesc_register_in_reggroup_p(struct gdbarch *gdbarch, int regno, struct reggroup *reggroup)
Definition: target-descriptions.c:1292
nds32_epilogue_frame_sniffer
static int nds32_epilogue_frame_sniffer(const struct frame_unwind *self, struct frame_info *this_frame, void **this_cache)
Definition: nds32-tdep.c:1296
REG_VALID
Definition: common-regcache.h:32
nds32_frame_this_id
static void nds32_frame_this_id(struct frame_info *this_frame, void **this_cache, struct frame_id *this_id)
Definition: nds32-tdep.c:963
TYPE_CODE_ENUM
Definition: gdbtypes.h:108
nds32_gdbarch_init
static struct gdbarch * nds32_gdbarch_init(struct gdbarch_info info, struct gdbarch_list *arches)
Definition: nds32-tdep.c:2024
nds32_add_reggroups
static void nds32_add_reggroups(struct gdbarch *gdbarch)
Definition: nds32-tdep.c:344
set_tdesc_pseudo_register_name
void set_tdesc_pseudo_register_name(struct gdbarch *gdbarch, gdbarch_register_name_ftype *pseudo_name)
Definition: target-descriptions.c:1341
get_frame_pc
CORE_ADDR get_frame_pc(struct frame_info *frame)
Definition: frame.c:2376
gdbarch_tdep::elf_abi
int elf_abi
Definition: nds32-tdep.h:52
CORE_ADDR
bfd_vma CORE_ADDR
Definition: common-types.h:41
gdbarch_tdep::fs0_regnum
int fs0_regnum
Definition: nds32-tdep.h:50
INSN_RECOVER_RETURN
Definition: nds32-tdep.c:76
gdbarch_init_osabi
void gdbarch_init_osabi(struct gdbarch_info info, struct gdbarch *gdbarch)
Definition: osabi.c:334
nds32_dr_reggroup
static struct reggroup * nds32_dr_reggroup
Definition: nds32-tdep.c:320
reggroup_new
struct reggroup * reggroup_new(const char *name, enum reggroup_type type)
Definition: reggroups.c:40
alias
const char * alias
Definition: nds32-tdep.c:114
set_gdbarch_wchar_bit
void set_gdbarch_wchar_bit(struct gdbarch *gdbarch, int wchar_bit)
Definition: gdbarch.c:1789
NDS32_FP_REGNUM
Definition: nds32-tdep.h:30
num_fdr_map
const int num_fdr_map[]
Definition: nds32-tdep.c:107
INSN_NORMAL
Definition: nds32-tdep.c:68
frame_unwind_got_memory
struct value * frame_unwind_got_memory(struct frame_info *frame, int regnum, CORE_ADDR addr)
Definition: frame-unwind.c:233
set_tdesc_pseudo_register_type
void set_tdesc_pseudo_register_type(struct gdbarch *gdbarch, gdbarch_register_type_ftype *pseudo_type)
Definition: target-descriptions.c:1351
func_type
Definition: gdbtypes.h:1059
warning
void warning(const char *fmt,...)
Definition: errors.c:26
nds32_frame_cache::fp_offset
CORE_ADDR fp_offset
Definition: nds32-tdep.c:547
N32_LMW_BIM
#define N32_LMW_BIM
Definition: nds32-tdep.c:53
RETURN_VALUE_STRUCT_CONVENTION
Definition: defs.h:258
align_down
ULONGEST align_down(ULONGEST v, int n)
Definition: utils.c:3005
frame_unwind_register_unsigned
ULONGEST frame_unwind_register_unsigned(struct frame_info *frame, int regnum)
Definition: frame.c:1279
reggroups.h
TYPE_CODE_RANGE
Definition: gdbtypes.h:127
TYPE_CODE_INT
Definition: gdbtypes.h:111
nds32_epilogue_frame_this_id
static void nds32_epilogue_frame_this_id(struct frame_info *this_frame, void **this_cache, struct frame_id *this_id)
Definition: nds32-tdep.c:1344
internal_error
void internal_error(const char *file, int line, const char *fmt,...)
Definition: errors.c:50
tdesc_nds32
struct target_desc * tdesc_nds32
Definition: nds32.c:8
TYPE_CODE_SET
Definition: gdbtypes.h:126
gdbarch_tdep::pc
struct m32c_reg * pc
Definition: m32c-tdep.c:116
gdbarch_tdep
Definition: aarch64-tdep.h:55
return_value_convention
return_value_convention
Definition: defs.h:247
REG_UNAVAIL
Definition: nds32-tdep.c:59
gdbarch_tdep::num_regs
int num_regs
Definition: m32c-tdep.c:113
set_gdbarch_register_reggroup_p
void set_gdbarch_register_reggroup_p(struct gdbarch *gdbarch, gdbarch_register_reggroup_p_ftype register_reggroup_p)
Definition: gdbarch.c:3599
frame_info
Definition: frame.c:85
nds32_analyze_epilogue
static int nds32_analyze_epilogue(struct gdbarch *gdbarch, CORE_ADDR pc, struct nds32_frame_cache *cache)
Definition: nds32-tdep.c:1176
nds32_frame_cache
static struct nds32_frame_cache * nds32_frame_cache(struct frame_info *this_frame, void **this_cache)
Definition: nds32-tdep.c:912
gdbarch_list_lookup_by_info
struct gdbarch_list * gdbarch_list_lookup_by_info(struct gdbarch_list *arches, const struct gdbarch_info *info)
Definition: gdbarch.c:5309
register_status
register_status
Definition: common-regcache.h:25
skip_prologue_using_sal
CORE_ADDR skip_prologue_using_sal(struct gdbarch *gdbarch, CORE_ADDR func_addr)
Definition: symtab.c:3854
gdbarch_list::next
struct gdbarch_list * next
Definition: gdbarch.h:1623
restore_reggroup
struct reggroup *const restore_reggroup
Definition: reggroups.c:320
gdbarch_num_regs
int gdbarch_num_regs(struct gdbarch *gdbarch)
Definition: gdbarch.c:2039
nds32_ir_reggroup
static struct reggroup * nds32_ir_reggroup
Definition: nds32-tdep.c:318
all_reggroup
struct reggroup *const all_reggroup
Definition: reggroups.c:318
nds32_abi_split
static int nds32_abi_split(int elf_abi)
Definition: nds32-tdep.c:525
_
#define _(String)
Definition: gdb_locale.h:35
nds32_frame_cache::sp_offset
CORE_ADDR sp_offset
Definition: nds32-tdep.c:546
set_gdbarch_dwarf2_reg_to_regnum
void set_gdbarch_dwarf2_reg_to_regnum(struct gdbarch *gdbarch, gdbarch_dwarf2_reg_to_regnum_ftype dwarf2_reg_to_regnum)
Definition: gdbarch.c:2275
nds32_stack_frame_destroyed_p
static int nds32_stack_frame_destroyed_p(struct gdbarch *gdbarch, CORE_ADDR addr)
Definition: nds32-tdep.c:1228
defs.h
nds32_store_return_value
static void nds32_store_return_value(struct gdbarch *gdbarch, struct type *type, struct regcache *regcache, const gdb_byte *valbuf)
Definition: nds32-tdep.c:1818
gdbarch_tdep
struct gdbarch_tdep * gdbarch_tdep(struct gdbarch *gdbarch)
Definition: gdbarch.c:1491
tdesc_data_cleanup
void tdesc_data_cleanup(void *data_untyped)
Definition: target-descriptions.c:1061
TYPE_FIELD_TYPE
#define TYPE_FIELD_TYPE(thistype, n)
Definition: gdbtypes.h:1371
N32_FLDI_SP
#define N32_FLDI_SP
Definition: nds32-tdep.c:55
reggroup
Definition: reggroups.c:33
frame_unwind_append_unwinder
void frame_unwind_append_unwinder(struct gdbarch *gdbarch, const struct frame_unwind *unwinder)
Definition: frame-unwind.c:79
set_gdbarch_wchar_signed
void set_gdbarch_wchar_signed(struct gdbarch *gdbarch, int wchar_signed)
Definition: gdbarch.c:1807
FRAME_OBSTACK_ZALLOC
#define FRAME_OBSTACK_ZALLOC(TYPE)
Definition: frame.h:678
arch-utils.h
frame_unwind_got_constant
struct value * frame_unwind_got_constant(struct frame_info *frame, int regnum, ULONGEST val)
Definition: frame-unwind.c:246
nds32_init_reggroups
static void nds32_init_reggroups(void)
Definition: nds32-tdep.c:329
nds32_check_calling_use_fpr
static int nds32_check_calling_use_fpr(struct type *type)
Definition: nds32-tdep.c:1421
nds32_hspr_reggroup
static struct reggroup * nds32_hspr_reggroup
Definition: nds32-tdep.c:322
gdbarch_num_pseudo_regs
int gdbarch_num_pseudo_regs(struct gdbarch *gdbarch)
Definition: gdbarch.c:2057
nds32_abi_use_fpr
static int nds32_abi_use_fpr(int elf_abi)
Definition: nds32-tdep.c:516
symtab.h
float_reggroup
struct reggroup *const float_reggroup
Definition: reggroups.c:315
tdesc_numbered_register
int tdesc_numbered_register(const struct tdesc_feature *feature, struct tdesc_arch_data *data, int regno, const char *name)
Definition: target-descriptions.c:1084
frame_base_set_default
void frame_base_set_default(struct gdbarch *gdbarch, const struct frame_base *default_base)
Definition: frame-base.c:95
nds32_push_multiple_words
static void nds32_push_multiple_words(struct nds32_frame_cache *cache, int rb, int re, int enable4)
Definition: nds32-tdep.c:580
set_gdbarch_pseudo_register_write
void set_gdbarch_pseudo_register_write(struct gdbarch *gdbarch, gdbarch_pseudo_register_write_ftype pseudo_register_write)
Definition: gdbarch.c:2032
check_typedef
struct type * check_typedef(struct type *type)
Definition: gdbtypes.c:2421
NORMAL_FRAME
Definition: frame.h:244
value_contents
const gdb_byte * value_contents(struct value *value)
Definition: value.c:1407
general_reggroup
struct reggroup *const general_reggroup
Definition: reggroups.c:314
TYPE_CODE_CHAR
Definition: gdbtypes.h:160
nds32_frame_base
static const struct frame_base nds32_frame_base
Definition: nds32-tdep.c:1018
nds32_racr_reggroup
static struct reggroup * nds32_racr_reggroup
Definition: nds32-tdep.c:324
set_gdbarch_stack_frame_destroyed_p
void set_gdbarch_stack_frame_destroyed_p(struct gdbarch *gdbarch, gdbarch_stack_frame_destroyed_p_ftype stack_frame_destroyed_p)
Definition: gdbarch.c:3367
extract_unsigned_integer
static ULONGEST extract_unsigned_integer(const gdb_byte *addr, int len, enum bfd_endian byte_order)
Definition: defs.h:577
regcache_cooked_read_unsigned
enum register_status regcache_cooked_read_unsigned(struct regcache *regcache, int regnum, ULONGEST *val)
Definition: regcache.c:777
osabi.h
system_reggroup
struct reggroup *const system_reggroup
Definition: reggroups.c:316
arch_float_type
struct type * arch_float_type(struct gdbarch *gdbarch, int bit, const char *name, const struct floatformat **floatformats)
Definition: gdbtypes.c:5014
regcache.h
set_gdbarch_sp_regnum
void set_gdbarch_sp_regnum(struct gdbarch *gdbarch, int sp_regnum)
Definition: gdbarch.c:2156
gdbarch_info::abfd
bfd * abfd
Definition: gdbarch.h:1637
set_gdbarch_dummy_id
void set_gdbarch_dummy_id(struct gdbarch *gdbarch, gdbarch_dummy_id_ftype dummy_id)
Definition: gdbarch.c:2340
struct_return
struct_return
Definition: arm-tdep.h:88
frame.h
TYPE_CODE_FLT
Definition: gdbtypes.h:116
gdb_assert_not_reached
#define gdb_assert_not_reached(message)
Definition: gdb_assert.h:55
nds32_type_align
static int nds32_type_align(struct type *type)
Definition: nds32-tdep.c:1445
NDS32_NUM_SAVED_REGS
#define NDS32_NUM_SAVED_REGS
Definition: nds32-tdep.c:530
nds32_secur_reggroup
static struct reggroup * nds32_secur_reggroup
Definition: nds32-tdep.c:326
gdbarch_byte_order
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
Definition: gdbarch.c:1509
inferior.h
TYPE_CODE_UNION
Definition: gdbtypes.h:107
nds32_frame_cache
Definition: nds32-tdep.c:532
nds32_fsr_register_names
static const char *const nds32_fsr_register_names[]
Definition: nds32-tdep.c:98
type
Definition: gdbtypes.h:749
find_pc_partial_function
int find_pc_partial_function(CORE_ADDR pc, const char **name, CORE_ADDR *address, CORE_ADDR *endaddr)
Definition: blockframe.c:320
gdbarch_tdep::use_pseudo_fsrs
int use_pseudo_fsrs
Definition: nds32-tdep.h:48
nds32_analyze_prologue
static CORE_ADDR nds32_analyze_prologue(struct gdbarch *gdbarch, CORE_ADDR pc, CORE_ADDR limit_pc, struct nds32_frame_cache *cache)
Definition: nds32-tdep.c:616
frame-unwind.h
set_gdbarch_unwind_pc
void set_gdbarch_unwind_pc(struct gdbarch *gdbarch, gdbarch_unwind_pc_ftype unwind_pc)
Definition: gdbarch.c:3079
nds32_unwind_pc
static CORE_ADDR nds32_unwind_pc(struct gdbarch *gdbarch, struct frame_info *next_frame)
Definition: nds32-tdep.c:1404
default_frame_sniffer
int default_frame_sniffer(const struct frame_unwind *self, struct frame_info *this_frame, void **this_prologue_cache)
Definition: frame-unwind.c:174
nds32_fdr_register_names
static const char *const nds32_fdr_register_names[]
Definition: nds32-tdep.c:90
initialize_tdesc_nds32
static void initialize_tdesc_nds32(void)
Definition: nds32.c:10
type
static const char * type
Definition: language.c:113
nds32_mr_reggroup
static struct reggroup * nds32_mr_reggroup
Definition: nds32-tdep.c:319
NDS32_PC_REGNUM
Definition: nds32-tdep.h:35
nds32_register_aliases
static const struct @132 nds32_register_aliases[]
gdbarch_register_name
const char * gdbarch_register_name(struct gdbarch *gdbarch, int regnr)
Definition: gdbarch.c:2282
status
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int status
Definition: gnu-nat.c:1822
INSN_RECOVER
Definition: nds32-tdep.c:72
USER_REGGROUP
Definition: reggroups.h:28
INVALID_OFFSET
Definition: nds32-tdep.c:62
num_fsr_map
const int num_fsr_map[]
Definition: nds32-tdep.c:108
nds32_push_dummy_call
static CORE_ADDR nds32_push_dummy_call(struct gdbarch *gdbarch, struct value *function, struct regcache *regcache, CORE_ADDR bp_addr, int nargs, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr)
Definition: nds32-tdep.c:1490
set_gdbarch_unwind_sp
void set_gdbarch_unwind_sp(struct gdbarch *gdbarch, gdbarch_unwind_sp_ftype unwind_sp)
Definition: gdbarch.c:3103
nds32_epilogue_frame_cache
static struct nds32_frame_cache * nds32_epilogue_frame_cache(struct frame_info *this_frame, void **this_cache)
Definition: nds32-tdep.c:1312
gdbarch_list::gdbarch
struct gdbarch * gdbarch
Definition: gdbarch.h:1622
tdesc_feature
Definition: target-descriptions.c:516
nds32_validate_tdesc_p
static int nds32_validate_tdesc_p(const struct target_desc *tdesc, struct tdesc_arch_data *tdesc_data, int *fpu_freg, int *use_pseudo_fsrs)
Definition: nds32-tdep.c:1928
regnum
int regnum
Definition: aarch64-tdep.c:77
frame_base
Definition: frame-base.h:58
nds32_alloc_frame_cache
static struct nds32_frame_cache * nds32_alloc_frame_cache(void)
Definition: nds32-tdep.c:559
user_reg_map_name_to_regnum
int user_reg_map_name_to_regnum(struct gdbarch *gdbarch, const char *name, int len)
Definition: user-regs.c:130
get_frame_register_unsigned
ULONGEST get_frame_register_unsigned(struct frame_info *frame, int regnum)
Definition: frame.c:1308
TYPE_CODE_STRUCT
Definition: gdbtypes.h:106
frame-base.h
gdbarch_tdep::fpu_freg
int fpu_freg
Definition: nds32-tdep.h:46
set_gdbarch_breakpoint_kind_from_pc
void set_gdbarch_breakpoint_kind_from_pc(struct gdbarch *gdbarch, gdbarch_breakpoint_kind_from_pc_ftype breakpoint_kind_from_pc)
Definition: gdbarch.c:2871
nds32_idr_reggroup
static struct reggroup * nds32_idr_reggroup
Definition: nds32-tdep.c:325
TYPE_CODE_REF
Definition: gdbtypes.h:156
nds32_skip_prologue
static CORE_ADDR nds32_skip_prologue(struct gdbarch *gdbarch, CORE_ADDR pc)
Definition: nds32-tdep.c:878
user-regs.h
gdb_assert
#define gdb_assert(expr)
Definition: gdb_assert.h:32
gdbarch_info::target_desc
const struct target_desc * target_desc
Definition: gdbarch.h:1660
value
Definition: value.c:169
floatformats_ieee_single
const struct floatformat * floatformats_ieee_single[BFD_ENDIAN_UNKNOWN]
Definition: gdbtypes.c:72
nds32_pseudo_register_write
static void nds32_pseudo_register_write(struct gdbarch *gdbarch, struct regcache *regcache, int regnum, const gdb_byte *buf)
Definition: nds32-tdep.c:478
TYPE_CODE_PTR
Definition: gdbtypes.h:84
tdesc_use_registers
void tdesc_use_registers(struct gdbarch *gdbarch, const struct target_desc *target_desc, struct tdesc_arch_data *early_data)
Definition: target-descriptions.c:1374
core_addr_lessthan
int core_addr_lessthan(CORE_ADDR lhs, CORE_ADDR rhs)
Definition: arch-utils.c:117
gdb_byte
bfd_byte gdb_byte
Definition: common-types.h:38
nds32_frame_base_address
static CORE_ADDR nds32_frame_base_address(struct frame_info *this_frame, void **this_cache)
Definition: nds32-tdep.c:1011
NDS32_NUM_REGS
Definition: nds32-tdep.h:37
set_gdbarch_pseudo_register_read
void set_gdbarch_pseudo_register_read(struct gdbarch *gdbarch, gdbarch_pseudo_register_read_ftype pseudo_register_read)
Definition: gdbarch.c:1984
align_up
ULONGEST align_up(ULONGEST v, int n)
Definition: utils.c:2997
TYPE_VARARGS
#define TYPE_VARARGS(t)
Definition: gdbtypes.h:247
CHOP_BITS
#define CHOP_BITS(insn, n)
Definition: nds32-tdep.c:49
TYPE_TARGET_TYPE
#define TYPE_TARGET_TYPE(thistype)
Definition: gdbtypes.h:1226
dwarf2-frame.h
INSN_RESET_SP
Definition: nds32-tdep.c:70
XCNEW
#define XCNEW(T)
Definition: poison.h:121
gdbcore.h
frame_relative_level
int frame_relative_level(struct frame_info *fi)
Definition: frame.c:2610
TYPE_CODE
#define TYPE_CODE(thistype)
Definition: gdbtypes.h:1238
value_of_register
struct value * value_of_register(int regnum, struct frame_info *frame)
Definition: findvar.c:263
regcache_raw_read
enum register_status regcache_raw_read(struct regcache *regcache, int regnum, gdb_byte *buf)
Definition: regcache.c:565
regcache_cooked_write_unsigned
void regcache_cooked_write_unsigned(struct regcache *regcache, int regnum, ULONGEST val)
Definition: regcache.c:806
frame_unwind_got_register
struct value * frame_unwind_got_register(struct frame_info *frame, int regnum, int new_regnum)
Definition: frame-unwind.c:223
target_read_memory
int target_read_memory(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
Definition: target.c:1370
nds32_pseudo_register_read
static enum register_status nds32_pseudo_register_read(struct gdbarch *gdbarch, struct regcache *regcache, int regnum, gdb_byte *buf)
Definition: nds32-tdep.c:439
nds32_frame_unwind
static const struct frame_unwind nds32_frame_unwind
Definition: nds32-tdep.c:998
nds32_unwind_sp
static CORE_ADDR nds32_unwind_sp(struct gdbarch *gdbarch, struct frame_info *next_frame)
Definition: nds32-tdep.c:1412
nds32_frame_cache::base
CORE_ADDR base
Definition: nds32-tdep.c:539
target_desc
Definition: target-descriptions.c:591
nds32_epilogue_frame_unwind
static const struct frame_unwind nds32_epilogue_frame_unwind
Definition: nds32-tdep.c:1381
offset
int offset
Definition: agent.c:65
nds32_dummy_id
static struct frame_id nds32_dummy_id(struct gdbarch *gdbarch, struct frame_info *this_frame)
Definition: nds32-tdep.c:1394
TYPE_NFIELDS
#define TYPE_NFIELDS(thistype)
Definition: gdbtypes.h:1239
target-descriptions.h
set_gdbarch_num_pseudo_regs
void set_gdbarch_num_pseudo_regs(struct gdbarch *gdbarch, int num_pseudo_regs)
Definition: gdbarch.c:2067
dwarf2_append_unwinders
void dwarf2_append_unwinders(struct gdbarch *gdbarch)
Definition: dwarf2-frame.c:1384
regcache_cooked_read
enum register_status regcache_cooked_read(struct regcache *regcache, int regnum, gdb_byte *buf)
Definition: regcache.c:661
nds32_analyze_epilogue_insn32
static int nds32_analyze_epilogue_insn32(int abi_use_fpr, uint32_t insn, struct nds32_frame_cache *cache)
Definition: nds32-tdep.c:1071
remote.h
nds32_frame_cache::pc
CORE_ADDR pc
Definition: nds32-tdep.c:550
NDS32_SP_REGNUM
Definition: nds32-tdep.h:33
name
const char * name
Definition: nds32-tdep.c:113
value.h
frame_unwind
Definition: frame-unwind.h:144
gdbarch_tdep::tdesc
const struct target_desc * tdesc
Definition: i386-tdep.h:204
nds32_analyze_epilogue_insn16
static int nds32_analyze_epilogue_insn16(uint32_t insn, struct nds32_frame_cache *cache)
Definition: nds32-tdep.c:1128
nds32_frame_align
static CORE_ADDR nds32_frame_align(struct gdbarch *gdbarch, CORE_ADDR sp)
Definition: nds32-tdep.c:276
tdesc_data_alloc
struct tdesc_arch_data * tdesc_data_alloc(void)
Definition: target-descriptions.c:1051
nds32_get_longjmp_target
static int nds32_get_longjmp_target(struct frame_info *frame, CORE_ADDR *pc)
Definition: nds32-tdep.c:1907
NDS32_FD0_REGNUM
Definition: nds32-tdep.h:40
gdbtypes.h
ULONGEST
unsigned long long ULONGEST
Definition: common-types.h:53
default_frame_unwind_stop_reason
enum unwind_stop_reason default_frame_unwind_stop_reason(struct frame_info *this_frame, void **this_cache)
Definition: frame-unwind.c:184
INSN_RETURN
Definition: nds32-tdep.c:74
tdesc_find_feature
const struct tdesc_feature * tdesc_find_feature(const struct target_desc *target_desc, const char *name)
Definition: target-descriptions.c:942
tdesc_arch_data
Definition: target-descriptions.c:670
regcache
Definition: regcache.h:232
gdbarch_info
Definition: gdbarch.h:1626
user_reg_add
void user_reg_add(struct gdbarch *gdbarch, const char *name, user_reg_read_ftype *read, const void *baton)
Definition: user-regs.c:112
value_type
struct type * value_type(const struct value *value)
Definition: value.c:1095
N32_SMW_ADM
#define N32_SMW_ADM
Definition: nds32-tdep.c:51
set_gdbarch_return_value
void set_gdbarch_return_value(struct gdbarch *gdbarch, gdbarch_return_value_ftype return_value)
Definition: gdbarch.c:2738
nds32_register_reggroup_p
static int nds32_register_reggroup_p(struct gdbarch *gdbarch, int regnum, struct reggroup *reggroup)
Definition: nds32-tdep.c:370
nds32_register_names
static const char *const nds32_register_names[]
Definition: nds32-tdep.c:79
nds32_pseudo_register_name
static const char * nds32_pseudo_register_name(struct gdbarch *gdbarch, int regnum)
Definition: nds32-tdep.c:424
default_register_reggroup_p
int default_register_reggroup_p(struct gdbarch *gdbarch, int regnum, struct reggroup *group)
Definition: reggroups.c:192
save_reggroup
struct reggroup *const save_reggroup
Definition: reggroups.c:319
TYPE_LENGTH
#define TYPE_LENGTH(thistype)
Definition: gdbtypes.h:1235
set_gdbarch_push_dummy_call
void set_gdbarch_push_dummy_call(struct gdbarch *gdbarch, gdbarch_push_dummy_call_ftype push_dummy_call)
Definition: gdbarch.c:2381
nds32-tdep.h
read_memory_unsigned_integer
ULONGEST read_memory_unsigned_integer(CORE_ADDR memaddr, int len, enum bfd_endian byte_order)
Definition: corefile.c:326
nds32_pseudo_register_type
static struct type * nds32_pseudo_register_type(struct gdbarch *gdbarch, int regnum)
Definition: nds32-tdep.c:408
nds32_dmar_reggroup
static struct reggroup * nds32_dmar_reggroup
Definition: nds32-tdep.c:323
set_gdbarch_sw_breakpoint_from_kind
void set_gdbarch_sw_breakpoint_from_kind(struct gdbarch *gdbarch, gdbarch_sw_breakpoint_from_kind_ftype sw_breakpoint_from_kind)
Definition: gdbarch.c:2888
nds32_frame_cache::saved_regs
CORE_ADDR saved_regs[NDS32_NUM_SAVED_REGS]
Definition: nds32-tdep.c:553
value_of_nds32_reg
static struct value * value_of_nds32_reg(struct frame_info *frame, const void *baton)
Definition: nds32-tdep.c:268
register_gdbarch_init
void register_gdbarch_init(enum bfd_architecture bfd_architecture, gdbarch_init_ftype *init)
Definition: gdbarch.c:5299
_initialize_nds32_tdep
void _initialize_nds32_tdep(void)
Definition: nds32-tdep.c:2174
write_memory
void write_memory(CORE_ADDR memaddr, const bfd_byte *myaddr, ssize_t len)
Definition: corefile.c:394
set_gdbarch_skip_prologue
void set_gdbarch_skip_prologue(struct gdbarch *gdbarch, gdbarch_skip_prologue_ftype skip_prologue)
Definition: gdbarch.c:2772
tdesc_data
static struct gdbarch_data * tdesc_data
Definition: target-descriptions.c:725
NDS32_TA_REGNUM
Definition: nds32-tdep.h:29
nds32_pop_multiple_words
static void nds32_pop_multiple_words(struct nds32_frame_cache *cache, int rb, int re, int enable4)
Definition: nds32-tdep.c:1029
RETURN_VALUE_REGISTER_CONVENTION
Definition: defs.h:251
gdbarch_info::tdesc_data
struct tdesc_arch_data * tdesc_data
Definition: gdbarch.h:1648
nds32_frame_cache::prev_sp
CORE_ADDR prev_sp
Definition: nds32-tdep.c:536
gdbarch::byte_order
enum bfd_endian byte_order
Definition: gdbarch.c:137
nds32_epilogue_frame_prev_register
static struct value * nds32_epilogue_frame_prev_register(struct frame_info *this_frame, void **this_cache, int regnum)
Definition: nds32-tdep.c:1360
set_gdbarch_pc_regnum
void set_gdbarch_pc_regnum(struct gdbarch *gdbarch, int pc_regnum)
Definition: gdbarch.c:2173
tdesc_has_registers
int tdesc_has_registers(const struct target_desc *target_desc)
Definition: target-descriptions.c:926
nds32_extract_return_value
static void nds32_extract_return_value(struct gdbarch *gdbarch, struct type *type, struct regcache *regcache, gdb_byte *valbuf)
Definition: nds32-tdep.c:1728
get_frame_func
CORE_ADDR get_frame_func(struct frame_info *this_frame)
Definition: frame.c:1001
error
void error(const char *fmt,...)
Definition: errors.c:38
gdbarch_alloc
struct gdbarch * gdbarch_alloc(const struct gdbarch_info *info, struct gdbarch_tdep *tdep)
Definition: gdbarch.c:361
set_gdbarch_inner_than
void set_gdbarch_inner_than(struct gdbarch *gdbarch, gdbarch_inner_than_ftype inner_than)
Definition: gdbarch.c:2837
frame_id
Definition: frame.h:111
get_frame_arch
struct gdbarch * get_frame_arch(struct frame_info *this_frame)
Definition: frame.c:2691
reggroup_name
const char * reggroup_name(struct reggroup *group)
Definition: reggroups.c:66
regcache_cooked_write
void regcache_cooked_write(struct regcache *regcache, int regnum, const gdb_byte *buf)
Definition: regcache.c:873
NDS32_R0_REGNUM
Definition: nds32-tdep.h:27
tdesc_unnumbered_register
int tdesc_unnumbered_register(const struct tdesc_feature *feature, const char *name)
Definition: target-descriptions.c:1106
TYPE_CODE_COMPLEX
Definition: gdbtypes.h:167
store_unsigned_integer
static void store_unsigned_integer(gdb_byte *addr, int len, enum bfd_endian byte_order, ULONGEST val)
Definition: defs.h:604
regcache_raw_write
void regcache_raw_write(struct regcache *regcache, int regnum, const gdb_byte *buf)
Definition: regcache.c:831
nds32_break_insn
constexpr gdb_byte nds32_break_insn[]
Definition: nds32-tdep.c:283
gdbarch_list
Definition: gdbarch.h:1620