aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.arch/arm-disp-step.S
blob: fb769743592f55faa89e87c856577a5c217129ba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/* Copyright 2010, 2011 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

	.syntax unified
	.text
	.type main,%function
#if defined (__thumb__) || defined (__thumb2__)
	.code   16
	.thumb_func
#endif
	.globl main
main:
	push {r7, lr}
	add     sp, sp, #4
	mov	r7, sp

	
	/* Test call and return */	
	.global test_call
test_call:
	bl test_call_subr
        .global test_ret_end
test_ret_end:
	nop			@ Location test_ret_end
	
	/* Test branch */
	bl test_branch

	/* Test ldr from pc */
	bl test_ldr_pc

	/* Test ldm/stm only in ARM mode */
#if !defined (__thumb__) && !defined (__thumb2__)
	bl test_ldm_stm_pc
#endif

	/* Test str in ARM mode and Thumb-2 */
#if !defined(__thumb__)
	bl test_str_pc
#endif
	/* Return */
	mov     sp, r7
	sub     sp, sp, #4
	movs 	r0, #0
	pop	{r7, pc}
	.size main, .-main
	
	.global test_call_subr
#if defined (__thumb__) || defined (__thumb2__)
	.code   16
	.thumb_func
#endif
	.type test_call_subr, %function
test_call_subr:
	nop
        .global test_call_end
test_call_end:
        nop			@ Location test_call_end
        .global test_ret
test_ret:
        bx lr
	.size test_call_subr, .-test_call_subr

	
	.global test_branch
#if defined (__thumb__) || defined (__thumb2__)
	.code   16
	.thumb_func
#endif
	.type test_branch, %function
test_branch:
	b	L_branch
	.global
L_branch:
	bx lr
	.size test_branch, .-test_branch

	.global test_ldr_pc
#if defined (__thumb__) || defined (__thumb2__)
	.code   16
	.thumb_func
#endif
	.type test_ldr_pc, %function
test_ldr_pc:
	ldr	r1, [pc, #0]

	.global
test_ldr_pc_ret:
	bx lr
	.size test_ldr_pc, .-test_ldr_pc

#if !defined (__thumb__) && !defined (__thumb2__)
	.global test_ldm_stm_pc
	.type test_ldm_stm_pc, %function
test_ldm_stm_pc:
	stmdb	sp!, {lr, pc}
	ldmia	sp!, {r0, r1}
	ldr	r0, .L1
	stmdb	sp!, {r0}
	.global
test_ldm_pc:
	ldmia	sp!, {pc}
	.global
test_ldm_stm_pc_ret:
	bx lr
	.align	2
.L1:
	.word	test_ldm_stm_pc_ret
	.size test_ldm_stm_pc, .-test_ldm_stm_pc
#endif

#if !defined(__thumb__)
#if defined (__thumb2__)
	.code   16
	.thumb_func
#endif
	.global test_str_pc
	.type test_str_pc, %function
test_str_pc:
	str     pc, [sp, #-4]
	ldr	r0, [sp, #-4]
	sub	r0, r0, pc
	/* compute offset again without displaced stepping.  */
	str     pc, [sp, #-4]
	ldr	r1, [sp, #-4]
	sub	r1, r1, pc

	/* r0 should be equal to r1.  */
	cmp	r0, r1
	bne	pc_offset_wrong

	.global pc_offset_right
pc_offset_right:
	b	test_str_pc_end

	.global pc_offset_wrong
pc_offset_wrong:
	nop

	.global test_str_pc_end
test_str_pc_end:
	bx lr
#endif