aboutsummaryrefslogtreecommitdiff
path: root/gas/config/tc-i386-intel.c
diff options
context:
space:
mode:
Diffstat (limited to 'gas/config/tc-i386-intel.c')
-rw-r--r--gas/config/tc-i386-intel.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/gas/config/tc-i386-intel.c b/gas/config/tc-i386-intel.c
index 74aae24..99d215e 100644
--- a/gas/config/tc-i386-intel.c
+++ b/gas/config/tc-i386-intel.c
@@ -413,7 +413,19 @@ static int i386_intel_simplify (expressionS *e)
intel_state.index))
return 0;
if (!intel_state.in_offset)
- intel_state.seg = e->X_add_symbol;
+ {
+ if (!intel_state.seg)
+ intel_state.seg = e->X_add_symbol;
+ else
+ {
+ expressionS exp;
+
+ exp.X_op = O_full_ptr;
+ exp.X_add_symbol = e->X_add_symbol;
+ exp.X_op_symbol = intel_state.seg;
+ intel_state.seg = make_expr_symbol (&exp);
+ }
+ }
i386_intel_fold (e, e->X_op_symbol);
break;
@@ -956,10 +968,12 @@ i386_intel_operand (char *operand_string, int got_a_float)
if (intel_state.seg)
{
- for (;;)
+ for (ret = check_none; ; ret = operand_check)
{
expP = symbol_get_value_expression (intel_state.seg);
- if (expP->X_op != O_full_ptr)
+ if (expP->X_op != O_full_ptr
+ || symbol_get_value_expression (expP->X_op_symbol)->X_op
+ != O_register)
break;
intel_state.seg = expP->X_add_symbol;
}
@@ -974,6 +988,15 @@ i386_intel_operand (char *operand_string, int got_a_float)
as_bad (_("invalid use of register"));
return 0;
}
+ switch (ret)
+ {
+ case check_error:
+ as_bad (_("redundant segment overrides"));
+ return 0;
+ case check_warning:
+ as_warn (_("redundant segment overrides"));
+ break;
+ }
switch (i386_regtab[expP->X_add_number].reg_num)
{
case 0: i.seg[i.mem_operands] = &es; break;