* ar.c (delete_members): Plug memory leak.
[deliverable/binutils-gdb.git] / gas / read.c
index 92371b79f95ce50d4d140c2a8087110a4dc714d2..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.
 
@@ -521,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()                                  \
@@ -629,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
@@ -1123,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 ();
@@ -2652,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)
@@ -4263,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)
@@ -5398,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.  */
@@ -5414,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.02497 seconds and 4 git commands to generate.