Eliminate copy_location_spec
[binutils-gdb.git] / gdb / location.c
1 /* Data structures and API for location specs in GDB.
2 Copyright (C) 2013-2022 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 "gdbsupport/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 static std::string
33 explicit_to_string_internal (bool as_linespec,
34 const explicit_location_spec *explicit_loc);
35
36 /* Return a xstrdup of STR if not NULL, otherwise return NULL. */
37
38 static char *
39 maybe_xstrdup (const char *str)
40 {
41 return (str != nullptr ? xstrdup (str) : nullptr);
42 }
43
44 probe_location_spec::probe_location_spec (std::string &&probe)
45 : location_spec (PROBE_LOCATION_SPEC, std::move (probe))
46 {
47 }
48
49 location_spec_up
50 probe_location_spec::clone () const
51 {
52 return location_spec_up (new probe_location_spec (*this));
53 }
54
55 bool
56 probe_location_spec::empty_p () const
57 {
58 return false;
59 }
60
61 std::string probe_location_spec::compute_string () const
62 {
63 return std::move (as_string);
64 }
65
66 /* A "normal" linespec. */
67 linespec_location_spec::linespec_location_spec
68 (const char **linespec, symbol_name_match_type match_type_)
69 : location_spec (LINESPEC_LOCATION_SPEC),
70 match_type (match_type_)
71 {
72 if (*linespec != NULL)
73 {
74 const char *p;
75 const char *orig = *linespec;
76
77 linespec_lex_to_end (linespec);
78 p = remove_trailing_whitespace (orig, *linespec);
79
80 /* If there is no valid linespec then this will leave the
81 spec_string as nullptr. This behaviour is relied on in the
82 breakpoint setting code, where spec_string being nullptr means
83 to use the default breakpoint location. */
84 if ((p - orig) > 0)
85 spec_string = savestring (orig, p - orig);
86 }
87 }
88
89 linespec_location_spec::~linespec_location_spec ()
90 {
91 xfree (spec_string);
92 }
93
94 location_spec_up
95 linespec_location_spec::clone () const
96 {
97 return location_spec_up (new linespec_location_spec (*this));
98 }
99
100 bool
101 linespec_location_spec::empty_p () const
102 {
103 return false;
104 }
105
106 linespec_location_spec::linespec_location_spec
107 (const linespec_location_spec &other)
108 : location_spec (other),
109 match_type (other.match_type),
110 spec_string (maybe_xstrdup (other.spec_string))
111 {
112 }
113
114 std::string
115 linespec_location_spec::compute_string () const
116 {
117 if (spec_string != nullptr)
118 {
119 if (match_type == symbol_name_match_type::FULL)
120 return std::string ("-qualified ") + spec_string;
121 else
122 return spec_string;
123 }
124 return {};
125 }
126
127 address_location_spec::address_location_spec (CORE_ADDR addr,
128 const char *addr_string,
129 int addr_string_len)
130 : location_spec (ADDRESS_LOCATION_SPEC),
131 address (addr)
132 {
133 if (addr_string != nullptr)
134 as_string = std::string (addr_string, addr_string_len);
135 }
136
137 location_spec_up
138 address_location_spec::clone () const
139 {
140 return location_spec_up (new address_location_spec (*this));
141 }
142
143 bool
144 address_location_spec::empty_p () const
145 {
146 return false;
147 }
148
149 address_location_spec::address_location_spec
150 (const address_location_spec &other)
151 : location_spec (other),
152 address (other.address)
153 {
154 }
155
156 std::string
157 address_location_spec::compute_string () const
158 {
159 const char *addr_string = core_addr_to_string (address);
160 return std::string ("*") + addr_string;
161 }
162
163 explicit_location_spec::explicit_location_spec ()
164 : location_spec (EXPLICIT_LOCATION_SPEC)
165 {
166 }
167
168 explicit_location_spec::~explicit_location_spec ()
169 {
170 xfree (source_filename);
171 xfree (function_name);
172 xfree (label_name);
173 }
174
175 explicit_location_spec::explicit_location_spec
176 (const explicit_location_spec &other)
177 : location_spec (other),
178 source_filename (maybe_xstrdup (other.source_filename)),
179 function_name (maybe_xstrdup (other.function_name)),
180 func_name_match_type (other.func_name_match_type),
181 label_name (maybe_xstrdup (other.label_name)),
182 line_offset (other.line_offset)
183 {
184 }
185
186 location_spec_up
187 explicit_location_spec::clone () const
188 {
189 return location_spec_up (new explicit_location_spec (*this));
190 }
191
192 bool
193 explicit_location_spec::empty_p () const
194 {
195 return (source_filename == nullptr
196 && function_name == nullptr
197 && label_name == nullptr
198 && line_offset.sign == LINE_OFFSET_UNKNOWN);
199 }
200
201 std::string
202 explicit_location_spec::compute_string () const
203 {
204 return explicit_to_string_internal (false, this);
205 }
206
207 /* See description in location.h. */
208
209 enum location_spec_type
210 location_spec_type (const location_spec *locspec)
211 {
212 return locspec->type;
213 }
214
215 /* See description in location.h. */
216
217 location_spec_up
218 new_linespec_location_spec (const char **linespec,
219 symbol_name_match_type match_type)
220 {
221 return location_spec_up (new linespec_location_spec (linespec,
222 match_type));
223 }
224
225 /* See description in location.h. */
226
227 const linespec_location_spec *
228 as_linespec_location_spec (const location_spec *locspec)
229 {
230 gdb_assert (locspec->type == LINESPEC_LOCATION_SPEC);
231 return static_cast<const linespec_location_spec *> (locspec);
232 }
233
234 /* See description in location.h. */
235
236 location_spec_up
237 new_address_location_spec (CORE_ADDR addr, const char *addr_string,
238 int addr_string_len)
239 {
240 return location_spec_up (new address_location_spec (addr, addr_string,
241 addr_string_len));
242 }
243
244 /* See description in location.h. */
245
246 const address_location_spec *
247 as_address_location_spec (const location_spec *locspec)
248 {
249 gdb_assert (locspec->type == ADDRESS_LOCATION_SPEC);
250 return static_cast<const address_location_spec *> (locspec);
251 }
252
253 /* See description in location.h. */
254
255 location_spec_up
256 new_probe_location_spec (std::string &&probe)
257 {
258 return location_spec_up (new probe_location_spec (std::move (probe)));
259 }
260
261 /* See description in location.h. */
262
263 const probe_location_spec *
264 as_probe_location_spec (const location_spec *locspec)
265 {
266 gdb_assert (locspec->type == PROBE_LOCATION_SPEC);
267 return static_cast<const probe_location_spec *> (locspec);
268 }
269
270 /* See description in location.h. */
271
272 const explicit_location_spec *
273 as_explicit_location_spec (const location_spec *locspec)
274 {
275 gdb_assert (locspec->type == EXPLICIT_LOCATION_SPEC);
276 return static_cast<const explicit_location_spec *> (locspec);
277 }
278
279 /* See description in location.h. */
280
281 explicit_location_spec *
282 as_explicit_location_spec (location_spec *locspec)
283 {
284 gdb_assert (locspec->type == EXPLICIT_LOCATION_SPEC);
285 return static_cast<explicit_location_spec *> (locspec);
286 }
287
288 /* Return a string representation of the explicit location spec in
289 EXPLICIT_LOCSPEC.
290
291 AS_LINESPEC is true if this string should be a linespec. Otherwise
292 it will be output in explicit form. */
293
294 static std::string
295 explicit_to_string_internal (bool as_linespec,
296 const explicit_location_spec *explicit_loc)
297 {
298 bool need_space = false;
299 char space = as_linespec ? ':' : ' ';
300 string_file buf;
301
302 if (explicit_loc->source_filename != NULL)
303 {
304 if (!as_linespec)
305 buf.puts ("-source ");
306 buf.puts (explicit_loc->source_filename);
307 need_space = true;
308 }
309
310 if (explicit_loc->function_name != NULL)
311 {
312 if (need_space)
313 buf.putc (space);
314 if (explicit_loc->func_name_match_type == symbol_name_match_type::FULL)
315 buf.puts ("-qualified ");
316 if (!as_linespec)
317 buf.puts ("-function ");
318 buf.puts (explicit_loc->function_name);
319 need_space = true;
320 }
321
322 if (explicit_loc->label_name != NULL)
323 {
324 if (need_space)
325 buf.putc (space);
326 if (!as_linespec)
327 buf.puts ("-label ");
328 buf.puts (explicit_loc->label_name);
329 need_space = true;
330 }
331
332 if (explicit_loc->line_offset.sign != LINE_OFFSET_UNKNOWN)
333 {
334 if (need_space)
335 buf.putc (space);
336 if (!as_linespec)
337 buf.puts ("-line ");
338 buf.printf ("%s%d",
339 (explicit_loc->line_offset.sign == LINE_OFFSET_NONE ? ""
340 : (explicit_loc->line_offset.sign
341 == LINE_OFFSET_PLUS ? "+" : "-")),
342 explicit_loc->line_offset.offset);
343 }
344
345 return buf.release ();
346 }
347
348 /* See description in location.h. */
349
350 std::string
351 explicit_location_spec::to_linespec () const
352 {
353 return explicit_to_string_internal (true, this);
354 }
355
356 /* See description in location.h. */
357
358 const char *
359 location_spec_to_string (struct location_spec *locspec)
360 {
361 return locspec->to_string ();
362 }
363
364 /* Find an instance of the quote character C in the string S that is
365 outside of all single- and double-quoted strings (i.e., any quoting
366 other than C). */
367
368 static const char *
369 find_end_quote (const char *s, char end_quote_char)
370 {
371 /* zero if we're not in quotes;
372 '"' if we're in a double-quoted string;
373 '\'' if we're in a single-quoted string. */
374 char nested_quote_char = '\0';
375
376 for (const char *scan = s; *scan != '\0'; scan++)
377 {
378 if (nested_quote_char != '\0')
379 {
380 if (*scan == nested_quote_char)
381 nested_quote_char = '\0';
382 else if (scan[0] == '\\' && *(scan + 1) != '\0')
383 scan++;
384 }
385 else if (*scan == end_quote_char && nested_quote_char == '\0')
386 return scan;
387 else if (*scan == '"' || *scan == '\'')
388 nested_quote_char = *scan;
389 }
390
391 return 0;
392 }
393
394 /* A lexer for explicit location specs. This function will advance
395 INP past any strings that it lexes. Returns a malloc'd copy of the
396 lexed string or NULL if no lexing was done. */
397
398 static gdb::unique_xmalloc_ptr<char>
399 explicit_location_spec_lex_one (const char **inp,
400 const struct language_defn *language,
401 explicit_completion_info *completion_info)
402 {
403 const char *start = *inp;
404
405 if (*start == '\0')
406 return NULL;
407
408 /* If quoted, skip to the ending quote. */
409 if (strchr (get_gdb_linespec_parser_quote_characters (), *start))
410 {
411 if (completion_info != NULL)
412 completion_info->quoted_arg_start = start;
413
414 const char *end = find_end_quote (start + 1, *start);
415
416 if (end == NULL)
417 {
418 if (completion_info == NULL)
419 error (_("Unmatched quote, %s."), start);
420
421 end = start + strlen (start);
422 *inp = end;
423 return gdb::unique_xmalloc_ptr<char> (savestring (start + 1,
424 *inp - start - 1));
425 }
426
427 if (completion_info != NULL)
428 completion_info->quoted_arg_end = end;
429 *inp = end + 1;
430 return gdb::unique_xmalloc_ptr<char> (savestring (start + 1,
431 *inp - start - 2));
432 }
433
434 /* If the input starts with '-' or '+', the string ends with the next
435 whitespace or comma. */
436 if (*start == '-' || *start == '+')
437 {
438 while (*inp[0] != '\0' && *inp[0] != ',' && !isspace (*inp[0]))
439 ++(*inp);
440 }
441 else
442 {
443 /* Handle numbers first, stopping at the next whitespace or ','. */
444 while (isdigit (*inp[0]))
445 ++(*inp);
446 if (*inp[0] == '\0' || isspace (*inp[0]) || *inp[0] == ',')
447 return gdb::unique_xmalloc_ptr<char> (savestring (start,
448 *inp - start));
449
450 /* Otherwise stop at the next occurrence of whitespace, '\0',
451 keyword, or ','. */
452 *inp = start;
453 while ((*inp)[0]
454 && (*inp)[0] != ','
455 && !(isspace ((*inp)[0])
456 || linespec_lexer_lex_keyword (&(*inp)[1])))
457 {
458 /* Special case: C++ operator,. */
459 if (language->la_language == language_cplus
460 && startswith (*inp, CP_OPERATOR_STR))
461 (*inp) += CP_OPERATOR_LEN;
462 ++(*inp);
463 }
464 }
465
466 if (*inp - start > 0)
467 return gdb::unique_xmalloc_ptr<char> (savestring (start, *inp - start));
468
469 return NULL;
470 }
471
472 /* Return true if COMMA points past "operator". START is the start of
473 the line that COMMAND points to, hence when reading backwards, we
474 must not read any character before START. */
475
476 static bool
477 is_cp_operator (const char *start, const char *comma)
478 {
479 if (comma != NULL
480 && (comma - start) >= CP_OPERATOR_LEN)
481 {
482 const char *p = comma;
483
484 while (p > start && isspace (p[-1]))
485 p--;
486 if (p - start >= CP_OPERATOR_LEN)
487 {
488 p -= CP_OPERATOR_LEN;
489 if (strncmp (p, CP_OPERATOR_STR, CP_OPERATOR_LEN) == 0
490 && (p == start
491 || !(isalnum (p[-1]) || p[-1] == '_')))
492 {
493 return true;
494 }
495 }
496 }
497 return false;
498 }
499
500 /* When scanning the input string looking for the next explicit
501 location spec option/delimiter, we jump to the next option by looking
502 for ",", and "-". Such a character can also appear in C++ symbols
503 like "operator," and "operator-". So when we find such a
504 character, we call this function to check if we found such a
505 symbol, meaning we had a false positive for an option string. In
506 that case, we keep looking for the next delimiter, until we find
507 one that is not a false positive, or we reach end of string. FOUND
508 is the character that scanning found (either '-' or ','), and START
509 is the start of the line that FOUND points to, hence when reading
510 backwards, we must not read any character before START. Returns a
511 pointer to the next non-false-positive delimiter character, or NULL
512 if none was found. */
513
514 static const char *
515 skip_op_false_positives (const char *start, const char *found)
516 {
517 while (found != NULL && is_cp_operator (start, found))
518 {
519 if (found[0] == '-' && found[1] == '-')
520 start = found + 2;
521 else
522 start = found + 1;
523 found = find_toplevel_char (start, *found);
524 }
525
526 return found;
527 }
528
529 /* Assuming both FIRST and NEW_TOK point into the same string, return
530 the pointer that is closer to the start of the string. If FIRST is
531 NULL, returns NEW_TOK. If NEW_TOK is NULL, returns FIRST. */
532
533 static const char *
534 first_of (const char *first, const char *new_tok)
535 {
536 if (first == NULL)
537 return new_tok;
538 else if (new_tok != NULL && new_tok < first)
539 return new_tok;
540 else
541 return first;
542 }
543
544 /* A lexer for functions in explicit location specs. This function will
545 advance INP past a function until the next option, or until end of
546 string. Returns a malloc'd copy of the lexed string or NULL if no
547 lexing was done. */
548
549 static gdb::unique_xmalloc_ptr<char>
550 explicit_location_spec_lex_one_function
551 (const char **inp,
552 const struct language_defn *language,
553 explicit_completion_info *completion_info)
554 {
555 const char *start = *inp;
556
557 if (*start == '\0')
558 return NULL;
559
560 /* If quoted, skip to the ending quote. */
561 if (strchr (get_gdb_linespec_parser_quote_characters (), *start))
562 {
563 char quote_char = *start;
564
565 /* If the input is not an Ada operator, skip to the matching
566 closing quote and return the string. */
567 if (!(language->la_language == language_ada
568 && quote_char == '\"' && is_ada_operator (start)))
569 {
570 if (completion_info != NULL)
571 completion_info->quoted_arg_start = start;
572
573 const char *end = find_toplevel_char (start + 1, quote_char);
574
575 if (end == NULL)
576 {
577 if (completion_info == NULL)
578 error (_("Unmatched quote, %s."), start);
579
580 end = start + strlen (start);
581 *inp = end;
582 char *saved = savestring (start + 1, *inp - start - 1);
583 return gdb::unique_xmalloc_ptr<char> (saved);
584 }
585
586 if (completion_info != NULL)
587 completion_info->quoted_arg_end = end;
588 *inp = end + 1;
589 char *saved = savestring (start + 1, *inp - start - 2);
590 return gdb::unique_xmalloc_ptr<char> (saved);
591 }
592 }
593
594 const char *comma = find_toplevel_char (start, ',');
595
596 /* If we have "-function -myfunction", or perhaps better example,
597 "-function -[BasicClass doIt]" (objc selector), treat
598 "-myfunction" as the function name. I.e., skip the first char if
599 it is an hyphen. Don't skip the first char always, because we
600 may have C++ "operator<", and find_toplevel_char needs to see the
601 'o' in that case. */
602 const char *hyphen
603 = (*start == '-'
604 ? find_toplevel_char (start + 1, '-')
605 : find_toplevel_char (start, '-'));
606
607 /* Check for C++ "operator," and "operator-". */
608 comma = skip_op_false_positives (start, comma);
609 hyphen = skip_op_false_positives (start, hyphen);
610
611 /* Pick the one that appears first. */
612 const char *end = first_of (hyphen, comma);
613
614 /* See if a linespec keyword appears first. */
615 const char *s = start;
616 const char *ws = find_toplevel_char (start, ' ');
617 while (ws != NULL && linespec_lexer_lex_keyword (ws + 1) == NULL)
618 {
619 s = ws + 1;
620 ws = find_toplevel_char (s, ' ');
621 }
622 if (ws != NULL)
623 end = first_of (end, ws + 1);
624
625 /* If we don't have any terminator, then take the whole string. */
626 if (end == NULL)
627 end = start + strlen (start);
628
629 /* Trim whitespace at the end. */
630 while (end > start && end[-1] == ' ')
631 end--;
632
633 *inp = end;
634
635 if (*inp - start > 0)
636 return gdb::unique_xmalloc_ptr<char> (savestring (start, *inp - start));
637
638 return NULL;
639 }
640
641 /* See description in location.h. */
642
643 location_spec_up
644 string_to_explicit_location_spec (const char **argp,
645 const struct language_defn *language,
646 explicit_completion_info *completion_info)
647 {
648 /* It is assumed that input beginning with '-' and a non-digit
649 character is an explicit location. "-p" is reserved, though,
650 for probe locations. */
651 if (argp == NULL
652 || *argp == NULL
653 || *argp[0] != '-'
654 || !isalpha ((*argp)[1])
655 || ((*argp)[0] == '-' && (*argp)[1] == 'p'))
656 return NULL;
657
658 std::unique_ptr<explicit_location_spec> locspec
659 (new explicit_location_spec ());
660
661 /* Process option/argument pairs. dprintf_command
662 requires that processing stop on ','. */
663 while ((*argp)[0] != '\0' && (*argp)[0] != ',')
664 {
665 int len;
666 const char *start;
667
668 /* Clear these on each iteration, since they should be filled
669 with info about the last option. */
670 if (completion_info != NULL)
671 {
672 completion_info->quoted_arg_start = NULL;
673 completion_info->quoted_arg_end = NULL;
674 }
675
676 /* If *ARGP starts with a keyword, stop processing
677 options. */
678 if (linespec_lexer_lex_keyword (*argp) != NULL)
679 break;
680
681 /* Mark the start of the string in case we need to rewind. */
682 start = *argp;
683
684 if (completion_info != NULL)
685 completion_info->last_option = start;
686
687 /* Get the option string. */
688 gdb::unique_xmalloc_ptr<char> opt
689 = explicit_location_spec_lex_one (argp, language, NULL);
690
691 /* Use the length of the option to allow abbreviations. */
692 len = strlen (opt.get ());
693
694 /* Get the argument string. */
695 *argp = skip_spaces (*argp);
696
697 /* All options have a required argument. Checking for this
698 required argument is deferred until later. */
699 gdb::unique_xmalloc_ptr<char> oarg;
700 /* True if we have an argument. This is required because we'll
701 move from OARG before checking whether we have an
702 argument. */
703 bool have_oarg = false;
704
705 /* True if the option needs an argument. */
706 bool need_oarg = false;
707
708 /* Convenience to consistently set both OARG/HAVE_OARG from
709 ARG. */
710 auto set_oarg = [&] (gdb::unique_xmalloc_ptr<char> arg)
711 {
712 if (completion_info != NULL)
713 {
714 /* We do this here because the set of options that take
715 arguments matches the set of explicit location
716 options. */
717 completion_info->saw_explicit_location_spec_option = true;
718 }
719 oarg = std::move (arg);
720 have_oarg = oarg != NULL;
721 need_oarg = true;
722 };
723
724 if (strncmp (opt.get (), "-source", len) == 0)
725 {
726 set_oarg (explicit_location_spec_lex_one (argp, language,
727 completion_info));
728 locspec->source_filename = oarg.release ();
729 }
730 else if (strncmp (opt.get (), "-function", len) == 0)
731 {
732 set_oarg (explicit_location_spec_lex_one_function (argp, language,
733 completion_info));
734 locspec->function_name = oarg.release ();
735 }
736 else if (strncmp (opt.get (), "-qualified", len) == 0)
737 {
738 locspec->func_name_match_type = symbol_name_match_type::FULL;
739 }
740 else if (strncmp (opt.get (), "-line", len) == 0)
741 {
742 set_oarg (explicit_location_spec_lex_one (argp, language, NULL));
743 *argp = skip_spaces (*argp);
744 if (have_oarg)
745 {
746 locspec->line_offset = linespec_parse_line_offset (oarg.get ());
747 continue;
748 }
749 }
750 else if (strncmp (opt.get (), "-label", len) == 0)
751 {
752 set_oarg (explicit_location_spec_lex_one (argp, language,
753 completion_info));
754 locspec->label_name = oarg.release ();
755 }
756 /* Only emit an "invalid argument" error for options
757 that look like option strings. */
758 else if (opt.get ()[0] == '-' && !isdigit (opt.get ()[1]))
759 {
760 if (completion_info == NULL)
761 error (_("invalid explicit location argument, \"%s\""), opt.get ());
762 }
763 else
764 {
765 /* End of the explicit location specification.
766 Stop parsing and return whatever explicit location was
767 parsed. */
768 *argp = start;
769 break;
770 }
771
772 *argp = skip_spaces (*argp);
773
774 /* It's a little lame to error after the fact, but in this
775 case, it provides a much better user experience to issue
776 the "invalid argument" error before any missing
777 argument error. */
778 if (need_oarg && !have_oarg && completion_info == NULL)
779 error (_("missing argument for \"%s\""), opt.get ());
780 }
781
782 /* One special error check: If a source filename was given
783 without offset, function, or label, issue an error. */
784 if (locspec->source_filename != NULL
785 && locspec->function_name == NULL
786 && locspec->label_name == NULL
787 && (locspec->line_offset.sign == LINE_OFFSET_UNKNOWN)
788 && completion_info == NULL)
789 {
790 error (_("Source filename requires function, label, or "
791 "line offset."));
792 }
793
794 return location_spec_up (locspec.release ());
795 }
796
797 /* See description in location.h. */
798
799 location_spec_up
800 string_to_location_spec_basic (const char **stringp,
801 const struct language_defn *language,
802 symbol_name_match_type match_type)
803 {
804 location_spec_up locspec;
805 const char *cs;
806
807 /* Try the input as a probe spec. */
808 cs = *stringp;
809 if (cs != NULL && probe_linespec_to_static_ops (&cs) != NULL)
810 {
811 locspec = new_probe_location_spec (*stringp);
812 *stringp += strlen (*stringp);
813 }
814 else
815 {
816 /* Try an address location spec. */
817 if (*stringp != NULL && **stringp == '*')
818 {
819 const char *arg, *orig;
820 CORE_ADDR addr;
821
822 orig = arg = *stringp;
823 addr = linespec_expression_to_pc (&arg);
824 locspec = new_address_location_spec (addr, orig, arg - orig);
825 *stringp += arg - orig;
826 }
827 else
828 {
829 /* Everything else is a linespec. */
830 locspec = new_linespec_location_spec (stringp, match_type);
831 }
832 }
833
834 return locspec;
835 }
836
837 /* See description in location.h. */
838
839 location_spec_up
840 string_to_location_spec (const char **stringp,
841 const struct language_defn *language,
842 symbol_name_match_type match_type)
843 {
844 const char *arg, *orig;
845
846 /* Try an explicit location spec. */
847 orig = arg = *stringp;
848 location_spec_up locspec
849 = string_to_explicit_location_spec (&arg, language, NULL);
850 if (locspec != nullptr)
851 {
852 /* It was a valid explicit location. Advance STRINGP to
853 the end of input. */
854 *stringp += arg - orig;
855
856 /* If the user really specified a location spec, then we're
857 done. */
858 if (!location_spec_empty_p (locspec.get ()))
859 return locspec;
860
861 /* Otherwise, the user _only_ specified optional flags like
862 "-qualified", otherwise string_to_explicit_location_spec
863 would have thrown an error. Save the flags for "basic"
864 linespec parsing below and discard the explicit location
865 spec. */
866 explicit_location_spec *xloc
867 = dynamic_cast<explicit_location_spec *> (locspec.get ());
868 gdb_assert (xloc != nullptr);
869 match_type = xloc->func_name_match_type;
870 }
871
872 /* Everything else is a "basic" linespec, address, or probe location
873 spec. */
874 return string_to_location_spec_basic (stringp, language, match_type);
875 }
876
877 /* See description in location.h. */
878
879 int
880 location_spec_empty_p (const location_spec *locspec)
881 {
882 return locspec->empty_p ();
883 }
884
885 /* See description in location.h. */
886
887 void
888 set_location_spec_string (struct location_spec *locspec,
889 std::string &&string)
890 {
891 locspec->as_string = std::move (string);
892 }