Fix conditional assembly listings when more than one .else/.elsif
This commit is contained in:
parent
69e37bf6a2
commit
61b96bb428
6 changed files with 95 additions and 59 deletions
|
@ -1,5 +1,10 @@
|
||||||
2001-03-31 Alan Modra <alan@linuxcare.com.au>
|
2001-03-31 Alan Modra <alan@linuxcare.com.au>
|
||||||
|
|
||||||
|
* listing.c (listing_listing): Enable listing on EDICT_NOLIST_NEXT
|
||||||
|
for one line if not already enabled.
|
||||||
|
* cond.c (s_elseif): Correct conditional assembly listing.
|
||||||
|
(s_else): Likewise.
|
||||||
|
|
||||||
* cond.c (s_endif): Correct handling of "if .. elseif .." trees.
|
* cond.c (s_endif): Correct handling of "if .. elseif .." trees.
|
||||||
Don't abort on NULL current_cframe.
|
Don't abort on NULL current_cframe.
|
||||||
|
|
||||||
|
|
100
gas/cond.c
100
gas/cond.c
|
@ -255,9 +255,6 @@ void
|
||||||
s_elseif (arg)
|
s_elseif (arg)
|
||||||
int arg;
|
int arg;
|
||||||
{
|
{
|
||||||
expressionS operand;
|
|
||||||
int t;
|
|
||||||
|
|
||||||
if (current_cframe == NULL)
|
if (current_cframe == NULL)
|
||||||
{
|
{
|
||||||
as_bad (_("\".elseif\" without matching \".if\" - ignored"));
|
as_bad (_("\".elseif\" without matching \".if\" - ignored"));
|
||||||
|
@ -277,54 +274,55 @@ s_elseif (arg)
|
||||||
as_where (¤t_cframe->else_file_line.file,
|
as_where (¤t_cframe->else_file_line.file,
|
||||||
¤t_cframe->else_file_line.line);
|
¤t_cframe->else_file_line.line);
|
||||||
|
|
||||||
if (!current_cframe->dead_tree)
|
current_cframe->dead_tree |= !current_cframe->ignoring;
|
||||||
{
|
current_cframe->ignoring = current_cframe->dead_tree;
|
||||||
current_cframe->dead_tree = !current_cframe->ignoring;
|
}
|
||||||
current_cframe->ignoring = !current_cframe->ignoring;
|
|
||||||
if (LISTING_SKIP_COND ())
|
|
||||||
{
|
|
||||||
if (! current_cframe->ignoring)
|
|
||||||
listing_list (1);
|
|
||||||
else
|
|
||||||
listing_list (2);
|
|
||||||
}
|
|
||||||
} /* if not a dead tree */
|
|
||||||
} /* if error else do it */
|
|
||||||
|
|
||||||
if (current_cframe == NULL || current_cframe->ignoring)
|
if (current_cframe == NULL || current_cframe->ignoring)
|
||||||
{
|
{
|
||||||
while (! is_end_of_line[(unsigned char) *input_line_pointer])
|
while (! is_end_of_line[(unsigned char) *input_line_pointer])
|
||||||
++input_line_pointer;
|
++input_line_pointer;
|
||||||
return;
|
|
||||||
|
if (current_cframe == NULL)
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
/* Leading whitespace is part of operand. */
|
|
||||||
SKIP_WHITESPACE ();
|
|
||||||
|
|
||||||
expression (&operand);
|
|
||||||
if (operand.X_op != O_constant)
|
|
||||||
as_bad (_("non-constant expression in \".elseif\" statement"));
|
|
||||||
|
|
||||||
switch ((operatorT) arg)
|
|
||||||
{
|
{
|
||||||
case O_eq: t = operand.X_add_number == 0; break;
|
expressionS operand;
|
||||||
case O_ne: t = operand.X_add_number != 0; break;
|
int t;
|
||||||
case O_lt: t = operand.X_add_number < 0; break;
|
|
||||||
case O_le: t = operand.X_add_number <= 0; break;
|
|
||||||
case O_ge: t = operand.X_add_number >= 0; break;
|
|
||||||
case O_gt: t = operand.X_add_number > 0; break;
|
|
||||||
default:
|
|
||||||
abort ();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
current_cframe->ignoring = current_cframe->dead_tree || ! t;
|
/* Leading whitespace is part of operand. */
|
||||||
|
SKIP_WHITESPACE ();
|
||||||
|
|
||||||
|
expression (&operand);
|
||||||
|
if (operand.X_op != O_constant)
|
||||||
|
as_bad (_("non-constant expression in \".elseif\" statement"));
|
||||||
|
|
||||||
|
switch ((operatorT) arg)
|
||||||
|
{
|
||||||
|
case O_eq: t = operand.X_add_number == 0; break;
|
||||||
|
case O_ne: t = operand.X_add_number != 0; break;
|
||||||
|
case O_lt: t = operand.X_add_number < 0; break;
|
||||||
|
case O_le: t = operand.X_add_number <= 0; break;
|
||||||
|
case O_ge: t = operand.X_add_number >= 0; break;
|
||||||
|
case O_gt: t = operand.X_add_number > 0; break;
|
||||||
|
default:
|
||||||
|
abort ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
current_cframe->ignoring = current_cframe->dead_tree || ! t;
|
||||||
|
}
|
||||||
|
|
||||||
if (LISTING_SKIP_COND ()
|
if (LISTING_SKIP_COND ()
|
||||||
&& current_cframe->ignoring
|
|
||||||
&& (current_cframe->previous_cframe == NULL
|
&& (current_cframe->previous_cframe == NULL
|
||||||
|| ! current_cframe->previous_cframe->ignoring))
|
|| ! current_cframe->previous_cframe->ignoring))
|
||||||
listing_list (2);
|
{
|
||||||
|
if (! current_cframe->ignoring)
|
||||||
|
listing_list (1);
|
||||||
|
else
|
||||||
|
listing_list (2);
|
||||||
|
}
|
||||||
|
|
||||||
demand_empty_rest_of_line ();
|
demand_empty_rest_of_line ();
|
||||||
}
|
}
|
||||||
|
@ -368,7 +366,6 @@ s_else (arg)
|
||||||
if (current_cframe == NULL)
|
if (current_cframe == NULL)
|
||||||
{
|
{
|
||||||
as_bad (_(".else without matching .if - ignored"));
|
as_bad (_(".else without matching .if - ignored"));
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (current_cframe->else_seen)
|
else if (current_cframe->else_seen)
|
||||||
{
|
{
|
||||||
|
@ -385,20 +382,21 @@ s_else (arg)
|
||||||
as_where (¤t_cframe->else_file_line.file,
|
as_where (¤t_cframe->else_file_line.file,
|
||||||
¤t_cframe->else_file_line.line);
|
¤t_cframe->else_file_line.line);
|
||||||
|
|
||||||
if (!current_cframe->dead_tree)
|
current_cframe->ignoring =
|
||||||
|
current_cframe->dead_tree | !current_cframe->ignoring;
|
||||||
|
|
||||||
|
if (LISTING_SKIP_COND ()
|
||||||
|
&& (current_cframe->previous_cframe == NULL
|
||||||
|
|| ! current_cframe->previous_cframe->ignoring))
|
||||||
{
|
{
|
||||||
current_cframe->ignoring = !current_cframe->ignoring;
|
if (! current_cframe->ignoring)
|
||||||
if (LISTING_SKIP_COND ())
|
listing_list (1);
|
||||||
{
|
else
|
||||||
if (! current_cframe->ignoring)
|
listing_list (2);
|
||||||
listing_list (1);
|
}
|
||||||
else
|
|
||||||
listing_list (2);
|
|
||||||
}
|
|
||||||
} /* if not a dead tree */
|
|
||||||
|
|
||||||
current_cframe->else_seen = 1;
|
current_cframe->else_seen = 1;
|
||||||
} /* if error else do it */
|
}
|
||||||
|
|
||||||
if (flag_mri)
|
if (flag_mri)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/* listing.c - mainting assembly listings
|
/* listing.c - mainting assembly listings
|
||||||
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
|
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
|
||||||
|
2001
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GAS, the GNU Assembler.
|
This file is part of GAS, the GNU Assembler.
|
||||||
|
@ -1007,6 +1008,8 @@ listing_listing (name)
|
||||||
show_listing--;
|
show_listing--;
|
||||||
break;
|
break;
|
||||||
case EDICT_NOLIST_NEXT:
|
case EDICT_NOLIST_NEXT:
|
||||||
|
if (show_listing == 0)
|
||||||
|
list_line--;
|
||||||
break;
|
break;
|
||||||
case EDICT_EJECT:
|
case EDICT_EJECT:
|
||||||
break;
|
break;
|
||||||
|
@ -1029,7 +1032,8 @@ listing_listing (name)
|
||||||
p = buffer_line (list->file, buffer, width);
|
p = buffer_line (list->file, buffer, width);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (list->edict == EDICT_LIST)
|
if (list->edict == EDICT_LIST
|
||||||
|
|| (list->edict == EDICT_NOLIST_NEXT && show_listing == 0))
|
||||||
{
|
{
|
||||||
/* Enable listing for the single line that caused the enable. */
|
/* Enable listing for the single line that caused the enable. */
|
||||||
list_line++;
|
list_line++;
|
||||||
|
@ -1090,7 +1094,7 @@ listing_listing (name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (list->edict == EDICT_NOLIST_NEXT)
|
if (list->edict == EDICT_NOLIST_NEXT && show_listing == 1)
|
||||||
--show_listing;
|
--show_listing;
|
||||||
|
|
||||||
list = list->next;
|
list = list->next;
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2001-03-31 Alan Modra <alan@linuxcare.com.au>
|
||||||
|
|
||||||
|
* gas/all/cond.s: Add .if .elseif tree.
|
||||||
|
* gas/all/cond.d: Match above.
|
||||||
|
|
||||||
2001-03-30 H.J. Lu <hjl@gnu.org>
|
2001-03-30 H.J. Lu <hjl@gnu.org>
|
||||||
|
|
||||||
* gas/i386/relax.d: Dump with -s instead of -drw.
|
* gas/i386/relax.d: Dump with -s instead of -drw.
|
||||||
|
|
|
@ -13,8 +13,18 @@
|
||||||
15 0004 0[04] ?00 ?00 ?0[04][ ]+.long[ ]+4
|
15 0004 0[04] ?00 ?00 ?0[04][ ]+.long[ ]+4
|
||||||
16[ ]+.endc
|
16[ ]+.endc
|
||||||
17[ ]+.endc
|
17[ ]+.endc
|
||||||
18 0008 00 ?00 ?00 ?00[ ]+.p2align 5,0
|
18[ ]+
|
||||||
18[ ]+00 ?00 ?00 ?00
|
19[ ]+.if 0
|
||||||
18[ ]+00 ?00 ?00 ?00
|
21[ ]+.elseif 1
|
||||||
18[ ]+00 ?00 ?00 ?00
|
22[ ]+.if 0
|
||||||
18[ ]+00 ?00 ?00 ?00
|
24[ ]+.elseif 1
|
||||||
|
25 0008 0[07] ?00 ?00 ?0[07][ ]+.long[ ]+7
|
||||||
|
26[ ]+.endif
|
||||||
|
27[ ]+.elseif 1
|
||||||
|
29[ ]+.else
|
||||||
|
31[ ]+.endif
|
||||||
|
32 000c 00 ?00 ?00 ?00[ ]+.p2align 5,0
|
||||||
|
32[ ]+00 ?00 ?00 ?00
|
||||||
|
32[ ]+00 ?00 ?00 ?00
|
||||||
|
32[ ]+00 ?00 ?00 ?00
|
||||||
|
32[ ]+00 ?00 ?00 ?00
|
||||||
|
|
|
@ -15,4 +15,18 @@
|
||||||
.long 4
|
.long 4
|
||||||
.endc
|
.endc
|
||||||
.endc
|
.endc
|
||||||
|
|
||||||
|
.if 0
|
||||||
|
.long 5
|
||||||
|
.elseif 1
|
||||||
|
.if 0
|
||||||
|
.long 6
|
||||||
|
.elseif 1
|
||||||
|
.long 7
|
||||||
|
.endif
|
||||||
|
.elseif 1
|
||||||
|
.long 8
|
||||||
|
.else
|
||||||
|
.long 9
|
||||||
|
.endif
|
||||||
.p2align 5,0
|
.p2align 5,0
|
||||||
|
|
Loading…
Reference in a new issue