From 0c5e171aedb2697b4ebf072e47f498aaf62b7a05 Mon Sep 17 00:00:00 2001 From: Klee Dienes Date: Mon, 18 Nov 2002 19:14:10 +0000 Subject: [PATCH] 2002-11-18 Klee Dienes * 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. --- gdb/ChangeLog | 12 ++++++++++++ gdb/buildsym.c | 9 +++++++++ gdb/buildsym.h | 8 ++------ gdb/dbxread.c | 13 +++++++++++++ 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 + + * 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 * 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); -- 2.30.2