* ar.c (delete_members): Plug memory leak.
[deliverable/binutils-gdb.git] / gas / read.c
index ae0dbb86e70a7e8ecfb292408607d409e298eb2a..5cca366cecff6abeca46a09487def76edb06cdfe 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,
-   2010  Free Software Foundation, Inc.
+   2010, 2011  Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -471,7 +471,6 @@ get_absolute_expression (void)
 {
   expressionS exp;
 
-  exp.X_md = 0;
   return get_absolute_expr (&exp);
 }
 
@@ -522,11 +521,10 @@ pobegin (void)
   pop_table_name = "standard";
   pop_insert (potable);
 
-#ifdef TARGET_USE_CFIPOP
+  /* Now CFI ones.  */
   pop_table_name = "cfi";
   pop_override_ok = 1;
   cfi_pop_insert ();
-#endif
 }
 \f
 #define HANDLE_CONDITIONAL_ASSEMBLY()                                  \
@@ -630,6 +628,7 @@ read_a_source_file (char *name)
          was_new_line = is_end_of_line[(unsigned char) input_line_pointer[-1]];
          if (was_new_line)
            {
+             symbol_set_value_now (&dot_symbol);
 #ifdef md_start_line_hook
              md_start_line_hook ();
 #endif
@@ -1124,13 +1123,10 @@ read_a_source_file (char *name)
          /* Report unknown char as error.  */
          demand_empty_rest_of_line ();
        }
-
-#ifdef md_after_pass_hook
-      md_after_pass_hook ();
-#endif
     }
 
  quit:
+  symbol_set_value_now (&dot_symbol);
 
 #ifdef md_cleanup
   md_cleanup ();
@@ -1611,6 +1607,8 @@ s_mri_common (int small ATTRIBUTE_UNUSED)
 #ifdef S_SET_ALIGN
   if (align != 0)
     S_SET_ALIGN (sym, align);
+#else
+  (void) align;
 #endif
 
   if (line_label != NULL)
@@ -2651,7 +2649,9 @@ s_mri (int ignore ATTRIBUTE_UNUSED)
 static void
 do_org (segT segment, expressionS *exp, int fill)
 {
-  if (segment != now_seg && segment != absolute_section)
+  if (segment != now_seg
+      && segment != absolute_section
+      && segment != expr_section)
     as_bad (_("invalid segment \"%s\""), segment_name (segment));
 
   if (now_seg == absolute_section)
@@ -3866,7 +3866,15 @@ cons_worker (int nbytes, /* 1=.byte, 2=.word, 4=.long.  */
        parse_mri_cons (&exp, (unsigned int) nbytes);
       else
 #endif
-       TC_PARSE_CONS_EXPRESSION (&exp, (unsigned int) nbytes);
+        {
+         if (*input_line_pointer == '"')
+           {
+             as_bad (_("unexpected `\"' in expression"));
+             ignore_rest_of_line ();
+             return;
+           }
+         TC_PARSE_CONS_EXPRESSION (&exp, (unsigned int) nbytes);
+       }
 
       if (rva)
        {
@@ -4254,15 +4262,32 @@ emit_expr (expressionS *exp, unsigned int nbytes)
       unsigned int size;
       LITTLENUM_TYPE *nums;
 
-      know (nbytes % CHARS_PER_LITTLENUM == 0);
-
       size = exp->X_add_number * CHARS_PER_LITTLENUM;
       if (nbytes < size)
        {
-         as_warn (_("bignum truncated to %d bytes"), nbytes);
+         int i = nbytes / CHARS_PER_LITTLENUM;
+         if (i != 0)
+           {
+             LITTLENUM_TYPE sign = 0;
+             if ((generic_bignum[--i]
+                  & (1 << (LITTLENUM_NUMBER_OF_BITS - 1))) != 0)
+               sign = ~(LITTLENUM_TYPE) 0;
+             while (++i < exp->X_add_number)
+               if (generic_bignum[i] != sign)
+                 break;
+           }
+         if (i < exp->X_add_number)
+           as_warn (_("bignum truncated to %d bytes"), nbytes);
          size = nbytes;
        }
 
+      if (nbytes == 1)
+       {
+         md_number_to_chars (p, (valueT) generic_bignum[0], 1);
+         return;
+       }
+      know (nbytes % CHARS_PER_LITTLENUM == 0);
+
       if (target_big_endian)
        {
          while (nbytes > size)
@@ -5148,7 +5173,9 @@ stringer (int bits_appendzero)
   const int bitsize = bits_appendzero & ~7;
   const int append_zero = bits_appendzero & 1;
   unsigned int c;
+#if !defined(NO_LISTING) && defined (OBJ_ELF)
   char *start;
+#endif
 
 #ifdef md_flush_pending_output
   md_flush_pending_output ();
@@ -5188,7 +5215,9 @@ stringer (int bits_appendzero)
        {
        case '\"':
          ++input_line_pointer; /*->1st char of string.  */
+#if !defined(NO_LISTING) && defined (OBJ_ELF)
          start = input_line_pointer;
+#endif
 
          while (is_a_char (c = next_char_of_string ()))
            stringer_append_char (c, bitsize);
@@ -5198,8 +5227,7 @@ stringer (int bits_appendzero)
 
          know (input_line_pointer[-1] == '\"');
 
-#ifndef NO_LISTING
-#ifdef OBJ_ELF
+#if !defined(NO_LISTING) && defined (OBJ_ELF)
          /* In ELF, when gcc is emitting DWARF 1 debugging output, it
             will emit .string with a filename in the .debug section
             after a sequence of constants.  See the comment in
@@ -5215,7 +5243,6 @@ stringer (int bits_appendzero)
              listing_source_file (start);
              input_line_pointer[-1] = c;
            }
-#endif
 #endif
 
          break;
@@ -5387,9 +5414,9 @@ get_segmented_expression (expressionS *expP)
 static segT
 get_known_segmented_expression (expressionS *expP)
 {
-  segT retval;
+  segT retval = get_segmented_expression (expP);
 
-  if ((retval = get_segmented_expression (expP)) == undefined_section)
+  if (retval == undefined_section)
     {
       /* There is no easy way to extract the undefined symbol from the
         expression.  */
@@ -5403,8 +5430,7 @@ get_known_segmented_expression (expressionS *expP)
       expP->X_op = O_constant;
       expP->X_add_number = 0;
     }
-  know (retval == absolute_section || SEG_NORMAL (retval));
-  return (retval);
+  return retval;
 }
 
 char                           /* Return terminator.  */
This page took 0.024919 seconds and 4 git commands to generate.