bfd:
[binutils-gdb.git] / gas / read.c
index 2fa01178964a3698910fc5c653029417cca886d4..4afb190173e31d66abc56c79047e1f510c00f37e 100644 (file)
@@ -1,7 +1,7 @@
 /* read.c - read a source file -
    Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
-   1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-   Free Software Foundation, Inc.
+   1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
+   2010  Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -371,7 +371,7 @@ static const pseudo_typeS potable[] = {
   {"irpc", s_irp, 1},
   {"irepc", s_irp, 1},
   {"lcomm", s_lcomm, 0},
-  {"lflags", listing_flags, 0},        /* Listing flags.  */
+  {"lflags", s_ignore, 0},     /* Listing flags.  */
   {"linefile", s_app_line, 0},
   {"linkonce", s_linkonce, 0},
   {"list", listing_list, 1},   /* Turn listing on.  */
@@ -589,9 +589,9 @@ try_macro (char term, const char *line)
 void
 read_a_source_file (char *name)
 {
-  register char c;
-  register char *s;            /* String of symbol, '\0' appended.  */
-  register int temp;
+  char c;
+  char *s;             /* String of symbol, '\0' appended.  */
+  int temp;
   pseudo_typeS *pop;
 
 #ifdef WARN_COMMENTS
@@ -620,19 +620,57 @@ read_a_source_file (char *name)
 #endif
       while (input_line_pointer < buffer_limit)
        {
+         bfd_boolean was_new_line;
          /* We have more of this buffer to parse.  */
 
          /* We now have input_line_pointer->1st char of next line.
             If input_line_pointer [-1] == '\n' then we just
             scanned another line: so bump line counters.  */
-         if (is_end_of_line[(unsigned char) input_line_pointer[-1]])
+         was_new_line = is_end_of_line[(unsigned char) input_line_pointer[-1]];
+         if (was_new_line)
            {
 #ifdef md_start_line_hook
              md_start_line_hook ();
 #endif
              if (input_line_pointer[-1] == '\n')
                bump_line_counters ();
+           }
+
+#ifndef NO_LISTING
+         /* If listing is on, and we are expanding a macro, then give
+            the listing code the contents of the expanded line.  */
+         if (listing)
+           {
+             if ((listing & LISTING_MACEXP) && macro_nest > 0)
+               {
+                 /* Find the end of the current expanded macro line.  */
+                 s = find_end_of_line (input_line_pointer, flag_m68k_mri);
+
+                 if (s != last_eol)
+                   {
+                     char *copy;
+                     int len;
+
+                     last_eol = s;
+                     /* Copy it for safe keeping.  Also give an indication of
+                        how much macro nesting is involved at this point.  */
+                     len = s - input_line_pointer;
+                     copy = (char *) xmalloc (len + macro_nest + 2);
+                     memset (copy, '>', macro_nest);
+                     copy[macro_nest] = ' ';
+                     memcpy (copy + macro_nest + 1, input_line_pointer, len);
+                     copy[macro_nest + 1 + len] = '\0';
 
+                     /* Install the line with the listing facility.  */
+                     listing_newline (copy);
+                   }
+               }
+             else
+               listing_newline (NULL);
+           }
+#endif
+         if (was_new_line)
+           {
              line_label = NULL;
 
              if (LABELS_WITHOUT_COLONS || flag_m68k_mri)
@@ -642,10 +680,8 @@ read_a_source_file (char *name)
                  if (is_name_beginner (*input_line_pointer))
                    {
                      char *line_start = input_line_pointer;
-                     char c;
                      int mri_line_macro;
 
-                     LISTING_NEWLINE ();
                      HANDLE_CONDITIONAL_ASSEMBLY ();
 
                      c = get_symbol_end ();
@@ -712,39 +748,6 @@ read_a_source_file (char *name)
            c = *input_line_pointer++;
          while (c == '\t' || c == ' ' || c == '\f');
 
-#ifndef NO_LISTING
-         /* If listing is on, and we are expanding a macro, then give
-            the listing code the contents of the expanded line.  */
-         if (listing)
-           {
-             if ((listing & LISTING_MACEXP) && macro_nest > 0)
-               {
-                 char *copy;
-                 int len;
-
-                 /* Find the end of the current expanded macro line.  */
-                 s = find_end_of_line (input_line_pointer - 1, flag_m68k_mri);
-
-                 if (s != last_eol)
-                   {
-                     last_eol = s;
-                     /* Copy it for safe keeping.  Also give an indication of
-                        how much macro nesting is involved at this point.  */
-                     len = s - (input_line_pointer - 1);
-                     copy = (char *) xmalloc (len + macro_nest + 2);
-                     memset (copy, '>', macro_nest);
-                     copy[macro_nest] = ' ';
-                     memcpy (copy + macro_nest + 1, input_line_pointer - 1, len);
-                     copy[macro_nest + 1 + len] = '\0';
-
-                     /* Install the line with the listing facility.  */
-                     listing_newline (copy);
-                   }
-               }
-             else
-               listing_newline (NULL);
-           }
-#endif
          /* C is the 1st significant character.
             Input_line_pointer points after that character.  */
          if (is_name_beginner (c))
@@ -1638,7 +1641,7 @@ void
 s_data (int ignore ATTRIBUTE_UNUSED)
 {
   segT section;
-  register int temp;
+  int temp;
 
   temp = get_absolute_expression ();
   if (flag_readonly_data_in_text)
@@ -1680,7 +1683,7 @@ s_app_file_string (char *file, int appfile ATTRIBUTE_UNUSED)
 void
 s_app_file (int appfile)
 {
-  register char *s;
+  char *s;
   int length;
 
   /* Some assemblers tolerate immediately following '"'.  */
@@ -1914,7 +1917,7 @@ s_fill (int ignore ATTRIBUTE_UNUSED)
 {
   expressionS rep_exp;
   long size = 1;
-  register long fill = 0;
+  long fill = 0;
   char *p;
 
 #ifdef md_flush_pending_output
@@ -2425,11 +2428,11 @@ s_lcomm_bytes (int needs_align)
 void
 s_lsym (int ignore ATTRIBUTE_UNUSED)
 {
-  register char *name;
-  register char c;
-  register char *p;
+  char *name;
+  char c;
+  char *p;
   expressionS exp;
-  register symbolS *symbolP;
+  symbolS *symbolP;
 
   /* We permit ANY defined expression: BSD4.2 demands constants.  */
   name = input_line_pointer;
@@ -2604,10 +2607,15 @@ s_mexit (int ignore ATTRIBUTE_UNUSED)
 void
 s_mri (int ignore ATTRIBUTE_UNUSED)
 {
-  int on, old_flag;
+  int on;
+#ifdef MRI_MODE_CHANGE
+  int old_flag;
+#endif
 
   on = get_absolute_expression ();
+#ifdef MRI_MODE_CHANGE
   old_flag = flag_mri;
+#endif
   if (on != 0)
     {
       flag_mri = 1;
@@ -2677,9 +2685,9 @@ do_org (segT segment, expressionS *exp, int fill)
 void
 s_org (int ignore ATTRIBUTE_UNUSED)
 {
-  register segT segment;
+  segT segment;
   expressionS exp;
-  register long temp_fill;
+  long temp_fill;
 
 #ifdef md_flush_pending_output
   md_flush_pending_output ();
@@ -3194,12 +3202,12 @@ s_space (int mult)
        }
       else if (mri_common_symbol != NULL)
        {
-         valueT val;
+         valueT mri_val;
 
-         val = S_GET_VALUE (mri_common_symbol);
-         if ((val & 1) != 0)
+         mri_val = S_GET_VALUE (mri_common_symbol);
+         if ((mri_val & 1) != 0)
            {
-             S_SET_VALUE (mri_common_symbol, val + 1);
+             S_SET_VALUE (mri_common_symbol, mri_val + 1);
              if (line_label != NULL)
                {
                  expressionS *symexp;
@@ -3449,7 +3457,7 @@ s_struct (int ignore ATTRIBUTE_UNUSED)
 void
 s_text (int ignore ATTRIBUTE_UNUSED)
 {
-  register int temp;
+  int temp;
 
   temp = get_absolute_expression ();
   subseg_set (text_section, (subsegT) temp);
@@ -3746,6 +3754,7 @@ pseudo_set (symbolS *symbolP)
        }
       S_SET_SEGMENT (symbolP, undefined_section);
       symbol_set_value_expression (symbolP, &exp);
+      copy_symbol_attributes (symbolP, exp.X_add_symbol);
       set_zero_frag (symbolP);
       break;
 
@@ -3816,7 +3825,7 @@ do_parse_cons_expression (expressionS *exp,
    Clobbers input_line_pointer and checks end-of-line.  */
 
 static void
-cons_worker (register int nbytes,      /* 1=.byte, 2=.word, 4=.long.  */
+cons_worker (int nbytes,       /* 1=.byte, 2=.word, 4=.long.  */
             int rva)
 {
   int c;
@@ -3962,7 +3971,7 @@ s_reloc (int ignore ATTRIBUTE_UNUSED)
   if (*input_line_pointer == ',')
     {
       ++input_line_pointer;
-      expression_and_evaluate (&exp);
+      expression (&exp);
     }
   switch (exp.X_op)
     {
@@ -4010,7 +4019,7 @@ void
 emit_expr (expressionS *exp, unsigned int nbytes)
 {
   operatorT op;
-  register char *p;
+  char *p;
   valueT extra_digit = 0;
 
   /* Don't do anything if we are going to make another pass.  */
@@ -4187,11 +4196,11 @@ emit_expr (expressionS *exp, unsigned int nbytes)
 
   if (op == O_constant)
     {
-      register valueT get;
-      register valueT use;
-      register valueT mask;
+      valueT get;
+      valueT use;
+      valueT mask;
       valueT hibit;
-      register valueT unmask;
+      valueT unmask;
 
       /* JF << of >= number of bits in the object is undefined.  In
         particular SPARC (Sun 4) has problems.  */
@@ -4546,7 +4555,7 @@ parse_repeat_cons (exp, nbytes)
      unsigned int nbytes;
 {
   expressionS count;
-  register int i;
+  int i;
 
   expression (exp);
 
@@ -4681,11 +4690,11 @@ hex_float (int float_type, char *bytes)
 
 void
 float_cons (/* Clobbers input_line-pointer, checks end-of-line.  */
-           register int float_type     /* 'f':.ffloat ... 'F':.float ...  */)
+           int float_type      /* 'f':.ffloat ... 'F':.float ...  */)
 {
-  register char *p;
+  char *p;
   int length;                  /* Number of chars in an object.  */
-  register char *err;          /* Error from scanning floating literal.  */
+  char *err;           /* Error from scanning floating literal.  */
   char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
 
   if (is_it_end_of_statement ())
@@ -4782,8 +4791,8 @@ float_cons (/* Clobbers input_line-pointer, checks end-of-line.  */
 static inline int
 sizeof_sleb128 (offsetT value)
 {
-  register int size = 0;
-  register unsigned byte;
+  int size = 0;
+  unsigned byte;
 
   do
     {
@@ -4803,12 +4812,10 @@ sizeof_sleb128 (offsetT value)
 static inline int
 sizeof_uleb128 (valueT value)
 {
-  register int size = 0;
-  register unsigned byte;
+  int size = 0;
 
   do
     {
-      byte = (value & 0x7f);
       value >>= 7;
       size += 1;
     }
@@ -4831,8 +4838,8 @@ sizeof_leb128 (valueT value, int sign)
 static inline int
 output_sleb128 (char *p, offsetT value)
 {
-  register char *orig = p;
-  register int more;
+  char *orig = p;
+  int more;
 
   do
     {
@@ -5239,7 +5246,7 @@ stringer (int bits_appendzero)
 unsigned int
 next_char_of_string (void)
 {
-  register unsigned int c;
+  unsigned int c;
 
   c = *input_line_pointer++ & CHAR_MASK;
   switch (c)
@@ -5359,9 +5366,9 @@ next_char_of_string (void)
 }
 \f
 static segT
-get_segmented_expression (register expressionS *expP)
+get_segmented_expression (expressionS *expP)
 {
-  register segT retval;
+  segT retval;
 
   retval = expression (expP);
   if (expP->X_op == O_illegal
@@ -5377,9 +5384,9 @@ get_segmented_expression (register expressionS *expP)
 }
 
 static segT
-get_known_segmented_expression (register expressionS *expP)
+get_known_segmented_expression (expressionS *expP)
 {
-  register segT retval;
+  segT retval;
 
   if ((retval = get_segmented_expression (expP)) == undefined_section)
     {
@@ -5413,11 +5420,11 @@ get_absolute_expression_and_terminator (long *val_pointer /* Return value of exp
 char *
 demand_copy_C_string (int *len_pointer)
 {
-  register char *s;
+  char *s;
 
   if ((s = demand_copy_string (len_pointer)) != 0)
     {
-      register int len;
+      int len;
 
       for (len = *len_pointer; len > 0; len--)
        {
@@ -5440,8 +5447,8 @@ demand_copy_C_string (int *len_pointer)
 char *
 demand_copy_string (int *lenP)
 {
-  register unsigned int c;
-  register int len;
+  unsigned int c;
+  int len;
   char *retval;
 
   len = 0;