* [RFA] dwarf2expr.c: Fix some stack [re]allocation problems
@ 2003-04-24 1:05 Kevin Buettner
2003-05-07 22:39 ` Kevin Buettner
0 siblings, 1 reply; 4+ messages in thread
From: Kevin Buettner @ 2003-04-24 1:05 UTC (permalink / raw)
To: gdb-patches
The patch below fixes some problems with the dwarf expression stack.
First, the stack is not being initialized correctly. The
``stack_len'' member indicates the position of the top of the stack
and it was being set to 10. This value should be zero, and, as a
consequence, none of the underflow checking code was actually working
properly. Furthermore, the field which indicates the amount of space
actually allocated wasn't being initialized at all!
The function which grows the stack also has a bug. It uses a loop
which doubles the new size so long as that size isn't yet large enough
to accomodate the new space request. The problem with this is that if
the size starts out at zero, the loop will never terminate. Computing
this sort of thing with a loop is silly anyway, so I've simplified the
mechanism used to allocate more space. It seems unlikely that the
DWARF 2 expression stack will grow very quickly, hence the new code is
conservative and allocates a mere 10 elements (at a time) more than
required.
Okay?
* dwarf2expr.c (new_dwarf_expr_context): Set ``stack_len'' to
correctly indicate an empty stack and ``stack_allocated'' to the
indicate the number of elements initially allocated.
(dwarf_expr_grow_stack): Simplify method for computing new
stack size. Don't loop infinitely if ``stack_len'' is zero.
Index: dwarf2expr.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2expr.c,v
retrieving revision 1.6
diff -u -p -r1.6 dwarf2expr.c
--- dwarf2expr.c 13 Apr 2003 15:53:44 -0000 1.6
+++ dwarf2expr.c 23 Apr 2003 23:19:38 -0000
@@ -39,8 +39,9 @@ new_dwarf_expr_context (void)
{
struct dwarf_expr_context *retval;
retval = xcalloc (1, sizeof (struct dwarf_expr_context));
- retval->stack_len = 10;
- retval->stack = xmalloc (10 * sizeof (CORE_ADDR));
+ retval->stack_len = 0;
+ retval->stack_allocated = 10;
+ retval->stack = xmalloc (retval->stack_allocated * sizeof (CORE_ADDR));
return retval;
}
@@ -61,12 +62,10 @@ dwarf_expr_grow_stack (struct dwarf_expr
{
if (ctx->stack_len + need > ctx->stack_allocated)
{
- size_t templen = ctx->stack_len * 2;
- while (templen < (ctx->stack_len + need))
- templen *= 2;
+ size_t newlen = ctx->stack_len + need + 10;
ctx->stack = xrealloc (ctx->stack,
- templen * sizeof (CORE_ADDR));
- ctx->stack_allocated = templen;
+ newlen * sizeof (CORE_ADDR));
+ ctx->stack_allocated = newlen;
}
}
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [RFA] dwarf2expr.c: Fix some stack [re]allocation problems
2003-04-24 1:05 [RFA] dwarf2expr.c: Fix some stack [re]allocation problems Kevin Buettner
@ 2003-05-07 22:39 ` Kevin Buettner
2003-05-07 22:57 ` Elena Zannoni
0 siblings, 1 reply; 4+ messages in thread
From: Kevin Buettner @ 2003-05-07 22:39 UTC (permalink / raw)
To: gdb-patches
Ping!
--- Forwarded mail from Kevin Buettner <kevinb@redhat.com>
Date: Wed, 23 Apr 2003 16:45:26 -0700
From: Kevin Buettner <kevinb@redhat.com>
To: gdb-patches@sources.redhat.com
Subject: [RFA] dwarf2expr.c: Fix some stack [re]allocation problems
The patch below fixes some problems with the dwarf expression stack.
First, the stack is not being initialized correctly. The
``stack_len'' member indicates the position of the top of the stack
and it was being set to 10. This value should be zero, and, as a
consequence, none of the underflow checking code was actually working
properly. Furthermore, the field which indicates the amount of space
actually allocated wasn't being initialized at all!
The function which grows the stack also has a bug. It uses a loop
which doubles the new size so long as that size isn't yet large enough
to accomodate the new space request. The problem with this is that if
the size starts out at zero, the loop will never terminate. Computing
this sort of thing with a loop is silly anyway, so I've simplified the
mechanism used to allocate more space. It seems unlikely that the
DWARF 2 expression stack will grow very quickly, hence the new code is
conservative and allocates a mere 10 elements (at a time) more than
required.
Okay?
* dwarf2expr.c (new_dwarf_expr_context): Set ``stack_len'' to
correctly indicate an empty stack and ``stack_allocated'' to the
indicate the number of elements initially allocated.
(dwarf_expr_grow_stack): Simplify method for computing new
stack size. Don't loop infinitely if ``stack_len'' is zero.
Index: dwarf2expr.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2expr.c,v
retrieving revision 1.6
diff -u -p -r1.6 dwarf2expr.c
--- dwarf2expr.c 13 Apr 2003 15:53:44 -0000 1.6
+++ dwarf2expr.c 23 Apr 2003 23:19:38 -0000
@@ -39,8 +39,9 @@ new_dwarf_expr_context (void)
{
struct dwarf_expr_context *retval;
retval = xcalloc (1, sizeof (struct dwarf_expr_context));
- retval->stack_len = 10;
- retval->stack = xmalloc (10 * sizeof (CORE_ADDR));
+ retval->stack_len = 0;
+ retval->stack_allocated = 10;
+ retval->stack = xmalloc (retval->stack_allocated * sizeof (CORE_ADDR));
return retval;
}
@@ -61,12 +62,10 @@ dwarf_expr_grow_stack (struct dwarf_expr
{
if (ctx->stack_len + need > ctx->stack_allocated)
{
- size_t templen = ctx->stack_len * 2;
- while (templen < (ctx->stack_len + need))
- templen *= 2;
+ size_t newlen = ctx->stack_len + need + 10;
ctx->stack = xrealloc (ctx->stack,
- templen * sizeof (CORE_ADDR));
- ctx->stack_allocated = templen;
+ newlen * sizeof (CORE_ADDR));
+ ctx->stack_allocated = newlen;
}
}
--- End of forwarded mail from Kevin Buettner <kevinb@redhat.com>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [RFA] dwarf2expr.c: Fix some stack [re]allocation problems
2003-05-07 22:39 ` Kevin Buettner
@ 2003-05-07 22:57 ` Elena Zannoni
[not found] ` <ezannoni@redhat.com>
0 siblings, 1 reply; 4+ messages in thread
From: Elena Zannoni @ 2003-05-07 22:57 UTC (permalink / raw)
To: Kevin Buettner; +Cc: gdb-patches
Kevin Buettner writes:
> Ping!
>
> --- Forwarded mail from Kevin Buettner <kevinb@redhat.com>
>
> Date: Wed, 23 Apr 2003 16:45:26 -0700
> From: Kevin Buettner <kevinb@redhat.com>
> To: gdb-patches@sources.redhat.com
> Subject: [RFA] dwarf2expr.c: Fix some stack [re]allocation problems
>
> The patch below fixes some problems with the dwarf expression stack.
>
> First, the stack is not being initialized correctly. The
> ``stack_len'' member indicates the position of the top of the stack
> and it was being set to 10. This value should be zero, and, as a
> consequence, none of the underflow checking code was actually working
> properly. Furthermore, the field which indicates the amount of space
> actually allocated wasn't being initialized at all!
>
> The function which grows the stack also has a bug. It uses a loop
> which doubles the new size so long as that size isn't yet large enough
> to accomodate the new space request. The problem with this is that if
> the size starts out at zero, the loop will never terminate. Computing
> this sort of thing with a loop is silly anyway, so I've simplified the
> mechanism used to allocate more space. It seems unlikely that the
> DWARF 2 expression stack will grow very quickly, hence the new code is
> conservative and allocates a mere 10 elements (at a time) more than
> required.
>
> Okay?
Sure.
elena
>
> * dwarf2expr.c (new_dwarf_expr_context): Set ``stack_len'' to
> correctly indicate an empty stack and ``stack_allocated'' to the
> indicate the number of elements initially allocated.
> (dwarf_expr_grow_stack): Simplify method for computing new
> stack size. Don't loop infinitely if ``stack_len'' is zero.
>
> Index: dwarf2expr.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/dwarf2expr.c,v
> retrieving revision 1.6
> diff -u -p -r1.6 dwarf2expr.c
> --- dwarf2expr.c 13 Apr 2003 15:53:44 -0000 1.6
> +++ dwarf2expr.c 23 Apr 2003 23:19:38 -0000
> @@ -39,8 +39,9 @@ new_dwarf_expr_context (void)
> {
> struct dwarf_expr_context *retval;
> retval = xcalloc (1, sizeof (struct dwarf_expr_context));
> - retval->stack_len = 10;
> - retval->stack = xmalloc (10 * sizeof (CORE_ADDR));
> + retval->stack_len = 0;
> + retval->stack_allocated = 10;
> + retval->stack = xmalloc (retval->stack_allocated * sizeof (CORE_ADDR));
> return retval;
> }
>
> @@ -61,12 +62,10 @@ dwarf_expr_grow_stack (struct dwarf_expr
> {
> if (ctx->stack_len + need > ctx->stack_allocated)
> {
> - size_t templen = ctx->stack_len * 2;
> - while (templen < (ctx->stack_len + need))
> - templen *= 2;
> + size_t newlen = ctx->stack_len + need + 10;
> ctx->stack = xrealloc (ctx->stack,
> - templen * sizeof (CORE_ADDR));
> - ctx->stack_allocated = templen;
> + newlen * sizeof (CORE_ADDR));
> + ctx->stack_allocated = newlen;
> }
> }
>
>
>
> --- End of forwarded mail from Kevin Buettner <kevinb@redhat.com>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [RFA] dwarf2expr.c: Fix some stack [re]allocation problems
[not found] ` <ezannoni@redhat.com>
@ 2003-05-14 22:46 ` Kevin Buettner
0 siblings, 0 replies; 4+ messages in thread
From: Kevin Buettner @ 2003-05-14 22:46 UTC (permalink / raw)
To: gdb-patches
On May 7, 7:02pm, Elena Zannoni wrote:
> > Okay?
>
> Sure.
>
> > * dwarf2expr.c (new_dwarf_expr_context): Set ``stack_len'' to
> > correctly indicate an empty stack and ``stack_allocated'' to the
> > indicate the number of elements initially allocated.
> > (dwarf_expr_grow_stack): Simplify method for computing new
> > stack size. Don't loop infinitely if ``stack_len'' is zero.
Committed.
Kevin
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2003-05-14 22:46 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-04-24 1:05 [RFA] dwarf2expr.c: Fix some stack [re]allocation problems Kevin Buettner
2003-05-07 22:39 ` Kevin Buettner
2003-05-07 22:57 ` Elena Zannoni
[not found] ` <ezannoni@redhat.com>
2003-05-14 22:46 ` Kevin Buettner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox