* 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>
* as.c (show_usage): Add --size-check=.

View 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 != ']'))

View 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. */