diff options
Diffstat (limited to 'gdb/linespec.c')
-rw-r--r-- | gdb/linespec.c | 225 |
1 files changed, 115 insertions, 110 deletions
diff --git a/gdb/linespec.c b/gdb/linespec.c index 942a5ac0bb7..37633ccf5ec 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -1,6 +1,6 @@ /* Parser for linespec for the GNU debugger, GDB. Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, - 1996, 1997, 1998, 1999, 2000, 2001 + 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. This file is part of GDB. @@ -78,26 +78,26 @@ symtabs_and_lines decode_all_digits (char **argptr, struct symtab *default_symtab, int default_line, char ***canonical, - struct symtab *s, + struct symtab *file_symtab, char *q); static struct symtabs_and_lines decode_dollar (char *copy, int funfirstline, struct symtab *default_symtab, char ***canonical, - struct symtab *s); + struct symtab *file_symtab); static struct symtabs_and_lines decode_variable (char *copy, int funfirstline, char ***canonical, - struct symtab *s); + struct symtab *file_symtab); static struct symtabs_and_lines symbol_found (int funfirstline, char ***canonical, char *copy, struct symbol *sym, - struct symtab *s, + struct symtab *file_symtab, struct symtab *sym_symtab); static struct @@ -229,7 +229,8 @@ find_methods (struct type *t, char *name, struct symbol **sym_arr) else phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter); - /* Destructor is handled by caller, dont add it to the list */ + /* Destructor is handled by caller, don't add it to + the list. */ if (is_destructor_name (phys_name) != 0) continue; @@ -255,9 +256,10 @@ find_methods (struct type *t, char *name, struct symbol **sym_arr) && (class_name[name_len] == '\0' || class_name[name_len] == '<')) { - /* For GCC 3.x and stabs, constructors and destructors have names - like __base_ctor and __complete_dtor. Check the physname for now - if we're looking for a constructor. */ + /* For GCC 3.x and stabs, constructors and destructors + have names like __base_ctor and __complete_dtor. + Check the physname for now if we're looking for a + constructor. */ for (field_counter = TYPE_FN_FIELDLIST_LENGTH (t, method_counter) - 1; field_counter >= 0; @@ -268,8 +270,8 @@ find_methods (struct type *t, char *name, struct symbol **sym_arr) f = TYPE_FN_FIELDLIST1 (t, method_counter); - /* GCC 3.x will never produce stabs stub methods, so we don't need - to handle this case. */ + /* GCC 3.x will never produce stabs stub methods, so + we don't need to handle this case. */ if (TYPE_FN_FIELD_STUB (f, field_counter)) continue; phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter); @@ -358,7 +360,7 @@ find_toplevel_char (char *s, char c) int quoted = 0; /* zero if we're not in quotes; '"' if we're in a double-quoted string; '\'' if we're in a single-quoted string. */ - int depth = 0; /* number of unclosed parens we've seen */ + int depth = 0; /* Number of unclosed parens we've seen. */ char *scan; for (scan = s; *scan; scan++) @@ -418,7 +420,7 @@ decode_line_2 (struct symbol *sym_arr[], int nelts, int funfirstline, printf_unfiltered ("[0] cancel\n[1] all\n"); while (i < nelts) { - init_sal (&return_values.sals[i]); /* initialize to zeroes */ + init_sal (&return_values.sals[i]); /* Initialize to zeroes. */ init_sal (&values.sals[i]); if (sym_arr[i] && SYMBOL_CLASS (sym_arr[i]) == LOC_BLOCK) { @@ -561,7 +563,8 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab, { char *p; char *q; - struct symtab *s = NULL; + /* If a file name is specified, this is its symtab. */ + struct symtab *file_symtab = NULL; char *copy; /* This is NULL if there are no parens in *ARGPTR, or a pointer to @@ -578,16 +581,15 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab, initialize_defaults (&default_symtab, &default_line); - /* See if arg is *PC */ + /* See if arg is *PC. */ if (**argptr == '*') return decode_indirect (argptr); - /* Set various flags. - * 'paren_pointer' is important for overload checking, where - * we allow things like: - * (gdb) break c::f(int) - */ + /* Set various flags. 'paren_pointer' is important for overload + checking, where we allow things like: + (gdb) break c::f(int) + */ set_flags (*argptr, &is_quoted, &paren_pointer); @@ -614,7 +616,7 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab, /* No, the first part is a filename; set s to be that file's symtab. Also, move argptr past the filename. */ - s = symtab_from_filename (argptr, p, is_quote_enclosed); + file_symtab = symtab_from_filename (argptr, p, is_quote_enclosed); } #if 0 /* No one really seems to know why this was added. It certainly @@ -654,7 +656,7 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab, /* S is specified file's symtab, or 0 if no file specified. arg no longer contains the file name. */ - /* Check whether arg is all digits (and sign) */ + /* Check whether arg is all digits (and sign). */ q = *argptr; if (*q == '-' || *q == '+') @@ -665,13 +667,14 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab, if (q != *argptr && (*q == 0 || *q == ' ' || *q == '\t' || *q == ',')) /* We found a token consisting of all digits -- at least one digit. */ return decode_all_digits (argptr, default_symtab, default_line, - canonical, s, q); + canonical, file_symtab, q); /* Arg token is not digits => try it as a variable name Find the next token (everything up to end or next whitespace). */ - if (**argptr == '$') /* May be a convenience variable */ - p = skip_quoted (*argptr + (((*argptr)[1] == '$') ? 2 : 1)); /* One or two $ chars possible */ + if (**argptr == '$') /* May be a convenience variable. */ + /* One or two $ chars possible. */ + p = skip_quoted (*argptr + (((*argptr)[1] == '$') ? 2 : 1)); else if (is_quoted) { p = skip_quoted (*argptr); @@ -704,16 +707,16 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab, /* If it starts with $: may be a legitimate variable or routine name (e.g. HP-UX millicode routines such as $$dyncall), or it may - be history value, or it may be a convenience variable */ + be history value, or it may be a convenience variable. */ if (*copy == '$') return decode_dollar (copy, funfirstline, default_symtab, - canonical, s); + canonical, file_symtab); /* Look up that token as a variable. If file specified, use that file's per-file block to start with. */ - return decode_variable (copy, funfirstline, canonical, s); + return decode_variable (copy, funfirstline, canonical, file_symtab); } @@ -768,8 +771,8 @@ set_flags (char *arg, int *is_quoted, char **paren_pointer) int has_if = 0; /* 'has_if' is for the syntax: - * (gdb) break foo if (a==b) - */ + (gdb) break foo if (a==b) + */ if ((ii = strstr (arg, " if ")) != NULL || (ii = strstr (arg, "\tif ")) != NULL || (ii = strstr (arg, " if\t")) != NULL || @@ -777,10 +780,9 @@ set_flags (char *arg, int *is_quoted, char **paren_pointer) (ii = strstr (arg, " if(")) != NULL || (ii = strstr (arg, "\tif( ")) != NULL) has_if = 1; - /* Temporarily zap out "if (condition)" to not - * confuse the parenthesis-checking code below. - * This is undone below. Do not change ii!! - */ + /* Temporarily zap out "if (condition)" to not confuse the + parenthesis-checking code below. This is undone below. Do not + change ii!! */ if (has_if) { *ii = '\0'; @@ -794,9 +796,8 @@ set_flags (char *arg, int *is_quoted, char **paren_pointer) if (*paren_pointer != NULL) *paren_pointer = strrchr (*paren_pointer, ')'); - /* Now that we're safely past the paren_pointer check, - * put back " if (condition)" so outer layers can see it - */ + /* Now that we're safely past the paren_pointer check, put back " if + (condition)" so outer layers can see it. */ if (has_if) *ii = ' '; } @@ -849,18 +850,16 @@ locate_first_half (char **argptr, int *is_quote_enclosed) ii = find_toplevel_char (*argptr, ','); has_comma = (ii != 0); - /* Temporarily zap out second half to not - * confuse the code below. - * This is undone below. Do not change ii!! - */ + /* Temporarily zap out second half to not confuse the code below. + This is undone below. Do not change ii!! */ if (has_comma) { *ii = '\0'; } - /* Maybe arg is FILE : LINENUM or FILE : FUNCTION */ - /* May also be CLASS::MEMBER, or NAMESPACE::NAME */ - /* Look for ':', but ignore inside of <> */ + /* Maybe arg is FILE : LINENUM or FILE : FUNCTION. May also be + CLASS::MEMBER, or NAMESPACE::NAME. Look for ':', but ignore + inside of <>. */ p = *argptr; if (p[0] == '"') @@ -880,18 +879,20 @@ locate_first_half (char **argptr, int *is_quote_enclosed) error ("malformed template specification in command"); p = temp_end; } - /* Check for the end of the first half of the linespec. End of line, - a tab, a double colon or the last single colon, or a space. But - if enclosed in double quotes we do not break on enclosed spaces */ + /* Check for the end of the first half of the linespec. End of + line, a tab, a double colon or the last single colon, or a + space. But if enclosed in double quotes we do not break on + enclosed spaces. */ if (!*p || p[0] == '\t' || ((p[0] == ':') && ((p[1] == ':') || (strchr (p + 1, ':') == NULL))) || ((p[0] == ' ') && !*is_quote_enclosed)) break; - if (p[0] == '.' && strchr (p, ':') == NULL) /* Java qualified method. */ + if (p[0] == '.' && strchr (p, ':') == NULL) { - /* Find the *last* '.', since the others are package qualifiers. */ + /* Java qualified method. Find the *last* '.', since the + others are package qualifiers. */ for (p1 = p; *p1; p1++) { if (*p1 == '.') @@ -903,7 +904,7 @@ locate_first_half (char **argptr, int *is_quote_enclosed) while (p[0] == ' ' || p[0] == '\t') p++; - /* if the closing double quote was left at the end, remove it */ + /* If the closing double quote was left at the end, remove it. */ if (*is_quote_enclosed) { char *closing_quote = strchr (p - 1, '"'); @@ -911,9 +912,8 @@ locate_first_half (char **argptr, int *is_quote_enclosed) *closing_quote = '\0'; } - /* Now that we've safely parsed the first half, - * put back ',' so outer layers can see it - */ + /* Now that we've safely parsed the first half, put back ',' so + outer layers can see it. */ if (has_comma) *ii = ','; @@ -946,8 +946,8 @@ decode_compound (char **argptr, int funfirstline, char ***canonical, struct type *t; /* First check for "global" namespace specification, - of the form "::foo". If found, skip over the colons - and jump to normal symbol processing */ + of the form "::foo". If found, skip over the colons + and jump to normal symbol processing. */ if (p[0] == ':' && ((*argptr == p) || (p[-1] == ' ') || (p[-1] == '\t'))) saved_arg2 += 2; @@ -970,9 +970,9 @@ decode_compound (char **argptr, int funfirstline, char ***canonical, Note that namespaces can nest only inside other namespaces, and not inside classes. So we need only consider *prefixes* of the string; there is no need to look up - "B::C" separately as a symbol in the previous example. */ + "B::C" separately as a symbol in the previous example. */ - p2 = p; /* save for restart */ + p2 = p; /* Save for restart. */ while (1) { /* Extract the class name. */ @@ -997,8 +997,9 @@ decode_compound (char **argptr, int funfirstline, char ***canonical, (TYPE_CODE (t) == TYPE_CODE_STRUCT || TYPE_CODE (t) == TYPE_CODE_UNION))) { - /* Arg token is not digits => try it as a function name - Find the next token(everything up to end or next blank). */ + /* Arg token is not digits => try it as a function name. + Find the next token (everything up to end or next + blank). */ if (**argptr && strchr (get_gdb_completer_quote_characters (), **argptr) != NULL) @@ -1042,13 +1043,13 @@ decode_compound (char **argptr, int funfirstline, char ***canonical, copy[p - *argptr - 1] = '\0'; } - /* no line number may be specified */ + /* No line number may be specified. */ while (*p == ' ' || *p == '\t') p++; *argptr = p; sym = 0; - i1 = 0; /* counter for the symbol array */ + i1 = 0; /* Counter for the symbol array. */ sym_arr = (struct symbol **) alloca (total_number_of_methods (t) * sizeof (struct symbol *)); @@ -1119,9 +1120,9 @@ decode_compound (char **argptr, int funfirstline, char ***canonical, } } - /* Move pointer up to next possible class/namespace token */ - p = p2 + 1; /* restart with old value +1 */ - /* Move pointer ahead to next double-colon */ + /* Move pointer up to next possible class/namespace token. */ + p = p2 + 1; /* Restart with old value +1. */ + /* Move pointer ahead to next double-colon. */ while (*p && (p[0] != ' ') && (p[0] != '\t') && (p[0] != '\'')) { if (p[0] == '<') @@ -1132,26 +1133,27 @@ decode_compound (char **argptr, int funfirstline, char ***canonical, p = temp_end; } else if ((p[0] == ':') && (p[1] == ':')) - break; /* found double-colon */ + break; /* Found double-colon. */ else p++; } if (*p != ':') - break; /* out of the while (1) */ + break; /* Out of the while (1). */ - p2 = p; /* save restart for next time around */ - *argptr = saved_arg2; /* restore argptr */ + p2 = p; /* Save restart for next time around. */ + *argptr = saved_arg2; /* Restore argptr. */ } /* while (1) */ - /* Last chance attempt -- check entire name as a symbol */ - /* Use "copy" in preparation for jumping out of this block, - to be consistent with usage following the jump target */ + /* Last chance attempt -- check entire name as a symbol. Use "copy" + in preparation for jumping out of this block, to be consistent + with usage following the jump target. */ copy = (char *) alloca (p - saved_arg2 + 1); memcpy (copy, saved_arg2, p - saved_arg2); - /* Note: if is_quoted should be true, we snuff out quote here anyway */ + /* Note: if is_quoted should be true, we snuff out quote here + anyway. */ copy[p - saved_arg2] = '\000'; - /* Set argptr to skip over the name */ + /* Set argptr to skip over the name. */ *argptr = (*p == '\'') ? p + 1 : p; /* Look up entire name */ sym = lookup_symbol (copy, 0, VAR_NAMESPACE, 0, &sym_symtab); @@ -1159,8 +1161,8 @@ decode_compound (char **argptr, int funfirstline, char ***canonical, return symbol_found (funfirstline, canonical, copy, sym, NULL, sym_symtab); - /* Couldn't find any interpretation as classes/namespaces, so give up */ - /* The quotes are important if copy is empty. */ + /* Couldn't find any interpretation as classes/namespaces, so give + up. The quotes are important if copy is empty. */ cplusplus_error (saved_arg, "Can't find member of namespace, class, struct, or union named \"%s\"\n", copy); @@ -1176,7 +1178,7 @@ symtab_from_filename (char **argptr, char *p, int is_quote_enclosed) { char *p1; char *copy; - struct symtab *s; + struct symtab *file_symtab; p1 = p; while (p != *argptr && p[-1] == ' ') @@ -1185,15 +1187,15 @@ symtab_from_filename (char **argptr, char *p, int is_quote_enclosed) --p; copy = (char *) alloca (p - *argptr + 1); memcpy (copy, *argptr, p - *argptr); - /* It may have the ending quote right after the file name */ + /* It may have the ending quote right after the file name. */ if (is_quote_enclosed && copy[p - *argptr - 1] == '"') copy[p - *argptr - 1] = 0; else copy[p - *argptr] = 0; /* Find that file's data. */ - s = lookup_symtab (copy); - if (s == 0) + file_symtab = lookup_symtab (copy); + if (file_symtab == 0) { if (!have_full_symbols () && !have_partial_symbols ()) error ("No symbol table is loaded. Use the \"file\" command."); @@ -1206,7 +1208,7 @@ symtab_from_filename (char **argptr, char *p, int is_quote_enclosed) p++; *argptr = p; - return s; + return file_symtab; } @@ -1218,7 +1220,7 @@ symtab_from_filename (char **argptr, char *p, int is_quote_enclosed) static struct symtabs_and_lines decode_all_digits (char **argptr, struct symtab *default_symtab, int default_line, char ***canonical, - struct symtab *s, char *q) + struct symtab *file_symtab, char *q) { struct symtabs_and_lines values; @@ -1231,7 +1233,7 @@ decode_all_digits (char **argptr, struct symtab *default_symtab, sign = none; /* We might need a canonical line spec if no file was specified. */ - int need_canonical = (s == 0) ? 1 : 0; + int need_canonical = (file_symtab == 0) ? 1 : 0; init_sal (&val); @@ -1239,11 +1241,11 @@ decode_all_digits (char **argptr, struct symtab *default_symtab, We must guarantee that this section of code is never executed when we are called with just a function name, since set_default_source_symtab_and_line uses - select_source_symtab that calls us with such an argument */ + select_source_symtab that calls us with such an argument. */ - if (s == 0 && default_symtab == 0) + if (file_symtab == 0 && default_symtab == 0) { - /* Make sure we have at least a default source file. */ + /* Make sure we have at least a default source file. */ set_default_source_symtab_and_line (); initialize_defaults (&default_symtab, &default_line); } @@ -1258,13 +1260,13 @@ decode_all_digits (char **argptr, struct symtab *default_symtab, case plus: if (q == *argptr) val.line = 5; - if (s == 0) + if (file_symtab == 0) val.line = default_line + val.line; break; case minus: if (q == *argptr) val.line = 15; - if (s == 0) + if (file_symtab == 0) val.line = default_line - val.line; else val.line = 1; @@ -1276,15 +1278,15 @@ decode_all_digits (char **argptr, struct symtab *default_symtab, while (*q == ' ' || *q == '\t') q++; *argptr = q; - if (s == 0) - s = default_symtab; + if (file_symtab == 0) + file_symtab = default_symtab; /* It is possible that this source file has more than one symtab, and that the new line number specification has moved us from the - default (in s) to a new one. */ - val.symtab = find_line_symtab (s, val.line, NULL, NULL); + default (in file_symtab) to a new one. */ + val.symtab = find_line_symtab (file_symtab, val.line, NULL, NULL); if (val.symtab == 0) - val.symtab = s; + val.symtab = file_symtab; val.pc = 0; values.sals = (struct symtab_and_line *) @@ -1302,7 +1304,7 @@ decode_all_digits (char **argptr, struct symtab *default_symtab, static struct symtabs_and_lines decode_dollar (char *copy, int funfirstline, struct symtab *default_symtab, - char ***canonical, struct symtab *s) + char ***canonical, struct symtab *file_symtab) { struct value *valx; int index = 0; @@ -1318,9 +1320,9 @@ decode_dollar (char *copy, int funfirstline, struct symtab *default_symtab, p = (copy[1] == '$') ? copy + 2 : copy + 1; while (*p >= '0' && *p <= '9') p++; - if (!*p) /* reached end of token without hitting non-digit */ + if (!*p) /* Reached end of token without hitting non-digit. */ { - /* We have a value history reference */ + /* We have a value history reference. */ sscanf ((copy[1] == '$') ? copy + 2 : copy + 1, "%d", &index); valx = access_value_history ((copy[1] == '$') ? -index : index); if (TYPE_CODE (VALUE_TYPE (valx)) != TYPE_CODE_INT) @@ -1329,25 +1331,25 @@ decode_dollar (char *copy, int funfirstline, struct symtab *default_symtab, else { /* Not all digits -- may be user variable/function or a - convenience variable */ + convenience variable. */ - /* Look up entire name as a symbol first */ + /* Look up entire name as a symbol first. */ sym = lookup_symbol (copy, 0, VAR_NAMESPACE, 0, &sym_symtab); - s = (struct symtab *) 0; + file_symtab = (struct symtab *) 0; need_canonical = 1; /* Symbol was found --> jump to normal symbol processing. */ if (sym) return symbol_found (funfirstline, canonical, copy, sym, NULL, sym_symtab); - /* If symbol was not found, look in minimal symbol tables */ + /* If symbol was not found, look in minimal symbol tables. */ msymbol = lookup_minimal_symbol (copy, NULL, NULL); - /* Min symbol was found --> jump to minsym processing. */ + /* Min symbol was found --> jump to minsym processing. */ if (msymbol) return minsym_found (funfirstline, msymbol); - /* Not a user variable or function -- must be convenience variable */ - need_canonical = (s == 0) ? 1 : 0; + /* Not a user variable or function -- must be convenience variable. */ + need_canonical = (file_symtab == 0) ? 1 : 0; valx = value_of_internalvar (lookup_internalvar (copy + 1)); if (TYPE_CODE (VALUE_TYPE (valx)) != TYPE_CODE_INT) error ("Convenience variables used in line specs must have integer values."); @@ -1355,8 +1357,8 @@ decode_dollar (char *copy, int funfirstline, struct symtab *default_symtab, init_sal (&val); - /* Either history value or convenience value from above, in valx */ - val.symtab = s ? s : default_symtab; + /* Either history value or convenience value from above, in valx. */ + val.symtab = file_symtab ? file_symtab : default_symtab; val.line = value_as_long (valx); val.pc = 0; @@ -1372,12 +1374,12 @@ decode_dollar (char *copy, int funfirstline, struct symtab *default_symtab, -/* Decode a linespec that's a variable. If S is non-NULL, +/* Decode a linespec that's a variable. If FILE_SYMTAB is non-NULL, look in that symtab's static variables first. */ static struct symtabs_and_lines decode_variable (char *copy, int funfirstline, char ***canonical, - struct symtab *s) + struct symtab *file_symtab) { struct symbol *sym; /* The symtab that SYM was found in. */ @@ -1386,12 +1388,15 @@ decode_variable (char *copy, int funfirstline, char ***canonical, struct minimal_symbol *msymbol; sym = lookup_symbol (copy, - (s ? BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK) + (file_symtab + ? BLOCKVECTOR_BLOCK (BLOCKVECTOR (file_symtab), + STATIC_BLOCK) : get_selected_block (0)), VAR_NAMESPACE, 0, &sym_symtab); if (sym != NULL) - return symbol_found (funfirstline, canonical, copy, sym, s, sym_symtab); + return symbol_found (funfirstline, canonical, copy, sym, + file_symtab, sym_symtab); msymbol = lookup_minimal_symbol (copy, NULL, NULL); @@ -1416,7 +1421,7 @@ decode_variable (char *copy, int funfirstline, char ***canonical, static struct symtabs_and_lines symbol_found (int funfirstline, char ***canonical, char *copy, - struct symbol *sym, struct symtab *s, + struct symbol *sym, struct symtab *file_symtab, struct symtab *sym_symtab) { struct symtabs_and_lines values; @@ -1435,7 +1440,7 @@ symbol_found (int funfirstline, char ***canonical, char *copy, /* We might need a canonical line spec if it is a static function. */ - if (s == 0) + if (file_symtab == 0) { struct blockvector *bv = BLOCKVECTOR (sym_symtab); struct block *b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK); |