]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/testsuite/gdb.arch/arc-analyze-prologue.S
Update copyright year range in all GDB files.
[thirdparty/binutils-gdb.git] / gdb / testsuite / gdb.arch / arc-analyze-prologue.S
CommitLineData
fe5f7374
AK
1; This testcase is part of GDB, the GNU debugger.
2
42a4f53d 3; Copyright 2017-2019 Free Software Foundation, Inc.
fe5f7374
AK
4
5; This program is free software; you can redistribute it and/or modify
6; it under the terms of the GNU General Public License as published by
7; the Free Software Foundation; either version 3 of the License, or
8; (at your option) any later version.
9;
10; This program is distributed in the hope that it will be useful,
11; but WITHOUT ANY WARRANTY; without even the implied warranty of
12; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13; GNU General Public License for more details.
14;
15; You should have received a copy of the GNU General Public License
16; along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18.section .data
19some_variable:
20.long 0xdeadbeef
21
22.section .text
23.global main
24.type main, @function
25
26; Standard prologue.
27
28.align 4
29standard_prologue:
30 push blink
31 sub sp,sp,12
32 st r13, [sp, 0]
33 st r14, [sp, 4]
34 st r18, [sp, 8]
35 add r0, r1, r2
36 ld r18, [sp, 8]
37 ld r14, [sp, 4]
38 ld r13, [sp, 0]
39 add sp,sp,12
40 pop blink
41 j [blink]
42
43; Standard prologue using short instructions.
44
45.align 4
46mini_prologue:
47 push_s blink
48 sub_s sp,sp,12
49 ; ST_S can store only some of the core registers.
50 st_s r13, [sp, 0]
51 st_s r15, [sp, 4]
52 st_s r14, [sp, 8]
53 add r0, r1, r2
54 add sp,sp,16
55 j [blink]
56
57; Standard prologue without `sub sp,sp,INTEGER`.
58
59.align 4
60no_subsp_prologue:
61 push blink
62 push r13
63 push r20
64 push r25
65 add r0, r1, r2
66 pop r25
67 pop r20
68 pop r13
69 pop blink
70 j [blink]
71
72; Standard prologue of leaf function.
73
74.align 4
75leaf_prologue:
76 sub sp,sp,8
77 st r13, [sp, 0]
78 st r15, [sp, 4]
79 add r0, r1, r2
80 ld r13, [sp, 0]
81 ld r15, [sp, 4]
82 j.d [blink]
83 add sp,sp,8
84
85; Prologue with `push fp`.
86
87.align 4
88pushfp_prologue:
89 push r13
90 push r14
91 push fp
92 ; mov fp,sp is part of prologue, but this test will not verify that.
93 ; It will be checked later in the "arg_regs_fp" test.
94 mov fp, sp
95 add r0, r1, r2
96 pop fp
97 pop r14
98 pop r13
99 j [blink]
100
101; Prologue with frame pointer and store relative to FP.
102
103.align 4
104fp_prologue_with_store:
105 push r13
106 push r14
107 push fp
108 mov fp, sp
109 sub_s sp,sp,4
110 st r15,[fp,-4]
111 add r0, r1, r2
112 pop r15
113 pop fp
114 pop r14
115 pop r13
116 j [blink]
117
118; Verify that store of the non-callee saved registers is not part of prologue.
119; Repeat this test for multiple registers, to check boundaries. Also check
120; with both ST and PUSH (aka ST.AW). We have to use multiple functions for
121; this, because GDB would stop analisys at the first instruction that is not
122; part of prologue.
123
124.align 4
125noncallee_saved_regs_r12_st:
126 sub sp,sp,8
127 st r13, [sp, 4]
128 st r12, [sp, 0]
129 add r0, r1, r2
130 j.d [blink]
131 add sp,sp,8
132
133.align 4
134noncallee_saved_regs_r12_push:
135 push r13
136 push r12
137 add r0, r1, r2
138 j.d [blink]
139 add sp,sp,8
140
141.align 4
142noncallee_saved_regs_r2_push:
143 push r13
144 push r2
145 add r0, r1, r2
146 j.d [blink]
147 add sp,sp,8
148
149.align 4
150noncallee_saved_regs_gp_push:
151 push r25
152 push gp
153 add r0, r1, r2
154 j.d [blink]
155 add sp,sp,8
156
157; LP_COUNT is treated like a normal register.
158
159.align 4
160noncallee_saved_regs_lp_count:
161 push r25
162 push lp_count
163 add r0, r1, r2
164 j.d [blink]
165 add sp,sp,8
166
167; BLINK is saved, but after an instruction that is not part of prologue.
168; Currently arc_analyze_prologue stops analisys at the first intstruction
169; that is not a part of prologue. This might be not the best way, but it is
170; what it is right now, so this test confirms this.
171
172.align 4
173noncallee_saved_regs_blink_out_of_prologue:
174 push r25
175 push gp
176 push blink
177 add r0, r1, r2
178 j.d [blink]
179 add sp,sp,12
180
181; Saving arguments register via FP.
182
183.align 4
184arg_regs_fp:
185 push fp
186 mov fp, sp
187 sub sp, sp, 16
188 st r0, [fp, -4]
189 st r1, [fp, -8]
190 st r7, [fp, -12]
191 st r8, [fp, -16]
192 add r0, r1, r2
193 add sp,sp,16
194 pop fp
195 j [blink]
196
197; Like the previous, but with mov_s.
198
199.align 4
200arg_regs_fp_mov_s:
201 push fp
202 mov_s fp, sp
203 sub sp, sp, 8
204 st r0, [fp, -4]
205 ; Not part of the prologue.
206 st r8, [fp, -8]
207 add r0, r1, r2
208 add sp,sp,8
209 pop fp
210 j [blink]
211
212; Saving arguments register without FP.
213
214.align 4
215arg_regs_sp:
216 sub sp, sp, 24
217 st r0, [sp, 0]
218 st r1, [sp, 4]
219 st r7, [sp, 8]
220 ; Normally that would be done before saving args, but it is used as a
221 ; marker that saving arguments relatively to SP is considered part of
222 ; prologue.
223 st r13, [sp, 16]
224 ; Not part of the prologue.
225 st r8, [sp, 12]
226 st r14, [sp, 20]
227 add r0, r1, r2
228 j.d [blink]
229 add sp,sp,24
230
231; ENTER_S that does nothing.
232
233.align 4
234enter_s_nop:
235 ; Effectively a nop.
236 enter_s 0
237 add r0,r1,r2
238 j [blink]
239
240; ENTER_S that stores BLINK.
241
242.align 4
243enter_s_blink:
244 enter_s 32
245 add r0,r1,r2
246 j.d [blink]
247 add sp,sp,4
248
249; ENTER_S that stores FP.
250
251.align 4
252enter_s_fp:
253 enter_s 16
254 add r0,r1,r2
255 j.d [blink]
256 add sp,sp,4
257
258; ENTER_S that stores R13, FP and BLINK.
259
260.align 4
261enter_s_r13:
262 enter_s (32 + 16 + 1)
263 add r0,r1,r2
264 j.d [blink]
265 add sp,sp,12
266
267; ENTER_S that stores R13-R15
268
269.align 4
270enter_s_r15:
271 enter_s 3
272 add r0,r1,r2
273 j.d [blink]
274 add sp,sp,12
275
276; ENTER_S that stores everything it could.
277
278.align 4
279enter_s_all:
280 enter_s (32 + 16 + 14)
281 add r0,r1,r2
282 j.d [blink]
283 add sp,sp,64
284
285; Deeper nesting.
286
287.align 4
288nested_prologue_inner:
289 sub sp,sp,8
290 st r18, [sp, 4]
291 st r13, [sp, 0]
292 add r0, r1, r2
293 ld r18, [sp, 4]
294 ld r13, [sp, 0]
295 j.d [blink]
296 add sp,sp,8
297
298.align 4
299nested_prologue_outer:
300 push blink
301 sub sp,sp,8
302 st r14, [sp, 0]
303 st r15, [sp, 4]
304 bl @nested_prologue_inner
305 add r0, r1, r2
306 ld r14, [sp, 0]
307 ld r15, [sp, 4]
308 add sp,sp,8
309 pop blink
310 j [blink]
311
312; Prologue with maximum length.
313; Expressions like (0xFFFFFFFF + 25) force assembler to use long immediate
314; even for values that don't need it, thus letting us test maksimum prologue
315; length without having huge frames.
316.align 4
317max_length_prologue:
318 ; Variadic args
319 sub sp,sp,(0xFFFFFFFF + 25) ; 24 bytes
320 push blink
321 ; Allocate space for 13 callee-saved and 8 arg regs.
322 sub sp,sp,(0xFFFFFFFF + 1 + 21 * 4)
323 st r13, [sp, 0]
324 st r14, [sp, 4]
325 st r15, [sp, 8]
326 st r16, [sp, 12]
327 st r17, [sp, 16]
328 st r18, [sp, 20]
329 st r19, [sp, 24]
330 st r20, [sp, 28]
331 st r21, [sp, 32]
332 st r22, [sp, 36]
333 st r23, [sp, 40]
334 st r24, [sp, 44]
335 st r25, [sp, 48]
336 st r0, [sp, 52]
337 st r1, [sp, 56]
338 st r2, [sp, 60]
339 st r3, [sp, 64]
340 st r4, [sp, 68]
341 st r5, [sp, 72]
342 st r6, [sp, 76]
343 st r7, [sp, 80]
344 push fp
345 mov fp,sp
346 sub sp,sp,(0xFFFFFFFF + 1 + 16) ; Space for local variables.
347 ; End of prologue.
348 add sp,sp,24 + 21 * 4 + 16
349 j [blink]
350
351; Few tests that test that prologue analysis stops at branch. There are four
352; types of "branches": conditional and non-conditional, relative branches and
353; absolute jumps.
354
355.align 4
356branch_in_prologue:
357 push r13
358 b @.L1
359 ; This store on stack is not a prologue.
360 push r14
361.L1:
362 add r0,r1,r2
363 j.d [blink]
364 add sp,sp,4
365
366.align 4
367cond_branch_in_prologue:
368 sub_s sp,sp,8
369 st_s r13,[sp,4]
370 ; Doesn't matter if branch is taken or not.
371 breq r0,r1,@.L2
372 ; This store on stack is not a prologue.
373 st_s r14,[sp,0]
374.L2:
375 add r0,r1,r2
376 pop fp
377 j.d [blink]
378 add sp,sp,8
379
380.align 4
381jump_in_prologue:
382 push r13
383 j @.L3
384 ; This store on stack is not a prologue.
385 push r14
386.L3:
387 add r0,r1,r2
388 j.d [blink]
389 add sp,sp,4
390
391.align 4
392cond_jump_in_prologue:
393 sub_s sp,sp,8
394 st_s r13,[sp,4]
395 ; It doesn't matter if jump is taken or not - prologue analysis has to
396 ; stop before `jeq` in any case.
397 jeq @.L4
398 ; This store on stack is not a prologue.
399 st_s r14,[sp,0]
400.L4:
401 add r0,r1,r2
402 j.d [blink]
403 add sp,sp,8
404
405.align 4
406predicated_insn:
407 sub_s sp,sp,12
408 st_s r13,[sp,8]
409 st_s r15,[sp,0]
410 ; Use SUB SP,SP,0 because it is otherwise a valid instruction for
411 ; prologue, so it will halt analysis purely because of its predicate.
412 sub.eq sp,sp,0 ; This is not a prologue anymore.
413 st_s r14,[sp,4]
414 add sp,sp,12
415 j [blink]
416
417; Loops should halt prologue analysis.
418
419.align 4
420loop_in_prologue:
421 push r25
422 push lp_count
423 mov lp_count, 4
424 lp @.Lloop_end1
425 push r26 ; Not part of prologue.
426 add r0, r1, r2
427.Lloop_end1:
428 add r1, r1, r2
429 pop r26
430 add sp,sp,8
431 pop r25
432 j [blink]
433
434; Store of a constant value (not a register).
435
436.align 4
437store_constant:
438 sub_s sp,sp,12
439 st_s r13,[sp,8]
440 st 0xdeadbeef,[sp,0]
441 st_s r14,[sp,4]
442 add sp,sp,12
443 j [blink]
444
445; Test that store to immediate address halts prologue analysis.
446.align 4
447st_c_limm:
448 push r15
449 st r14,[@some_variable]
450 push r13
451 add sp,sp,8
452 j [blink]
453
454; Store with AB writeback mode.
455
456.align 4
457st_ab_writeback:
458 sub sp,sp,8
459 st r13,[sp,4]
460 st.ab r14,[sp,-4]
461 st r15,[sp,0]
462 add sp,sp,12
463 j [blink]
464
465; Store of a word with AS writeback mode.
466
467.align 4
468st_as_writeback:
469 sub sp,sp,12
470 st r13,[sp,8]
471 st.as r14,[sp,1] ; ST.AS, hence address is (offset << 2).
472 st r15,[sp,0]
473 add sp,sp,12
474 j [blink]
475
476; Store of a halfword with AS writeback mode.
477
478.align 4
479sth_as_writeback:
480 sub sp,sp,12
481 st r13,[sp,8]
482 sth.as r14,[sp,2] ; STH.AS, hence address is (offset << 1).
483 st r15,[sp,0]
484 add sp,sp,12
485 j [blink]
486
487; Store of a double word with AS writeback mode. Shift is still 2, like ST!
488
489.align 4
490std_as_writeback:
491 sub sp,sp,16
492 st r13,[sp,12]
493#ifdef __ARC_LL64__
494 std.as r14,[sp,1] ; STD.AS, hence address is (offset << 2).
495#else
496 st.as r14,[sp,1] ; STD.AS, hence address is (offset << 2).
497 st.as r15,[sp,2] ; STD.AS, hence address is (offset << 2).
498#endif
499 st r16,[sp,0]
500 add sp,sp,12
501 j [blink]
502
503; Store of the halfword. R14 will not be reported as "saved".
504
505.align 4
506st_halfword:
507 sub sp,sp,12
508 st r13,[sp,8]
509 sth r14,[sp,4]
510 st r15,[sp,0]
511 add sp,sp,12
512 j [blink]
513
514; Store of the halfword. R14 will not be reported as "saved".
515
516.align 4
517sts_halfword:
518 sub sp,sp,12
519 st r13,[sp,8]
520 mov r13,sp
521 sth_s r14,[r13,4]
522 st r15,[sp,0]
523 add sp,sp,12
524 j [blink]
525
526; Store of the byte. R14 will not be reported as "saved".
527
528.align 4
529st_byte:
530 sub sp,sp,12
531 st r13,[sp,8]
532 stb r14,[sp,4]
533 st r15,[sp,0]
534 add sp,sp,12
535 j [blink]
536
537; Store of the byte. R14 will not be reported as "saved".
538
539.align 4
540sts_byte:
541 sub sp,sp,12
542 st r13,[sp,8]
543 mov r13,sp
544 stb_s r14,[r13,4]
545 st r15,[sp,0]
546 add sp,sp,12
547 j [blink]
548
549; Store of the byte. R14 will not be reported as "saved".
550
551.align 4
552sts_byte_sp:
553 sub sp,sp,12
554 st r13,[sp,8]
555 stb_s r14,[sp,4]
556 st r15,[sp,0]
557 add sp,sp,12
558 j [blink]
559
560; Double word store, optionally available for ARC HS.
561
562.align 4
563st_double:
564 sub sp,sp,8
565#ifdef __ARC_LL64__
566 std r14,[sp,0]
567 std.aw r18,[sp,-8]
568 std.aw 0xdeadbeef,[sp,-8]
569#else
570 st r14,[sp,0]
571 st r15,[sp,4]
572 st.aw r19,[sp,-4]
573 st.aw r18,[sp,-4]
574 sub sp,sp,8
575#endif
576 add sp,sp,24
577 j [blink]
578
579; Store relative to some register with a known value.
580
581.align 4
582r_relative_store:
583 sub_s sp,sp,12
584 st_s r13,[sp,8]
585 mov r13,sp
586 ; Check for both mov and mov_s in one testcase.
587 mov_s r12,r13
588 st r15,[r12,0]
589 st_s r14,[sp,4]
590 add sp,sp,12
591 j [blink]
592
593; Store relative to some register with a known value using sub.
594; Like a previous test, but register is assigned via sub, instead of mov.
595
596.align 4
597r_relative_sub_store:
598 ; Following is a complicated way to construct frame like this:
599 ; sub_s sp,sp,12
600 ; st_s r13,[sp,8]
601 ; st_s r14,[sp,4]
602 ; st_s r15,[sp,0]
603 sub_s sp,sp,12
604 st_s r13,[sp,8]
605 sub r13,sp,4
606 st r14,[r13,8]
607 st_s r15,[sp,0]
608 add sp,sp,12
609 j [blink]
610
611; Like r_relative_store, but using st_s c,[b,u7] which has different opcode.
612
613.align 4
614r_relative_store_st_s:
615 sub_s sp,sp,12
616 st_s r13,[sp,8]
617 mov r13,sp
618 st_s r15,[r13,4]
619 st_s r14,[sp,0]
620 add sp,sp,12
621 j [blink]
622
623; Store relative to some register with a unknown value.
624
625.align 4
626r_relative_store_unknown:
627 sub_s sp,sp,12
628 st_s r13,[sp,8]
629 st r15,[gp,0] ; GP value is not relative to SP.
630 st_s r14,[sp,4]
631 add sp,sp,12
632 j [blink]
633
634; Store relative to some register with a unknown value, using st_s r0,[gp,s11].
635
636.align 4
637st_s_r0gp:
638 sub_s sp,sp,12
639 st_s r13,[sp,8]
640 st_s r0,[gp,0] ; GP value is not relative to SP.
641 st_s r14,[sp,4]
642 add sp,sp,12
643 j [blink]
644
645; Check prologue that uses `push_s RR` instructions. `push_s b` and `push_s
646; blink` use slightly different subopcodes.
647
648.align 4
649push_s_prologue:
650 push_s r12
651 push_s r0
652 push_s r3
653 push_s r13
654 push_s r1
655 push_s r14
656 push_s r15
657 push_s r2
658 push_s blink ; Also tested in mini_prologue ().
659 add sp,sp,(4 * 9)
660 j [blink]
661
662; Check for SUB_S c,b,u3 presence - it doesn't affect prologue.
663
664.align 4
665sub_s_cbu3:
666 push_s r13
667 sub_s r0,r1,3
668 push_s r14
669 add sp,sp,8
670 j [blink]
671
672; Check for SUB_S b,b,c presence - it doesn't affect prologue.
673
674.align 4
675sub_s_bbc:
676 push_s r13
677 sub_s r0,r0,r1
678 push_s r0
679 push_s r1
680 push_s r14
681 add sp,sp,16
682 j [blink]
683
684; Check for SUB_S b,b,u5.
685
686.align 4
687sub_s_bbu5:
688 push_s r13
689 sub_s r2,r2,14
690 push_s r2
691 push_s r14
692 add sp,sp,12
693 j [blink]
694
695; Check for SUB 0,b,c, which is effectively a noop (but it can set status
696; flags). It shouldn't stop prologue analysis.
697
698.align 4
699sub_0bc:
700 push_s r13
701 sub 0,r1,r2
702 sub.f 0,r3,r4
703 push_s r14
704 add sp,sp,8
705 j [blink]
706
707; Check for SUB a,limm,c.
708
709.align 4
710sub_alimmb:
711 push_s r13
712 sub r13,0xdeadbeef,r14
713 push_s r14
714 add sp,sp,8
715 j [blink]
716
717; Check for sub_s.ne b,b,b. Has a condition code, hence should halt prologue.
718
719.align 4
720sub_s_ne_bbb:
721 push_s r13
722 sub_s.ne r13,r13,r13
723 push_s r14
724 add sp,sp,8
725 j [blink]
726
727; Check MOV that uses LIMM values.
728
729.align 4
730mov_limm:
731 push_s r13
732 mov r13,0xdeadbeef
733 push_s r14
734 add sp,sp,4
735 pop_s r13
736 j [blink]
737
738; Check MOV 0,c.
739
740.align 4
741mov0c_limm:
742 push_s r13
743 mov 0,r13
744 push_s r14
745 add sp,sp,4
746 pop_s r13
747 j [blink]
748
749; Check that MOV_S h,s3 doesn't prevent prologue analysis.
750
751.align 4
752mov_s_hs3:
753 push_s r13
754 mov_s r5,1
755 push_s r14
756 add sp,sp,8
757 j [blink]
758
759; Check that MOV_S b,u8 doesn't prevent prologue analysis.
760
761.align 4
762mov_s_bu8:
763 push_s r13
764 mov_s r12,250
765 push_s r14
766 add sp,sp,8
767 j [blink]
768
769; Check that `mov_s.ne b,h` halts prologue analysis.
770
771.align 4
772mov_s_ne_bh:
773 push_s r13
774 mov_s.ne r13,r5
775 push_s r14
776 add sp,sp,8
777 j [blink]
778
779; Check that register R12 which original value is not stored will not pop-up in
780; the "Saved registers" list.
781
782.align 4
783unstored_reg:
784 sub_s sp,sp,12
785 st_s r13,[sp,0]
786 st_s r14,[sp,4]
787 mov r12,0x42
788 st_s r12,[sp,8]
789 add sp,sp,12
790 j [blink]
791
792; Two stores at the same adddress. GDB should report only the R14.
793
794.align 4
795double_store:
796 sub_s sp,sp,4
797 st_s r13,[sp,0]
798 st_s r14,[sp,0]
799 add sp,sp,4
800 j [blink]
801
802; Test for a case where callee has an alloca or anything else that might
803; modify stack dynamically in the function body - after the prologue.
804; This assumes that FP is set properly, so that GDB can use it - this holds
805; true for frames generated by GCC.
806
807.align 4
808alloca_outer:
809 sub sp,sp,8
810 st blink,[sp,4]
811 st fp,[sp,0]
812 mov fp,sp
813 add r0,r1,r2 ; Not a prologue anymore.
814 sub sp,sp,8
815 bl @alloca_inner
816 add sp,sp,8
817 ld fp,[sp,0]
818 ld blink,[sp,4]
819 j.d [blink]
820 add sp,sp,8
821
822.align 4
823alloca_inner:
824 push r13
825 push r14
826 add sp,sp,8
827 j [blink]
828
829
830.align 4
831main:
832 push blink
833 # Create small section for GP-relative accesses.
834 push gp
835 sub sp,sp,16
836 add gp,sp,8
837 bl @standard_prologue
838 bl @mini_prologue
839 bl @no_subsp_prologue
840 bl @leaf_prologue
841 bl @pushfp_prologue
842 bl @fp_prologue_with_store
843 bl @noncallee_saved_regs_r12_st
844 bl @noncallee_saved_regs_r12_push
845 bl @noncallee_saved_regs_r2_push
846 bl @noncallee_saved_regs_gp_push
847 bl @noncallee_saved_regs_lp_count
848 bl @noncallee_saved_regs_blink_out_of_prologue
849 bl @arg_regs_fp
850 bl @arg_regs_fp_mov_s
851 bl @arg_regs_sp
852 bl @enter_s_nop
853 bl @enter_s_blink
854 bl @enter_s_fp
855 bl @enter_s_r13
856 bl @enter_s_r15
857 bl @enter_s_all
858 bl @nested_prologue_outer
859 bl @max_length_prologue
860 bl @branch_in_prologue
861 bl @cond_branch_in_prologue
862 bl @jump_in_prologue
863 bl @cond_jump_in_prologue
864 bl @predicated_insn
865 bl @loop_in_prologue
866 bl @store_constant
867 bl @st_c_limm
868 bl @st_ab_writeback
869 bl @st_as_writeback
870 bl @sth_as_writeback
871 bl @std_as_writeback
872 bl @st_halfword
873 bl @sts_halfword
874 bl @st_byte
875 bl @sts_byte
876 bl @sts_byte_sp
877 bl @st_double
878 bl @r_relative_store
879 bl @r_relative_sub_store
880 bl @r_relative_store_st_s
881 bl @r_relative_store_unknown
882 bl @st_s_r0gp
883 bl @push_s_prologue
884 bl @sub_s_cbu3
885 bl @sub_s_bbc
886 bl @sub_s_bbu5
887 bl @sub_0bc
888 bl @sub_alimmb
889 bl @sub_s_ne_bbb
890 bl @mov_limm
891 bl @mov0c_limm
892 bl @mov_s_hs3
893 bl @mov_s_bu8
894 bl @mov_s_ne_bh
895 bl @unstored_reg
896 bl @double_store
897 bl @alloca_outer
898 add sp,sp,16
899 pop gp
900 pop blink
901 j_s [blink]
902
903.align 4