OLD | NEW |
1 /* This testcase is part of GDB, the GNU debugger. | 1 /* This testcase is part of GDB, the GNU debugger. |
2 | 2 |
3 Copyright 2011-2012 Free Software Foundation, Inc. | 3 Copyright 2012 Free Software Foundation, Inc. |
4 | 4 |
5 This program is free software; you can redistribute it and/or modify | 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 | 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 | 7 the Free Software Foundation; either version 3 of the License, or |
8 (at your option) any later version. | 8 (at your option) any later version. |
9 | 9 |
10 This program is distributed in the hope that it will be useful, | 10 This program is distributed in the hope that it will be useful, |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 GNU General Public License for more details. | 13 GNU General Public License for more details. |
14 | 14 |
15 You should have received a copy of the GNU General Public License | 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/>. */ | 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
17 | 17 |
| 18 #include <pthread.h> |
| 19 |
18 #ifdef SYMBOL_PREFIX | 20 #ifdef SYMBOL_PREFIX |
19 #define SYMBOL(str) SYMBOL_PREFIX #str | 21 #define SYMBOL(str) SYMBOL_PREFIX #str |
20 #else | 22 #else |
21 #define SYMBOL(str) #str | 23 #define SYMBOL(str) #str |
22 #endif | 24 #endif |
23 | |
24 int globvar; | |
25 | |
26 static void | |
27 begin (void) | |
28 {} | |
29 | |
30 /* Called from asm. */ | 25 /* Called from asm. */ |
31 static void __attribute__((used)) | 26 static void __attribute__((used)) |
32 func (void) | 27 func (void) |
33 {} | 28 {} |
34 | 29 |
35 static void | 30 static void * |
36 marker (int anarg) | 31 thread_function(void *arg) |
37 { | 32 { |
38 /* `set_point' is the label at which to set a fast tracepoint. The | 33 /* `set_point1' is the label at which to set a fast tracepoint. The |
39 insn at the label must be large enough to fit a fast tracepoint | 34 insn at the label must be large enough to fit a fast tracepoint |
40 jump. */ | 35 jump. */ |
41 asm (" .global " SYMBOL(set_point) "\n" | 36 asm (" .global " SYMBOL(set_point1) "\n" |
42 SYMBOL(set_point) ":\n" | 37 SYMBOL(set_point1) ":\n" |
43 #if (defined __x86_64__ || defined __i386__) | 38 #if (defined __x86_64__ || defined __i386__) |
44 " call " SYMBOL(func) "\n" | 39 " call " SYMBOL(func) "\n" |
45 #endif | 40 #endif |
46 ); | 41 ); |
47 | |
48 ++anarg; | |
49 | |
50 /* Set up a known 4-byte instruction so we can try to set a shorter | |
51 fast tracepoint at it. */ | |
52 asm (" .global " SYMBOL(four_byter) "\n" | |
53 SYMBOL(four_byter) ":\n" | |
54 #if (defined __i386__) | |
55 " cmpl $0x1,0x8(%ebp) \n" | |
56 #endif | |
57 ); | |
58 } | 42 } |
59 | 43 |
60 static void | 44 static void |
61 end (void) | 45 end (void) |
62 {} | 46 {} |
63 | 47 |
64 int | 48 int |
65 main () | 49 main (int argc, char *argv[], char *envp[]) |
66 { | 50 { |
67 begin (); | 51 pthread_t threads[2]; |
| 52 int i; |
68 | 53 |
69 for (globvar = 1; globvar < 11; ++globvar) | 54 for (i = 0; i < 2; i++) |
70 { | 55 pthread_create (&threads[i], NULL, thread_function, NULL); |
71 marker (globvar * 100); | 56 |
72 } | 57 for (i = 0; i < 2; i++) |
| 58 pthread_join (threads[i], NULL); |
73 | 59 |
74 end (); | 60 end (); |
| 61 |
75 return 0; | 62 return 0; |
76 } | 63 } |
OLD | NEW |