diff options
Diffstat (limited to 'gdb/cp-support.c')
-rw-r--r-- | gdb/cp-support.c | 114 |
1 files changed, 99 insertions, 15 deletions
diff --git a/gdb/cp-support.c b/gdb/cp-support.c index de83eb5d957..f52055893d2 100644 --- a/gdb/cp-support.c +++ b/gdb/cp-support.c @@ -166,7 +166,7 @@ inspect_type (struct demangle_parse_info *info, if (sym != NULL) { - struct type *otype = SYMBOL_TYPE (sym); + struct type *otype = sym->type (); if (finder != NULL) { @@ -512,7 +512,7 @@ replace_typedefs (struct demangle_parse_info *info, if (sym != NULL) { - struct type *otype = SYMBOL_TYPE (sym); + struct type *otype = sym->type (); const char *new_name = (*finder) (otype, data); if (new_name != NULL) @@ -1215,7 +1215,7 @@ overload_list_add_symbol (struct symbol *sym, { /* If there is no type information, we can't do anything, so skip. */ - if (SYMBOL_TYPE (sym) == NULL) + if (sym->type () == NULL) return; /* skip any symbols that we've already considered. */ @@ -1400,7 +1400,7 @@ add_symbol_overload_list_using (const char *func_name, for (block = get_selected_block (0); block != NULL; - block = BLOCK_SUPERBLOCK (block)) + block = block->superblock ()) for (current = block_using (block); current != NULL; current = current->next) @@ -1440,7 +1440,7 @@ static void add_symbol_overload_list_qualified (const char *func_name, std::vector<symbol *> *overload_list) { - const struct block *b, *surrounding_static_block = 0; + const struct block *surrounding_static_block = 0; /* Look through the partial symtabs for all symbols which begin by matching FUNC_NAME. Make sure we read that symbol table in. */ @@ -1451,7 +1451,9 @@ add_symbol_overload_list_qualified (const char *func_name, /* Search upwards from currently selected frame (so that we can complete on local vars. */ - for (b = get_selected_block (0); b != NULL; b = BLOCK_SUPERBLOCK (b)) + for (const block *b = get_selected_block (0); + b != nullptr; + b = b->superblock ()) add_symbol_overload_list_block (func_name, b, overload_list); surrounding_static_block = block_static_block (get_selected_block (0)); @@ -1464,7 +1466,7 @@ add_symbol_overload_list_qualified (const char *func_name, for (compunit_symtab *cust : objfile->compunits ()) { QUIT; - b = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust), GLOBAL_BLOCK); + const block *b = cust->blockvector ()->global_block (); add_symbol_overload_list_block (func_name, b, overload_list); } } @@ -1474,10 +1476,12 @@ add_symbol_overload_list_qualified (const char *func_name, for (compunit_symtab *cust : objfile->compunits ()) { QUIT; - b = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust), STATIC_BLOCK); + const block *b = cust->blockvector ()->static_block (); + /* Don't do this block twice. */ if (b == surrounding_static_block) continue; + add_symbol_overload_list_block (func_name, b, overload_list); } } @@ -1501,13 +1505,13 @@ cp_lookup_rtti_type (const char *name, const struct block *block) return NULL; } - if (SYMBOL_CLASS (rtti_sym) != LOC_TYPEDEF) + if (rtti_sym->aclass () != LOC_TYPEDEF) { warning (_("RTTI symbol for class '%s' is not a type"), name); return NULL; } - rtti_type = check_typedef (SYMBOL_TYPE (rtti_sym)); + rtti_type = check_typedef (rtti_sym->type ()); switch (rtti_type->code ()) { @@ -1583,9 +1587,9 @@ report_failed_demangle (const char *name, bool core_dump_allowed, begin_line (); if (core_dump_allowed) - fprintf_unfiltered (gdb_stderr, - _("%s\nAttempting to dump core.\n"), - long_msg.c_str ()); + gdb_printf (gdb_stderr, + _("%s\nAttempting to dump core.\n"), + long_msg.c_str ()); else warn_cant_dump_core (long_msg.c_str ()); @@ -1692,6 +1696,12 @@ cp_search_name_hash (const char *search_name) && string[5] != ':') break; + /* Ignore template parameter lists. */ + if (string[0] == '<' + && string[1] != '(' && string[1] != '<' && string[1] != '=' + && string[1] != ' ' && string[1] != '\0') + break; + hash = SYMBOL_HASH_NEXT (hash, *string); } return hash; @@ -1745,7 +1755,7 @@ cp_symbol_name_matches_1 (const char *symbol_search_name, while (true) { if (strncmp_iw_with_mode (sname, lookup_name, lookup_name_len, - mode, language_cplus, match_for_lcd) == 0) + mode, language_cplus, match_for_lcd, true) == 0) { if (comp_match_res != NULL) { @@ -2185,7 +2195,7 @@ first_component_command (const char *arg, int from_tty) memcpy (prefix, arg, len); prefix[len] = '\0'; - printf_filtered ("%s\n", prefix); + gdb_printf ("%s\n", prefix); } /* Implement "info vtbl". */ @@ -2199,6 +2209,80 @@ info_vtbl_command (const char *arg, int from_tty) cplus_print_vtable (value); } +/* See description in cp-support.h. */ + +const char * +find_toplevel_char (const 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. */ + const char *scan; + + for (scan = s; *scan; scan++) + { + if (quoted) + { + if (*scan == quoted) + quoted = 0; + else if (*scan == '\\' && *(scan + 1)) + scan++; + } + else if (*scan == c && ! quoted && depth == 0) + return scan; + else if (*scan == '"' || *scan == '\'') + quoted = *scan; + else if (*scan == '(' || *scan == '<') + depth++; + else if ((*scan == ')' || *scan == '>') && depth > 0) + depth--; + else if (*scan == 'o' && !quoted && depth == 0) + { + /* Handle C++ operator names. */ + if (strncmp (scan, CP_OPERATOR_STR, CP_OPERATOR_LEN) == 0) + { + scan += CP_OPERATOR_LEN; + if (*scan == c) + return scan; + while (ISSPACE (*scan)) + { + ++scan; + if (*scan == c) + return scan; + } + if (*scan == '\0') + break; + + switch (*scan) + { + /* Skip over one less than the appropriate number of + characters: the for loop will skip over the last + one. */ + case '<': + if (scan[1] == '<') + { + scan++; + if (*scan == c) + return scan; + } + break; + case '>': + if (scan[1] == '>') + { + scan++; + if (*scan == c) + return scan; + } + break; + } + } + } + } + + return 0; +} + void _initialize_cp_support (); void _initialize_cp_support () |