Skip to content

Commit d029b02

Browse files
committed
arc64: gdb: Add support of prologue tests for HS5x
Remove tests for unsupported SUB_S c,b,u3 instruction and mark LP tests as xfail for HS5x targets. LP is supported only by HS5x in ARCv3 but it's not implemented in GNU tools yet. In addition make ENTER tests save 13 general purpose registers instead of 14. ARCv3's ENTER instruction can save GPRs from R14 to R27 (ARCv2's one saves from R13 to R26). The last one is FP (frame pointer) and it's possible to save FP twice: enter_s (16 + 14) 16 stands for FP bit and 14 stands for R14-R27 set. That behavior is documented in PRM: This use case is not illegal but serves no useful purpose. However, it's not recommended to use ENTER that way and saving FP twice can break GDB's frame unwinder (information about saved registers may be incomplete). It's necessary to rewrite unwinder's logic to make him detect FP which is saved twice. Signed-off-by: Yuriy Kolerov <[email protected]>
1 parent 34fbbfc commit d029b02

File tree

2 files changed

+83
-8
lines changed

2 files changed

+83
-8
lines changed

gdb/testsuite/gdb.arch/arc-analyze-prologue.S

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,14 +155,18 @@ noncallee_saved_regs_gp_push:
155155
add sp,sp,8
156156

157157
; LP_COUNT is treated like a normal register.
158+
; HS6x does not have loop instructions and registers but HS5x does. However,
159+
; it's not supported by GNU tools yet.
158160

161+
#ifndef __ARCV3__
159162
.align 4
160163
noncallee_saved_regs_lp_count:
161164
push r25
162165
push lp_count
163166
add r0, r1, r2
164167
j.d [blink]
165168
add sp,sp,8
169+
#endif
166170

167171
; BLINK is saved, but after an instruction that is not part of prologue.
168172
; Currently arc_analyze_prologue stops analisys at the first intstruction
@@ -277,7 +281,11 @@ enter_s_r15:
277281

278282
.align 4
279283
enter_s_all:
284+
#ifdef __ARCV3__
285+
enter_s (32 + 16 + 13)
286+
#else
280287
enter_s (32 + 16 + 14)
288+
#endif
281289
add r0,r1,r2
282290
j.d [blink]
283291
add sp,sp,64
@@ -415,7 +423,10 @@ predicated_insn:
415423
j [blink]
416424

417425
; Loops should halt prologue analysis.
426+
; HS6x does not have loop instructions and registers but HS5x does. However,
427+
; it's not supported by GNU tools yet.
418428

429+
#ifndef __ARCV3__
419430
.align 4
420431
loop_in_prologue:
421432
push r25
@@ -430,6 +441,7 @@ loop_in_prologue:
430441
add sp,sp,8
431442
pop r25
432443
j [blink]
444+
#endif
433445

434446
; Store of a constant value (not a register).
435447

@@ -660,14 +672,17 @@ push_s_prologue:
660672
j [blink]
661673

662674
; Check for SUB_S c,b,u3 presence - it doesn't affect prologue.
675+
; ARCv3 targets does not have this instruction.
663676

677+
#ifndef __ARCV3__
664678
.align 4
665679
sub_s_cbu3:
666680
push_s r13
667681
sub_s r0,r1,3
668682
push_s r14
669683
add sp,sp,8
670684
j [blink]
685+
#endif
671686

672687
; Check for SUB_S b,b,c presence - it doesn't affect prologue.
673688

@@ -844,7 +859,9 @@ main:
844859
bl @noncallee_saved_regs_r12_push
845860
bl @noncallee_saved_regs_r2_push
846861
bl @noncallee_saved_regs_gp_push
862+
#ifndef __ARCV3__
847863
bl @noncallee_saved_regs_lp_count
864+
#endif
848865
bl @noncallee_saved_regs_blink_out_of_prologue
849866
bl @arg_regs_fp
850867
bl @arg_regs_fp_mov_s
@@ -862,7 +879,9 @@ main:
862879
bl @jump_in_prologue
863880
bl @cond_jump_in_prologue
864881
bl @predicated_insn
882+
#ifndef __ARCV3__
865883
bl @loop_in_prologue
884+
#endif
866885
bl @store_constant
867886
bl @st_c_limm
868887
bl @st_ab_writeback
@@ -881,7 +900,9 @@ main:
881900
bl @r_relative_store_unknown
882901
bl @st_s_r0gp
883902
bl @push_s_prologue
903+
#ifndef __ARCV3__
884904
bl @sub_s_cbu3
905+
#endif
885906
bl @sub_s_bbc
886907
bl @sub_s_bbu5
887908
bl @sub_0bc

gdb/testsuite/gdb.arch/arc-analyze-prologue.exp

Lines changed: 62 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,27 @@ if ![runto_main] {
3333
return 0
3434
}
3535

36+
proc get_arc_defines { } {
37+
global target_info board_info decimal
38+
39+
set target_board [target_info name]
40+
set compiler [board_info $target_board compiler]
41+
set multilib ""
42+
43+
if { [board_info $target_board exists multilib_flags] } {
44+
set multilib "[board_info $target_board multilib_flags]"
45+
}
46+
47+
set options "$multilib -dM -E -"
48+
return [eval exec "$compiler $options < /dev/null"]
49+
}
50+
51+
set arc_defines [get_arc_defines]
52+
regexp "#define __SIZEOF_POINTER__ ($decimal)" $arc_defines -> arc_reg_size
53+
set is_arcv3 [regexp "__ARCV3__" $arc_defines]
54+
set is_arcv3_arc32 [regexp "__ARC64_ARCH32__" $arc_defines]
55+
set is_arcv3_arc64 [regexp "__ARC64_ARCH64__" $arc_defines]
56+
3657
# Convert list of saved registers and their offsets to a GDB string.
3758
proc saved_regs_to_str { savedregs funcname } {
3859
set str ""
@@ -109,7 +130,15 @@ prologue_test "noncallee_saved_regs_r12_st" { {r12 0} {r13 4} }
109130
prologue_test "noncallee_saved_regs_r12_push" { {r12 0} {r13 4} }
110131
prologue_test "noncallee_saved_regs_r2_push" { {r2 0} {r13 4} }
111132
prologue_test "noncallee_saved_regs_gp_push" { {r25 4} {gp 0} }
112-
prologue_test "noncallee_saved_regs_lp_count" { {r25 4} {lp_count 0} }
133+
# HS6x does not have loop instructions and registers but HS5x does. However,
134+
# it's not supported by GNU tools yet.
135+
if { !$is_arcv3 } {
136+
prologue_test "noncallee_saved_regs_lp_count" { {r25 4} {lp_count 0} }
137+
} else {
138+
if { $is_arcv3_arc32 } {
139+
xfail "noncallee_saved_regs_lp_count: loops are not implemented for HS5x yet"
140+
}
141+
}
113142
prologue_test "noncallee_saved_regs_blink_out_of_prologue" { {r25 8} {gp 4} \
114143
{blink 0}}
115144
# Argument registers are not reported as "saved" regs.
@@ -120,14 +149,28 @@ prologue_test "enter_s_nop"
120149
prologue_test "enter_s_blink" { {blink 0} }
121150
prologue_test "enter_s_fp" { {fp 0} } 0
122151
# Layout of registers as stored by enter_s doesn't conform to ARC ABI.
123-
prologue_test "enter_s_r13" { {r13 4} {fp 8} {blink 0} } 0
124-
prologue_test "enter_s_r15" { {r13 0} {r14 4} {r15 8} } 0
152+
if { $is_arcv3 } {
153+
prologue_test "enter_s_r13" { {r14 8} {fp 0} {blink 4} } 0
154+
} else {
155+
prologue_test "enter_s_r13" { {r13 4} {fp 8} {blink 0} } 0
156+
}
157+
if { $is_arcv3 } {
158+
prologue_test "enter_s_r15" { {r14 0} {r15 4} {r16 8} } 0
159+
} else {
160+
prologue_test "enter_s_r15" { {r13 0} {r14 4} {r15 8} } 0
161+
}
125162
# This enter_s saves GP, however because it is not a "calle-saved register",
126163
# GDB will not report it as "saved register" (but maybe it should). GP is at
127164
# offset 56.
128-
prologue_test "enter_s_all" { {r13 4} {r14 8} {r15 12} {r16 16} {r17 20} \
129-
{r18 24} {r19 28} {r20 32} {r21 36} {r22 40} {r23 44} {r24 48} {r25 52} \
130-
{gp 56} {fp 60} {blink 0} } 0
165+
if { $is_arcv3 } {
166+
prologue_test "enter_s_all" { {r14 8} {r15 12} {r16 16} {r17 20} {r18 24} \
167+
{r19 28} {r20 32} {r21 36} {r22 40} {r23 44} {r24 48} {r25 52} \
168+
{r26 56} {fp 0} {blink 4} } 0
169+
} else {
170+
prologue_test "enter_s_all" { {r13 4} {r14 8} {r15 12} {r16 16} {r17 20} \
171+
{r18 24} {r19 28} {r20 32} {r21 36} {r22 40} {r23 44} {r24 48} \
172+
{r25 52} {gp 56} {fp 60} {blink 0} } 0
173+
}
131174

132175
# Test more levels of backtrace.
133176
gdb_breakpoint nested_prologue_inner temporary
@@ -154,7 +197,15 @@ prologue_test "cond_branch_in_prologue" { {r13 4} }
154197
prologue_test "jump_in_prologue" { {r13 0} }
155198
prologue_test "cond_jump_in_prologue" { {r13 4} }
156199
prologue_test "predicated_insn" { {r13 8} {r15 0} }
157-
prologue_test "loop_in_prologue" { {r25 4} {lp_count 0} }
200+
# HS6x does not have loop instructions and registers but HS5x does. However,
201+
# it's not supported by GNU tools yet.
202+
if { !$is_arcv3 } {
203+
prologue_test "loop_in_prologue" { {r25 4} {lp_count 0} }
204+
} else {
205+
if { $is_arcv3_arc32 } {
206+
xfail "loop_in_prologue: loops are not implemented for HS5x yet"
207+
}
208+
}
158209
prologue_test "store_constant" { {r13 8} {r14 4} }
159210
prologue_test "st_c_limm" { {r15 0} }
160211
prologue_test "st_ab_writeback" { {r13 8} {r14 4} {r15 0} }
@@ -174,7 +225,10 @@ prologue_test "r_relative_store_unknown" { {r13 8} }
174225
prologue_test "st_s_r0gp" { {r13 8} }
175226
prologue_test "push_s_prologue" { {r0 28} {r1 16} {r2 4} {r3 24} {r12 32} \
176227
{r13 20} {r14 12} {r15 8} {blink 0}}
177-
prologue_test "sub_s_cbu3" { {r13 4} {r14 0} }
228+
# ARCv3 targets does not have this instruction.
229+
if { !$is_arcv3 } {
230+
prologue_test "sub_s_cbu3" { {r13 4} {r14 0} }
231+
}
178232
prologue_test "sub_s_bbc" { {r1 4} {r13 12} {r14 0} }
179233
prologue_test "sub_s_bbu5" { {r13 8} {r14 0} }
180234
prologue_test "sub_0bc" { {r13 4} {r14 0} }

0 commit comments

Comments
 (0)