summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlee Dienes <kdienes@apple.com>2002-11-18 19:14:10 +0000
committerKlee Dienes <kdienes@apple.com>2002-11-18 19:14:10 +0000
commit60ffc12c2259eb8ab80321121aaddbff84e8f1a9 (patch)
tree1ad8242f1246b97260640016e25a7323c575bd8a
parent9283744f2c87cf567ed3e9c4253f69d9ab82f17b (diff)
downloadgdb-60ffc12c2259eb8ab80321121aaddbff84e8f1a9.tar.gz
2002-11-18 Klee Dienes <kdienes@apple.com>
* buildsym.h (pop_context): Convert to function, defined in buildsym.c. * buildsym.c: Include gdb_assert.h. (pop_context): Implement as C function. Add check for stack underflow. * dbxread.c (process_one_symbol): Complain and stop processing that symbol if we are already at the top of the context stack for a function-end N_FUN (this would imply an umatched RBRAC). Ditto when processing N_RBRAC.
-rw-r--r--gdb/ChangeLog12
-rw-r--r--gdb/buildsym.c9
-rw-r--r--gdb/buildsym.h8
-rw-r--r--gdb/dbxread.c13
4 files changed, 36 insertions, 6 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 607e89e6c64..e16296b71fe 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,15 @@
+2002-11-18 Klee Dienes <kdienes@apple.com>
+
+ * buildsym.h (pop_context): Convert to function, defined in
+ buildsym.c.
+ * buildsym.c: Include gdb_assert.h.
+ (pop_context): Implement as C function. Add check for stack
+ underflow.
+ * dbxread.c (process_one_symbol): Complain and stop processing
+ that symbol if we are already at the top of the context stack for
+ a function-end N_FUN (this would imply an umatched RBRAC). Ditto
+ when processing N_RBRAC.
+
2002-11-16 Daniel Jacobowitz <drow@mvista.com>
* config/pa/nm-hppah.h (CHILD_POST_FOLLOW_INFERIOR_BY_CLONE): Don't
diff --git a/gdb/buildsym.c b/gdb/buildsym.c
index 09e81228aea..ae8929d2b6d 100644
--- a/gdb/buildsym.c
+++ b/gdb/buildsym.c
@@ -33,6 +33,7 @@
#include "symfile.h"
#include "objfiles.h"
#include "gdbtypes.h"
+#include "gdb_assert.h"
#include "complaints.h"
#include "gdb_string.h"
#include "expression.h" /* For "enum exp_opcode" used by... */
@@ -1100,6 +1101,14 @@ push_context (int desc, CORE_ADDR valu)
return new;
}
+
+struct context_stack *
+pop_context (void)
+{
+ gdb_assert (context_stack_depth > 0);
+ return (&context_stack[--context_stack_depth]);
+}
+
/* Compute a small integer hash code for the given name. */
diff --git a/gdb/buildsym.h b/gdb/buildsym.h
index 968a5793845..25fe9b14d37 100644
--- a/gdb/buildsym.h
+++ b/gdb/buildsym.h
@@ -173,12 +173,6 @@ EXTERN int context_stack_depth;
EXTERN int context_stack_size;
-/* Macro "function" for popping contexts from the stack. Pushing is
- done by a real function, push_context. This returns a pointer to a
- struct context_stack. */
-
-#define pop_context() (&context_stack[--context_stack_depth]);
-
/* Non-zero if the context stack is empty. */
#define outermost_context_p() (context_stack_depth == 0)
@@ -272,6 +266,8 @@ extern void buildsym_init (void);
extern struct context_stack *push_context (int desc, CORE_ADDR valu);
+extern struct context_stack *pop_context (void);
+
extern void record_line (struct subfile *subfile, int line, CORE_ADDR pc);
extern void start_symtab (char *name, char *dirname, CORE_ADDR start_addr);
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index 0cf70919972..538f076a6f7 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -2774,6 +2774,13 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
{
/* This N_FUN marks the end of a function. This closes off the
current block. */
+
+ if (context_stack_depth <= 0)
+ {
+ complain (&lbrac_mismatch_complaint, symnum);
+ break;
+ }
+
record_line (current_subfile, 0, function_start_offset + valu);
within_function = 0;
new = pop_context ();
@@ -2843,6 +2850,12 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
N_SO, the linker did not relocate them (sigh). */
valu += last_source_start_addr;
+ if (context_stack_depth <= 0)
+ {
+ complain (&lbrac_mismatch_complaint, symnum);
+ break;
+ }
+
new = pop_context ();
if (desc != new->depth)
complain (&lbrac_mismatch_complaint, symnum);