GDB (xrefs)
/tmp/gdb-8.1/gdb/location.c
Go to the documentation of this file.
1 /* Data structures and API for event locations in GDB.
2  Copyright (C) 2013-2018 Free Software Foundation, Inc.
3 
4  This file is part of GDB.
5 
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.
10 
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.
15 
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/>. */
18 
19 #include "defs.h"
20 #include "gdb_assert.h"
21 #include "location.h"
22 #include "symtab.h"
23 #include "language.h"
24 #include "linespec.h"
25 #include "cli/cli-utils.h"
26 #include "probe.h"
27 #include "cp-support.h"
28 
29 #include <ctype.h>
30 #include <string.h>
31 
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. */
35 
37 {
38  /* The type of this breakpoint specification. */
40 #define EL_TYPE(P) (P)->type
41 
42  union
43  {
44  /* A probe. */
45  char *addr_string;
46 #define EL_PROBE(P) ((P)->u.addr_string)
47 
48  /* A "normal" linespec. */
50 #define EL_LINESPEC(P) (&(P)->u.linespec_location)
51 
52  /* An address in the inferior. */
54 #define EL_ADDRESS(P) (P)->u.address
55 
56  /* An explicit location. */
58 #define EL_EXPLICIT(P) (&((P)->u.explicit_loc))
59  } u;
60 
61  /* Cached string representation of this location. This is used, e.g., to
62  save stop event locations to file. Malloc'd. */
63  char *as_string;
64 #define EL_STRING(P) ((P)->as_string)
65 };
66 
67 /* See description in location.h. */
68 
70 event_location_type (const struct event_location *location)
71 {
72  return EL_TYPE (location);
73 }
74 
75 /* See description in location.h. */
76 
77 void
79 {
80  memset (explicit_loc, 0, sizeof (struct explicit_location));
81  explicit_loc->line_offset.sign = LINE_OFFSET_UNKNOWN;
83 }
84 
85 /* See description in location.h. */
86 
89  symbol_name_match_type match_type)
90 {
91  struct event_location *location;
92 
93  location = XCNEW (struct event_location);
94  EL_TYPE (location) = LINESPEC_LOCATION;
95  EL_LINESPEC (location)->match_type = match_type;
96  if (*linespec != NULL)
97  {
98  const char *p;
99  const char *orig = *linespec;
100 
103  if ((p - orig) > 0)
104  EL_LINESPEC (location)->spec_string = savestring (orig, p - orig);
105  }
106  return event_location_up (location);
107 }
108 
109 /* See description in location.h. */
110 
111 const linespec_location *
112 get_linespec_location (const struct event_location *location)
113 {
114  gdb_assert (EL_TYPE (location) == LINESPEC_LOCATION);
115  return EL_LINESPEC (location);
116 }
117 
118 /* See description in location.h. */
119 
122  int addr_string_len)
123 {
124  struct event_location *location;
125 
126  location = XCNEW (struct event_location);
127  EL_TYPE (location) = ADDRESS_LOCATION;
128  EL_ADDRESS (location) = addr;
129  if (addr_string != NULL)
130  EL_STRING (location) = xstrndup (addr_string, addr_string_len);
131  return event_location_up (location);
132 }
133 
134 /* See description in location.h. */
135 
136 CORE_ADDR
137 get_address_location (const struct event_location *location)
138 {
139  gdb_assert (EL_TYPE (location) == ADDRESS_LOCATION);
140  return EL_ADDRESS (location);
141 }
142 
143 /* See description in location.h. */
144 
145 const char *
147 {
148  gdb_assert (EL_TYPE (location) == ADDRESS_LOCATION);
149  return EL_STRING (location);
150 }
151 
152 /* See description in location.h. */
153 
156 {
157  struct event_location *location;
158 
159  location = XCNEW (struct event_location);
160  EL_TYPE (location) = PROBE_LOCATION;
161  if (probe != NULL)
162  EL_PROBE (location) = xstrdup (probe);
163  return event_location_up (location);
164 }
165 
166 /* See description in location.h. */
167 
168 const char *
169 get_probe_location (const struct event_location *location)
170 {
171  gdb_assert (EL_TYPE (location) == PROBE_LOCATION);
172  return EL_PROBE (location);
173 }
174 
175 /* See description in location.h. */
176 
179 {
180  struct event_location tmp;
181 
182  memset (&tmp, 0, sizeof (struct event_location));
183  EL_TYPE (&tmp) = EXPLICIT_LOCATION;
185  if (explicit_loc != NULL)
186  {
187  EL_EXPLICIT (&tmp)->func_name_match_type
189 
190  if (explicit_loc->source_filename != NULL)
191  {
192  EL_EXPLICIT (&tmp)->source_filename
194  }
195 
196  if (explicit_loc->function_name != NULL)
197  EL_EXPLICIT (&tmp)->function_name
199 
200  if (explicit_loc->label_name != NULL)
201  EL_EXPLICIT (&tmp)->label_name = explicit_loc->label_name;
202 
204  EL_EXPLICIT (&tmp)->line_offset = explicit_loc->line_offset;
205  }
206 
207  return copy_event_location (&tmp);
208 }
209 
210 /* See description in location.h. */
211 
212 struct explicit_location *
214 {
215  gdb_assert (EL_TYPE (location) == EXPLICIT_LOCATION);
216  return EL_EXPLICIT (location);
217 }
218 
219 /* See description in location.h. */
220 
221 const struct explicit_location *
223 {
224  gdb_assert (EL_TYPE (location) == EXPLICIT_LOCATION);
225  return EL_EXPLICIT (location);
226 }
227 
228 /* This convenience function returns a malloc'd string which
229  represents the location in EXPLICIT_LOC.
230 
231  AS_LINESPEC is non-zero if this string should be a linespec.
232  Otherwise it will be output in explicit form. */
233 
234 static char *
236  const struct explicit_location *explicit_loc)
237 {
238  int need_space = 0;
239  char space = as_linespec ? ':' : ' ';
240  string_file buf;
241 
242  if (explicit_loc->source_filename != NULL)
243  {
244  if (!as_linespec)
245  buf.puts ("-source ");
246  buf.puts (explicit_loc->source_filename);
247  need_space = 1;
248  }
249 
250  if (explicit_loc->function_name != NULL)
251  {
252  if (need_space)
253  buf.putc (space);
255  buf.puts ("-qualified ");
256  if (!as_linespec)
257  buf.puts ("-function ");
258  buf.puts (explicit_loc->function_name);
259  need_space = 1;
260  }
261 
262  if (explicit_loc->label_name != NULL)
263  {
264  if (need_space)
265  buf.putc (space);
266  if (!as_linespec)
267  buf.puts ("-label ");
268  buf.puts (explicit_loc->label_name);
269  need_space = 1;
270  }
271 
272  if (explicit_loc->line_offset.sign != LINE_OFFSET_UNKNOWN)
273  {
274  if (need_space)
275  buf.putc (space);
276  if (!as_linespec)
277  buf.puts ("-line ");
278  buf.printf ("%s%d",
279  (explicit_loc->line_offset.sign == LINE_OFFSET_NONE ? ""
280  : (explicit_loc->line_offset.sign
281  == LINE_OFFSET_PLUS ? "+" : "-")),
282  explicit_loc->line_offset.offset);
283  }
284 
285  return xstrdup (buf.c_str ());
286 }
287 
288 /* See description in location.h. */
289 
290 char *
291 explicit_location_to_string (const struct explicit_location *explicit_loc)
292 {
293  return explicit_to_string_internal (0, explicit_loc);
294 }
295 
296 /* See description in location.h. */
297 
298 char *
300 {
301  return explicit_to_string_internal (1, explicit_loc);
302 }
303 
304 /* See description in location.h. */
305 
308 {
309  struct event_location *dst;
310 
311  dst = XCNEW (struct event_location);
312  EL_TYPE (dst) = EL_TYPE (src);
313  if (EL_STRING (src) != NULL)
314  EL_STRING (dst) = xstrdup (EL_STRING (src));
315 
316  switch (EL_TYPE (src))
317  {
318  case LINESPEC_LOCATION:
319  EL_LINESPEC (dst)->match_type = EL_LINESPEC (src)->match_type;
320  if (EL_LINESPEC (src)->spec_string != NULL)
321  EL_LINESPEC (dst)->spec_string
322  = xstrdup (EL_LINESPEC (src)->spec_string);
323  break;
324 
325  case ADDRESS_LOCATION:
326  EL_ADDRESS (dst) = EL_ADDRESS (src);
327  break;
328 
329  case EXPLICIT_LOCATION:
330  EL_EXPLICIT (dst)->func_name_match_type
331  = EL_EXPLICIT (src)->func_name_match_type;
332  if (EL_EXPLICIT (src)->source_filename != NULL)
333  EL_EXPLICIT (dst)->source_filename
334  = xstrdup (EL_EXPLICIT (src)->source_filename);
335 
336  if (EL_EXPLICIT (src)->function_name != NULL)
337  EL_EXPLICIT (dst)->function_name
338  = xstrdup (EL_EXPLICIT (src)->function_name);
339 
340  if (EL_EXPLICIT (src)->label_name != NULL)
341  EL_EXPLICIT (dst)->label_name = xstrdup (EL_EXPLICIT (src)->label_name);
342 
343  EL_EXPLICIT (dst)->line_offset = EL_EXPLICIT (src)->line_offset;
344  break;
345 
346 
347  case PROBE_LOCATION:
348  if (EL_PROBE (src) != NULL)
349  EL_PROBE (dst) = xstrdup (EL_PROBE (src));
350  break;
351 
352  default:
353  gdb_assert_not_reached ("unknown event location type");
354  }
355 
356  return event_location_up (dst);
357 }
358 
359 void
361 {
362  if (location != NULL)
363  {
364  xfree (EL_STRING (location));
365 
366  switch (EL_TYPE (location))
367  {
368  case LINESPEC_LOCATION:
369  xfree (EL_LINESPEC (location)->spec_string);
370  break;
371 
372  case ADDRESS_LOCATION:
373  /* Nothing to do. */
374  break;
375 
376  case EXPLICIT_LOCATION:
377  xfree (EL_EXPLICIT (location)->source_filename);
378  xfree (EL_EXPLICIT (location)->function_name);
379  xfree (EL_EXPLICIT (location)->label_name);
380  break;
381 
382  case PROBE_LOCATION:
383  xfree (EL_PROBE (location));
384  break;
385 
386  default:
387  gdb_assert_not_reached ("unknown event location type");
388  }
389 
390  xfree (location);
391  }
392 }
393 
394 /* See description in location.h. */
395 
396 const char *
398 {
399  if (EL_STRING (location) == NULL)
400  {
401  switch (EL_TYPE (location))
402  {
403  case LINESPEC_LOCATION:
404  if (EL_LINESPEC (location)->spec_string != NULL)
405  {
406  linespec_location *ls = EL_LINESPEC (location);
408  {
409  EL_STRING (location)
410  = concat ("-qualified ", ls->spec_string, (char *) NULL);
411  }
412  else
413  EL_STRING (location) = xstrdup (ls->spec_string);
414  }
415  break;
416 
417  case ADDRESS_LOCATION:
418  EL_STRING (location)
419  = xstrprintf ("*%s",
420  core_addr_to_string (EL_ADDRESS (location)));
421  break;
422 
423  case EXPLICIT_LOCATION:
424  EL_STRING (location)
426  break;
427 
428  case PROBE_LOCATION:
429  EL_STRING (location) = xstrdup (EL_PROBE (location));
430  break;
431 
432  default:
433  gdb_assert_not_reached ("unknown event location type");
434  }
435  }
436 
437  return EL_STRING (location);
438 }
439 
440 /* Find an instance of the quote character C in the string S that is
441  outside of all single- and double-quoted strings (i.e., any quoting
442  other than C). */
443 
444 static const char *
445 find_end_quote (const char *s, char end_quote_char)
446 {
447  /* zero if we're not in quotes;
448  '"' if we're in a double-quoted string;
449  '\'' if we're in a single-quoted string. */
450  char nested_quote_char = '\0';
451 
452  for (const char *scan = s; *scan != '\0'; scan++)
453  {
454  if (nested_quote_char != '\0')
455  {
456  if (*scan == nested_quote_char)
457  nested_quote_char = '\0';
458  else if (scan[0] == '\\' && *(scan + 1) != '\0')
459  scan++;
460  }
461  else if (*scan == end_quote_char && nested_quote_char == '\0')
462  return scan;
463  else if (*scan == '"' || *scan == '\'')
464  nested_quote_char = *scan;
465  }
466 
467  return 0;
468 }
469 
470 /* A lexer for explicit locations. This function will advance INP
471  past any strings that it lexes. Returns a malloc'd copy of the
472  lexed string or NULL if no lexing was done. */
473 
475 explicit_location_lex_one (const char **inp,
476  const struct language_defn *language,
477  explicit_completion_info *completion_info)
478 {
479  const char *start = *inp;
480 
481  if (*start == '\0')
482  return NULL;
483 
484  /* If quoted, skip to the ending quote. */
485  if (strchr (get_gdb_linespec_parser_quote_characters (), *start))
486  {
487  if (completion_info != NULL)
488  completion_info->quoted_arg_start = start;
489 
490  const char *end = find_end_quote (start + 1, *start);
491 
492  if (end == NULL)
493  {
494  if (completion_info == NULL)
495  error (_("Unmatched quote, %s."), start);
496 
497  end = start + strlen (start);
498  *inp = end;
499  return gdb::unique_xmalloc_ptr<char> (savestring (start + 1,
500  *inp - start - 1));
501  }
502 
503  if (completion_info != NULL)
504  completion_info->quoted_arg_end = end;
505  *inp = end + 1;
506  return gdb::unique_xmalloc_ptr<char> (savestring (start + 1,
507  *inp - start - 2));
508  }
509 
510  /* If the input starts with '-' or '+', the string ends with the next
511  whitespace or comma. */
512  if (*start == '-' || *start == '+')
513  {
514  while (*inp[0] != '\0' && *inp[0] != ',' && !isspace (*inp[0]))
515  ++(*inp);
516  }
517  else
518  {
519  /* Handle numbers first, stopping at the next whitespace or ','. */
520  while (isdigit (*inp[0]))
521  ++(*inp);
522  if (*inp[0] == '\0' || isspace (*inp[0]) || *inp[0] == ',')
524  *inp - start));
525 
526  /* Otherwise stop at the next occurrence of whitespace, '\0',
527  keyword, or ','. */
528  *inp = start;
529  while ((*inp)[0]
530  && (*inp)[0] != ','
531  && !(isspace ((*inp)[0])
532  || linespec_lexer_lex_keyword (&(*inp)[1])))
533  {
534  /* Special case: C++ operator,. */
535  if (language->la_language == language_cplus
536  && startswith (*inp, CP_OPERATOR_STR))
537  (*inp) += CP_OPERATOR_LEN;
538  ++(*inp);
539  }
540  }
541 
542  if (*inp - start > 0)
543  return gdb::unique_xmalloc_ptr<char> (savestring (start, *inp - start));
544 
545  return NULL;
546 }
547 
548 /* Return true if COMMA points past "operator". START is the start of
549  the line that COMMAND points to, hence when reading backwards, we
550  must not read any character before START. */
551 
552 static bool
553 is_cp_operator (const char *start, const char *comma)
554 {
555  if (comma != NULL
556  && (comma - start) >= CP_OPERATOR_LEN)
557  {
558  const char *p = comma;
559 
560  while (p > start && isspace (p[-1]))
561  p--;
562  if (p - start >= CP_OPERATOR_LEN)
563  {
564  p -= CP_OPERATOR_LEN;
565  if (strncmp (p, CP_OPERATOR_STR, CP_OPERATOR_LEN) == 0
566  && (p == start
567  || !(isalnum (p[-1]) || p[-1] == '_')))
568  {
569  return true;
570  }
571  }
572  }
573  return false;
574 }
575 
576 /* When scanning the input string looking for the next explicit
577  location option/delimiter, we jump to the next option by looking
578  for ",", and "-". Such a character can also appear in C++ symbols
579  like "operator," and "operator-". So when we find such a
580  character, we call this function to check if we found such a
581  symbol, meaning we had a false positive for an option string. In
582  that case, we keep looking for the next delimiter, until we find
583  one that is not a false positive, or we reach end of string. FOUND
584  is the character that scanning found (either '-' or ','), and START
585  is the start of the line that FOUND points to, hence when reading
586  backwards, we must not read any character before START. Returns a
587  pointer to the next non-false-positive delimiter character, or NULL
588  if none was found. */
589 
590 static const char *
591 skip_op_false_positives (const char *start, const char *found)
592 {
593  while (found != NULL && is_cp_operator (start, found))
594  {
595  if (found[0] == '-' && found[1] == '-')
596  start = found + 2;
597  else
598  start = found + 1;
599  found = find_toplevel_char (start, *found);
600  }
601 
602  return found;
603 }
604 
605 /* Assuming both FIRST and NEW_TOK point into the same string, return
606  the pointer that is closer to the start of the string. If FIRST is
607  NULL, returns NEW_TOK. If NEW_TOK is NULL, returns FIRST. */
608 
609 static const char *
610 first_of (const char *first, const char *new_tok)
611 {
612  if (first == NULL)
613  return new_tok;
614  else if (new_tok != NULL && new_tok < first)
615  return new_tok;
616  else
617  return first;
618 }
619 
620 /* A lexer for functions in explicit locations. This function will
621  advance INP past a function until the next option, or until end of
622  string. Returns a malloc'd copy of the lexed string or NULL if no
623  lexing was done. */
624 
627  const struct language_defn *language,
628  explicit_completion_info *completion_info)
629 {
630  const char *start = *inp;
631 
632  if (*start == '\0')
633  return NULL;
634 
635  /* If quoted, skip to the ending quote. */
636  if (strchr (get_gdb_linespec_parser_quote_characters (), *start))
637  {
638  char quote_char = *start;
639 
640  /* If the input is not an Ada operator, skip to the matching
641  closing quote and return the string. */
642  if (!(language->la_language == language_ada
643  && quote_char == '\"' && is_ada_operator (start)))
644  {
645  if (completion_info != NULL)
646  completion_info->quoted_arg_start = start;
647 
648  const char *end = find_toplevel_char (start + 1, quote_char);
649 
650  if (end == NULL)
651  {
652  if (completion_info == NULL)
653  error (_("Unmatched quote, %s."), start);
654 
655  end = start + strlen (start);
656  *inp = end;
657  char *saved = savestring (start + 1, *inp - start - 1);
658  return gdb::unique_xmalloc_ptr<char> (saved);
659  }
660 
661  if (completion_info != NULL)
662  completion_info->quoted_arg_end = end;
663  *inp = end + 1;
664  char *saved = savestring (start + 1, *inp - start - 2);
665  return gdb::unique_xmalloc_ptr<char> (saved);
666  }
667  }
668 
669  const char *comma = find_toplevel_char (start, ',');
670 
671  /* If we have "-function -myfunction", or perhaps better example,
672  "-function -[BasicClass doIt]" (objc selector), treat
673  "-myfunction" as the function name. I.e., skip the first char if
674  it is an hyphen. Don't skip the first char always, because we
675  may have C++ "operator<", and find_toplevel_char needs to see the
676  'o' in that case. */
677  const char *hyphen
678  = (*start == '-'
679  ? find_toplevel_char (start + 1, '-')
680  : find_toplevel_char (start, '-'));
681 
682  /* Check for C++ "operator," and "operator-". */
683  comma = skip_op_false_positives (start, comma);
684  hyphen = skip_op_false_positives (start, hyphen);
685 
686  /* Pick the one that appears first. */
687  const char *end = first_of (hyphen, comma);
688 
689  /* See if a linespec keyword appears first. */
690  const char *s = start;
691  const char *ws = find_toplevel_char (start, ' ');
692  while (ws != NULL && linespec_lexer_lex_keyword (ws + 1) == NULL)
693  {
694  s = ws + 1;
695  ws = find_toplevel_char (s, ' ');
696  }
697  if (ws != NULL)
698  end = first_of (end, ws + 1);
699 
700  /* If we don't have any terminator, then take the whole string. */
701  if (end == NULL)
702  end = start + strlen (start);
703 
704  /* Trim whitespace at the end. */
705  while (end > start && end[-1] == ' ')
706  end--;
707 
708  *inp = end;
709 
710  if (*inp - start > 0)
711  return gdb::unique_xmalloc_ptr<char> (savestring (start, *inp - start));
712 
713  return NULL;
714 }
715 
716 /* See description in location.h. */
717 
719 string_to_explicit_location (const char **argp,
720  const struct language_defn *language,
721  explicit_completion_info *completion_info)
722 {
723  event_location_up location;
724 
725  /* It is assumed that input beginning with '-' and a non-digit
726  character is an explicit location. "-p" is reserved, though,
727  for probe locations. */
728  if (argp == NULL
729  || *argp == NULL
730  || *argp[0] != '-'
731  || !isalpha ((*argp)[1])
732  || ((*argp)[0] == '-' && (*argp)[1] == 'p'))
733  return NULL;
734 
735  location = new_explicit_location (NULL);
736 
737  /* Process option/argument pairs. dprintf_command
738  requires that processing stop on ','. */
739  while ((*argp)[0] != '\0' && (*argp)[0] != ',')
740  {
741  int len;
742  const char *start;
743 
744  /* Clear these on each iteration, since they should be filled
745  with info about the last option. */
746  if (completion_info != NULL)
747  {
748  completion_info->quoted_arg_start = NULL;
749  completion_info->quoted_arg_end = NULL;
750  }
751 
752  /* If *ARGP starts with a keyword, stop processing
753  options. */
754  if (linespec_lexer_lex_keyword (*argp) != NULL)
755  break;
756 
757  /* Mark the start of the string in case we need to rewind. */
758  start = *argp;
759 
760  if (completion_info != NULL)
761  completion_info->last_option = start;
762 
763  /* Get the option string. */
765  = explicit_location_lex_one (argp, language, NULL);
766 
767  /* Use the length of the option to allow abbreviations. */
768  len = strlen (opt.get ());
769 
770  /* Get the argument string. */
771  *argp = skip_spaces (*argp);
772 
773  /* All options have a required argument. Checking for this
774  required argument is deferred until later. */
776  /* True if we have an argument. This is required because we'll
777  move from OARG before checking whether we have an
778  argument. */
779  bool have_oarg = false;
780 
781  /* True if the option needs an argument. */
782  bool need_oarg = false;
783 
784  /* Convenience to consistently set both OARG/HAVE_OARG from
785  ARG. */
786  auto set_oarg = [&] (gdb::unique_xmalloc_ptr<char> arg)
787  {
788  if (completion_info != NULL)
789  {
790  /* We do this here because the set of options that take
791  arguments matches the set of explicit location
792  options. */
793  completion_info->saw_explicit_location_option = true;
794  }
795  oarg = std::move (arg);
796  have_oarg = oarg != NULL;
797  need_oarg = true;
798  };
799 
800  if (strncmp (opt.get (), "-source", len) == 0)
801  {
802  set_oarg (explicit_location_lex_one (argp, language,
803  completion_info));
804  EL_EXPLICIT (location)->source_filename = oarg.release ();
805  }
806  else if (strncmp (opt.get (), "-function", len) == 0)
807  {
809  completion_info));
810  EL_EXPLICIT (location)->function_name = oarg.release ();
811  }
812  else if (strncmp (opt.get (), "-qualified", len) == 0)
813  {
814  EL_EXPLICIT (location)->func_name_match_type
816  }
817  else if (strncmp (opt.get (), "-line", len) == 0)
818  {
819  set_oarg (explicit_location_lex_one (argp, language, NULL));
820  *argp = skip_spaces (*argp);
821  if (have_oarg)
822  {
823  EL_EXPLICIT (location)->line_offset
824  = linespec_parse_line_offset (oarg.get ());
825  continue;
826  }
827  }
828  else if (strncmp (opt.get (), "-label", len) == 0)
829  {
830  set_oarg (explicit_location_lex_one (argp, language, completion_info));
831  EL_EXPLICIT (location)->label_name = oarg.release ();
832  }
833  /* Only emit an "invalid argument" error for options
834  that look like option strings. */
835  else if (opt.get ()[0] == '-' && !isdigit (opt.get ()[1]))
836  {
837  if (completion_info == NULL)
838  error (_("invalid explicit location argument, \"%s\""), opt.get ());
839  }
840  else
841  {
842  /* End of the explicit location specification.
843  Stop parsing and return whatever explicit location was
844  parsed. */
845  *argp = start;
846  break;
847  }
848 
849  *argp = skip_spaces (*argp);
850 
851  /* It's a little lame to error after the fact, but in this
852  case, it provides a much better user experience to issue
853  the "invalid argument" error before any missing
854  argument error. */
855  if (need_oarg && !have_oarg && completion_info == NULL)
856  error (_("missing argument for \"%s\""), opt.get ());
857  }
858 
859  /* One special error check: If a source filename was given
860  without offset, function, or label, issue an error. */
861  if (EL_EXPLICIT (location)->source_filename != NULL
862  && EL_EXPLICIT (location)->function_name == NULL
863  && EL_EXPLICIT (location)->label_name == NULL
864  && (EL_EXPLICIT (location)->line_offset.sign == LINE_OFFSET_UNKNOWN)
865  && completion_info == NULL)
866  {
867  error (_("Source filename requires function, label, or "
868  "line offset."));
869  }
870 
871  return location;
872 }
873 
874 /* See description in location.h. */
875 
877 string_to_event_location_basic (const char **stringp,
878  const struct language_defn *language,
879  symbol_name_match_type match_type)
880 {
881  event_location_up location;
882  const char *cs;
883 
884  /* Try the input as a probe spec. */
885  cs = *stringp;
886  if (cs != NULL && probe_linespec_to_static_ops (&cs) != NULL)
887  {
888  location = new_probe_location (*stringp);
889  *stringp += strlen (*stringp);
890  }
891  else
892  {
893  /* Try an address location. */
894  if (*stringp != NULL && **stringp == '*')
895  {
896  const char *arg, *orig;
897  CORE_ADDR addr;
898 
899  orig = arg = *stringp;
900  addr = linespec_expression_to_pc (&arg);
901  location = new_address_location (addr, orig, arg - orig);
902  *stringp += arg - orig;
903  }
904  else
905  {
906  /* Everything else is a linespec. */
907  location = new_linespec_location (stringp, match_type);
908  }
909  }
910 
911  return location;
912 }
913 
914 /* See description in location.h. */
915 
917 string_to_event_location (const char **stringp,
918  const struct language_defn *language,
919  symbol_name_match_type match_type)
920 {
921  const char *arg, *orig;
922 
923  /* Try an explicit location. */
924  orig = arg = *stringp;
925  event_location_up location = string_to_explicit_location (&arg, language, NULL);
926  if (location != NULL)
927  {
928  /* It was a valid explicit location. Advance STRINGP to
929  the end of input. */
930  *stringp += arg - orig;
931 
932  /* If the user really specified a location, then we're done. */
933  if (!event_location_empty_p (location.get ()))
934  return location;
935 
936  /* Otherwise, the user _only_ specified optional flags like
937  "-qualified", otherwise string_to_explicit_location would
938  have thrown an error. Save the flags for "basic" linespec
939  parsing below and discard the explicit location. */
940  match_type = EL_EXPLICIT (location)->func_name_match_type;
941  }
942 
943  /* Everything else is a "basic" linespec, address, or probe
944  location. */
945  return string_to_event_location_basic (stringp, language, match_type);
946 }
947 
948 /* See description in location.h. */
949 
950 int
951 event_location_empty_p (const struct event_location *location)
952 {
953  switch (EL_TYPE (location))
954  {
955  case LINESPEC_LOCATION:
956  /* Linespecs are never "empty." (NULL is a valid linespec) */
957  return 0;
958 
959  case ADDRESS_LOCATION:
960  return 0;
961 
962  case EXPLICIT_LOCATION:
963  return (EL_EXPLICIT (location) == NULL
964  || (EL_EXPLICIT (location)->source_filename == NULL
965  && EL_EXPLICIT (location)->function_name == NULL
966  && EL_EXPLICIT (location)->label_name == NULL
967  && (EL_EXPLICIT (location)->line_offset.sign
968  == LINE_OFFSET_UNKNOWN)));
969 
970  case PROBE_LOCATION:
971  return EL_PROBE (location) == NULL;
972 
973  default:
974  gdb_assert_not_reached ("unknown event location type");
975  }
976 }
977 
978 /* See description in location.h. */
979 
980 void
982  const char *string)
983 {
984  xfree (EL_STRING (location));
985  EL_STRING (location) = string == NULL ? NULL : xstrdup (string);
986 }
static gdb::unique_xmalloc_ptr< char > explicit_location_lex_one(const char **inp, const struct language_defn *language, explicit_completion_info *completion_info)
Definition: location.c:475
static bool is_cp_operator(const char *start, const char *comma)
Definition: location.c:553
Definition: probe.h:112
int is_ada_operator(const char *string)
Definition: linespec.c:504
const struct static_probe_ops * probe_linespec_to_static_ops(const char **linespecp)
Definition: probe.c:712
bfd_vma CORE_ADDR
Definition: common-types.h:41
void xfree(void *)
const char * get_probe_location(const struct event_location *location)
Definition: location.c:169
#define EL_EXPLICIT(P)
Definition: location.c:58
static void scan(struct macro_buffer *dest, struct macro_buffer *src, struct macro_name_list *no_loop, macro_lookup_ftype *lookup_func, void *lookup_baton)
Definition: macroexp.c:1446
event_location_up new_linespec_location(const char **linespec, symbol_name_match_type match_type)
Definition: location.c:88
void * memset(T *s, int c, size_t n)=delete
static const char * first_of(const char *first, const char *new_tok)
Definition: location.c:610
#define EL_ADDRESS(P)
Definition: location.c:54
event_location_up copy_event_location(const struct event_location *src)
Definition: location.c:307
const char * get_address_string_location(const struct event_location *location)
Definition: location.c:146
struct line_offset line_offset
Definition: location.h:102
char * spec_string
Definition: location.h:77
char * skip_spaces(char *chp)
Definition: common-utils.c:337
#define _(String)
Definition: gdb_locale.h:35
#define EL_PROBE(P)
Definition: location.c:46
CORE_ADDR get_address_location(const struct event_location *location)
Definition: location.c:137
symbol_name_match_type match_type
Definition: location.h:74
event_location_up string_to_event_location_basic(const char **stringp, const struct language_defn *language, symbol_name_match_type match_type)
Definition: location.c:877
static char * explicit_to_string_internal(int as_linespec, const struct explicit_location *explicit_loc)
Definition: location.c:235
void initialize_explicit_location(struct explicit_location *explicit_loc)
Definition: location.c:78
enum offset_relative_sign sign
Definition: location.h:48
const struct explicit_location * get_explicit_location_const(const struct event_location *location)
Definition: location.c:222
const char * remove_trailing_whitespace(const char *start, const char *s)
Definition: cli-utils.c:248
std::unique_ptr< T, xfree_deleter< T > > unique_xmalloc_ptr
static const char * find_end_quote(const char *s, char end_quote_char)
Definition: location.c:445
const linespec_location * get_linespec_location(const struct event_location *location)
Definition: location.c:112
#define gdb_assert_not_reached(message)
Definition: gdb_assert.h:55
const char * quoted_arg_start
Definition: location.h:254
const char * last_option
Definition: location.h:247
void operator()(event_location *location) const
Definition: location.c:360
static int startswith(const char *string, const char *pattern)
Definition: common-utils.h:107
const char * linespec_lexer_lex_keyword(const char *p)
Definition: linespec.c:456
event_location_up new_explicit_location(const struct explicit_location *explicit_loc)
Definition: location.c:178
std::unique_ptr< event_location, event_location_deleter > event_location_up
Definition: location.h:140
const char * get_gdb_linespec_parser_quote_characters(void)
Definition: linespec.c:4656
const char * event_location_to_string(struct event_location *location)
Definition: location.c:397
enum event_location_type event_location_type(const struct event_location *location)
Definition: location.c:70
char * xstrprintf(const char *format,...)
Definition: common-utils.c:107
CORE_ADDR linespec_expression_to_pc(const char **exp_ptr)
Definition: linespec.c:3442
int offset
Definition: location.h:47
virtual void puts(const char *str)
Definition: ui-file.h:63
event_location_up new_address_location(CORE_ADDR addr, const char *addr_string, int addr_string_len)
Definition: location.c:121
char * as_string
Definition: location.c:63
CORE_ADDR address
Definition: location.c:53
#define gdb_assert(expr)
Definition: gdb_assert.h:32
enum event_location_type type
Definition: location.c:39
event_location_type
Definition: location.h:54
#define CP_OPERATOR_STR
Definition: cp-support.h:51
#define CP_OPERATOR_LEN
Definition: cp-support.h:55
event_location_up new_probe_location(const char *probe)
Definition: location.c:155
char * function_name
Definition: location.h:91
void printf(const char *,...) ATTRIBUTE_PRINTF(2
Definition: ui-file.c:37
symbol_name_match_type func_name_match_type
Definition: location.h:94
struct explicit_location explicit_loc
Definition: location.c:57
void linespec_lex_to_end(const char **stringp)
Definition: linespec.c:2815
struct line_offset linespec_parse_line_offset(const char *string)
Definition: linespec.c:1745
char * explicit_location_to_linespec(const struct explicit_location *explicit_loc)
Definition: location.c:299
#define XCNEW(T)
Definition: poison.h:121
const char * c_str() const
Definition: ui-file.h:137
char * addr_string
Definition: location.c:45
const char * quoted_arg_end
Definition: location.h:255
#define EL_LINESPEC(P)
Definition: location.c:50
#define EL_TYPE(P)
Definition: location.c:40
#define EL_STRING(P)
Definition: location.c:64
int event_location_empty_p(const struct event_location *location)
Definition: location.c:951
static gdb::unique_xmalloc_ptr< char > explicit_location_lex_one_function(const char **inp, const struct language_defn *language, explicit_completion_info *completion_info)
Definition: location.c:626
void set_event_location_string(struct event_location *location, const char *string)
Definition: location.c:981
language
Definition: defs.h:203
char * savestring(const char *ptr, size_t len)
Definition: common-utils.c:226
char * source_filename
Definition: location.h:88
const char * find_toplevel_char(const char *s, char c)
Definition: linespec.c:1286
event_location_up string_to_explicit_location(const char **argp, const struct language_defn *language, explicit_completion_info *completion_info)
Definition: location.c:719
char * label_name
Definition: location.h:97
int putc(int c)
Definition: ui-file.c:59
event_location_up string_to_event_location(const char **stringp, const struct language_defn *language, symbol_name_match_type match_type)
Definition: location.c:917
void error(const char *fmt,...)
Definition: errors.c:38
static const char * skip_op_false_positives(const char *start, const char *found)
Definition: location.c:591
union event_location::@82 u
struct explicit_location * get_explicit_location(struct event_location *location)
Definition: location.c:213
symbol_name_match_type
Definition: symtab.h:52
char * explicit_location_to_string(const struct explicit_location *explicit_loc)
Definition: location.c:291