1 /* Target-dependent code for the S+core architecture, for GDB,
4 Copyright (C) 2006-2016 Free Software Foundation, Inc.
6 Contributed by Qinwei (qinwei@sunnorth.com.cn)
7 Contributed by Ching-Peng Lin (cplin@sunplus.com)
9 This file is part of GDB.
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 3 of the License, or
14 (at your option) any later version.
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with this program. If not, see <http://www.gnu.org/licenses/>. */
30 #include "arch-utils.h"
34 #include "frame-unwind.h"
35 #include "frame-base.h"
36 #include "trad-frame.h"
37 #include "dwarf2-frame.h"
38 #include "score-tdep.h"
40 #define G_FLD(_i,_ms,_ls) \
41 ((unsigned)((_i) << (31 - (_ms))) >> (31 - (_ms) + (_ls)))
45 unsigned long long raw
;
49 struct score_frame_cache
53 struct trad_frame_saved_reg
*saved_regs
;
56 static int target_mach
= bfd_mach_score7
;
59 score_register_type (struct gdbarch
*gdbarch
, int regnum
)
61 gdb_assert (regnum
>= 0
62 && regnum
< ((target_mach
== bfd_mach_score7
)
63 ? SCORE7_NUM_REGS
: SCORE3_NUM_REGS
));
64 return builtin_type (gdbarch
)->builtin_uint32
;
68 score_unwind_sp (struct gdbarch
*gdbarch
, struct frame_info
*next_frame
)
70 return frame_unwind_register_unsigned (next_frame
, SCORE_SP_REGNUM
);
74 score_unwind_pc (struct gdbarch
*gdbarch
, struct frame_info
*next_frame
)
76 return frame_unwind_register_unsigned (next_frame
, SCORE_PC_REGNUM
);
80 score7_register_name (struct gdbarch
*gdbarch
, int regnum
)
82 const char *score_register_names
[] = {
83 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
84 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
85 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
86 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
88 "PSR", "COND", "ECR", "EXCPVEC", "CCR",
89 "EPC", "EMA", "TLBLOCK", "TLBPT", "PEADDR",
90 "TLBRPT", "PEVN", "PECTX", "LIMPFN", "LDMPFN",
91 "PREV", "DREG", "PC", "DSAVE", "COUNTER",
92 "LDCR", "STCR", "CEH", "CEL",
95 gdb_assert (regnum
>= 0 && regnum
< SCORE7_NUM_REGS
);
96 return score_register_names
[regnum
];
100 score3_register_name (struct gdbarch
*gdbarch
, int regnum
)
102 const char *score_register_names
[] = {
103 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
104 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
105 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
106 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
108 "PSR", "COND", "ECR", "EXCPVEC", "CCR",
109 "EPC", "EMA", "PREV", "DREG", "DSAVE",
110 "COUNTER", "LDCR", "STCR", "CEH", "CEL",
114 gdb_assert (regnum
>= 0 && regnum
< SCORE3_NUM_REGS
);
115 return score_register_names
[regnum
];
120 score_register_sim_regno (struct gdbarch
*gdbarch
, int regnum
)
122 gdb_assert (regnum
>= 0
123 && regnum
< ((target_mach
== bfd_mach_score7
)
124 ? SCORE7_NUM_REGS
: SCORE3_NUM_REGS
));
130 score_print_insn (bfd_vma memaddr
, struct disassemble_info
*info
)
132 if (info
->endian
== BFD_ENDIAN_BIG
)
133 return print_insn_big_score (memaddr
, info
);
135 return print_insn_little_score (memaddr
, info
);
139 score7_fetch_inst (struct gdbarch
*gdbarch
, CORE_ADDR addr
, gdb_byte
*memblock
)
141 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
142 static inst_t inst
= { 0, 0, 0 };
143 gdb_byte buf
[SCORE_INSTLEN
] = { 0 };
147 if (target_has_execution
&& memblock
!= NULL
)
149 /* Fetch instruction from local MEMBLOCK. */
150 memcpy (buf
, memblock
, SCORE_INSTLEN
);
154 /* Fetch instruction from target. */
155 ret
= target_read_memory (addr
& ~0x3, buf
, SCORE_INSTLEN
);
158 error (_("Error: target_read_memory in file:%s, line:%d!"),
164 inst
.raw
= extract_unsigned_integer (buf
, SCORE_INSTLEN
, byte_order
);
165 inst
.len
= (inst
.raw
& 0x80008000) ? 4 : 2;
166 inst
.v
= ((inst
.raw
>> 16 & 0x7FFF) << 15) | (inst
.raw
& 0x7FFF);
167 big
= (byte_order
== BFD_ENDIAN_BIG
);
170 if (big
^ ((addr
& 0x2) == 2))
171 inst
.v
= G_FLD (inst
.v
, 29, 15);
173 inst
.v
= G_FLD (inst
.v
, 14, 0);
179 score3_adjust_pc_and_fetch_inst (CORE_ADDR
*pcptr
, int *lenptr
,
180 enum bfd_endian byte_order
)
182 static inst_t inst
= { 0, 0, 0 };
189 /* raw table 1 (column 2, 3, 4)
193 table 2 (column 1, 2, 3)
199 static const struct breakplace bk_table
[16] =
221 #define EXTRACT_LEN 2
222 CORE_ADDR adjust_pc
= *pcptr
& ~0x1;
223 gdb_byte buf
[5][EXTRACT_LEN
] =
233 unsigned int cbits
= 0;
242 for (i
= 0; i
< 5; i
++)
244 ret
= target_read_memory (adjust_pc
+ 2 * i
, buf
[i
], EXTRACT_LEN
);
250 error (_("Error: target_read_memory in file:%s, line:%d!"),
254 raw
= extract_unsigned_integer (buf
[i
], EXTRACT_LEN
, byte_order
);
255 cbits
= (cbits
<< 1) | (raw
>> 15);
262 cbits
= (cbits
>> 1) & 0x7;
268 cbits
= (cbits
>> 2) & 0x7;
269 bk_index
= cbits
+ 8;
272 gdb_assert (!((bk_table
[bk_index
].break_offset
== 0)
273 && (bk_table
[bk_index
].inst_len
== 0)));
275 inst
.len
= bk_table
[bk_index
].inst_len
;
277 i
= (bk_table
[bk_index
].break_offset
+ 4) / 2;
278 count
= inst
.len
/ 2;
279 for (; count
> 0; i
++, count
--)
281 inst
.raw
= (inst
.raw
<< 16)
282 | extract_unsigned_integer (buf
[i
], EXTRACT_LEN
, byte_order
);
288 inst
.v
= inst
.raw
& 0x7FFF;
291 inst
.v
= ((inst
.raw
>> 16 & 0x7FFF) << 15) | (inst
.raw
& 0x7FFF);
294 inst
.v
= ((inst
.raw
>> 32 & 0x7FFF) << 30)
295 | ((inst
.raw
>> 16 & 0x7FFF) << 15) | (inst
.raw
& 0x7FFF);
300 *pcptr
= adjust_pc
+ bk_table
[bk_index
].break_offset
;
302 *lenptr
= bk_table
[bk_index
].inst_len
;
310 score7_breakpoint_kind_from_pc (struct gdbarch
*gdbarch
, CORE_ADDR
*pcptr
)
314 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
315 gdb_byte buf
[SCORE_INSTLEN
] = { 0 };
317 if ((ret
= target_read_memory (*pcptr
& ~0x3, buf
, SCORE_INSTLEN
)) != 0)
319 error (_("Error: target_read_memory in file:%s, line:%d!"),
322 raw
= extract_unsigned_integer (buf
, SCORE_INSTLEN
, byte_order
);
324 if (!(raw
& 0x80008000))
326 /* 16bits instruction. */
332 /* 32bits instruction. */
338 static const gdb_byte
*
339 score7_sw_breakpoint_from_kind (struct gdbarch
*gdbarch
, int kind
, int *size
)
341 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
347 static gdb_byte big_breakpoint32
[] = { 0x80, 0x00, 0x80, 0x06 };
348 static gdb_byte little_breakpoint32
[] = { 0x06, 0x80, 0x00, 0x80 };
350 if (byte_order
== BFD_ENDIAN_BIG
)
351 return big_breakpoint32
;
353 return little_breakpoint32
;
357 static gdb_byte big_breakpoint16
[] = { 0x60, 0x02 };
358 static gdb_byte little_breakpoint16
[] = { 0x02, 0x60 };
360 if (byte_order
== BFD_ENDIAN_BIG
)
361 return big_breakpoint16
;
363 return little_breakpoint16
;
367 GDBARCH_BREAKPOINT_FROM_PC (score7
)
370 score3_breakpoint_kind_from_pc (struct gdbarch
*gdbarch
, CORE_ADDR
*pcptr
)
372 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
375 score3_adjust_pc_and_fetch_inst (pcptr
, &len
, byte_order
);
380 static const gdb_byte
*
381 score3_sw_breakpoint_from_kind (struct gdbarch
*gdbarch
, int kind
, int *size
)
384 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
385 static gdb_byte score_break_insns
[6][6] = {
386 /* The following three instructions are big endian. */
388 { 0x80, 0x00, 0x00, 0x06 },
389 { 0x80, 0x00, 0x80, 0x00, 0x00, 0x00 },
390 /* The following three instructions are little endian. */
392 { 0x00, 0x80, 0x06, 0x00 },
393 { 0x00, 0x80, 0x00, 0x80, 0x00, 0x00 }};
397 index
= ((byte_order
== BFD_ENDIAN_BIG
) ? 0 : 3) + (kind
/ 2 - 1);
398 return score_break_insns
[index
];
401 GDBARCH_BREAKPOINT_FROM_PC (score3
)
404 score_adjust_breakpoint_address (struct gdbarch
*gdbarch
, CORE_ADDR bpaddr
)
406 CORE_ADDR adjust_pc
= bpaddr
;
408 if (target_mach
== bfd_mach_score3
)
409 score3_adjust_pc_and_fetch_inst (&adjust_pc
, NULL
,
410 gdbarch_byte_order (gdbarch
));
412 adjust_pc
= align_down (adjust_pc
, 2);
418 score_frame_align (struct gdbarch
*gdbarch
, CORE_ADDR addr
)
420 return align_down (addr
, 16);
424 score_xfer_register (struct regcache
*regcache
, int regnum
, int length
,
425 enum bfd_endian endian
, gdb_byte
*readbuf
,
426 const gdb_byte
*writebuf
, int buf_offset
)
429 gdb_assert (regnum
>= 0
430 && regnum
< ((target_mach
== bfd_mach_score7
)
431 ? SCORE7_NUM_REGS
: SCORE3_NUM_REGS
));
436 reg_offset
= SCORE_REGSIZE
- length
;
438 case BFD_ENDIAN_LITTLE
:
441 case BFD_ENDIAN_UNKNOWN
:
445 error (_("Error: score_xfer_register in file:%s, line:%d!"),
450 regcache_cooked_read_part (regcache
, regnum
, reg_offset
, length
,
451 readbuf
+ buf_offset
);
452 if (writebuf
!= NULL
)
453 regcache_cooked_write_part (regcache
, regnum
, reg_offset
, length
,
454 writebuf
+ buf_offset
);
457 static enum return_value_convention
458 score_return_value (struct gdbarch
*gdbarch
, struct value
*function
,
459 struct type
*type
, struct regcache
*regcache
,
460 gdb_byte
* readbuf
, const gdb_byte
* writebuf
)
462 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
463 || TYPE_CODE (type
) == TYPE_CODE_UNION
464 || TYPE_CODE (type
) == TYPE_CODE_ARRAY
)
465 return RETURN_VALUE_STRUCT_CONVENTION
;
470 for (offset
= 0, regnum
= SCORE_A0_REGNUM
;
471 offset
< TYPE_LENGTH (type
);
472 offset
+= SCORE_REGSIZE
, regnum
++)
474 int xfer
= SCORE_REGSIZE
;
476 if (offset
+ xfer
> TYPE_LENGTH (type
))
477 xfer
= TYPE_LENGTH (type
) - offset
;
478 score_xfer_register (regcache
, regnum
, xfer
,
479 gdbarch_byte_order(gdbarch
),
480 readbuf
, writebuf
, offset
);
482 return RETURN_VALUE_REGISTER_CONVENTION
;
486 static struct frame_id
487 score_dummy_id (struct gdbarch
*gdbarch
, struct frame_info
*this_frame
)
489 return frame_id_build (get_frame_register_unsigned (this_frame
,
491 get_frame_pc (this_frame
));
495 score_type_needs_double_align (struct type
*type
)
497 enum type_code typecode
= TYPE_CODE (type
);
499 if ((typecode
== TYPE_CODE_INT
&& TYPE_LENGTH (type
) == 8)
500 || (typecode
== TYPE_CODE_FLT
&& TYPE_LENGTH (type
) == 8))
502 else if (typecode
== TYPE_CODE_STRUCT
|| typecode
== TYPE_CODE_UNION
)
506 n
= TYPE_NFIELDS (type
);
507 for (i
= 0; i
< n
; i
++)
508 if (score_type_needs_double_align (TYPE_FIELD_TYPE (type
, i
)))
516 score_push_dummy_call (struct gdbarch
*gdbarch
, struct value
*function
,
517 struct regcache
*regcache
, CORE_ADDR bp_addr
,
518 int nargs
, struct value
**args
, CORE_ADDR sp
,
519 int struct_return
, CORE_ADDR struct_addr
)
521 enum bfd_endian byte_order
= gdbarch_byte_order (gdbarch
);
525 CORE_ADDR stack_offset
= 0;
528 /* Step 1, Save RA. */
529 regcache_cooked_write_unsigned (regcache
, SCORE_RA_REGNUM
, bp_addr
);
531 /* Step 2, Make space on the stack for the args. */
532 struct_addr
= align_down (struct_addr
, 16);
533 sp
= align_down (sp
, 16);
534 for (argnum
= 0; argnum
< nargs
; argnum
++)
535 arglen
+= align_up (TYPE_LENGTH (value_type (args
[argnum
])),
537 sp
-= align_up (arglen
, 16);
539 argreg
= SCORE_BEGIN_ARG_REGNUM
;
541 /* Step 3, Check if struct return then save the struct address to
542 r4 and increase the stack_offset by 4. */
545 regcache_cooked_write_unsigned (regcache
, argreg
++, struct_addr
);
546 stack_offset
+= SCORE_REGSIZE
;
549 /* Step 4, Load arguments:
550 If arg length is too long (> 4 bytes), then split the arg and
552 for (argnum
= 0; argnum
< nargs
; argnum
++)
554 struct value
*arg
= args
[argnum
];
555 struct type
*arg_type
= check_typedef (value_type (arg
));
556 enum type_code typecode
= TYPE_CODE (arg_type
);
557 const gdb_byte
*val
= value_contents (arg
);
558 int downward_offset
= 0;
559 int arg_last_part_p
= 0;
561 arglen
= TYPE_LENGTH (arg_type
);
563 /* If a arg should be aligned to 8 bytes (long long or double),
564 the value should be put to even register numbers. */
565 if (score_type_needs_double_align (arg_type
))
571 /* If sizeof a block < SCORE_REGSIZE, then Score GCC will chose
572 the default "downward"/"upward" method:
578 char a; char b; char c;
579 } s = {'a', 'b', 'c'};
581 Big endian: s = {X, 'a', 'b', 'c'}
582 Little endian: s = {'a', 'b', 'c', X}
584 Where X is a hole. */
586 if (gdbarch_byte_order(gdbarch
) == BFD_ENDIAN_BIG
587 && (typecode
== TYPE_CODE_STRUCT
588 || typecode
== TYPE_CODE_UNION
)
589 && argreg
> SCORE_LAST_ARG_REGNUM
590 && arglen
< SCORE_REGSIZE
)
591 downward_offset
+= (SCORE_REGSIZE
- arglen
);
595 int partial_len
= arglen
< SCORE_REGSIZE
? arglen
: SCORE_REGSIZE
;
596 ULONGEST regval
= extract_unsigned_integer (val
, partial_len
,
599 /* The last part of a arg should shift left when
600 gdbarch_byte_order is BFD_ENDIAN_BIG. */
601 if (byte_order
== BFD_ENDIAN_BIG
602 && arg_last_part_p
== 1
603 && (typecode
== TYPE_CODE_STRUCT
604 || typecode
== TYPE_CODE_UNION
))
605 regval
<<= ((SCORE_REGSIZE
- partial_len
) * TARGET_CHAR_BIT
);
607 /* Always increase the stack_offset and save args to stack. */
608 addr
= sp
+ stack_offset
+ downward_offset
;
609 write_memory (addr
, val
, partial_len
);
611 if (argreg
<= SCORE_LAST_ARG_REGNUM
)
613 regcache_cooked_write_unsigned (regcache
, argreg
++, regval
);
614 if (arglen
> SCORE_REGSIZE
&& arglen
< SCORE_REGSIZE
* 2)
619 arglen
-= partial_len
;
620 stack_offset
+= align_up (partial_len
, SCORE_REGSIZE
);
624 /* Step 5, Save SP. */
625 regcache_cooked_write_unsigned (regcache
, SCORE_SP_REGNUM
, sp
);
631 score7_skip_prologue (struct gdbarch
*gdbarch
, CORE_ADDR pc
)
634 int iscan
= 32, stack_sub
= 0;
637 inst_t
*inst
= score7_fetch_inst (gdbarch
, cpc
, NULL
);
640 if ((inst
->len
== 4) && !stack_sub
641 && (G_FLD (inst
->v
, 29, 25) == 0x1
642 && G_FLD (inst
->v
, 24, 20) == 0x0))
644 /* addi r0, offset */
645 stack_sub
= cpc
+ SCORE_INSTLEN
;
646 pc
= cpc
+ SCORE_INSTLEN
;
648 else if ((inst
->len
== 4)
649 && (G_FLD (inst
->v
, 29, 25) == 0x0)
650 && (G_FLD (inst
->v
, 24, 20) == 0x2)
651 && (G_FLD (inst
->v
, 19, 15) == 0x0)
652 && (G_FLD (inst
->v
, 14, 10) == 0xF)
653 && (G_FLD (inst
->v
, 9, 0) == 0x56))
656 pc
= cpc
+ SCORE_INSTLEN
;
659 else if ((inst
->len
== 2)
660 && (G_FLD (inst
->v
, 14, 12) == 0x0)
661 && (G_FLD (inst
->v
, 11, 8) == 0x2)
662 && (G_FLD (inst
->v
, 7, 4) == 0x0)
663 && (G_FLD (inst
->v
, 3, 0) == 0x3))
666 pc
= cpc
+ SCORE16_INSTLEN
;
669 else if ((inst
->len
== 2)
670 && ((G_FLD (inst
->v
, 14, 12) == 3) /* j15 form */
671 || (G_FLD (inst
->v
, 14, 12) == 4) /* b15 form */
672 || (G_FLD (inst
->v
, 14, 12) == 0x0
673 && G_FLD (inst
->v
, 3, 0) == 0x4))) /* br! */
675 else if ((inst
->len
== 4)
676 && ((G_FLD (inst
->v
, 29, 25) == 2) /* j32 form */
677 || (G_FLD (inst
->v
, 29, 25) == 4) /* b32 form */
678 || (G_FLD (inst
->v
, 29, 25) == 0x0
679 && G_FLD (inst
->v
, 6, 1) == 0x4))) /* br */
682 cpc
+= (inst
->len
== 2) ? SCORE16_INSTLEN
: SCORE_INSTLEN
;
688 score3_skip_prologue (struct gdbarch
*gdbarch
, CORE_ADDR pc
)
691 int iscan
= 32, stack_sub
= 0;
695 = score3_adjust_pc_and_fetch_inst (&cpc
, NULL
,
696 gdbarch_byte_order (gdbarch
));
700 if (inst
->len
== 4 && !stack_sub
701 && (G_FLD (inst
->v
, 29, 25) == 0x1)
702 && (G_FLD (inst
->v
, 19, 17) == 0x0)
703 && (G_FLD (inst
->v
, 24, 20) == 0x0))
705 /* addi r0, offset */
706 stack_sub
= cpc
+ inst
->len
;
707 pc
= cpc
+ inst
->len
;
709 else if (inst
->len
== 4
710 && (G_FLD (inst
->v
, 29, 25) == 0x0)
711 && (G_FLD (inst
->v
, 24, 20) == 0x2)
712 && (G_FLD (inst
->v
, 19, 15) == 0x0)
713 && (G_FLD (inst
->v
, 14, 10) == 0xF)
714 && (G_FLD (inst
->v
, 9, 0) == 0x56))
717 pc
= cpc
+ inst
->len
;
720 else if ((inst
->len
== 2)
721 && (G_FLD (inst
->v
, 14, 10) == 0x10)
722 && (G_FLD (inst
->v
, 9, 5) == 0x2)
723 && (G_FLD (inst
->v
, 4, 0) == 0x0))
726 pc
= cpc
+ inst
->len
;
729 else if (inst
->len
== 2
730 && ((G_FLD (inst
->v
, 14, 12) == 3) /* b15 form */
731 || (G_FLD (inst
->v
, 14, 12) == 0x0
732 && G_FLD (inst
->v
, 11, 5) == 0x4))) /* br! */
734 else if (inst
->len
== 4
735 && ((G_FLD (inst
->v
, 29, 25) == 2) /* j32 form */
736 || (G_FLD (inst
->v
, 29, 25) == 4))) /* b32 form */
744 /* Implement the stack_frame_destroyed_p gdbarch method. */
747 score7_stack_frame_destroyed_p (struct gdbarch
*gdbarch
, CORE_ADDR cur_pc
)
749 inst_t
*inst
= score7_fetch_inst (gdbarch
, cur_pc
, NULL
);
752 return 1; /* mv! r0, r2 */
753 else if (G_FLD (inst
->v
, 14, 12) == 0x2
754 && G_FLD (inst
->v
, 3, 0) == 0xa)
756 else if (G_FLD (inst
->v
, 14, 12) == 0x0
757 && G_FLD (inst
->v
, 7, 0) == 0x34)
758 return 1; /* br! r3 */
759 else if (G_FLD (inst
->v
, 29, 15) == 0x2
760 && G_FLD (inst
->v
, 6, 1) == 0x2b)
761 return 1; /* mv r0, r2 */
762 else if (G_FLD (inst
->v
, 29, 25) == 0x0
763 && G_FLD (inst
->v
, 6, 1) == 0x4
764 && G_FLD (inst
->v
, 19, 15) == 0x3)
765 return 1; /* br r3 */
770 /* Implement the stack_frame_destroyed_p gdbarch method. */
773 score3_stack_frame_destroyed_p (struct gdbarch
*gdbarch
, CORE_ADDR cur_pc
)
775 CORE_ADDR pc
= cur_pc
;
777 = score3_adjust_pc_and_fetch_inst (&pc
, NULL
,
778 gdbarch_byte_order (gdbarch
));
781 && (G_FLD (inst
->v
, 14, 10) == 0x10)
782 && (G_FLD (inst
->v
, 9, 5) == 0x0)
783 && (G_FLD (inst
->v
, 4, 0) == 0x2))
784 return 1; /* mv! r0, r2 */
785 else if (inst
->len
== 4
786 && (G_FLD (inst
->v
, 29, 25) == 0x0)
787 && (G_FLD (inst
->v
, 24, 20) == 0x2)
788 && (G_FLD (inst
->v
, 19, 15) == 0x0)
789 && (G_FLD (inst
->v
, 14, 10) == 0xF)
790 && (G_FLD (inst
->v
, 9, 0) == 0x56))
791 return 1; /* mv r0, r2 */
792 else if (inst
->len
== 2
793 && (G_FLD (inst
->v
, 14, 12) == 0x0)
794 && (G_FLD (inst
->v
, 11, 5) == 0x2))
796 else if (inst
->len
== 2
797 && (G_FLD (inst
->v
, 14, 12) == 0x0)
798 && (G_FLD (inst
->v
, 11, 7) == 0x0)
799 && (G_FLD (inst
->v
, 6, 5) == 0x2))
800 return 1; /* rpop! */
801 else if (inst
->len
== 2
802 && (G_FLD (inst
->v
, 14, 12) == 0x0)
803 && (G_FLD (inst
->v
, 11, 5) == 0x4)
804 && (G_FLD (inst
->v
, 4, 0) == 0x3))
805 return 1; /* br! r3 */
806 else if (inst
->len
== 4
807 && (G_FLD (inst
->v
, 29, 25) == 0x0)
808 && (G_FLD (inst
->v
, 24, 20) == 0x0)
809 && (G_FLD (inst
->v
, 19, 15) == 0x3)
810 && (G_FLD (inst
->v
, 14, 10) == 0xF)
811 && (G_FLD (inst
->v
, 9, 0) == 0x8))
812 return 1; /* br r3 */
818 score7_malloc_and_get_memblock (CORE_ADDR addr
, CORE_ADDR size
)
821 gdb_byte
*memblock
= NULL
;
826 memblock
= (gdb_byte
*) xmalloc (size
);
827 memset (memblock
, 0, size
);
828 ret
= target_read_memory (addr
& ~0x3, memblock
, size
);
831 error (_("Error: target_read_memory in file:%s, line:%d!"),
839 score7_free_memblock (gdb_byte
*memblock
)
845 score7_adjust_memblock_ptr (gdb_byte
**memblock
, CORE_ADDR prev_pc
,
850 /* First time call this function, do nothing. */
852 else if (cur_pc
- prev_pc
== 2 && (cur_pc
& 0x3) == 0)
854 /* First 16-bit instruction, then 32-bit instruction. */
855 *memblock
+= SCORE_INSTLEN
;
857 else if (cur_pc
- prev_pc
== 4)
859 /* Is 32-bit instruction, increase MEMBLOCK by 4. */
860 *memblock
+= SCORE_INSTLEN
;
865 score7_analyze_prologue (CORE_ADDR startaddr
, CORE_ADDR pc
,
866 struct frame_info
*this_frame
,
867 struct score_frame_cache
*this_cache
)
869 struct gdbarch
*gdbarch
= get_frame_arch (this_frame
);
872 CORE_ADDR cur_pc
= startaddr
;
881 gdb_byte
*memblock
= NULL
;
882 gdb_byte
*memblock_ptr
= NULL
;
883 CORE_ADDR prev_pc
= -1;
885 /* Allocate MEMBLOCK if PC - STARTADDR > 0. */
886 memblock_ptr
= memblock
=
887 score7_malloc_and_get_memblock (startaddr
, pc
- startaddr
);
889 sp
= get_frame_register_unsigned (this_frame
, SCORE_SP_REGNUM
);
890 fp
= get_frame_register_unsigned (this_frame
, SCORE_FP_REGNUM
);
892 for (; cur_pc
< pc
; prev_pc
= cur_pc
, cur_pc
+= inst_len
)
895 if (memblock
!= NULL
)
897 /* Reading memory block from target succefully and got all
898 the instructions(from STARTADDR to PC) needed. */
899 score7_adjust_memblock_ptr (&memblock
, prev_pc
, cur_pc
);
900 inst
= score7_fetch_inst (gdbarch
, cur_pc
, memblock
);
904 /* Otherwise, we fetch 4 bytes from target, and GDB also
906 inst
= score7_fetch_inst (gdbarch
, cur_pc
, NULL
);
909 /* FIXME: make a full-power prologue analyzer. */
912 inst_len
= SCORE16_INSTLEN
;
914 if (G_FLD (inst
->v
, 14, 12) == 0x2
915 && G_FLD (inst
->v
, 3, 0) == 0xe)
920 if (G_FLD (inst
->v
, 11, 7) == 0x6
924 ra_offset
= sp_offset
;
927 else if (G_FLD (inst
->v
, 11, 7) == 0x4
931 fp_offset
= sp_offset
;
935 else if (G_FLD (inst
->v
, 14, 12) == 0x2
936 && G_FLD (inst
->v
, 3, 0) == 0xa)
941 else if (G_FLD (inst
->v
, 14, 7) == 0xc1
942 && G_FLD (inst
->v
, 2, 0) == 0x0)
945 sp_offset
+= (int) pow (2, G_FLD (inst
->v
, 6, 3));
947 else if (G_FLD (inst
->v
, 14, 7) == 0xc0
948 && G_FLD (inst
->v
, 2, 0) == 0x0)
951 sp_offset
-= (int) pow (2, G_FLD (inst
->v
, 6, 3));
956 inst_len
= SCORE_INSTLEN
;
958 if (G_FLD(inst
->v
, 29, 25) == 0x3
959 && G_FLD(inst
->v
, 2, 0) == 0x4
960 && G_FLD(inst
->v
, 19, 15) == 0)
962 /* sw rD, [r0, offset]+ */
963 sp_offset
+= SCORE_INSTLEN
;
965 if (G_FLD(inst
->v
, 24, 20) == 0x3)
968 if (ra_offset_p
== 0)
970 ra_offset
= sp_offset
;
974 else if (G_FLD(inst
->v
, 24, 20) == 0x2)
977 if (fp_offset_p
== 0)
979 fp_offset
= sp_offset
;
984 else if (G_FLD(inst
->v
, 29, 25) == 0x14
985 && G_FLD(inst
->v
, 19,15) == 0)
987 /* sw rD, [r0, offset] */
988 if (G_FLD(inst
->v
, 24, 20) == 0x3)
991 ra_offset
= sp_offset
- G_FLD(inst
->v
, 14, 0);
994 else if (G_FLD(inst
->v
, 24, 20) == 0x2)
997 fp_offset
= sp_offset
- G_FLD(inst
->v
, 14, 0);
1001 else if (G_FLD (inst
->v
, 29, 15) == 0x1c60
1002 && G_FLD (inst
->v
, 2, 0) == 0x0)
1004 /* lw r3, [r0]+, 4 */
1005 sp_offset
-= SCORE_INSTLEN
;
1008 else if (G_FLD (inst
->v
, 29, 15) == 0x1c40
1009 && G_FLD (inst
->v
, 2, 0) == 0x0)
1011 /* lw r2, [r0]+, 4 */
1012 sp_offset
-= SCORE_INSTLEN
;
1016 else if (G_FLD (inst
->v
, 29, 17) == 0x100
1017 && G_FLD (inst
->v
, 0, 0) == 0x0)
1019 /* addi r0, -offset */
1020 sp_offset
+= 65536 - G_FLD (inst
->v
, 16, 1);
1022 else if (G_FLD (inst
->v
, 29, 17) == 0x110
1023 && G_FLD (inst
->v
, 0, 0) == 0x0)
1025 /* addi r2, offset */
1026 if (pc
- cur_pc
> 4)
1028 unsigned int save_v
= inst
->v
;
1030 score7_fetch_inst (gdbarch
, cur_pc
+ SCORE_INSTLEN
, NULL
);
1031 if (inst2
->v
== 0x23)
1034 sp_offset
-= G_FLD (save_v
, 16, 1);
1042 if (ra_offset_p
== 1)
1044 if (this_cache
->saved_regs
[SCORE_PC_REGNUM
].addr
== -1)
1045 this_cache
->saved_regs
[SCORE_PC_REGNUM
].addr
=
1046 sp
+ sp_offset
- ra_offset
;
1050 this_cache
->saved_regs
[SCORE_PC_REGNUM
] =
1051 this_cache
->saved_regs
[SCORE_RA_REGNUM
];
1055 if (fp_offset_p
== 1)
1057 if (this_cache
->saved_regs
[SCORE_FP_REGNUM
].addr
== -1)
1058 this_cache
->saved_regs
[SCORE_FP_REGNUM
].addr
=
1059 sp
+ sp_offset
- fp_offset
;
1062 /* Save SP and FP. */
1063 this_cache
->base
= sp
+ sp_offset
;
1064 this_cache
->fp
= fp
;
1066 /* Don't forget to free MEMBLOCK if we allocated it. */
1067 if (memblock_ptr
!= NULL
)
1068 score7_free_memblock (memblock_ptr
);
1072 score3_analyze_prologue (CORE_ADDR startaddr
, CORE_ADDR pc
,
1073 struct frame_info
*this_frame
,
1074 struct score_frame_cache
*this_cache
)
1078 CORE_ADDR cur_pc
= startaddr
;
1079 enum bfd_endian byte_order
1080 = gdbarch_byte_order (get_frame_arch (this_frame
));
1085 int ra_offset_p
= 0;
1086 int fp_offset_p
= 0;
1089 sp
= get_frame_register_unsigned (this_frame
, SCORE_SP_REGNUM
);
1090 fp
= get_frame_register_unsigned (this_frame
, SCORE_FP_REGNUM
);
1092 for (; cur_pc
< pc
; cur_pc
+= inst_len
)
1094 inst_t
*inst
= NULL
;
1096 inst
= score3_adjust_pc_and_fetch_inst (&cur_pc
, &inst_len
, byte_order
);
1098 /* FIXME: make a full-power prologue analyzer. */
1101 if (G_FLD (inst
->v
, 14, 12) == 0x0
1102 && G_FLD (inst
->v
, 11, 7) == 0x0
1103 && G_FLD (inst
->v
, 6, 5) == 0x3)
1108 if (G_FLD (inst
->v
, 4, 0) == 0x3
1109 && ra_offset_p
== 0)
1111 /* push! r3, [r0] */
1112 ra_offset
= sp_offset
;
1115 else if (G_FLD (inst
->v
, 4, 0) == 0x2
1116 && fp_offset_p
== 0)
1118 /* push! r2, [r0] */
1119 fp_offset
= sp_offset
;
1123 else if (G_FLD (inst
->v
, 14, 12) == 0x6
1124 && G_FLD (inst
->v
, 11, 10) == 0x3)
1127 int start_r
= G_FLD (inst
->v
, 9, 5);
1128 int cnt
= G_FLD (inst
->v
, 4, 0);
1130 if ((ra_offset_p
== 0)
1131 && (start_r
<= SCORE_RA_REGNUM
)
1132 && (SCORE_RA_REGNUM
< start_r
+ cnt
))
1134 /* rpush! contains r3 */
1136 ra_offset
= sp_offset
+ 4 * (SCORE_RA_REGNUM
- start_r
) + 4;
1139 if ((fp_offset_p
== 0)
1140 && (start_r
<= SCORE_FP_REGNUM
)
1141 && (SCORE_FP_REGNUM
< start_r
+ cnt
))
1143 /* rpush! contains r2 */
1145 fp_offset
= sp_offset
+ 4 * (SCORE_FP_REGNUM
- start_r
) + 4;
1148 sp_offset
+= 4 * cnt
;
1150 else if (G_FLD (inst
->v
, 14, 12) == 0x0
1151 && G_FLD (inst
->v
, 11, 7) == 0x0
1152 && G_FLD (inst
->v
, 6, 5) == 0x2)
1157 else if (G_FLD (inst
->v
, 14, 12) == 0x6
1158 && G_FLD (inst
->v
, 11, 10) == 0x2)
1161 sp_offset
-= 4 * G_FLD (inst
->v
, 4, 0);
1163 else if (G_FLD (inst
->v
, 14, 12) == 0x5
1164 && G_FLD (inst
->v
, 11, 10) == 0x3
1165 && G_FLD (inst
->v
, 9, 6) == 0x0)
1167 /* addi! r0, -offset */
1168 int imm
= G_FLD (inst
->v
, 5, 0);
1170 imm
= -(0x3F - imm
+ 1);
1173 else if (G_FLD (inst
->v
, 14, 12) == 0x5
1174 && G_FLD (inst
->v
, 11, 10) == 0x3
1175 && G_FLD (inst
->v
, 9, 6) == 0x2)
1177 /* addi! r2, offset */
1178 if (pc
- cur_pc
>= 2)
1182 cur_pc
+= inst
->len
;
1183 inst2
= score3_adjust_pc_and_fetch_inst (&cur_pc
, NULL
,
1187 && G_FLD (inst2
->v
, 14, 10) == 0x10
1188 && G_FLD (inst2
->v
, 9, 5) == 0x0
1189 && G_FLD (inst2
->v
, 4, 0) == 0x2)
1192 int imm
= G_FLD (inst
->v
, 5, 0);
1194 imm
= -(0x3F - imm
+ 1);
1200 else if (inst
->len
== 4)
1202 if (G_FLD (inst
->v
, 29, 25) == 0x3
1203 && G_FLD (inst
->v
, 2, 0) == 0x4
1204 && G_FLD (inst
->v
, 24, 20) == 0x3
1205 && G_FLD (inst
->v
, 19, 15) == 0x0)
1207 /* sw r3, [r0, offset]+ */
1208 sp_offset
+= inst
->len
;
1209 if (ra_offset_p
== 0)
1211 ra_offset
= sp_offset
;
1215 else if (G_FLD (inst
->v
, 29, 25) == 0x3
1216 && G_FLD (inst
->v
, 2, 0) == 0x4
1217 && G_FLD (inst
->v
, 24, 20) == 0x2
1218 && G_FLD (inst
->v
, 19, 15) == 0x0)
1220 /* sw r2, [r0, offset]+ */
1221 sp_offset
+= inst
->len
;
1222 if (fp_offset_p
== 0)
1224 fp_offset
= sp_offset
;
1228 else if (G_FLD (inst
->v
, 29, 25) == 0x7
1229 && G_FLD (inst
->v
, 2, 0) == 0x0
1230 && G_FLD (inst
->v
, 24, 20) == 0x3
1231 && G_FLD (inst
->v
, 19, 15) == 0x0)
1233 /* lw r3, [r0]+, 4 */
1234 sp_offset
-= inst
->len
;
1237 else if (G_FLD (inst
->v
, 29, 25) == 0x7
1238 && G_FLD (inst
->v
, 2, 0) == 0x0
1239 && G_FLD (inst
->v
, 24, 20) == 0x2
1240 && G_FLD (inst
->v
, 19, 15) == 0x0)
1242 /* lw r2, [r0]+, 4 */
1243 sp_offset
-= inst
->len
;
1246 else if (G_FLD (inst
->v
, 29, 25) == 0x1
1247 && G_FLD (inst
->v
, 19, 17) == 0x0
1248 && G_FLD (inst
->v
, 24, 20) == 0x0
1249 && G_FLD (inst
->v
, 0, 0) == 0x0)
1251 /* addi r0, -offset */
1252 int imm
= G_FLD (inst
->v
, 16, 1);
1254 imm
= -(0xFFFF - imm
+ 1);
1257 else if (G_FLD (inst
->v
, 29, 25) == 0x1
1258 && G_FLD (inst
->v
, 19, 17) == 0x0
1259 && G_FLD (inst
->v
, 24, 20) == 0x2
1260 && G_FLD (inst
->v
, 0, 0) == 0x0)
1262 /* addi r2, offset */
1263 if (pc
- cur_pc
>= 2)
1267 cur_pc
+= inst
->len
;
1268 inst2
= score3_adjust_pc_and_fetch_inst (&cur_pc
, NULL
,
1272 && G_FLD (inst2
->v
, 14, 10) == 0x10
1273 && G_FLD (inst2
->v
, 9, 5) == 0x0
1274 && G_FLD (inst2
->v
, 4, 0) == 0x2)
1277 int imm
= G_FLD (inst
->v
, 16, 1);
1279 imm
= -(0xFFFF - imm
+ 1);
1288 if (ra_offset_p
== 1)
1290 if (this_cache
->saved_regs
[SCORE_PC_REGNUM
].addr
== -1)
1291 this_cache
->saved_regs
[SCORE_PC_REGNUM
].addr
=
1292 sp
+ sp_offset
- ra_offset
;
1296 this_cache
->saved_regs
[SCORE_PC_REGNUM
] =
1297 this_cache
->saved_regs
[SCORE_RA_REGNUM
];
1301 if (fp_offset_p
== 1)
1303 if (this_cache
->saved_regs
[SCORE_FP_REGNUM
].addr
== -1)
1304 this_cache
->saved_regs
[SCORE_FP_REGNUM
].addr
=
1305 sp
+ sp_offset
- fp_offset
;
1308 /* Save SP and FP. */
1309 this_cache
->base
= sp
+ sp_offset
;
1310 this_cache
->fp
= fp
;
1313 static struct score_frame_cache
*
1314 score_make_prologue_cache (struct frame_info
*this_frame
, void **this_cache
)
1316 struct score_frame_cache
*cache
;
1318 if ((*this_cache
) != NULL
)
1319 return (struct score_frame_cache
*) (*this_cache
);
1321 cache
= FRAME_OBSTACK_ZALLOC (struct score_frame_cache
);
1322 (*this_cache
) = cache
;
1323 cache
->saved_regs
= trad_frame_alloc_saved_regs (this_frame
);
1325 /* Analyze the prologue. */
1327 const CORE_ADDR pc
= get_frame_pc (this_frame
);
1328 CORE_ADDR start_addr
;
1330 find_pc_partial_function (pc
, NULL
, &start_addr
, NULL
);
1331 if (start_addr
== 0)
1334 if (target_mach
== bfd_mach_score3
)
1335 score3_analyze_prologue (start_addr
, pc
, this_frame
,
1336 (struct score_frame_cache
*) *this_cache
);
1338 score7_analyze_prologue (start_addr
, pc
, this_frame
,
1339 (struct score_frame_cache
*) *this_cache
);
1343 trad_frame_set_value (cache
->saved_regs
, SCORE_SP_REGNUM
, cache
->base
);
1345 return (struct score_frame_cache
*) (*this_cache
);
1349 score_prologue_this_id (struct frame_info
*this_frame
, void **this_cache
,
1350 struct frame_id
*this_id
)
1352 struct score_frame_cache
*info
= score_make_prologue_cache (this_frame
,
1354 (*this_id
) = frame_id_build (info
->base
, get_frame_func (this_frame
));
1357 static struct value
*
1358 score_prologue_prev_register (struct frame_info
*this_frame
,
1359 void **this_cache
, int regnum
)
1361 struct score_frame_cache
*info
= score_make_prologue_cache (this_frame
,
1363 return trad_frame_get_prev_register (this_frame
, info
->saved_regs
, regnum
);
1366 static const struct frame_unwind score_prologue_unwind
=
1369 default_frame_unwind_stop_reason
,
1370 score_prologue_this_id
,
1371 score_prologue_prev_register
,
1373 default_frame_sniffer
,
1378 score_prologue_frame_base_address (struct frame_info
*this_frame
,
1381 struct score_frame_cache
*info
=
1382 score_make_prologue_cache (this_frame
, this_cache
);
1386 static const struct frame_base score_prologue_frame_base
=
1388 &score_prologue_unwind
,
1389 score_prologue_frame_base_address
,
1390 score_prologue_frame_base_address
,
1391 score_prologue_frame_base_address
,
1394 static const struct frame_base
*
1395 score_prologue_frame_base_sniffer (struct frame_info
*this_frame
)
1397 return &score_prologue_frame_base
;
1400 /* Core file support. */
1402 static const struct regcache_map_entry score7_linux_gregmap
[] =
1404 /* FIXME: According to the current Linux kernel, r0 is preceded by
1405 9 rather than 7 words. */
1406 { 7, REGCACHE_MAP_SKIP
, 4 },
1407 { 32, 0, 4 }, /* r0 ... r31 */
1408 { 1, 55, 4 }, /* CEL */
1409 { 1, 54, 4 }, /* CEH */
1410 { 1, 53, 4 }, /* sr0, i.e. cnt or COUNTER */
1411 { 1, 52, 4 }, /* sr1, i.e. lcr or LDCR */
1412 { 1, 51, 4 }, /* sr2, i.e. scr or STCR */
1413 { 1, 49, 4 }, /* PC (same slot as EPC) */
1414 { 1, 38, 4 }, /* EMA */
1415 { 1, 32, 4 }, /* PSR */
1416 { 1, 34, 4 }, /* ECR */
1417 { 1, 33, 4 }, /* COND */
1421 #define SCORE7_LINUX_EPC_OFFSET (44 * 4)
1422 #define SCORE7_LINUX_SIZEOF_GREGSET (49 * 4)
1425 score7_linux_supply_gregset(const struct regset
*regset
,
1426 struct regcache
*regcache
,
1427 int regnum
, const void *buf
,
1430 regcache_supply_regset (regset
, regcache
, regnum
, buf
, size
);
1432 /* Supply the EPC from the same slot as the PC. Note that the
1433 collect function will store the PC in that slot. */
1434 if ((regnum
== -1 || regnum
== SCORE_EPC_REGNUM
)
1435 && size
>= SCORE7_LINUX_EPC_OFFSET
+ 4)
1436 regcache_raw_supply (regcache
, SCORE_EPC_REGNUM
,
1437 (const gdb_byte
*) buf
1438 + SCORE7_LINUX_EPC_OFFSET
);
1441 static const struct regset score7_linux_gregset
=
1443 score7_linux_gregmap
,
1444 score7_linux_supply_gregset
,
1445 regcache_collect_regset
1448 /* Iterate over core file register note sections. */
1451 score7_linux_iterate_over_regset_sections (struct gdbarch
*gdbarch
,
1452 iterate_over_regset_sections_cb
*cb
,
1454 const struct regcache
*regcache
)
1456 cb (".reg", SCORE7_LINUX_SIZEOF_GREGSET
, &score7_linux_gregset
,
1460 static struct gdbarch
*
1461 score_gdbarch_init (struct gdbarch_info info
, struct gdbarch_list
*arches
)
1463 struct gdbarch
*gdbarch
;
1464 target_mach
= info
.bfd_arch_info
->mach
;
1466 arches
= gdbarch_list_lookup_by_info (arches
, &info
);
1469 return (arches
->gdbarch
);
1471 gdbarch
= gdbarch_alloc (&info
, NULL
);
1473 set_gdbarch_short_bit (gdbarch
, 16);
1474 set_gdbarch_int_bit (gdbarch
, 32);
1475 set_gdbarch_float_bit (gdbarch
, 32);
1476 set_gdbarch_double_bit (gdbarch
, 64);
1477 set_gdbarch_long_double_bit (gdbarch
, 64);
1479 set_gdbarch_register_sim_regno (gdbarch
, score_register_sim_regno
);
1481 set_gdbarch_pc_regnum (gdbarch
, SCORE_PC_REGNUM
);
1482 set_gdbarch_sp_regnum (gdbarch
, SCORE_SP_REGNUM
);
1483 set_gdbarch_adjust_breakpoint_address (gdbarch
,
1484 score_adjust_breakpoint_address
);
1485 set_gdbarch_register_type (gdbarch
, score_register_type
);
1486 set_gdbarch_frame_align (gdbarch
, score_frame_align
);
1487 set_gdbarch_inner_than (gdbarch
, core_addr_lessthan
);
1488 set_gdbarch_unwind_sp (gdbarch
, score_unwind_sp
);
1489 set_gdbarch_unwind_pc (gdbarch
, score_unwind_pc
);
1490 set_gdbarch_print_insn (gdbarch
, score_print_insn
);
1492 switch (target_mach
)
1494 case bfd_mach_score7
:
1495 SET_GDBARCH_BREAKPOINT_MANIPULATION (score7
);
1496 set_gdbarch_skip_prologue (gdbarch
, score7_skip_prologue
);
1497 set_gdbarch_stack_frame_destroyed_p (gdbarch
,
1498 score7_stack_frame_destroyed_p
);
1499 set_gdbarch_register_name (gdbarch
, score7_register_name
);
1500 set_gdbarch_num_regs (gdbarch
, SCORE7_NUM_REGS
);
1501 /* Core file support. */
1502 set_gdbarch_iterate_over_regset_sections
1503 (gdbarch
, score7_linux_iterate_over_regset_sections
);
1506 case bfd_mach_score3
:
1507 SET_GDBARCH_BREAKPOINT_MANIPULATION (score3
);
1508 set_gdbarch_skip_prologue (gdbarch
, score3_skip_prologue
);
1509 set_gdbarch_stack_frame_destroyed_p (gdbarch
,
1510 score3_stack_frame_destroyed_p
);
1511 set_gdbarch_register_name (gdbarch
, score3_register_name
);
1512 set_gdbarch_num_regs (gdbarch
, SCORE3_NUM_REGS
);
1516 /* Watchpoint hooks. */
1517 set_gdbarch_have_nonsteppable_watchpoint (gdbarch
, 1);
1519 /* Dummy frame hooks. */
1520 set_gdbarch_return_value (gdbarch
, score_return_value
);
1521 set_gdbarch_call_dummy_location (gdbarch
, AT_ENTRY_POINT
);
1522 set_gdbarch_dummy_id (gdbarch
, score_dummy_id
);
1523 set_gdbarch_push_dummy_call (gdbarch
, score_push_dummy_call
);
1525 /* Normal frame hooks. */
1526 dwarf2_append_unwinders (gdbarch
);
1527 frame_base_append_sniffer (gdbarch
, dwarf2_frame_base_sniffer
);
1528 frame_unwind_append_unwinder (gdbarch
, &score_prologue_unwind
);
1529 frame_base_append_sniffer (gdbarch
, score_prologue_frame_base_sniffer
);
1534 extern initialize_file_ftype _initialize_score_tdep
;
1537 _initialize_score_tdep (void)
1539 gdbarch_register (bfd_arch_score
, score_gdbarch_init
, NULL
);