aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@adacore.com>2015-02-02 07:20:58 +0400
committerJoel Brobecker <brobecker@adacore.com>2015-02-02 07:22:40 +0400
commit66c168ae56fa2d67f821ccae774fd25c695fd9ce (patch)
treedc43c58dcab2d86c90591bf09846f4c25bb39f34 /gdb
parented2b91f0d8ecc0a6ce61abe40962e132a5f90d91 (diff)
downloadgdb-66c168ae56fa2d67f821ccae774fd25c695fd9ce.zip
gdb-66c168ae56fa2d67f821ccae774fd25c695fd9ce.tar.gz
gdb-66c168ae56fa2d67f821ccae774fd25c695fd9ce.tar.bz2
[Ada] pspace_data->sym_cache is always NULL
The Ada symbol cache has been designed to have one instance of that of that cache per program space, and for each instance to be created on-demand. ada_get_symbol_cache is the function responsible for both lookup and creation on demand. Unfortunately, ada_get_symbol_cache forgot to store the reference to newly created caches, thus causing it to: - Leak old caches; - Allocate a new cache each time the cache is being searched or a new entry is to be inserted. This patch fixes the issue by avoiding the use of the local variable, which indirectly allowed the bug to happen. We manipulate the reference in the program-space data instead. gdb/ChangeLog: PR gdb/17854: * ada-lang.c (ada_get_symbol_cache): Set pspace_data->sym_cache when allocating a new one.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/ada-lang.c9
2 files changed, 10 insertions, 5 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 6f2f475..e11ff78 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2015-02-02 Joel Brobecker <brobecker@adacore.com>
+
+ PR gdb/17854:
+ * ada-lang.c (ada_get_symbol_cache): Set pspace_data->sym_cache
+ when allocating a new one.
+
2015-02-01 Tom Tromey <tom@tromey.com>
* MAINTAINERS: Remove myself.
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index f4f5bf3..921aed5 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -4404,15 +4404,14 @@ static struct ada_symbol_cache *
ada_get_symbol_cache (struct program_space *pspace)
{
struct ada_pspace_data *pspace_data = get_ada_pspace_data (pspace);
- struct ada_symbol_cache *sym_cache = pspace_data->sym_cache;
- if (sym_cache == NULL)
+ if (pspace_data->sym_cache == NULL)
{
- sym_cache = XCNEW (struct ada_symbol_cache);
- ada_init_symbol_cache (sym_cache);
+ pspace_data->sym_cache = XCNEW (struct ada_symbol_cache);
+ ada_init_symbol_cache (pspace_data->sym_cache);
}
- return sym_cache;
+ return pspace_data->sym_cache;
}
/* Clear all entries from the symbol cache. */