summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.base/stap-probe.c
blob: 36ce2da7847bb5509536e7bfab470f3e3c2cf247 (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
/* This testcase is part of GDB, the GNU debugger.

   Copyright 2012-2023 Free Software Foundation, Inc.

   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/>.  */

#include "attributes.h"

#if USE_SEMAPHORES

#define _SDT_HAS_SEMAPHORES
__extension__ unsigned short test_user_semaphore __attribute__ ((unused)) __attribute__ ((section (".probes")));
#define TEST test_user_semaphore

__extension__ unsigned short test_two_semaphore __attribute__ ((unused)) __attribute__ ((section (".probes")));
#define TEST2 test_two_semaphore

__extension__ unsigned short test_m4_semaphore __attribute__ ((unused)) __attribute__ ((section (".probes")));

__extension__ unsigned short test_pstr_semaphore __attribute__ ((unused)) __attribute__ ((section (".probes")));

__extension__ unsigned short test_ps_semaphore __attribute__ ((unused)) __attribute__ ((section (".probes")));

__extension__ unsigned short test_xmmreg_semaphore __attribute__ ((unused)) __attribute__ ((section (".probes")));
#else

int relocation_marker __attribute__ ((unused));

#define TEST 1
#define TEST2 1

#endif

#include <sys/sdt.h>

/* We only support SystemTap and only the v3 form.  */
#if _SDT_NOTE_TYPE != 3
#error "not using SystemTap v3 probes"
#endif

struct funcs
{
  int val;

  const char *(*ps) (int);
};

static void
m1 (void)
{
  /* m1 and m2 are equivalent, but because of some compiler
     optimizations we have to make each of them unique.  This is why
     we have this dummy variable here.  */
  volatile int dummy = 0;

  if (TEST2)
    STAP_PROBE1 (test, two, dummy);
}

static void
m2 (void)
{
  if (TEST2)
    STAP_PROBE (test, two);
}

static int
f (int x)
{
  if (TEST)
    STAP_PROBE1 (test, user, x);
  return x+5;
}

static const char *
pstr (int val)
{
  const char *a = "This is a test message.";
  const char *b = "This is another test message.";

  STAP_PROBE3 (test, ps, a, b, val);

  return val == 0 ? a : b;
}

#ifdef __SSE2__
static const char * __attribute__((noinline))
use_xmm_reg (int val)
{
  volatile register int val_in_reg asm ("xmm0") = val;

  STAP_PROBE1 (test, xmmreg, val_in_reg);

  return val == 0 ? "xxx" : "yyy";
}
#else
static const char * __attribute__((noinline)) ATTRIBUTE_NOCLONE
use_xmm_reg (int val)
{
  /* Nothing.  */
}
#endif /* __SSE2__ */

static void
m4 (const struct funcs *fs, int v)
{
  STAP_PROBE3 (test, m4, fs->val, fs->ps (v), v);
}

int
main()
{
  struct funcs fs;

  fs.val = 42;
  fs.ps = pstr;

  f (f (23));
  m1 ();
  m2 ();

  m4 (&fs, 0);
  m4 (&fs, 1);

  use_xmm_reg (0x1234);

  return 0; /* last break here */
}