* subsegs.c (subseg_set): Permit SEG_ABSOLUTE in know expression.

* expr.c (expr): Account for new operatorT values in know
	expression.

	* write.c (fixup_segment): Clear fixp->fx_subsy if the relocation
	is fully resolved.
This commit is contained in:
Ian Lance Taylor 1995-09-21 20:42:11 +00:00
parent 2c4747540f
commit 52e1cf9d01
2 changed files with 51 additions and 15 deletions

View File

@ -1,3 +1,12 @@
Thu Sep 21 16:30:56 1995 Ian Lance Taylor <ian@cygnus.com>
* subsegs.c (subseg_set): Permit SEG_ABSOLUTE in know expression.
* expr.c (expr): Account for new operatorT values in know
expression.
* write.c (fixup_segment): Clear fixp->fx_subsy if the relocation
is fully resolved.
Thu Sep 21 14:11:49 1995 Michael Meissner <meissner@cygnus.com>
* config/tc-ppc.c (ppc_flags): New variable to hold the flag bits

View File

@ -34,6 +34,7 @@
static void floating_constant PARAMS ((expressionS * expressionP));
static void integer_constant PARAMS ((int radix, expressionS * expressionP));
static void mri_char_constant PARAMS ((expressionS *));
static void current_location PARAMS ((expressionS *));
static void clean_up_expression PARAMS ((expressionS * expressionP));
extern const char EXP_CHARS[], FLT_CHARS[];
@ -491,6 +492,31 @@ mri_char_constant (expressionP)
++input_line_pointer;
}
/* Return an expression representing the current location. This
handles the magic symbol `.'. */
static void
current_location (expressionp)
expressionS *expressionp;
{
if (now_seg == absolute_section)
{
expressionp->X_op = O_constant;
expressionp->X_add_number = abs_section_offset;
}
else
{
symbolS *symbolp;
symbolp = symbol_new (FAKE_LABEL_NAME, now_seg,
(valueT) frag_now_fix (),
frag_now);
expressionp->X_op = O_symbol;
expressionp->X_add_symbol = symbolp;
expressionp->X_add_number = 0;
}
}
/*
* Summary of operand().
*
@ -810,23 +836,17 @@ operand (expressionP)
integer_constant (16, expressionP);
break;
}
/* Fall through. */
if (is_part_of_name (*input_line_pointer))
goto isname;
current_location (expressionP);
break;
case '.':
if (!is_part_of_name (*input_line_pointer))
{
const char *fake;
/* JF: '.' is pseudo symbol with value of current location
in current segment. */
fake = FAKE_LABEL_NAME;
symbolP = symbol_new (fake,
now_seg,
(valueT) frag_now_fix (),
frag_now);
expressionP->X_op = O_symbol;
expressionP->X_add_symbol = symbolP;
expressionP->X_add_number = 0;
current_location (expressionP);
break;
}
else if ((strncasecmp (input_line_pointer, "startof.", 8) == 0
@ -908,6 +928,13 @@ operand (expressionP)
integer_constant (16, expressionP);
break;
case '*':
if (! flag_mri || is_part_of_name (*input_line_pointer))
goto de_fault;
current_location (expressionP);
break;
default:
de_fault:
if (is_end_of_line[(unsigned char) c])
@ -1272,7 +1299,7 @@ expr (rank, resultP)
op_right = operator ();
know (op_right == O_illegal || op_rank[(int) op_right] <= op_rank[(int) op_left]);
know ((int) op_left >= (int) O_multiply && (int) op_left <= (int) O_subtract);
know ((int) op_left >= (int) O_multiply && (int) op_left <= (int) O_gt);
/* input_line_pointer->after right-hand quantity. */
/* left-hand quantity in resultP */