1 /* Data structures and API for event locations in GDB.
2 Copyright (C) 2013-2015 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 #include "gdb_assert.h"
25 #include "cli/cli-utils.h"
31 /* An event location used to set a stop event in the inferior.
32 This structure is an amalgam of the various ways
33 to specify where a stop event should be set. */
37 /* The type of this breakpoint specification. */
38 enum event_location_type type
;
39 #define EL_TYPE(PTR) (PTR)->type
43 /* A generic "this is a string specification" for a location.
44 This representation is used by both "normal" linespecs and
47 #define EL_LINESPEC(PTR) ((PTR)->u.addr_string)
48 #define EL_PROBE(PTR) ((PTR)->u.addr_string)
50 /* An address in the inferior. */
52 #define EL_ADDRESS(PTR) (PTR)->u.address
55 /* Cached string representation of this location. This is used, e.g., to
56 save stop event locations to file. Malloc'd. */
58 #define EL_STRING(PTR) ((PTR)->as_string)
61 /* See description in location.h. */
63 enum event_location_type
64 event_location_type (const struct event_location
*location
)
66 return EL_TYPE (location
);
69 /* See description in location.h. */
71 struct event_location
*
72 new_linespec_location (char **linespec
)
74 struct event_location
*location
;
76 location
= XCNEW (struct event_location
);
77 EL_TYPE (location
) = LINESPEC_LOCATION
;
78 if (*linespec
!= NULL
)
81 char *orig
= *linespec
;
83 linespec_lex_to_end (linespec
);
84 p
= remove_trailing_whitespace (orig
, *linespec
);
86 EL_LINESPEC (location
) = savestring (orig
, p
- orig
);
91 /* See description in location.h. */
94 get_linespec_location (const struct event_location
*location
)
96 gdb_assert (EL_TYPE (location
) == LINESPEC_LOCATION
);
97 return EL_LINESPEC (location
);
100 /* See description in location.h. */
102 struct event_location
*
103 new_address_location (CORE_ADDR addr
)
105 struct event_location
*location
;
107 location
= XCNEW (struct event_location
);
108 EL_TYPE (location
) = ADDRESS_LOCATION
;
109 EL_ADDRESS (location
) = addr
;
113 /* See description in location.h. */
116 get_address_location (const struct event_location
*location
)
118 gdb_assert (EL_TYPE (location
) == ADDRESS_LOCATION
);
119 return EL_ADDRESS (location
);
122 /* See description in location.h. */
124 struct event_location
*
125 new_probe_location (const char *probe
)
127 struct event_location
*location
;
129 location
= XCNEW (struct event_location
);
130 EL_TYPE (location
) = PROBE_LOCATION
;
132 EL_PROBE (location
) = xstrdup (probe
);
136 /* See description in location.h. */
139 get_probe_location (const struct event_location
*location
)
141 gdb_assert (EL_TYPE (location
) == PROBE_LOCATION
);
142 return EL_PROBE (location
);
145 /* See description in location.h. */
147 struct event_location
*
148 copy_event_location (const struct event_location
*src
)
150 struct event_location
*dst
;
152 dst
= XCNEW (struct event_location
);
153 EL_TYPE (dst
) = EL_TYPE (src
);
154 if (EL_STRING (src
) != NULL
)
155 EL_STRING (dst
) = xstrdup (EL_STRING (src
));
157 switch (EL_TYPE (src
))
159 case LINESPEC_LOCATION
:
160 if (EL_LINESPEC (src
) != NULL
)
161 EL_LINESPEC (dst
) = xstrdup (EL_LINESPEC (src
));
164 case ADDRESS_LOCATION
:
165 EL_ADDRESS (dst
) = EL_ADDRESS (src
);
169 if (EL_PROBE (src
) != NULL
)
170 EL_PROBE (dst
) = xstrdup (EL_PROBE (src
));
174 gdb_assert_not_reached ("unknown event location type");
180 /* A cleanup function for struct event_location. */
183 delete_event_location_cleanup (void *data
)
185 struct event_location
*location
= (struct event_location
*) data
;
187 delete_event_location (location
);
190 /* See description in location.h. */
193 make_cleanup_delete_event_location (struct event_location
*location
)
195 return make_cleanup (delete_event_location_cleanup
, location
);
198 /* See description in location.h. */
201 delete_event_location (struct event_location
*location
)
203 if (location
!= NULL
)
205 xfree (EL_STRING (location
));
207 switch (EL_TYPE (location
))
209 case LINESPEC_LOCATION
:
210 xfree (EL_LINESPEC (location
));
213 case ADDRESS_LOCATION
:
218 xfree (EL_PROBE (location
));
222 gdb_assert_not_reached ("unknown event location type");
229 /* See description in location.h. */
232 event_location_to_string (struct event_location
*location
)
234 if (EL_STRING (location
) == NULL
)
236 switch (EL_TYPE (location
))
238 case LINESPEC_LOCATION
:
239 if (EL_LINESPEC (location
) != NULL
)
240 EL_STRING (location
) = xstrdup (EL_LINESPEC (location
));
243 case ADDRESS_LOCATION
:
246 core_addr_to_string (EL_ADDRESS (location
)));
250 EL_STRING (location
) = xstrdup (EL_PROBE (location
));
254 gdb_assert_not_reached ("unknown event location type");
258 return EL_STRING (location
);
261 /* See description in location.h. */
263 struct event_location
*
264 string_to_event_location (char **stringp
,
265 const struct language_defn
*language
)
267 struct event_location
*location
;
269 /* First, check if the string is an address location. */
270 if (*stringp
!= NULL
&& **stringp
== '*')
272 const char *arg
, *orig
;
275 orig
= arg
= *stringp
;
276 addr
= linespec_expression_to_pc (&arg
);
277 location
= new_address_location (addr
);
278 *stringp
+= arg
- orig
;
284 /* Next, try the input as a probe spec. */
286 if (cs
!= NULL
&& probe_linespec_to_ops (&cs
) != NULL
)
288 location
= new_probe_location (*stringp
);
289 *stringp
+= strlen (*stringp
);
293 /* Everything else is a linespec. */
294 location
= new_linespec_location (stringp
);
301 /* See description in location.h. */
304 event_location_empty_p (const struct event_location
*location
)
306 switch (EL_TYPE (location
))
308 case LINESPEC_LOCATION
:
309 /* Linespecs are never "empty." (NULL is a valid linespec) */
312 case ADDRESS_LOCATION
:
316 return EL_PROBE (location
) == NULL
;
319 gdb_assert_not_reached ("unknown event location type");
323 /* See description in location.h. */
326 set_event_location_string (struct event_location
*location
,
329 xfree (EL_STRING (location
));
330 EL_STRING (location
) = string
== NULL
? NULL
: xstrdup (string
);