diff options
-rw-r--r-- | gas/NEWS | 4 | ||||
-rw-r--r-- | gas/cond.c | 80 | ||||
-rw-r--r-- | gas/doc/as.texinfo | 11 | ||||
-rw-r--r-- | gas/read.c | 1 | ||||
-rw-r--r-- | gas/read.h | 1 |
5 files changed, 97 insertions, 0 deletions
@@ -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. @@ -247,6 +247,86 @@ s_ifc (arg) } 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; { diff --git a/gas/doc/as.texinfo b/gas/doc/as.texinfo index 0f342fe..9e89cee 100644 --- a/gas/doc/as.texinfo +++ b/gas/doc/as.texinfo @@ -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)); |