1 /* Data structures and API for event locations in GDB.
2 Copyright (C) 2013-2017 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"
27 #include "cp-support.h"
32 /* An event location used to set a stop event in the inferior.
33 This structure is an amalgam of the various ways
34 to specify where a stop event should be set. */
38 /* The type of this breakpoint specification. */
39 enum event_location_type type;
40 #define EL_TYPE(P) (P)->type
44 /* A generic "this is a string specification" for a location.
45 This representation is used by both "normal" linespecs and
48 #define EL_LINESPEC(P) ((P)->u.addr_string)
49 #define EL_PROBE(P) ((P)->u.addr_string)
51 /* An address in the inferior. */
53 #define EL_ADDRESS(P) (P)->u.address
55 /* An explicit location. */
56 struct explicit_location explicit_loc;
57 #define EL_EXPLICIT(P) (&((P)->u.explicit_loc))
60 /* Cached string representation of this location. This is used, e.g., to
61 save stop event locations to file. Malloc'd. */
63 #define EL_STRING(P) ((P)->as_string)
66 /* See description in location.h. */
68 enum event_location_type
69 event_location_type (const struct event_location *location)
71 return EL_TYPE (location);
74 /* See description in location.h. */
77 initialize_explicit_location (struct explicit_location *explicit_loc)
79 memset (explicit_loc, 0, sizeof (struct explicit_location));
80 explicit_loc->line_offset.sign = LINE_OFFSET_UNKNOWN;
83 /* See description in location.h. */
86 new_linespec_location (const char **linespec)
88 struct event_location *location;
90 location = XCNEW (struct event_location);
91 EL_TYPE (location) = LINESPEC_LOCATION;
92 if (*linespec != NULL)
95 const char *orig = *linespec;
97 linespec_lex_to_end (linespec);
98 p = remove_trailing_whitespace (orig, *linespec);
100 EL_LINESPEC (location) = savestring (orig, p - orig);
102 return event_location_up (location);
105 /* See description in location.h. */
108 get_linespec_location (const struct event_location *location)
110 gdb_assert (EL_TYPE (location) == LINESPEC_LOCATION);
111 return EL_LINESPEC (location);
114 /* See description in location.h. */
117 new_address_location (CORE_ADDR addr, const char *addr_string,
120 struct event_location *location;
122 location = XCNEW (struct event_location);
123 EL_TYPE (location) = ADDRESS_LOCATION;
124 EL_ADDRESS (location) = addr;
125 if (addr_string != NULL)
126 EL_STRING (location) = xstrndup (addr_string, addr_string_len);
127 return event_location_up (location);
130 /* See description in location.h. */
133 get_address_location (const struct event_location *location)
135 gdb_assert (EL_TYPE (location) == ADDRESS_LOCATION);
136 return EL_ADDRESS (location);
139 /* See description in location.h. */
142 get_address_string_location (const struct event_location *location)
144 gdb_assert (EL_TYPE (location) == ADDRESS_LOCATION);
145 return EL_STRING (location);
148 /* See description in location.h. */
151 new_probe_location (const char *probe)
153 struct event_location *location;
155 location = XCNEW (struct event_location);
156 EL_TYPE (location) = PROBE_LOCATION;
158 EL_PROBE (location) = xstrdup (probe);
159 return event_location_up (location);
162 /* See description in location.h. */
165 get_probe_location (const struct event_location *location)
167 gdb_assert (EL_TYPE (location) == PROBE_LOCATION);
168 return EL_PROBE (location);
171 /* See description in location.h. */
174 new_explicit_location (const struct explicit_location *explicit_loc)
176 struct event_location tmp;
178 memset (&tmp, 0, sizeof (struct event_location));
179 EL_TYPE (&tmp) = EXPLICIT_LOCATION;
180 initialize_explicit_location (EL_EXPLICIT (&tmp));
181 if (explicit_loc != NULL)
183 if (explicit_loc->source_filename != NULL)
185 EL_EXPLICIT (&tmp)->source_filename
186 = explicit_loc->source_filename;
189 if (explicit_loc->function_name != NULL)
190 EL_EXPLICIT (&tmp)->function_name
191 = explicit_loc->function_name;
193 if (explicit_loc->label_name != NULL)
194 EL_EXPLICIT (&tmp)->label_name = explicit_loc->label_name;
196 if (explicit_loc->line_offset.sign != LINE_OFFSET_UNKNOWN)
197 EL_EXPLICIT (&tmp)->line_offset = explicit_loc->line_offset;
200 return copy_event_location (&tmp);
203 /* See description in location.h. */
205 struct explicit_location *
206 get_explicit_location (struct event_location *location)
208 gdb_assert (EL_TYPE (location) == EXPLICIT_LOCATION);
209 return EL_EXPLICIT (location);
212 /* See description in location.h. */
214 const struct explicit_location *
215 get_explicit_location_const (const struct event_location *location)
217 gdb_assert (EL_TYPE (location) == EXPLICIT_LOCATION);
218 return EL_EXPLICIT (location);
221 /* This convenience function returns a malloc'd string which
222 represents the location in EXPLICIT_LOC.
224 AS_LINESPEC is non-zero if this string should be a linespec.
225 Otherwise it will be output in explicit form. */
228 explicit_to_string_internal (int as_linespec,
229 const struct explicit_location *explicit_loc)
232 char space = as_linespec ? ':' : ' ';
235 if (explicit_loc->source_filename != NULL)
238 buf.puts ("-source ");
239 buf.puts (explicit_loc->source_filename);
243 if (explicit_loc->function_name != NULL)
248 buf.puts ("-function ");
249 buf.puts (explicit_loc->function_name);
253 if (explicit_loc->label_name != NULL)
258 buf.puts ("-label ");
259 buf.puts (explicit_loc->label_name);
263 if (explicit_loc->line_offset.sign != LINE_OFFSET_UNKNOWN)
270 (explicit_loc->line_offset.sign == LINE_OFFSET_NONE ? ""
271 : (explicit_loc->line_offset.sign
272 == LINE_OFFSET_PLUS ? "+" : "-")),
273 explicit_loc->line_offset.offset);
276 return xstrdup (buf.c_str ());
279 /* See description in location.h. */
282 explicit_location_to_string (const struct explicit_location *explicit_loc)
284 return explicit_to_string_internal (0, explicit_loc);
287 /* See description in location.h. */
290 explicit_location_to_linespec (const struct explicit_location *explicit_loc)
292 return explicit_to_string_internal (1, explicit_loc);
295 /* See description in location.h. */
298 copy_event_location (const struct event_location *src)
300 struct event_location *dst;
302 dst = XCNEW (struct event_location);
303 EL_TYPE (dst) = EL_TYPE (src);
304 if (EL_STRING (src) != NULL)
305 EL_STRING (dst) = xstrdup (EL_STRING (src));
307 switch (EL_TYPE (src))
309 case LINESPEC_LOCATION:
310 if (EL_LINESPEC (src) != NULL)
311 EL_LINESPEC (dst) = xstrdup (EL_LINESPEC (src));
314 case ADDRESS_LOCATION:
315 EL_ADDRESS (dst) = EL_ADDRESS (src);
318 case EXPLICIT_LOCATION:
319 if (EL_EXPLICIT (src)->source_filename != NULL)
320 EL_EXPLICIT (dst)->source_filename
321 = xstrdup (EL_EXPLICIT (src)->source_filename);
323 if (EL_EXPLICIT (src)->function_name != NULL)
324 EL_EXPLICIT (dst)->function_name
325 = xstrdup (EL_EXPLICIT (src)->function_name);
327 if (EL_EXPLICIT (src)->label_name != NULL)
328 EL_EXPLICIT (dst)->label_name = xstrdup (EL_EXPLICIT (src)->label_name);
330 EL_EXPLICIT (dst)->line_offset = EL_EXPLICIT (src)->line_offset;
335 if (EL_PROBE (src) != NULL)
336 EL_PROBE (dst) = xstrdup (EL_PROBE (src));
340 gdb_assert_not_reached ("unknown event location type");
343 return event_location_up (dst);
347 event_location_deleter::operator() (event_location *location) const
349 if (location != NULL)
351 xfree (EL_STRING (location));
353 switch (EL_TYPE (location))
355 case LINESPEC_LOCATION:
356 xfree (EL_LINESPEC (location));
359 case ADDRESS_LOCATION:
363 case EXPLICIT_LOCATION:
364 xfree (EL_EXPLICIT (location)->source_filename);
365 xfree (EL_EXPLICIT (location)->function_name);
366 xfree (EL_EXPLICIT (location)->label_name);
370 xfree (EL_PROBE (location));
374 gdb_assert_not_reached ("unknown event location type");
381 /* See description in location.h. */
384 event_location_to_string (struct event_location *location)
386 if (EL_STRING (location) == NULL)
388 switch (EL_TYPE (location))
390 case LINESPEC_LOCATION:
391 if (EL_LINESPEC (location) != NULL)
392 EL_STRING (location) = xstrdup (EL_LINESPEC (location));
395 case ADDRESS_LOCATION:
398 core_addr_to_string (EL_ADDRESS (location)));
401 case EXPLICIT_LOCATION:
403 = explicit_location_to_string (EL_EXPLICIT (location));
407 EL_STRING (location) = xstrdup (EL_PROBE (location));
411 gdb_assert_not_reached ("unknown event location type");
415 return EL_STRING (location);
418 /* Find an instance of the quote character C in the string S that is
419 outside of all single- and double-quoted strings (i.e., any quoting
423 find_end_quote (const char *s, char end_quote_char)
425 /* zero if we're not in quotes;
426 '"' if we're in a double-quoted string;
427 '\'' if we're in a single-quoted string. */
428 char nested_quote_char = '\0';
430 for (const char *scan = s; *scan != '\0'; scan++)
432 if (nested_quote_char != '\0')
434 if (*scan == nested_quote_char)
435 nested_quote_char = '\0';
436 else if (scan[0] == '\\' && *(scan + 1) != '\0')
439 else if (*scan == end_quote_char && nested_quote_char == '\0')
441 else if (*scan == '"' || *scan == '\'')
442 nested_quote_char = *scan;
448 /* A lexer for explicit locations. This function will advance INP
449 past any strings that it lexes. Returns a malloc'd copy of the
450 lexed string or NULL if no lexing was done. */
452 static gdb::unique_xmalloc_ptr<char>
453 explicit_location_lex_one (const char **inp,
454 const struct language_defn *language,
455 explicit_completion_info *completion_info)
457 const char *start = *inp;
462 /* If quoted, skip to the ending quote. */
463 if (strchr (get_gdb_linespec_parser_quote_characters (), *start))
465 if (completion_info != NULL)
466 completion_info->quoted_arg_start = start;
468 const char *end = find_end_quote (start + 1, *start);
472 if (completion_info == NULL)
473 error (_("Unmatched quote, %s."), start);
475 end = start + strlen (start);
477 return gdb::unique_xmalloc_ptr<char> (savestring (start + 1,
481 if (completion_info != NULL)
482 completion_info->quoted_arg_end = end;
484 return gdb::unique_xmalloc_ptr<char> (savestring (start + 1,
488 /* If the input starts with '-' or '+', the string ends with the next
489 whitespace or comma. */
490 if (*start == '-' || *start == '+')
492 while (*inp[0] != '\0' && *inp[0] != ',' && !isspace (*inp[0]))
497 /* Handle numbers first, stopping at the next whitespace or ','. */
498 while (isdigit (*inp[0]))
500 if (*inp[0] == '\0' || isspace (*inp[0]) || *inp[0] == ',')
501 return gdb::unique_xmalloc_ptr<char> (savestring (start,
504 /* Otherwise stop at the next occurrence of whitespace, '\0',
509 && !(isspace ((*inp)[0])
510 || linespec_lexer_lex_keyword (&(*inp)[1])))
512 /* Special case: C++ operator,. */
513 if (language->la_language == language_cplus
514 && startswith (*inp, CP_OPERATOR_STR))
515 (*inp) += CP_OPERATOR_LEN;
520 if (*inp - start > 0)
521 return gdb::unique_xmalloc_ptr<char> (savestring (start, *inp - start));
526 /* Return true if COMMA points past "operator". START is the start of
527 the line that COMMAND points to, hence when reading backwards, we
528 must not read any character before START. */
531 is_cp_operator (const char *start, const char *comma)
534 && (comma - start) >= CP_OPERATOR_LEN)
536 const char *p = comma;
538 while (p > start && isspace (p[-1]))
540 if (p - start >= CP_OPERATOR_LEN)
542 p -= CP_OPERATOR_LEN;
543 if (strncmp (p, CP_OPERATOR_STR, CP_OPERATOR_LEN) == 0
545 || !(isalnum (p[-1]) || p[-1] == '_')))
554 /* When scanning the input string looking for the next explicit
555 location option/delimiter, we jump to the next option by looking
556 for ",", and "-". Such a character can also appear in C++ symbols
557 like "operator," and "operator-". So when we find such a
558 character, we call this function to check if we found such a
559 symbol, meaning we had a false positive for an option string. In
560 that case, we keep looking for the next delimiter, until we find
561 one that is not a false positive, or we reach end of string. FOUND
562 is the character that scanning found (either '-' or ','), and START
563 is the start of the line that FOUND points to, hence when reading
564 backwards, we must not read any character before START. Returns a
565 pointer to the next non-false-positive delimiter character, or NULL
566 if none was found. */
569 skip_op_false_positives (const char *start, const char *found)
571 while (found != NULL && is_cp_operator (start, found))
573 if (found[0] == '-' && found[1] == '-')
577 found = find_toplevel_char (start, *found);
583 /* Assuming both FIRST and NEW_TOK point into the same string, return
584 the pointer that is closer to the start of the string. If FIRST is
585 NULL, returns NEW_TOK. If NEW_TOK is NULL, returns FIRST. */
588 first_of (const char *first, const char *new_tok)
592 else if (new_tok != NULL && new_tok < first)
598 /* A lexer for functions in explicit locations. This function will
599 advance INP past a function until the next option, or until end of
600 string. Returns a malloc'd copy of the lexed string or NULL if no
603 static gdb::unique_xmalloc_ptr<char>
604 explicit_location_lex_one_function (const char **inp,
605 const struct language_defn *language,
606 explicit_completion_info *completion_info)
608 const char *start = *inp;
613 /* If quoted, skip to the ending quote. */
614 if (strchr (get_gdb_linespec_parser_quote_characters (), *start))
616 char quote_char = *start;
618 /* If the input is not an Ada operator, skip to the matching
619 closing quote and return the string. */
620 if (!(language->la_language == language_ada
621 && quote_char == '\"' && is_ada_operator (start)))
623 if (completion_info != NULL)
624 completion_info->quoted_arg_start = start;
626 const char *end = find_toplevel_char (start + 1, quote_char);
630 if (completion_info == NULL)
631 error (_("Unmatched quote, %s."), start);
633 end = start + strlen (start);
635 char *saved = savestring (start + 1, *inp - start - 1);
636 return gdb::unique_xmalloc_ptr<char> (saved);
639 if (completion_info != NULL)
640 completion_info->quoted_arg_end = end;
642 char *saved = savestring (start + 1, *inp - start - 2);
643 return gdb::unique_xmalloc_ptr<char> (saved);
647 const char *comma = find_toplevel_char (start, ',');
649 /* If we have "-function -myfunction", or perhaps better example,
650 "-function -[BasicClass doIt]" (objc selector), treat
651 "-myfunction" as the function name. I.e., skip the first char if
652 it is an hyphen. Don't skip the first char always, because we
653 may have C++ "operator<", and find_toplevel_char needs to see the
657 ? find_toplevel_char (start + 1, '-')
658 : find_toplevel_char (start, '-'));
660 /* Check for C++ "operator," and "operator-". */
661 comma = skip_op_false_positives (start, comma);
662 hyphen = skip_op_false_positives (start, hyphen);
664 /* Pick the one that appears first. */
665 const char *end = first_of (hyphen, comma);
667 /* See if a linespec keyword appears first. */
668 const char *s = start;
669 const char *ws = find_toplevel_char (start, ' ');
670 while (ws != NULL && linespec_lexer_lex_keyword (ws + 1) == NULL)
673 ws = find_toplevel_char (s, ' ');
676 end = first_of (end, ws + 1);
678 /* If we don't have any terminator, then take the whole string. */
680 end = start + strlen (start);
682 /* Trim whitespace at the end. */
683 while (end > start && end[-1] == ' ')
688 if (*inp - start > 0)
689 return gdb::unique_xmalloc_ptr<char> (savestring (start, *inp - start));
694 /* See description in location.h. */
697 string_to_explicit_location (const char **argp,
698 const struct language_defn *language,
699 explicit_completion_info *completion_info)
701 event_location_up location;
703 /* It is assumed that input beginning with '-' and a non-digit
704 character is an explicit location. "-p" is reserved, though,
705 for probe locations. */
709 || !isalpha ((*argp)[1])
710 || ((*argp)[0] == '-' && (*argp)[1] == 'p'))
713 location = new_explicit_location (NULL);
715 /* Process option/argument pairs. dprintf_command
716 requires that processing stop on ','. */
717 while ((*argp)[0] != '\0' && (*argp)[0] != ',')
722 /* Clear these on each iteration, since they should be filled
723 with info about the last option. */
724 if (completion_info != NULL)
726 completion_info->quoted_arg_start = NULL;
727 completion_info->quoted_arg_end = NULL;
730 /* If *ARGP starts with a keyword, stop processing
732 if (linespec_lexer_lex_keyword (*argp) != NULL)
735 /* Mark the start of the string in case we need to rewind. */
738 if (completion_info != NULL)
739 completion_info->last_option = start;
741 /* Get the option string. */
742 gdb::unique_xmalloc_ptr<char> opt
743 = explicit_location_lex_one (argp, language, NULL);
745 /* Use the length of the option to allow abbreviations. */
746 len = strlen (opt.get ());
748 /* Get the argument string. */
749 *argp = skip_spaces (*argp);
751 /* All options have a required argument. Checking for this
752 required argument is deferred until later. */
753 gdb::unique_xmalloc_ptr<char> oarg;
754 /* True if we have an argument. This is required because we'll
755 move from OARG before checking whether we have an
757 bool have_oarg = false;
759 /* Convenience to consistently set both OARG/HAVE_OARG from
761 auto set_oarg = [&] (gdb::unique_xmalloc_ptr<char> arg)
763 oarg = std::move (arg);
764 have_oarg = oarg != NULL;
767 if (strncmp (opt.get (), "-source", len) == 0)
769 set_oarg (explicit_location_lex_one (argp, language,
771 EL_EXPLICIT (location)->source_filename = oarg.release ();
773 else if (strncmp (opt.get (), "-function", len) == 0)
775 set_oarg (explicit_location_lex_one_function (argp, language,
777 EL_EXPLICIT (location)->function_name = oarg.release ();
779 else if (strncmp (opt.get (), "-line", len) == 0)
781 set_oarg (explicit_location_lex_one (argp, language, NULL));
782 *argp = skip_spaces (*argp);
785 EL_EXPLICIT (location)->line_offset
786 = linespec_parse_line_offset (oarg.get ());
790 else if (strncmp (opt.get (), "-label", len) == 0)
792 set_oarg (explicit_location_lex_one (argp, language, completion_info));
793 EL_EXPLICIT (location)->label_name = oarg.release ();
795 /* Only emit an "invalid argument" error for options
796 that look like option strings. */
797 else if (opt.get ()[0] == '-' && !isdigit (opt.get ()[1]))
799 if (completion_info == NULL)
800 error (_("invalid explicit location argument, \"%s\""), opt.get ());
804 /* End of the explicit location specification.
805 Stop parsing and return whatever explicit location was
811 *argp = skip_spaces (*argp);
813 /* It's a little lame to error after the fact, but in this
814 case, it provides a much better user experience to issue
815 the "invalid argument" error before any missing
817 if (!have_oarg && completion_info == NULL)
818 error (_("missing argument for \"%s\""), opt.get ());
821 /* One special error check: If a source filename was given
822 without offset, function, or label, issue an error. */
823 if (EL_EXPLICIT (location)->source_filename != NULL
824 && EL_EXPLICIT (location)->function_name == NULL
825 && EL_EXPLICIT (location)->label_name == NULL
826 && (EL_EXPLICIT (location)->line_offset.sign == LINE_OFFSET_UNKNOWN)
827 && completion_info == NULL)
829 error (_("Source filename requires function, label, or "
836 /* See description in location.h. */
839 string_to_event_location_basic (const char **stringp,
840 const struct language_defn *language)
842 event_location_up location;
845 /* Try the input as a probe spec. */
847 if (cs != NULL && probe_linespec_to_static_ops (&cs) != NULL)
849 location = new_probe_location (*stringp);
850 *stringp += strlen (*stringp);
854 /* Try an address location. */
855 if (*stringp != NULL && **stringp == '*')
857 const char *arg, *orig;
860 orig = arg = *stringp;
861 addr = linespec_expression_to_pc (&arg);
862 location = new_address_location (addr, orig, arg - orig);
863 *stringp += arg - orig;
867 /* Everything else is a linespec. */
868 location = new_linespec_location (stringp);
875 /* See description in location.h. */
878 string_to_event_location (const char **stringp,
879 const struct language_defn *language)
881 const char *arg, *orig;
883 /* Try an explicit location. */
884 orig = arg = *stringp;
885 event_location_up location = string_to_explicit_location (&arg, language, NULL);
886 if (location != NULL)
888 /* It was a valid explicit location. Advance STRINGP to
890 *stringp += arg - orig;
894 /* Everything else is a "basic" linespec, address, or probe
896 location = string_to_event_location_basic (stringp, language);
902 /* See description in location.h. */
905 event_location_empty_p (const struct event_location *location)
907 switch (EL_TYPE (location))
909 case LINESPEC_LOCATION:
910 /* Linespecs are never "empty." (NULL is a valid linespec) */
913 case ADDRESS_LOCATION:
916 case EXPLICIT_LOCATION:
917 return (EL_EXPLICIT (location) == NULL
918 || (EL_EXPLICIT (location)->source_filename == NULL
919 && EL_EXPLICIT (location)->function_name == NULL
920 && EL_EXPLICIT (location)->label_name == NULL
921 && (EL_EXPLICIT (location)->line_offset.sign
922 == LINE_OFFSET_UNKNOWN)));
925 return EL_PROBE (location) == NULL;
928 gdb_assert_not_reached ("unknown event location type");
932 /* See description in location.h. */
935 set_event_location_string (struct event_location *location,
938 xfree (EL_STRING (location));
939 EL_STRING (location) = string == NULL ? NULL : xstrdup (string);