New elseif directive has been added.
This commit is contained in:
parent
08ccce3206
commit
3fd9f0476f
4
gas/NEWS
4
gas/NEWS
|
@ -2,6 +2,10 @@
|
|||
|
||||
Changes in 2.10:
|
||||
|
||||
Support for numbers with suffixes.
|
||||
|
||||
New .elseif pseudo-op added.
|
||||
|
||||
New --fatal-warnings option.
|
||||
|
||||
picoJava architecture support added.
|
||||
|
|
80
gas/cond.c
80
gas/cond.c
|
@ -246,6 +246,86 @@ s_ifc (arg)
|
|||
demand_empty_rest_of_line ();
|
||||
}
|
||||
|
||||
void
|
||||
s_elseif (arg)
|
||||
int arg;
|
||||
{
|
||||
expressionS operand;
|
||||
int t;
|
||||
|
||||
if (current_cframe == NULL)
|
||||
{
|
||||
as_bad (_("\".elseif\" without matching \".if\" - ignored"));
|
||||
|
||||
}
|
||||
else if (current_cframe->else_seen)
|
||||
{
|
||||
as_bad (_("\".elseif\" after \".else\" - ignored"));
|
||||
as_bad_where (current_cframe->else_file_line.file,
|
||||
current_cframe->else_file_line.line,
|
||||
_("here is the previous \"else\""));
|
||||
as_bad_where (current_cframe->if_file_line.file,
|
||||
current_cframe->if_file_line.line,
|
||||
_("here is the previous \"if\""));
|
||||
}
|
||||
else
|
||||
{
|
||||
as_where (¤t_cframe->else_file_line.file,
|
||||
¤t_cframe->else_file_line.line);
|
||||
|
||||
if (!current_cframe->dead_tree)
|
||||
{
|
||||
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 */
|
||||
|
||||
|
||||
SKIP_WHITESPACE (); /* Leading whitespace is part of operand. */
|
||||
|
||||
if (current_cframe != NULL && current_cframe->ignoring)
|
||||
{
|
||||
operand.X_add_number = 0;
|
||||
while (! is_end_of_line[(unsigned char) *input_line_pointer])
|
||||
++input_line_pointer;
|
||||
}
|
||||
else
|
||||
{
|
||||
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 ()
|
||||
&& current_cframe->ignoring
|
||||
&& (current_cframe->previous_cframe == NULL
|
||||
|| ! current_cframe->previous_cframe->ignoring))
|
||||
listing_list (2);
|
||||
|
||||
demand_empty_rest_of_line ();
|
||||
}
|
||||
|
||||
void
|
||||
s_endif (arg)
|
||||
int arg ATTRIBUTE_UNUSED;
|
||||
|
|
|
@ -3109,6 +3109,7 @@ Some machine configurations provide additional directives.
|
|||
* Double:: @code{.double @var{flonums}}
|
||||
* Eject:: @code{.eject}
|
||||
* Else:: @code{.else}
|
||||
* Elseif:: @code{.elseif}
|
||||
* End:: @code{.end}
|
||||
@ifset COFF
|
||||
* Endef:: @code{.endef}
|
||||
|
@ -3466,6 +3467,14 @@ assembly; @pxref{If,,@code{.if}}. It marks the beginning of a section
|
|||
of code to be assembled if the condition for the preceding @code{.if}
|
||||
was false.
|
||||
|
||||
@node Elseif
|
||||
@section @code{.elseif}
|
||||
|
||||
@cindex @code{elseif} directive
|
||||
@code{.elseif} is part of the @code{@value{AS}} support for conditional
|
||||
assembly; @pxref{If,,@code{.if}}. It is shorthand for beginning a new
|
||||
@code{.if} block that would otherwise fill the entire @code{.else} section.
|
||||
|
||||
@node End
|
||||
@section @code{.end}
|
||||
|
||||
|
@ -3694,6 +3703,8 @@ considered part of the source program being assembled if the argument
|
|||
the conditional section of code must be marked by @code{.endif}
|
||||
(@pxref{Endif,,@code{.endif}}); optionally, you may include code for the
|
||||
alternative condition, flagged by @code{.else} (@pxref{Else,,@code{.else}}).
|
||||
If you have several conditions to check, @code{.elseif} may be used to avoid
|
||||
nesting blocks if/else within each subsequent @code{.else} block.
|
||||
|
||||
The following variants of @code{.if} are also supported:
|
||||
@table @code
|
||||
|
|
|
@ -306,6 +306,7 @@ static const pseudo_typeS potable[] =
|
|||
{"eject", listing_eject, 0}, /* Formfeed listing */
|
||||
{"else", s_else, 0},
|
||||
{"elsec", s_else, 0},
|
||||
{"elseif", s_elseif, (int) O_ne},
|
||||
{"end", s_end, 0},
|
||||
{"endc", s_endif, 0},
|
||||
{"endfunc", s_func, 1},
|
||||
|
|
|
@ -128,6 +128,7 @@ extern void s_comm PARAMS ((int));
|
|||
extern void s_data PARAMS ((int));
|
||||
extern void s_desc PARAMS ((int));
|
||||
extern void s_else PARAMS ((int arg));
|
||||
extern void s_elseif PARAMS ((int arg));
|
||||
extern void s_end PARAMS ((int arg));
|
||||
extern void s_endif PARAMS ((int arg));
|
||||
extern void s_err PARAMS ((int));
|
||||
|
|
Loading…
Reference in New Issue