OSDN Git Service

PR 12569
authoramodra <amodra>
Thu, 17 Mar 2011 10:59:29 +0000 (10:59 +0000)
committeramodra <amodra>
Thu, 17 Mar 2011 10:59:29 +0000 (10:59 +0000)
* expr.c (operand): Correct passing of "mode" to expr.
* read.c (do_org): Allow expr_section.
(get_known_segmented_expression): Don't assert anything about the
segment.

gas/ChangeLog
gas/expr.c
gas/read.c

index df7ecd5..6a73a0c 100644 (file)
@@ -1,3 +1,11 @@
+2011-03-17  Alan Modra  <amodra@gmail.com>
+
+       PR 12569
+       * expr.c (operand): Correct passing of "mode" to expr.
+       * read.c (do_org): Allow expr_section.
+       (get_known_segmented_expression): Don't assert anything about the
+       segment.
+
 2011-03-16  H.J. Lu  <hongjiu.lu@intel.com>
 
        * as.c (show_usage): Add --size-check=.
index 52eb472..0563b5b 100644 (file)
@@ -1,6 +1,6 @@
 /* expr.c -operands, expressions-
    Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009
+   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011
    Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
@@ -959,10 +959,7 @@ operand (expressionS *expressionP, enum expr_mode mode)
 #endif
     case '(':
       /* Didn't begin with digit & not a name.  */
-      if (mode != expr_defer)
-       segment = expression (expressionP);
-      else
-       segment = deferred_expression (expressionP);
+      segment = expr (0, expressionP, mode);
       /* expression () will pass trailing whitespace.  */
       if ((c == '(' && *input_line_pointer != ')')
          || (c == '[' && *input_line_pointer != ']'))
index c38de12..68b66bc 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.
 
@@ -2653,7 +2653,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)
@@ -5416,9 +5418,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.  */
@@ -5432,8 +5434,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.  */