aboutsummaryrefslogtreecommitdiff
path: root/gas/config
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2000-08-07 21:50:08 +0000
committerRichard Henderson <rth@redhat.com>2000-08-07 21:50:08 +0000
commit30d25259553fb463278b0a432a93314063d12cf3 (patch)
tree0822680cb3985835ff47e11c3dcbaf549c06163b /gas/config
parent0228082a3c8835e2475666e63c1ee6b4b6d9ac32 (diff)
downloadgdb-30d25259553fb463278b0a432a93314063d12cf3.zip
gdb-30d25259553fb463278b0a432a93314063d12cf3.tar.gz
gdb-30d25259553fb463278b0a432a93314063d12cf3.tar.bz2
* config/tc-ia64.c (unwind): Add prologue_mask member.
(dot_vframe): Elide psp_gr record if it overlaps prologue_gr. (dot_save): Likewise for pfs_gr, rp_gr, and preds_gr. (dot_body): Clear unwind.prologue_mask. (dot_prologue): Set it. Accept a register second argument.
Diffstat (limited to 'gas/config')
-rw-r--r--gas/config/tc-ia64.c35
1 files changed, 24 insertions, 11 deletions
diff --git a/gas/config/tc-ia64.c b/gas/config/tc-ia64.c
index c704cc6..d941fdb 100644
--- a/gas/config/tc-ia64.c
+++ b/gas/config/tc-ia64.c
@@ -584,6 +584,7 @@ static struct
/* TRUE if processing unwind directives in a prologue region. */
int prologue;
+ int prologue_mask;
} unwind;
typedef void (*vbyte_func) PARAMS ((int, char *, char *));
@@ -2747,7 +2748,8 @@ dot_vframe (dummy)
if (e.X_op == O_register && reg < 128)
{
add_unwind_entry (output_mem_stack_v ());
- add_unwind_entry (output_psp_gr (reg));
+ if (! (unwind.prologue_mask & 2))
+ add_unwind_entry (output_psp_gr (reg));
}
else
as_bad ("First operand to .vframe must be a general register");
@@ -2830,7 +2832,8 @@ dot_save (dummy)
break;
case REG_AR+AR_PFS:
add_unwind_entry (output_pfs_when ());
- add_unwind_entry (output_pfs_gr (reg2));
+ if (! (unwind.prologue_mask & 4))
+ add_unwind_entry (output_pfs_gr (reg2));
break;
case REG_AR+AR_LC:
add_unwind_entry (output_lc_when ());
@@ -2838,11 +2841,13 @@ dot_save (dummy)
break;
case REG_BR:
add_unwind_entry (output_rp_when ());
- add_unwind_entry (output_rp_gr (reg2));
+ if (! (unwind.prologue_mask & 8))
+ add_unwind_entry (output_rp_gr (reg2));
break;
case REG_PR:
add_unwind_entry (output_preds_when ());
- add_unwind_entry (output_preds_gr (reg2));
+ if (! (unwind.prologue_mask & 1))
+ add_unwind_entry (output_preds_gr (reg2));
break;
case REG_PRIUNAT:
add_unwind_entry (output_priunat_when_gr ());
@@ -3509,6 +3514,8 @@ dot_body (dummy)
int dummy;
{
unwind.prologue = 0;
+ unwind.prologue_mask = 0;
+
add_unwind_entry (output_body ());
demand_empty_rest_of_line ();
}
@@ -3518,8 +3525,8 @@ dot_prologue (dummy)
int dummy;
{
unsigned char sep;
+ int mask = 0, grsave;
- unwind.prologue = 1;
if (!is_it_end_of_statement ())
{
expressionS e1, e2;
@@ -3532,20 +3539,26 @@ dot_prologue (dummy)
if (e1.X_op == O_constant)
{
+ mask = e1.X_add_number;
+
if (e2.X_op == O_constant)
- {
- int mask = e1.X_add_number;
- int reg = e2.X_add_number;
- add_unwind_entry (output_prologue_gr (mask, reg));
- }
+ grsave = e2.X_add_number;
+ else if (e2.X_op == O_register
+ && (grsave = e2.X_add_number - REG_GR) < 128)
+ ;
else
- as_bad ("Second operand not a constant");
+ as_bad ("Second operand not a constant or general register");
+
+ add_unwind_entry (output_prologue_gr (mask, grsave));
}
else
as_bad ("First operand not a constant");
}
else
add_unwind_entry (output_prologue ());
+
+ unwind.prologue = 1;
+ unwind.prologue_mask = mask;
}
static void