aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2011-04-27 19:55:10 +0000
committerJan Kratochvil <jan.kratochvil@redhat.com>2011-04-27 19:55:10 +0000
commit681bf369ead4c4264cc9fcc8ba603cb06e7c2994 (patch)
tree8ee2658fa9f25b9f3950e1f6f340d5c30775b406
parentb11b1f88bd8c59e136e0ec10fbf5ea7f30d0ded6 (diff)
downloadgdb-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.
-rw-r--r--gdb/ChangeLog9
-rw-r--r--gdb/symtab.c53
2 files changed, 46 insertions, 16 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 92d01ef..beed4762 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,14 @@
2011-04-27 Jan Kratochvil <jan.kratochvil@redhat.com>
+ 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.
+
+2011-04-27 Jan Kratochvil <jan.kratochvil@redhat.com>
+
Format the code for the next patch.
* dwarf2read.c (struct mapped_index): Include delimiting newlines.
* utils.c (strcmp_iw_ordered): Reformat the code for the next patch.
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