Remove ATTRIBUTE_UNUSED check from ARI
[deliverable/binutils-gdb.git] / gas / cond.c
index b7a4082c52846a17036354081e834b383d593f7b..5996d2a59418e4f0424e77d54a0cb97517fc8981 100644 (file)
@@ -1,12 +1,11 @@
 /* cond.c - conditional assembly pseudo-ops, and .include
 /* cond.c - conditional assembly pseudo-ops, and .include
-   Copyright 1990, 1991, 1992, 1993, 1995, 1997, 1998, 2000, 2001
-   Free Software Foundation, Inc.
+   Copyright (C) 1990-2019 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
    GAS is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
    This file is part of GAS, the GNU Assembler.
 
    GAS is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
+   the Free Software Foundation; either version 3, or (at your option)
    any later version.
 
    GAS is distributed in the hope that it will be useful,
    any later version.
 
    GAS is distributed in the hope that it will be useful,
 
    You should have received a copy of the GNU General Public License
    along with GAS; see the file COPYING.  If not, write to the Free
 
    You should have received a copy of the GNU General Public License
    along with GAS; see the file COPYING.  If not, write to the Free
-   Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.  */
+   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
+   02110-1301, USA.  */
 
 #include "as.h"
 
 #include "as.h"
+#include "sb.h"
 #include "macro.h"
 
 #include "obstack.h"
 #include "macro.h"
 
 #include "obstack.h"
    scanned.  */
 struct obstack cond_obstack;
 
    scanned.  */
 struct obstack cond_obstack;
 
-struct file_line {
-  char *file;
+struct file_line
+{
+  const char *file;
   unsigned int line;
 };
 
 /* We push one of these structures for each .if, and pop it at the
    .endif.  */
 
   unsigned int line;
 };
 
 /* We push one of these structures for each .if, and pop it at the
    .endif.  */
 
-struct conditional_frame {
+struct conditional_frame
+{
   /* The source file & line number of the "if".  */
   struct file_line if_file_line;
   /* The source file & line of the "else".  */
   /* The source file & line number of the "if".  */
   struct file_line if_file_line;
   /* The source file & line of the "else".  */
@@ -55,8 +57,8 @@ struct conditional_frame {
   int macro_nest;
 };
 
   int macro_nest;
 };
 
-static void initialize_cframe PARAMS ((struct conditional_frame *cframe));
-static char *get_mri_string PARAMS ((int, int *));
+static void initialize_cframe (struct conditional_frame *cframe);
+static char *get_mri_string (int, int *);
 
 static struct conditional_frame *current_cframe = NULL;
 
 
 static struct conditional_frame *current_cframe = NULL;
 
@@ -64,8 +66,7 @@ static struct conditional_frame *current_cframe = NULL;
    the .ifndef (test_defined == 0) pseudo op.  */
 
 void
    the .ifndef (test_defined == 0) pseudo op.  */
 
 void
-s_ifdef (test_defined)
-     int test_defined;
+s_ifdef (int test_defined)
 {
   /* Points to name of symbol.  */
   char *name;
 {
   /* Points to name of symbol.  */
   char *name;
@@ -78,7 +79,7 @@ s_ifdef (test_defined)
   SKIP_WHITESPACE ();
   name = input_line_pointer;
 
   SKIP_WHITESPACE ();
   name = input_line_pointer;
 
-  if (!is_name_beginner (*name))
+  if (!is_name_beginner (*name) && *name != '"')
     {
       as_bad (_("invalid identifier for \".ifdef\""));
       obstack_1grow (&cond_obstack, 0);
     {
       as_bad (_("invalid identifier for \".ifdef\""));
       obstack_1grow (&cond_obstack, 0);
@@ -86,12 +87,12 @@ s_ifdef (test_defined)
       return;
     }
 
       return;
     }
 
-  c = get_symbol_end ();
+  c = get_symbol_name (& name);
   symbolP = symbol_find (name);
   symbolP = symbol_find (name);
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   initialize_cframe (&cframe);
 
   initialize_cframe (&cframe);
-  
+
   if (cframe.dead_tree)
     cframe.ignoring = 1;
   else
   if (cframe.dead_tree)
     cframe.ignoring = 1;
   else
@@ -103,15 +104,15 @@ s_ifdef (test_defined)
         considered to be undefined.  */
       is_defined =
        symbolP != NULL
         considered to be undefined.  */
       is_defined =
        symbolP != NULL
-       && S_IS_DEFINED (symbolP)
+       && (S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP))
        && S_GET_SEGMENT (symbolP) != reg_section;
 
       cframe.ignoring = ! (test_defined ^ is_defined);
     }
 
        && S_GET_SEGMENT (symbolP) != reg_section;
 
       cframe.ignoring = ! (test_defined ^ is_defined);
     }
 
-  current_cframe = ((struct conditional_frame *)
-                   obstack_copy (&cond_obstack, &cframe,
-                                 sizeof (cframe)));
+  current_cframe =
+    (struct conditional_frame *) obstack_alloc (&cond_obstack, sizeof cframe);
+  memcpy (current_cframe, &cframe, sizeof cframe);
 
   if (LISTING_SKIP_COND ()
       && cframe.ignoring
 
   if (LISTING_SKIP_COND ()
       && cframe.ignoring
@@ -123,14 +124,13 @@ s_ifdef (test_defined)
 }
 
 void
 }
 
 void
-s_if (arg)
-     int arg;
+s_if (int arg)
 {
   expressionS operand;
   struct conditional_frame cframe;
   int t;
   char *stop = NULL;
 {
   expressionS operand;
   struct conditional_frame cframe;
   int t;
   char *stop = NULL;
-  char stopc;
+  char stopc = 0;
 
   if (flag_mri)
     stop = mri_comment_field (&stopc);
 
   if (flag_mri)
     stop = mri_comment_field (&stopc);
@@ -146,7 +146,7 @@ s_if (arg)
     }
   else
     {
     }
   else
     {
-      expression (&operand);
+      expression_and_evaluate (&operand);
       if (operand.X_op != O_constant)
        as_bad (_("non-constant expression in \".if\" statement"));
     }
       if (operand.X_op != O_constant)
        as_bad (_("non-constant expression in \".if\" statement"));
     }
@@ -168,8 +168,9 @@ s_if (arg)
      using an undefined result.  No big deal.  */
   initialize_cframe (&cframe);
   cframe.ignoring = cframe.dead_tree || ! t;
      using an undefined result.  No big deal.  */
   initialize_cframe (&cframe);
   cframe.ignoring = cframe.dead_tree || ! t;
-  current_cframe = ((struct conditional_frame *)
-                   obstack_copy (&cond_obstack, &cframe, sizeof (cframe)));
+  current_cframe =
+    (struct conditional_frame *) obstack_alloc (&cond_obstack, sizeof cframe);
+  memcpy (current_cframe, & cframe, sizeof cframe);
 
   if (LISTING_SKIP_COND ()
       && cframe.ignoring
 
   if (LISTING_SKIP_COND ()
       && cframe.ignoring
@@ -183,12 +184,44 @@ s_if (arg)
   demand_empty_rest_of_line ();
 }
 
   demand_empty_rest_of_line ();
 }
 
+/* Performs the .ifb (test_blank == 1) and
+   the .ifnb (test_blank == 0) pseudo op.  */
+
+void
+s_ifb (int test_blank)
+{
+  struct conditional_frame cframe;
+
+  initialize_cframe (&cframe);
+
+  if (cframe.dead_tree)
+    cframe.ignoring = 1;
+  else
+    {
+      int is_eol;
+
+      SKIP_WHITESPACE ();
+      is_eol = is_end_of_line[(unsigned char) *input_line_pointer];
+      cframe.ignoring = (test_blank == !is_eol);
+    }
+
+  current_cframe =
+    (struct conditional_frame *) obstack_alloc (&cond_obstack, sizeof cframe);
+  memcpy (current_cframe, &cframe, sizeof cframe);
+
+  if (LISTING_SKIP_COND ()
+      && cframe.ignoring
+      && (cframe.previous_cframe == NULL
+         || ! cframe.previous_cframe->ignoring))
+    listing_list (2);
+
+  ignore_rest_of_line ();
+}
+
 /* Get a string for the MRI IFC or IFNC pseudo-ops.  */
 
 static char *
 /* Get a string for the MRI IFC or IFNC pseudo-ops.  */
 
 static char *
-get_mri_string (terminator, len)
-     int terminator;
-     int *len;
+get_mri_string (int terminator, int *len)
 {
   char *ret;
   char *s;
 {
   char *ret;
   char *s;
@@ -228,11 +261,10 @@ get_mri_string (terminator, len)
 /* The MRI IFC and IFNC pseudo-ops.  */
 
 void
 /* The MRI IFC and IFNC pseudo-ops.  */
 
 void
-s_ifc (arg)
-     int arg;
+s_ifc (int arg)
 {
   char *stop = NULL;
 {
   char *stop = NULL;
-  char stopc;
+  char stopc = 0;
   char *s1, *s2;
   int len1, len2;
   int res;
   char *s1, *s2;
   int len1, len2;
   int res;
@@ -254,10 +286,11 @@ s_ifc (arg)
 
   initialize_cframe (&cframe);
   cframe.ignoring = cframe.dead_tree || ! (res ^ arg);
 
   initialize_cframe (&cframe);
   cframe.ignoring = cframe.dead_tree || ! (res ^ arg);
-  current_cframe = ((struct conditional_frame *)
-                   obstack_copy (&cond_obstack, &cframe, sizeof (cframe)));
-
-  if (LISTING_SKIP_COND ()
+  current_cframe =
+    (struct conditional_frame *) obstack_alloc (&cond_obstack, sizeof cframe);
+  memcpy (current_cframe, &cframe, sizeof cframe);
+  
+ if (LISTING_SKIP_COND ()
       && cframe.ignoring
       && (cframe.previous_cframe == NULL
          || ! cframe.previous_cframe->ignoring))
       && cframe.ignoring
       && (cframe.previous_cframe == NULL
          || ! cframe.previous_cframe->ignoring))
@@ -270,8 +303,7 @@ s_ifc (arg)
 }
 
 void
 }
 
 void
-s_elseif (arg)
-     int arg;
+s_elseif (int arg)
 {
   if (current_cframe == NULL)
     {
 {
   if (current_cframe == NULL)
     {
@@ -282,15 +314,15 @@ s_elseif (arg)
       as_bad (_("\".elseif\" after \".else\""));
       as_bad_where (current_cframe->else_file_line.file,
                    current_cframe->else_file_line.line,
       as_bad (_("\".elseif\" after \".else\""));
       as_bad_where (current_cframe->else_file_line.file,
                    current_cframe->else_file_line.line,
-                   _("here is the previous \"else\""));
+                   _("here is the previous \".else\""));
       as_bad_where (current_cframe->if_file_line.file,
                    current_cframe->if_file_line.line,
       as_bad_where (current_cframe->if_file_line.file,
                    current_cframe->if_file_line.line,
-                   _("here is the previous \"if\""));
+                   _("here is the previous \".if\""));
     }
   else
     {
     }
   else
     {
-      as_where (&current_cframe->else_file_line.file,
-               &current_cframe->else_file_line.line);
+      current_cframe->else_file_line.file
+               = as_where (&current_cframe->else_file_line.line);
 
       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->dead_tree;
@@ -312,7 +344,7 @@ s_elseif (arg)
       /* Leading whitespace is part of operand.  */
       SKIP_WHITESPACE ();
 
       /* Leading whitespace is part of operand.  */
       SKIP_WHITESPACE ();
 
-      expression (&operand);
+      expression_and_evaluate (&operand);
       if (operand.X_op != O_constant)
        as_bad (_("non-constant expression in \".elseif\" statement"));
 
       if (operand.X_op != O_constant)
        as_bad (_("non-constant expression in \".elseif\" statement"));
 
@@ -346,8 +378,7 @@ s_elseif (arg)
 }
 
 void
 }
 
 void
-s_endif (arg)
-     int arg ATTRIBUTE_UNUSED;
+s_endif (int arg ATTRIBUTE_UNUSED)
 {
   struct conditional_frame *hold;
 
 {
   struct conditional_frame *hold;
 
@@ -378,8 +409,7 @@ s_endif (arg)
 }
 
 void
 }
 
 void
-s_else (arg)
-     int arg ATTRIBUTE_UNUSED;
+s_else (int arg ATTRIBUTE_UNUSED)
 {
   if (current_cframe == NULL)
     {
 {
   if (current_cframe == NULL)
     {
@@ -387,18 +417,18 @@ s_else (arg)
     }
   else if (current_cframe->else_seen)
     {
     }
   else if (current_cframe->else_seen)
     {
-      as_bad (_("duplicate \"else\""));
+      as_bad (_("duplicate \".else\""));
       as_bad_where (current_cframe->else_file_line.file,
                    current_cframe->else_file_line.line,
       as_bad_where (current_cframe->else_file_line.file,
                    current_cframe->else_file_line.line,
-                   _("here is the previous \"else\""));
+                   _("here is the previous \".else\""));
       as_bad_where (current_cframe->if_file_line.file,
                    current_cframe->if_file_line.line,
       as_bad_where (current_cframe->if_file_line.file,
                    current_cframe->if_file_line.line,
-                   _("here is the previous \"if\""));
+                   _("here is the previous \".if\""));
     }
   else
     {
     }
   else
     {
-      as_where (&current_cframe->else_file_line.file,
-               &current_cframe->else_file_line.line);
+      current_cframe->else_file_line.file
+               = as_where (&current_cframe->else_file_line.line);
 
       current_cframe->ignoring =
        current_cframe->dead_tree | !current_cframe->ignoring;
 
       current_cframe->ignoring =
        current_cframe->dead_tree | !current_cframe->ignoring;
@@ -426,8 +456,7 @@ s_else (arg)
 }
 
 void
 }
 
 void
-s_ifeqs (arg)
-     int arg;
+s_ifeqs (int arg)
 {
   char *s1, *s2;
   int len1, len2;
 {
   char *s1, *s2;
   int len1, len2;
@@ -452,8 +481,9 @@ s_ifeqs (arg)
 
   initialize_cframe (&cframe);
   cframe.ignoring = cframe.dead_tree || ! (res ^ arg);
 
   initialize_cframe (&cframe);
   cframe.ignoring = cframe.dead_tree || ! (res ^ arg);
-  current_cframe = ((struct conditional_frame *)
-                   obstack_copy (&cond_obstack, &cframe, sizeof (cframe)));
+  current_cframe =
+    (struct conditional_frame *) obstack_alloc (&cond_obstack, sizeof cframe);
+  memcpy (current_cframe, &cframe, sizeof cframe);
 
   if (LISTING_SKIP_COND ()
       && cframe.ignoring
 
   if (LISTING_SKIP_COND ()
       && cframe.ignoring
@@ -465,7 +495,7 @@ s_ifeqs (arg)
 }
 
 int
 }
 
 int
-ignore_input ()
+ignore_input (void)
 {
   char *s;
 
 {
   char *s;
 
@@ -499,12 +529,11 @@ ignore_input ()
 }
 
 static void
 }
 
 static void
-initialize_cframe (cframe)
-     struct conditional_frame *cframe;
+initialize_cframe (struct conditional_frame *cframe)
 {
   memset (cframe, 0, sizeof (*cframe));
 {
   memset (cframe, 0, sizeof (*cframe));
-  as_where (&cframe->if_file_line.file,
-           &cframe->if_file_line.line);
+  cframe->if_file_line.file
+           = as_where (&cframe->if_file_line.line);
   cframe->previous_cframe = current_cframe;
   cframe->dead_tree = current_cframe != NULL && current_cframe->ignoring;
   cframe->macro_nest = macro_nest;
   cframe->previous_cframe = current_cframe;
   cframe->dead_tree = current_cframe != NULL && current_cframe->ignoring;
   cframe->macro_nest = macro_nest;
@@ -516,8 +545,7 @@ initialize_cframe (cframe)
    negative, we are being called at the of the input files.  */
 
 void
    negative, we are being called at the of the input files.  */
 
 void
-cond_finish_check (nest)
-     int nest;
+cond_finish_check (int nest)
 {
   if (current_cframe != NULL && current_cframe->macro_nest >= nest)
     {
 {
   if (current_cframe != NULL && current_cframe->macro_nest >= nest)
     {
@@ -525,6 +553,7 @@ cond_finish_check (nest)
        as_bad (_("end of macro inside conditional"));
       else
        as_bad (_("end of file inside conditional"));
        as_bad (_("end of macro inside conditional"));
       else
        as_bad (_("end of file inside conditional"));
+
       as_bad_where (current_cframe->if_file_line.file,
                    current_cframe->if_file_line.line,
                    _("here is the start of the unterminated conditional"));
       as_bad_where (current_cframe->if_file_line.file,
                    current_cframe->if_file_line.line,
                    _("here is the start of the unterminated conditional"));
@@ -540,8 +569,7 @@ cond_finish_check (nest)
    nested, and just pop them off the stack.  */
 
 void
    nested, and just pop them off the stack.  */
 
 void
-cond_exit_macro (nest)
-     int nest;
+cond_exit_macro (int nest)
 {
   while (current_cframe != NULL && current_cframe->macro_nest >= nest)
     {
 {
   while (current_cframe != NULL && current_cframe->macro_nest >= nest)
     {
This page took 0.032268 seconds and 4 git commands to generate.