]> git.ipfire.org Git - people/ms/ipfire-3.x.git/blob - gdb/patches/gdb-6.6-bz237572-ppc-atomic-sequence-test.patch
kernel: Update to 3.15.6.
[people/ms/ipfire-3.x.git] / gdb / patches / gdb-6.6-bz237572-ppc-atomic-sequence-test.patch
1 2007-06-25 Jan Kratochvil <jan.kratochvil@redhat.com>
2
3 * gdb.threads/atomic-seq-threaded.c,
4 gdb.threads/atomic-seq-threaded.exp: New files.
5
6 Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.threads/atomic-seq-threaded.c
7 ===================================================================
8 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
9 +++ gdb-6.8.50.20081128/gdb/testsuite/gdb.threads/atomic-seq-threaded.c 2008-12-08 22:27:01.000000000 +0100
10 @@ -0,0 +1,171 @@
11 +/* This testcase is part of GDB, the GNU debugger.
12 +
13 + Copyright 2007 Free Software Foundation, Inc.
14 +
15 + This program is free software; you can redistribute it and/or modify
16 + it under the terms of the GNU General Public License as published by
17 + the Free Software Foundation; either version 2 of the License, or
18 + (at your option) any later version.
19 +
20 + This program is distributed in the hope that it will be useful,
21 + but WITHOUT ANY WARRANTY; without even the implied warranty of
22 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 + GNU General Public License for more details.
24 +
25 + You should have received a copy of the GNU General Public License
26 + along with this program; if not, write to the Free Software
27 + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
28 + MA 02110-1301, USA. */
29 +
30 +/* Test stepping over RISC atomic sequences.
31 + This variant testcases the code for stepping another thread while skipping
32 + over the atomic sequence in the former thread
33 + (STEPPING_PAST_SINGLESTEP_BREAKPOINT).
34 + Code comes from gcc/testsuite/gcc.dg/sync-2.c */
35 +
36 +/* { dg-options "-march=i486" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
37 +/* { dg-options "-mcpu=v9" { target sparc*-*-* } } */
38 +
39 +/* Test functionality of the intrinsics for 'short' and 'char'. */
40 +
41 +#include <stdlib.h>
42 +#include <string.h>
43 +#include <pthread.h>
44 +#include <assert.h>
45 +#include <unistd.h>
46 +
47 +#define LOOPS 2
48 +
49 +static int unused;
50 +
51 +static char AI[18];
52 +static char init_qi[18] = { 3,5,7,9,0,0,0,0,-1,0,0,0,0,0,-1,0,0,0 };
53 +static char test_qi[18] = { 3,5,7,9,1,4,22,-12,7,8,9,7,1,-12,7,8,9,7 };
54 +
55 +static void
56 +do_qi (void)
57 +{
58 + if (__sync_fetch_and_add(AI+4, 1) != 0)
59 + abort ();
60 + if (__sync_fetch_and_add(AI+5, 4) != 0)
61 + abort ();
62 + if (__sync_fetch_and_add(AI+6, 22) != 0)
63 + abort ();
64 + if (__sync_fetch_and_sub(AI+7, 12) != 0)
65 + abort ();
66 + if (__sync_fetch_and_and(AI+8, 7) != (char)-1)
67 + abort ();
68 + if (__sync_fetch_and_or(AI+9, 8) != 0)
69 + abort ();
70 + if (__sync_fetch_and_xor(AI+10, 9) != 0)
71 + abort ();
72 + if (__sync_fetch_and_nand(AI+11, 7) != 0)
73 + abort ();
74 +
75 + if (__sync_add_and_fetch(AI+12, 1) != 1)
76 + abort ();
77 + if (__sync_sub_and_fetch(AI+13, 12) != (char)-12)
78 + abort ();
79 + if (__sync_and_and_fetch(AI+14, 7) != 7)
80 + abort ();
81 + if (__sync_or_and_fetch(AI+15, 8) != 8)
82 + abort ();
83 + if (__sync_xor_and_fetch(AI+16, 9) != 9)
84 + abort ();
85 + if (__sync_nand_and_fetch(AI+17, 7) != 7)
86 + abort ();
87 +}
88 +
89 +static short AL[18];
90 +static short init_hi[18] = { 3,5,7,9,0,0,0,0,-1,0,0,0,0,0,-1,0,0,0 };
91 +static short test_hi[18] = { 3,5,7,9,1,4,22,-12,7,8,9,7,1,-12,7,8,9,7 };
92 +
93 +static void
94 +do_hi (void)
95 +{
96 + if (__sync_fetch_and_add(AL+4, 1) != 0)
97 + abort ();
98 + if (__sync_fetch_and_add(AL+5, 4) != 0)
99 + abort ();
100 + if (__sync_fetch_and_add(AL+6, 22) != 0)
101 + abort ();
102 + if (__sync_fetch_and_sub(AL+7, 12) != 0)
103 + abort ();
104 + if (__sync_fetch_and_and(AL+8, 7) != -1)
105 + abort ();
106 + if (__sync_fetch_and_or(AL+9, 8) != 0)
107 + abort ();
108 + if (__sync_fetch_and_xor(AL+10, 9) != 0)
109 + abort ();
110 + if (__sync_fetch_and_nand(AL+11, 7) != 0)
111 + abort ();
112 +
113 + if (__sync_add_and_fetch(AL+12, 1) != 1)
114 + abort ();
115 + if (__sync_sub_and_fetch(AL+13, 12) != -12)
116 + abort ();
117 + if (__sync_and_and_fetch(AL+14, 7) != 7)
118 + abort ();
119 + if (__sync_or_and_fetch(AL+15, 8) != 8)
120 + abort ();
121 + if (__sync_xor_and_fetch(AL+16, 9) != 9)
122 + abort ();
123 + if (__sync_nand_and_fetch(AL+17, 7) != 7)
124 + abort ();
125 +}
126 +
127 +static void *
128 +start1 (void *arg)
129 +{
130 + unsigned loop;
131 + sleep(1);
132 +
133 + for (loop = 0; loop < LOOPS; loop++)
134 + {
135 + memcpy(AI, init_qi, sizeof(init_qi));
136 +
137 + do_qi ();
138 +
139 + if (memcmp (AI, test_qi, sizeof(test_qi)))
140 + abort ();
141 + }
142 +
143 + return arg; /* _delete1_ */
144 +}
145 +
146 +static void *
147 +start2 (void *arg)
148 +{
149 + unsigned loop;
150 +
151 + for (loop = 0; loop < LOOPS; loop++)
152 + {
153 + memcpy(AL, init_hi, sizeof(init_hi));
154 +
155 + do_hi ();
156 +
157 + if (memcmp (AL, test_hi, sizeof(test_hi)))
158 + abort ();
159 + }
160 +
161 + return arg; /* _delete2_ */
162 +}
163 +
164 +int
165 +main (int argc, char **argv)
166 +{
167 + pthread_t thread;
168 + int i;
169 +
170 + i = pthread_create (&thread, NULL, start1, NULL); /* _create_ */
171 + assert (i == 0); /* _create_after_ */
172 +
173 + sleep (1);
174 +
175 + start2 (NULL);
176 +
177 + i = pthread_join (thread, NULL); /* _delete_ */
178 + assert (i == 0);
179 +
180 + return 0; /* _exit_ */
181 +}
182 Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.threads/atomic-seq-threaded.exp
183 ===================================================================
184 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
185 +++ gdb-6.8.50.20081128/gdb/testsuite/gdb.threads/atomic-seq-threaded.exp 2008-12-08 22:31:01.000000000 +0100
186 @@ -0,0 +1,84 @@
187 +# atomic-seq-threaded.exp -- Test case for stepping over RISC atomic code seqs.
188 +# This variant testcases the code for stepping another thread while skipping
189 +# over the atomic sequence in the former thread
190 +# (STEPPING_PAST_SINGLESTEP_BREAKPOINT).
191 +# Copyright (C) 2007 Free Software Foundation, Inc.
192 +
193 +# This program is free software; you can redistribute it and/or modify
194 +# it under the terms of the GNU General Public License as published by
195 +# the Free Software Foundation; either version 2 of the License, or
196 +# (at your option) any later version.
197 +#
198 +# This program is distributed in the hope that it will be useful,
199 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
200 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
201 +# GNU General Public License for more details.
202 +#
203 +# You should have received a copy of the GNU General Public License
204 +# along with this program; if not, write to the Free Software
205 +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
206 +
207 +# Please email any bugs, comments, and/or additions to this file to:
208 +# bug-gdb@prep.ai.mit.edu
209 +
210 +set testfile atomic-seq-threaded
211 +set srcfile ${testfile}.c
212 +set binfile ${objdir}/${subdir}/${testfile}
213 +
214 +foreach opts {{} {compiler=gcc4} {FAIL}} {
215 + if {$opts eq "FAIL"} {
216 + return -1
217 + }
218 + if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug $opts]] eq "" } {
219 + break
220 + }
221 +}
222 +
223 +gdb_exit
224 +gdb_start
225 +gdb_reinitialize_dir $srcdir/$subdir
226 +
227 +gdb_load ${binfile}
228 +if ![runto_main] then {
229 + fail "Can't run to main"
230 + return 0
231 +}
232 +
233 +# pthread_create () will not pass even on x86_64 with software watchpoint.
234 +# Pass after pthread_create () without any watchpoint active.
235 +set line [gdb_get_line_number "_create_after_"]
236 +gdb_test "tbreak $line" \
237 + "reakpoint (\[0-9\]+) at .*$srcfile, line $line\..*" \
238 + "set breakpoint after pthread_create ()"
239 +gdb_test "c" \
240 + ".*/\\* _create_after_ \\*/.*" \
241 + "run till after pthread_create ()"
242 +
243 +# Without a watchpoint being software no single-stepping would be used.
244 +set test "Start (software) watchpoint"
245 +gdb_test_multiple "watch unused" $test {
246 + -re "Watchpoint \[0-9\]+: unused.*$gdb_prompt $" {
247 + pass $test
248 + }
249 + -re "Hardware watchpoint \[0-9\]+: unused.*$gdb_prompt $" {
250 + # We do not test the goal but still the whole testcase should pass.
251 + unsupported $test
252 + }
253 +}
254 +
255 +# More thorough testing of the scheduling logic.
256 +gdb_test "set scheduler-locking step" ""
257 +
258 +# Critical code path is stepped through at this point.
259 +set line [gdb_get_line_number "_exit_"]
260 +gdb_test "tbreak $line" \
261 + "reakpoint \[0-9\]+ at .*$srcfile, line $line\..*" \
262 + "set breakpoint at _exit_"
263 +gdb_test "c" \
264 + ".*/\\* _exit_ \\*/.*" \
265 + "run till _exit_"
266 +
267 +# Just a nonproblematic program exit.
268 +gdb_test "c" \
269 + ".*Program exited normally\\..*" \
270 + "run till program exit"