* 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.
This commit is contained in:
Alan Modra 2011-03-17 10:59:29 +00:00
parent 29703da4b1
commit 259af69e77
3 changed files with 17 additions and 11 deletions

View 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> 2011-03-16 H.J. Lu <hongjiu.lu@intel.com>
* as.c (show_usage): Add --size-check=. * as.c (show_usage): Add --size-check=.

View File

@ -1,6 +1,6 @@
/* expr.c -operands, expressions- /* expr.c -operands, expressions-
Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 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. Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler. This file is part of GAS, the GNU Assembler.
@ -959,10 +959,7 @@ operand (expressionS *expressionP, enum expr_mode mode)
#endif #endif
case '(': case '(':
/* Didn't begin with digit & not a name. */ /* Didn't begin with digit & not a name. */
if (mode != expr_defer) segment = expr (0, expressionP, mode);
segment = expression (expressionP);
else
segment = deferred_expression (expressionP);
/* expression () will pass trailing whitespace. */ /* expression () will pass trailing whitespace. */
if ((c == '(' && *input_line_pointer != ')') if ((c == '(' && *input_line_pointer != ')')
|| (c == '[' && *input_line_pointer != ']')) || (c == '[' && *input_line_pointer != ']'))

View File

@ -1,7 +1,7 @@
/* read.c - read a source file - /* read.c - read a source file -
Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 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. This file is part of GAS, the GNU Assembler.
@ -2653,7 +2653,9 @@ s_mri (int ignore ATTRIBUTE_UNUSED)
static void static void
do_org (segT segment, expressionS *exp, int fill) 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)); as_bad (_("invalid segment \"%s\""), segment_name (segment));
if (now_seg == absolute_section) if (now_seg == absolute_section)
@ -5416,9 +5418,9 @@ get_segmented_expression (expressionS *expP)
static segT static segT
get_known_segmented_expression (expressionS *expP) 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 /* There is no easy way to extract the undefined symbol from the
expression. */ expression. */
@ -5432,8 +5434,7 @@ get_known_segmented_expression (expressionS *expP)
expP->X_op = O_constant; expP->X_op = O_constant;
expP->X_add_number = 0; expP->X_add_number = 0;
} }
know (retval == absolute_section || SEG_NORMAL (retval)); return retval;
return (retval);
} }
char /* Return terminator. */ char /* Return terminator. */