@@ -33,6 +33,27 @@ if ![runto_main] {
33
33
return 0
34
34
}
35
35
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
+
36
57
# Convert list of saved registers and their offsets to a GDB string.
37
58
proc saved_regs_to_str { savedregs funcname } {
38
59
set str ""
@@ -109,7 +130,15 @@ prologue_test "noncallee_saved_regs_r12_st" { {r12 0} {r13 4} }
109
130
prologue_test "noncallee_saved_regs_r12_push" { {r12 0} {r13 4} }
110
131
prologue_test "noncallee_saved_regs_r2_push" { {r2 0} {r13 4} }
111
132
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
+ }
113
142
prologue_test "noncallee_saved_regs_blink_out_of_prologue" { {r25 8} {gp 4} \
114
143
{blink 0}}
115
144
# Argument registers are not reported as "saved" regs.
@@ -120,14 +149,28 @@ prologue_test "enter_s_nop"
120
149
prologue_test "enter_s_blink" { {blink 0} }
121
150
prologue_test "enter_s_fp" { {fp 0} } 0
122
151
# 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
+ }
125
162
# This enter_s saves GP, however because it is not a "calle-saved register",
126
163
# GDB will not report it as "saved register" (but maybe it should). GP is at
127
164
# 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
+ }
131
174
132
175
# Test more levels of backtrace.
133
176
gdb_breakpoint nested_prologue_inner temporary
@@ -154,7 +197,15 @@ prologue_test "cond_branch_in_prologue" { {r13 4} }
154
197
prologue_test "jump_in_prologue" { {r13 0} }
155
198
prologue_test "cond_jump_in_prologue" { {r13 4} }
156
199
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
+ }
158
209
prologue_test "store_constant" { {r13 8} {r14 4} }
159
210
prologue_test "st_c_limm" { {r15 0} }
160
211
prologue_test "st_ab_writeback" { {r13 8} {r14 4} {r15 0} }
@@ -174,7 +225,10 @@ prologue_test "r_relative_store_unknown" { {r13 8} }
174
225
prologue_test "st_s_r0gp" { {r13 8} }
175
226
prologue_test "push_s_prologue" { {r0 28} {r1 16} {r2 4} {r3 24} {r12 32} \
176
227
{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
+ }
178
232
prologue_test "sub_s_bbc" { {r1 4} {r13 12} {r14 0} }
179
233
prologue_test "sub_s_bbu5" { {r13 8} {r14 0} }
180
234
prologue_test "sub_0bc" { {r13 4} {r14 0} }
0 commit comments