diff options
author | Jan Kratochvil <jan.kratochvil@redhat.com> | 2011-04-27 19:55:10 +0000 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2011-04-27 19:55:10 +0000 |
commit | 681bf369ead4c4264cc9fcc8ba603cb06e7c2994 (patch) | |
tree | 8ee2658fa9f25b9f3950e1f6f340d5c30775b406 /gdb/symtab.c | |
parent | b11b1f88bd8c59e136e0ec10fbf5ea7f30d0ded6 (diff) | |
download | gdb-681bf369ead4c4264cc9fcc8ba603cb06e7c2994.zip gdb-681bf369ead4c4264cc9fcc8ba603cb06e7c2994.tar.gz gdb-681bf369ead4c4264cc9fcc8ba603cb06e7c2994.tar.bz2 |
gdb/
Replace re_comp/re_exec by regcomp/regexec.
* symtab.c (struct search_symbols_data): New fields preg, preg_p.
(search_symbols_name_matches): Use them, use regexec.
(search_symbols): New variable retval_chain, adjust the use of
old_chain against it. Replace re_comp by regcomp. Use the new struct
search_symbols_data fields, use regexec instead of re_exec.
Diffstat (limited to 'gdb/symtab.c')
-rw-r--r-- | gdb/symtab.c | 53 |
1 files changed, 37 insertions, 16 deletions
diff --git a/gdb/symtab.c b/gdb/symtab.c index 86ffb98..ebc8221 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -2945,7 +2945,10 @@ struct search_symbols_data { int nfiles; char **files; - char *regexp; + + /* It is true if PREG contains valid data, false otherwise. */ + unsigned preg_p : 1; + regex_t preg; }; /* A callback for expand_symtabs_matching. */ @@ -2963,7 +2966,7 @@ search_symbols_name_matches (const char *symname, void *user_data) { struct search_symbols_data *data = user_data; - return data->regexp == NULL || re_exec (symname); + return !data->preg_p || regexec (&data->preg, symname, 0, NULL, 0) == 0; } /* Search the symbol table for matches to the regular expression REGEXP, @@ -3011,9 +3014,13 @@ search_symbols (char *regexp, enum search_domain kind, struct symbol_search *sr; struct symbol_search *psr; struct symbol_search *tail; - struct cleanup *old_chain = NULL; struct search_symbols_data datum; + /* OLD_CHAIN .. RETVAL_CHAIN is always freed, RETVAL_CHAIN .. current + CLEANUP_CHAIN is freed only in the case of an error. */ + struct cleanup *old_chain = make_cleanup (null_cleanup, NULL); + struct cleanup *retval_chain; + gdb_assert (kind <= TYPES_DOMAIN); ourtype = types[kind]; @@ -3023,6 +3030,7 @@ search_symbols (char *regexp, enum search_domain kind, sr = *matches = NULL; tail = NULL; + datum.preg_p = 0; if (regexp != NULL) { @@ -3032,6 +3040,7 @@ search_symbols (char *regexp, enum search_domain kind, and <TYPENAME> or <OPERATOR>. */ char *opend; char *opname = operator_chars (regexp, &opend); + int errcode; if (*opname) { @@ -3060,8 +3069,16 @@ search_symbols (char *regexp, enum search_domain kind, } } - if (0 != (val = re_comp (regexp))) - error (_("Invalid regexp (%s): %s"), val, regexp); + errcode = regcomp (&datum.preg, regexp, REG_NOSUB); + if (errcode != 0) + { + char *err = get_regcomp_error (errcode, &datum.preg); + + make_cleanup (xfree, err); + error (_("Invalid regexp (%s): %s"), err, regexp); + } + datum.preg_p = 1; + make_regfree_cleanup (&datum.preg); } /* Search through the partial symtabs *first* for all symbols @@ -3070,7 +3087,6 @@ search_symbols (char *regexp, enum search_domain kind, datum.nfiles = nfiles; datum.files = files; - datum.regexp = regexp; ALL_OBJFILES (objfile) { if (objfile->sf) @@ -3081,6 +3097,8 @@ search_symbols (char *regexp, enum search_domain kind, &datum); } + retval_chain = old_chain; + /* Here, we search through the minimal symbol tables for functions and variables that match, and force their symbols to be read. This is in particular necessary for demangled variable names, @@ -3104,8 +3122,9 @@ search_symbols (char *regexp, enum search_domain kind, MSYMBOL_TYPE (msymbol) == ourtype3 || MSYMBOL_TYPE (msymbol) == ourtype4) { - if (regexp == NULL - || re_exec (SYMBOL_NATURAL_NAME (msymbol)) != 0) + if (!datum.preg_p + || regexec (&datum.preg, SYMBOL_NATURAL_NAME (msymbol), 0, + NULL, 0) == 0) { if (0 == find_pc_symtab (SYMBOL_VALUE_ADDRESS (msymbol))) { @@ -3143,8 +3162,9 @@ search_symbols (char *regexp, enum search_domain kind, QUIT; if (file_matches (real_symtab->filename, files, nfiles) - && ((regexp == NULL - || re_exec (SYMBOL_NATURAL_NAME (sym)) != 0) + && ((!datum.preg_p + || regexec (&datum.preg, SYMBOL_NATURAL_NAME (sym), 0, + NULL, 0) == 0) && ((kind == VARIABLES_DOMAIN && SYMBOL_CLASS (sym) != LOC_TYPEDEF && SYMBOL_CLASS (sym) != LOC_UNRESOLVED @@ -3186,7 +3206,7 @@ search_symbols (char *regexp, enum search_domain kind, tail = sort_search_symbols (&dummy, nfound); sr = dummy.next; - old_chain = make_cleanup_free_search_symbols (sr); + make_cleanup_free_search_symbols (sr); } else tail = sort_search_symbols (prevtail, nfound); @@ -3208,8 +3228,9 @@ search_symbols (char *regexp, enum search_domain kind, MSYMBOL_TYPE (msymbol) == ourtype3 || MSYMBOL_TYPE (msymbol) == ourtype4) { - if (regexp == NULL - || re_exec (SYMBOL_NATURAL_NAME (msymbol)) != 0) + if (!datum.preg_p + || regexec (&datum.preg, SYMBOL_NATURAL_NAME (msymbol), 0, + NULL, 0) == 0) { /* Functions: Look up by address. */ if (kind != FUNCTIONS_DOMAIN || @@ -3231,7 +3252,7 @@ search_symbols (char *regexp, enum search_domain kind, if (tail == NULL) { sr = psr; - old_chain = make_cleanup_free_search_symbols (sr); + make_cleanup_free_search_symbols (sr); } else tail->next = psr; @@ -3243,9 +3264,9 @@ search_symbols (char *regexp, enum search_domain kind, } } + discard_cleanups (retval_chain); + do_cleanups (old_chain); *matches = sr; - if (sr != NULL) - discard_cleanups (old_chain); } /* Helper function for symtab_symbol_info, this function uses |