Constify some linespec functions
[deliverable/binutils-gdb.git] / gdb / location.c
1 /* Data structures and API for event locations in GDB.
2 Copyright (C) 2013-2017 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
36 struct event_location
37 {
38 /* The type of this breakpoint specification. */
39 enum event_location_type type;
40 #define EL_TYPE(P) (P)->type
41
42 union
43 {
44 /* A generic "this is a string specification" for a location.
45 This representation is used by both "normal" linespecs and
46 probes. */
47 char *addr_string;
48 #define EL_LINESPEC(P) ((P)->u.addr_string)
49 #define EL_PROBE(P) ((P)->u.addr_string)
50
51 /* An address in the inferior. */
52 CORE_ADDR address;
53 #define EL_ADDRESS(P) (P)->u.address
54
55 /* An explicit location. */
56 struct explicit_location explicit_loc;
57 #define EL_EXPLICIT(P) (&((P)->u.explicit_loc))
58 } u;
59
60 /* Cached string representation of this location. This is used, e.g., to
61 save stop event locations to file. Malloc'd. */
62 char *as_string;
63 #define EL_STRING(P) ((P)->as_string)
64 };
65
66 /* See description in location.h. */
67
68 enum event_location_type
69 event_location_type (const struct event_location *location)
70 {
71 return EL_TYPE (location);
72 }
73
74 /* See description in location.h. */
75
76 void
77 initialize_explicit_location (struct explicit_location *explicit_loc)
78 {
79 memset (explicit_loc, 0, sizeof (struct explicit_location));
80 explicit_loc->line_offset.sign = LINE_OFFSET_UNKNOWN;
81 }
82
83 /* See description in location.h. */
84
85 event_location_up
86 new_linespec_location (const char **linespec)
87 {
88 struct event_location *location;
89
90 location = XCNEW (struct event_location);
91 EL_TYPE (location) = LINESPEC_LOCATION;
92 if (*linespec != NULL)
93 {
94 const char *p;
95 const char *orig = *linespec;
96
97 linespec_lex_to_end (linespec);
98 p = remove_trailing_whitespace (orig, *linespec);
99 if ((p - orig) > 0)
100 EL_LINESPEC (location) = savestring (orig, p - orig);
101 }
102 return event_location_up (location);
103 }
104
105 /* See description in location.h. */
106
107 const char *
108 get_linespec_location (const struct event_location *location)
109 {
110 gdb_assert (EL_TYPE (location) == LINESPEC_LOCATION);
111 return EL_LINESPEC (location);
112 }
113
114 /* See description in location.h. */
115
116 event_location_up
117 new_address_location (CORE_ADDR addr, const char *addr_string,
118 int addr_string_len)
119 {
120 struct event_location *location;
121
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);
128 }
129
130 /* See description in location.h. */
131
132 CORE_ADDR
133 get_address_location (const struct event_location *location)
134 {
135 gdb_assert (EL_TYPE (location) == ADDRESS_LOCATION);
136 return EL_ADDRESS (location);
137 }
138
139 /* See description in location.h. */
140
141 const char *
142 get_address_string_location (const struct event_location *location)
143 {
144 gdb_assert (EL_TYPE (location) == ADDRESS_LOCATION);
145 return EL_STRING (location);
146 }
147
148 /* See description in location.h. */
149
150 event_location_up
151 new_probe_location (const char *probe)
152 {
153 struct event_location *location;
154
155 location = XCNEW (struct event_location);
156 EL_TYPE (location) = PROBE_LOCATION;
157 if (probe != NULL)
158 EL_PROBE (location) = xstrdup (probe);
159 return event_location_up (location);
160 }
161
162 /* See description in location.h. */
163
164 const char *
165 get_probe_location (const struct event_location *location)
166 {
167 gdb_assert (EL_TYPE (location) == PROBE_LOCATION);
168 return EL_PROBE (location);
169 }
170
171 /* See description in location.h. */
172
173 event_location_up
174 new_explicit_location (const struct explicit_location *explicit_loc)
175 {
176 struct event_location tmp;
177
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)
182 {
183 if (explicit_loc->source_filename != NULL)
184 {
185 EL_EXPLICIT (&tmp)->source_filename
186 = explicit_loc->source_filename;
187 }
188
189 if (explicit_loc->function_name != NULL)
190 EL_EXPLICIT (&tmp)->function_name
191 = explicit_loc->function_name;
192
193 if (explicit_loc->label_name != NULL)
194 EL_EXPLICIT (&tmp)->label_name = explicit_loc->label_name;
195
196 if (explicit_loc->line_offset.sign != LINE_OFFSET_UNKNOWN)
197 EL_EXPLICIT (&tmp)->line_offset = explicit_loc->line_offset;
198 }
199
200 return copy_event_location (&tmp);
201 }
202
203 /* See description in location.h. */
204
205 struct explicit_location *
206 get_explicit_location (struct event_location *location)
207 {
208 gdb_assert (EL_TYPE (location) == EXPLICIT_LOCATION);
209 return EL_EXPLICIT (location);
210 }
211
212 /* See description in location.h. */
213
214 const struct explicit_location *
215 get_explicit_location_const (const struct event_location *location)
216 {
217 gdb_assert (EL_TYPE (location) == EXPLICIT_LOCATION);
218 return EL_EXPLICIT (location);
219 }
220
221 /* This convenience function returns a malloc'd string which
222 represents the location in EXPLICIT_LOC.
223
224 AS_LINESPEC is non-zero if this string should be a linespec.
225 Otherwise it will be output in explicit form. */
226
227 static char *
228 explicit_to_string_internal (int as_linespec,
229 const struct explicit_location *explicit_loc)
230 {
231 int need_space = 0;
232 char space = as_linespec ? ':' : ' ';
233 string_file buf;
234
235 if (explicit_loc->source_filename != NULL)
236 {
237 if (!as_linespec)
238 buf.puts ("-source ");
239 buf.puts (explicit_loc->source_filename);
240 need_space = 1;
241 }
242
243 if (explicit_loc->function_name != NULL)
244 {
245 if (need_space)
246 buf.putc (space);
247 if (!as_linespec)
248 buf.puts ("-function ");
249 buf.puts (explicit_loc->function_name);
250 need_space = 1;
251 }
252
253 if (explicit_loc->label_name != NULL)
254 {
255 if (need_space)
256 buf.putc (space);
257 if (!as_linespec)
258 buf.puts ("-label ");
259 buf.puts (explicit_loc->label_name);
260 need_space = 1;
261 }
262
263 if (explicit_loc->line_offset.sign != LINE_OFFSET_UNKNOWN)
264 {
265 if (need_space)
266 buf.putc (space);
267 if (!as_linespec)
268 buf.puts ("-line ");
269 buf.printf ("%s%d",
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);
274 }
275
276 return xstrdup (buf.c_str ());
277 }
278
279 /* See description in location.h. */
280
281 char *
282 explicit_location_to_string (const struct explicit_location *explicit_loc)
283 {
284 return explicit_to_string_internal (0, explicit_loc);
285 }
286
287 /* See description in location.h. */
288
289 char *
290 explicit_location_to_linespec (const struct explicit_location *explicit_loc)
291 {
292 return explicit_to_string_internal (1, explicit_loc);
293 }
294
295 /* See description in location.h. */
296
297 event_location_up
298 copy_event_location (const struct event_location *src)
299 {
300 struct event_location *dst;
301
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));
306
307 switch (EL_TYPE (src))
308 {
309 case LINESPEC_LOCATION:
310 if (EL_LINESPEC (src) != NULL)
311 EL_LINESPEC (dst) = xstrdup (EL_LINESPEC (src));
312 break;
313
314 case ADDRESS_LOCATION:
315 EL_ADDRESS (dst) = EL_ADDRESS (src);
316 break;
317
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);
322
323 if (EL_EXPLICIT (src)->function_name != NULL)
324 EL_EXPLICIT (dst)->function_name
325 = xstrdup (EL_EXPLICIT (src)->function_name);
326
327 if (EL_EXPLICIT (src)->label_name != NULL)
328 EL_EXPLICIT (dst)->label_name = xstrdup (EL_EXPLICIT (src)->label_name);
329
330 EL_EXPLICIT (dst)->line_offset = EL_EXPLICIT (src)->line_offset;
331 break;
332
333
334 case PROBE_LOCATION:
335 if (EL_PROBE (src) != NULL)
336 EL_PROBE (dst) = xstrdup (EL_PROBE (src));
337 break;
338
339 default:
340 gdb_assert_not_reached ("unknown event location type");
341 }
342
343 return event_location_up (dst);
344 }
345
346 void
347 event_location_deleter::operator() (event_location *location) const
348 {
349 if (location != NULL)
350 {
351 xfree (EL_STRING (location));
352
353 switch (EL_TYPE (location))
354 {
355 case LINESPEC_LOCATION:
356 xfree (EL_LINESPEC (location));
357 break;
358
359 case ADDRESS_LOCATION:
360 /* Nothing to do. */
361 break;
362
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);
367 break;
368
369 case PROBE_LOCATION:
370 xfree (EL_PROBE (location));
371 break;
372
373 default:
374 gdb_assert_not_reached ("unknown event location type");
375 }
376
377 xfree (location);
378 }
379 }
380
381 /* See description in location.h. */
382
383 const char *
384 event_location_to_string (struct event_location *location)
385 {
386 if (EL_STRING (location) == NULL)
387 {
388 switch (EL_TYPE (location))
389 {
390 case LINESPEC_LOCATION:
391 if (EL_LINESPEC (location) != NULL)
392 EL_STRING (location) = xstrdup (EL_LINESPEC (location));
393 break;
394
395 case ADDRESS_LOCATION:
396 EL_STRING (location)
397 = xstrprintf ("*%s",
398 core_addr_to_string (EL_ADDRESS (location)));
399 break;
400
401 case EXPLICIT_LOCATION:
402 EL_STRING (location)
403 = explicit_location_to_string (EL_EXPLICIT (location));
404 break;
405
406 case PROBE_LOCATION:
407 EL_STRING (location) = xstrdup (EL_PROBE (location));
408 break;
409
410 default:
411 gdb_assert_not_reached ("unknown event location type");
412 }
413 }
414
415 return EL_STRING (location);
416 }
417
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
420 other than C). */
421
422 static const char *
423 find_end_quote (const char *s, char end_quote_char)
424 {
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';
429
430 for (const char *scan = s; *scan != '\0'; scan++)
431 {
432 if (nested_quote_char != '\0')
433 {
434 if (*scan == nested_quote_char)
435 nested_quote_char = '\0';
436 else if (scan[0] == '\\' && *(scan + 1) != '\0')
437 scan++;
438 }
439 else if (*scan == end_quote_char && nested_quote_char == '\0')
440 return scan;
441 else if (*scan == '"' || *scan == '\'')
442 nested_quote_char = *scan;
443 }
444
445 return 0;
446 }
447
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. */
451
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)
456 {
457 const char *start = *inp;
458
459 if (*start == '\0')
460 return NULL;
461
462 /* If quoted, skip to the ending quote. */
463 if (strchr (get_gdb_linespec_parser_quote_characters (), *start))
464 {
465 if (completion_info != NULL)
466 completion_info->quoted_arg_start = start;
467
468 const char *end = find_end_quote (start + 1, *start);
469
470 if (end == NULL)
471 {
472 if (completion_info == NULL)
473 error (_("Unmatched quote, %s."), start);
474
475 end = start + strlen (start);
476 *inp = end;
477 return gdb::unique_xmalloc_ptr<char> (savestring (start + 1,
478 *inp - start - 1));
479 }
480
481 if (completion_info != NULL)
482 completion_info->quoted_arg_end = end;
483 *inp = end + 1;
484 return gdb::unique_xmalloc_ptr<char> (savestring (start + 1,
485 *inp - start - 2));
486 }
487
488 /* If the input starts with '-' or '+', the string ends with the next
489 whitespace or comma. */
490 if (*start == '-' || *start == '+')
491 {
492 while (*inp[0] != '\0' && *inp[0] != ',' && !isspace (*inp[0]))
493 ++(*inp);
494 }
495 else
496 {
497 /* Handle numbers first, stopping at the next whitespace or ','. */
498 while (isdigit (*inp[0]))
499 ++(*inp);
500 if (*inp[0] == '\0' || isspace (*inp[0]) || *inp[0] == ',')
501 return gdb::unique_xmalloc_ptr<char> (savestring (start,
502 *inp - start));
503
504 /* Otherwise stop at the next occurrence of whitespace, '\0',
505 keyword, or ','. */
506 *inp = start;
507 while ((*inp)[0]
508 && (*inp)[0] != ','
509 && !(isspace ((*inp)[0])
510 || linespec_lexer_lex_keyword (&(*inp)[1])))
511 {
512 /* Special case: C++ operator,. */
513 if (language->la_language == language_cplus
514 && startswith (*inp, CP_OPERATOR_STR))
515 (*inp) += CP_OPERATOR_LEN;
516 ++(*inp);
517 }
518 }
519
520 if (*inp - start > 0)
521 return gdb::unique_xmalloc_ptr<char> (savestring (start, *inp - start));
522
523 return NULL;
524 }
525
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. */
529
530 static bool
531 is_cp_operator (const char *start, const char *comma)
532 {
533 if (comma != NULL
534 && (comma - start) >= CP_OPERATOR_LEN)
535 {
536 const char *p = comma;
537
538 while (p > start && isspace (p[-1]))
539 p--;
540 if (p - start >= CP_OPERATOR_LEN)
541 {
542 p -= CP_OPERATOR_LEN;
543 if (strncmp (p, CP_OPERATOR_STR, CP_OPERATOR_LEN) == 0
544 && (p == start
545 || !(isalnum (p[-1]) || p[-1] == '_')))
546 {
547 return true;
548 }
549 }
550 }
551 return false;
552 }
553
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. */
567
568 static const char *
569 skip_op_false_positives (const char *start, const char *found)
570 {
571 while (found != NULL && is_cp_operator (start, found))
572 {
573 if (found[0] == '-' && found[1] == '-')
574 start = found + 2;
575 else
576 start = found + 1;
577 found = find_toplevel_char (start, *found);
578 }
579
580 return found;
581 }
582
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. */
586
587 static const char *
588 first_of (const char *first, const char *new_tok)
589 {
590 if (first == NULL)
591 return new_tok;
592 else if (new_tok != NULL && new_tok < first)
593 return new_tok;
594 else
595 return first;
596 }
597
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
601 lexing was done. */
602
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)
607 {
608 const char *start = *inp;
609
610 if (*start == '\0')
611 return NULL;
612
613 /* If quoted, skip to the ending quote. */
614 if (strchr (get_gdb_linespec_parser_quote_characters (), *start))
615 {
616 char quote_char = *start;
617
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)))
622 {
623 if (completion_info != NULL)
624 completion_info->quoted_arg_start = start;
625
626 const char *end = find_toplevel_char (start + 1, quote_char);
627
628 if (end == NULL)
629 {
630 if (completion_info == NULL)
631 error (_("Unmatched quote, %s."), start);
632
633 end = start + strlen (start);
634 *inp = end;
635 char *saved = savestring (start + 1, *inp - start - 1);
636 return gdb::unique_xmalloc_ptr<char> (saved);
637 }
638
639 if (completion_info != NULL)
640 completion_info->quoted_arg_end = end;
641 *inp = end + 1;
642 char *saved = savestring (start + 1, *inp - start - 2);
643 return gdb::unique_xmalloc_ptr<char> (saved);
644 }
645 }
646
647 const char *comma = find_toplevel_char (start, ',');
648
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
654 'o' in that case. */
655 const char *hyphen
656 = (*start == '-'
657 ? find_toplevel_char (start + 1, '-')
658 : find_toplevel_char (start, '-'));
659
660 /* Check for C++ "operator," and "operator-". */
661 comma = skip_op_false_positives (start, comma);
662 hyphen = skip_op_false_positives (start, hyphen);
663
664 /* Pick the one that appears first. */
665 const char *end = first_of (hyphen, comma);
666
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)
671 {
672 s = ws + 1;
673 ws = find_toplevel_char (s, ' ');
674 }
675 if (ws != NULL)
676 end = first_of (end, ws + 1);
677
678 /* If we don't have any terminator, then take the whole string. */
679 if (end == NULL)
680 end = start + strlen (start);
681
682 /* Trim whitespace at the end. */
683 while (end > start && end[-1] == ' ')
684 end--;
685
686 *inp = end;
687
688 if (*inp - start > 0)
689 return gdb::unique_xmalloc_ptr<char> (savestring (start, *inp - start));
690
691 return NULL;
692 }
693
694 /* See description in location.h. */
695
696 event_location_up
697 string_to_explicit_location (const char **argp,
698 const struct language_defn *language,
699 explicit_completion_info *completion_info)
700 {
701 event_location_up location;
702
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. */
706 if (argp == NULL
707 || *argp == NULL
708 || *argp[0] != '-'
709 || !isalpha ((*argp)[1])
710 || ((*argp)[0] == '-' && (*argp)[1] == 'p'))
711 return NULL;
712
713 location = new_explicit_location (NULL);
714
715 /* Process option/argument pairs. dprintf_command
716 requires that processing stop on ','. */
717 while ((*argp)[0] != '\0' && (*argp)[0] != ',')
718 {
719 int len;
720 const char *start;
721
722 /* Clear these on each iteration, since they should be filled
723 with info about the last option. */
724 if (completion_info != NULL)
725 {
726 completion_info->quoted_arg_start = NULL;
727 completion_info->quoted_arg_end = NULL;
728 }
729
730 /* If *ARGP starts with a keyword, stop processing
731 options. */
732 if (linespec_lexer_lex_keyword (*argp) != NULL)
733 break;
734
735 /* Mark the start of the string in case we need to rewind. */
736 start = *argp;
737
738 if (completion_info != NULL)
739 completion_info->last_option = start;
740
741 /* Get the option string. */
742 gdb::unique_xmalloc_ptr<char> opt
743 = explicit_location_lex_one (argp, language, NULL);
744
745 /* Use the length of the option to allow abbreviations. */
746 len = strlen (opt.get ());
747
748 /* Get the argument string. */
749 *argp = skip_spaces (*argp);
750
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
756 argument. */
757 bool have_oarg = false;
758
759 /* Convenience to consistently set both OARG/HAVE_OARG from
760 ARG. */
761 auto set_oarg = [&] (gdb::unique_xmalloc_ptr<char> arg)
762 {
763 oarg = std::move (arg);
764 have_oarg = oarg != NULL;
765 };
766
767 if (strncmp (opt.get (), "-source", len) == 0)
768 {
769 set_oarg (explicit_location_lex_one (argp, language,
770 completion_info));
771 EL_EXPLICIT (location)->source_filename = oarg.release ();
772 }
773 else if (strncmp (opt.get (), "-function", len) == 0)
774 {
775 set_oarg (explicit_location_lex_one_function (argp, language,
776 completion_info));
777 EL_EXPLICIT (location)->function_name = oarg.release ();
778 }
779 else if (strncmp (opt.get (), "-line", len) == 0)
780 {
781 set_oarg (explicit_location_lex_one (argp, language, NULL));
782 *argp = skip_spaces (*argp);
783 if (have_oarg)
784 {
785 EL_EXPLICIT (location)->line_offset
786 = linespec_parse_line_offset (oarg.get ());
787 continue;
788 }
789 }
790 else if (strncmp (opt.get (), "-label", len) == 0)
791 {
792 set_oarg (explicit_location_lex_one (argp, language, completion_info));
793 EL_EXPLICIT (location)->label_name = oarg.release ();
794 }
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]))
798 {
799 if (completion_info == NULL)
800 error (_("invalid explicit location argument, \"%s\""), opt.get ());
801 }
802 else
803 {
804 /* End of the explicit location specification.
805 Stop parsing and return whatever explicit location was
806 parsed. */
807 *argp = start;
808 return location;
809 }
810
811 *argp = skip_spaces (*argp);
812
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
816 argument error. */
817 if (!have_oarg && completion_info == NULL)
818 error (_("missing argument for \"%s\""), opt.get ());
819 }
820
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)
828 {
829 error (_("Source filename requires function, label, or "
830 "line offset."));
831 }
832
833 return location;
834 }
835
836 /* See description in location.h. */
837
838 event_location_up
839 string_to_event_location_basic (const char **stringp,
840 const struct language_defn *language)
841 {
842 event_location_up location;
843 const char *cs;
844
845 /* Try the input as a probe spec. */
846 cs = *stringp;
847 if (cs != NULL && probe_linespec_to_ops (&cs) != NULL)
848 {
849 location = new_probe_location (*stringp);
850 *stringp += strlen (*stringp);
851 }
852 else
853 {
854 /* Try an address location. */
855 if (*stringp != NULL && **stringp == '*')
856 {
857 const char *arg, *orig;
858 CORE_ADDR addr;
859
860 orig = arg = *stringp;
861 addr = linespec_expression_to_pc (&arg);
862 location = new_address_location (addr, orig, arg - orig);
863 *stringp += arg - orig;
864 }
865 else
866 {
867 /* Everything else is a linespec. */
868 location = new_linespec_location (stringp);
869 }
870 }
871
872 return location;
873 }
874
875 /* See description in location.h. */
876
877 event_location_up
878 string_to_event_location (const char **stringp,
879 const struct language_defn *language)
880 {
881 const char *arg, *orig;
882
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)
887 {
888 /* It was a valid explicit location. Advance STRINGP to
889 the end of input. */
890 *stringp += arg - orig;
891 }
892 else
893 {
894 /* Everything else is a "basic" linespec, address, or probe
895 location. */
896 location = string_to_event_location_basic (stringp, language);
897 }
898
899 return location;
900 }
901
902 /* See description in location.h. */
903
904 int
905 event_location_empty_p (const struct event_location *location)
906 {
907 switch (EL_TYPE (location))
908 {
909 case LINESPEC_LOCATION:
910 /* Linespecs are never "empty." (NULL is a valid linespec) */
911 return 0;
912
913 case ADDRESS_LOCATION:
914 return 0;
915
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)));
923
924 case PROBE_LOCATION:
925 return EL_PROBE (location) == NULL;
926
927 default:
928 gdb_assert_not_reached ("unknown event location type");
929 }
930 }
931
932 /* See description in location.h. */
933
934 void
935 set_event_location_string (struct event_location *location,
936 const char *string)
937 {
938 xfree (EL_STRING (location));
939 EL_STRING (location) = string == NULL ? NULL : xstrdup (string);
940 }
This page took 0.048577 seconds and 5 git commands to generate.