aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/block.c15
-rw-r--r--gdb/block.h2
-rw-r--r--gdb/symtab.c27
4 files changed, 36 insertions, 16 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index b12cc7b..3dd4a52 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,13 @@
2003-05-19 David Carlton <carlton@bactrian.org>
+ * block.h: Declare block_static_block.
+ * block.c (block_static_block): New.
+ * symtab.c (lookup_symbol_aux): Remove 'static_block' argument to
+ lookup_symbol_aux_local, calling block_static_block instead.
+ (lookup_symbol_aux_local): Delete 'static_block' argument.
+
+2003-05-19 David Carlton <carlton@bactrian.org>
+
* symtab.c (lookup_symbol_aux): Delete #if 0 hunk.
2003-05-19 Michal Ludvig <mludvig@suse.cz>
diff --git a/gdb/block.c b/gdb/block.c
index 7bfd866..1360a15 100644
--- a/gdb/block.c
+++ b/gdb/block.c
@@ -199,3 +199,18 @@ block_initialize_namespace (struct block *block, struct obstack *obstack)
BLOCK_NAMESPACE (block)->using = NULL;
}
}
+
+/* Return the static block associated to BLOCK. Return NULL if block
+ is NULL or if block is a global block. */
+
+const struct block *
+block_static_block (const struct block *block)
+{
+ if (block == NULL || BLOCK_SUPERBLOCK (block) == NULL)
+ return NULL;
+
+ while (BLOCK_SUPERBLOCK (BLOCK_SUPERBLOCK (block)) != NULL)
+ block = BLOCK_SUPERBLOCK (block);
+
+ return block;
+}
diff --git a/gdb/block.h b/gdb/block.h
index 2fef52a..17c726d 100644
--- a/gdb/block.h
+++ b/gdb/block.h
@@ -207,4 +207,6 @@ extern void block_set_using (struct block *block,
struct using_direct *using,
struct obstack *obstack);
+extern const struct block *block_static_block (const struct block *block);
+
#endif /* BLOCK_H */
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 9b01d45..62e37b8 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -93,8 +93,7 @@ struct symbol *lookup_symbol_aux_local (const char *name,
const char *linkage_name,
const struct block *block,
const domain_enum domain,
- struct symtab **symtab,
- const struct block **static_block);
+ struct symtab **symtab);
static
struct symbol *lookup_symbol_aux_block (const char *name,
@@ -964,7 +963,7 @@ lookup_symbol_aux (const char *name, const char *linkage_name,
STATIC_BLOCK or GLOBAL_BLOCK. */
sym = lookup_symbol_aux_local (name, linkage_name, block, domain,
- symtab, &static_block);
+ symtab);
if (sym != NULL)
return sym;
@@ -1008,6 +1007,7 @@ lookup_symbol_aux (const char *name, const char *linkage_name,
than that one, so I don't think we should worry about that for
now. */
+ static_block = block_static_block (block);
if (static_block != NULL)
{
sym = lookup_symbol_aux_block (name, linkage_name, static_block,
@@ -1053,27 +1053,23 @@ lookup_symbol_aux (const char *name, const char *linkage_name,
}
/* Check to see if the symbol is defined in BLOCK or its superiors.
- Don't search STATIC_BLOCK or GLOBAL_BLOCK. If we don't find a
- match, store the address of STATIC_BLOCK in static_block. */
+ Don't search STATIC_BLOCK or GLOBAL_BLOCK. */
static struct symbol *
lookup_symbol_aux_local (const char *name, const char *linkage_name,
const struct block *block,
const domain_enum domain,
- struct symtab **symtab,
- const struct block **static_block)
+ struct symtab **symtab)
{
struct symbol *sym;
-
+ const struct block *static_block = block_static_block (block);
+
/* Check if either no block is specified or it's a global block. */
- if (block == NULL || BLOCK_SUPERBLOCK (block) == NULL)
- {
- *static_block = NULL;
- return NULL;
- }
+ if (static_block == NULL)
+ return NULL;
- while (BLOCK_SUPERBLOCK (BLOCK_SUPERBLOCK (block)) != NULL)
+ while (block != static_block)
{
sym = lookup_symbol_aux_block (name, linkage_name, block, domain,
symtab);
@@ -1082,9 +1078,8 @@ lookup_symbol_aux_local (const char *name, const char *linkage_name,
block = BLOCK_SUPERBLOCK (block);
}
- /* We've reached the static block. */
+ /* We've reached the static block without finding a result. */
- *static_block = block;
return NULL;
}