[gdb/testsuite] Fix gdb.fortran/nested-funcs-2.exp with gdbserver
[deliverable/binutils-gdb.git] / gas / cond.c
index 73304cbcbd5247ff7c1400c442b91a2eba674037..9753369e1882cf4f8a244b7720f0c3e3ca2adacd 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-2020 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,64 +57,80 @@ 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;
 
+/* Performs the .ifdef (test_defined == 1) and
+   the .ifndef (test_defined == 0) pseudo op.  */
+
 void
 void
-s_ifdef (arg)
-     int arg;
+s_ifdef (int test_defined)
 {
   /* Points to name of symbol.  */
 {
   /* Points to name of symbol.  */
-  register char *name;
+  char *name;
   /* Points to symbol.  */
   /* Points to symbol.  */
-  register symbolS *symbolP;
+  symbolS *symbolP;
   struct conditional_frame cframe;
   struct conditional_frame cframe;
+  char c;
 
   /* Leading whitespace is part of operand.  */
   SKIP_WHITESPACE ();
   name = input_line_pointer;
 
 
   /* Leading whitespace is part of operand.  */
   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);
       ignore_rest_of_line ();
     {
       as_bad (_("invalid identifier for \".ifdef\""));
       obstack_1grow (&cond_obstack, 0);
       ignore_rest_of_line ();
+      return;
     }
     }
+
+  c = get_symbol_name (& name);
+  symbolP = symbol_find (name);
+  (void) restore_line_pointer (c);
+
+  initialize_cframe (&cframe);
+
+  if (cframe.dead_tree)
+    cframe.ignoring = 1;
   else
     {
   else
     {
-      char c;
+      int is_defined;
 
 
-      c = get_symbol_end ();
-      symbolP = symbol_find (name);
-      *input_line_pointer = c;
+      /* Use the same definition of 'defined' as .equiv so that a symbol
+        which has been referenced but not yet given a value/address is
+        considered to be undefined.  */
+      is_defined =
+       symbolP != NULL
+       && (S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP))
+       && S_GET_SEGMENT (symbolP) != reg_section;
 
 
-      initialize_cframe (&cframe);
-      cframe.ignoring = cframe.dead_tree || !((symbolP != 0) ^ arg);
-      current_cframe = ((struct conditional_frame *)
-                       obstack_copy (&cond_obstack, &cframe,
-                                     sizeof (cframe)));
+      cframe.ignoring = ! (test_defined ^ is_defined);
+    }
 
 
-      if (LISTING_SKIP_COND ()
-         && cframe.ignoring
-         && (cframe.previous_cframe == NULL
-             || ! cframe.previous_cframe->ignoring))
-       listing_list (2);
+  current_cframe =
+    (struct conditional_frame *) obstack_alloc (&cond_obstack, sizeof cframe);
+  memcpy (current_cframe, &cframe, sizeof cframe);
 
 
-      demand_empty_rest_of_line ();
-    }                          /* if a valid identifyer name */
+  if (LISTING_SKIP_COND ()
+      && cframe.ignoring
+      && (cframe.previous_cframe == NULL
+         || ! cframe.previous_cframe->ignoring))
+    listing_list (2);
+
+  demand_empty_rest_of_line ();
 }
 
 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);
@@ -128,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"));
     }
@@ -150,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
@@ -165,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;
@@ -210,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;
@@ -236,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))
@@ -252,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)
     {
@@ -264,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;
@@ -294,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"));
 
@@ -328,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;
 
@@ -360,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)
     {
@@ -369,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;
@@ -408,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;
@@ -434,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
@@ -447,7 +495,7 @@ s_ifeqs (arg)
 }
 
 int
 }
 
 int
-ignore_input ()
+ignore_input (void)
 {
   char *s;
 
 {
   char *s;
 
@@ -481,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;
@@ -498,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)
     {
@@ -507,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"));
@@ -522,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.0299 seconds and 4 git commands to generate.