From: Jim Wilson Date: Wed, 21 Feb 2001 22:42:47 +0000 (+0000) Subject: Fix bugs in the handling of the .restore directive. X-Git-Tag: binutils-2_11~45 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4a4fa36d7bda0cad9880e2751f4f1b6d3a9ae89f;p=thirdparty%2Fbinutils-gdb.git Fix bugs in the handling of the .restore directive. * config/tc-ia64.c (struct unwind): Add member "prologue_count". (dot_proc): Clear unwind.prologue_count to zero. (dot_prologue): Increment unwind.prologue_count. (dot_restore): If second operand is omitted, use unwind.prologue_count -1 for "ecount" (# of additional regions to pop). Decrement unwind.prologue_count by number of regions popped. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index ab95ceab4ca..ed416df239b 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,13 @@ +2001-02-21 David Mosberger + + * config/tc-ia64.c (struct unwind): Add member "prologue_count". + (dot_proc): Clear unwind.prologue_count to zero. + (dot_prologue): Increment unwind.prologue_count. + (dot_restore): If second operand is omitted, use + unwind.prologue_count -1 for "ecount" (# of additional regions to + pop). Decrement unwind.prologue_count by number of regions + popped. + 2001-02-20 Bo Thorsen * config/tc-i386.c (tc_i386_fix_adjustable): Fix GOTPCREL GOT diff --git a/gas/config/tc-ia64.c b/gas/config/tc-ia64.c index 8f827393b3e..21bca8375b4 100644 --- a/gas/config/tc-ia64.c +++ b/gas/config/tc-ia64.c @@ -624,6 +624,7 @@ static struct /* TRUE if processing unwind directives in a prologue region. */ int prologue; int prologue_mask; + unsigned int prologue_count; /* number of .prologues seen so far */ } unwind; typedef void (*vbyte_func) PARAMS ((int, char *, char *)); @@ -3047,7 +3048,7 @@ dot_restore (dummy) int dummy ATTRIBUTE_UNUSED; { expressionS e1, e2; - unsigned long ecount = 0; + unsigned long ecount; /* # of _additional_ regions to pop */ int sep; sep = parse_operand (&e1); @@ -3060,14 +3061,21 @@ dot_restore (dummy) if (sep == ',') { parse_operand (&e2); - if (e1.X_op != O_constant) + if (e2.X_op != O_constant || e2.X_add_number < 0) { - as_bad ("Second operand to .restore must be constant"); + as_bad ("Second operand to .restore must be a constant >= 0"); return; } - ecount = e1.X_op; + ecount = e2.X_add_number; } + else + ecount = unwind.prologue_count - 1; add_unwind_entry (output_epilogue (ecount)); + + if (ecount < unwind.prologue_count) + unwind.prologue_count -= ecount + 1; + else + unwind.prologue_count = 0; } static void @@ -3710,6 +3718,7 @@ dot_proc (dummy) demand_empty_rest_of_line (); ia64_do_align (16); + unwind.prologue_count = 0; unwind.list = unwind.tail = unwind.current_entry = NULL; unwind.personality_routine = 0; } @@ -3764,6 +3773,7 @@ dot_prologue (dummy) unwind.prologue = 1; unwind.prologue_mask = mask; + ++unwind.prologue_count; } static void