This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
PR gas/10856
- From: Alan Modra <amodra at bigpond dot net dot au>
- To: binutils at sourceware dot org
- Date: Wed, 28 Oct 2009 18:51:48 +1030
- Subject: PR gas/10856
We already had a test for this PR. A pity the test expected a wrong
result.
gas/
PR gas/10856
* expr.c (resolve_expression): Only add "left" value to O_symbol
expression when the symbol is undefined and different from the
original symbol. Simplify negative logic.
gas/testsuite/
* gas/i386/intelpic.d: Correct.
Index: gas/expr.c
===================================================================
RCS file: /cvs/src/src/gas/expr.c,v
retrieving revision 1.78
diff -u -p -r1.78 expr.c
--- gas/expr.c 11 Sep 2009 15:27:33 -0000 1.78
+++ gas/expr.c 28 Oct 2009 06:23:50 -0000
@@ -1997,6 +2000,7 @@ resolve_expression (expressionS *express
/* Help out with CSE. */
valueT final_val = expressionP->X_add_number;
symbolS *add_symbol = expressionP->X_add_symbol;
+ symbolS *orig_add_symbol = add_symbol;
symbolS *op_symbol = expressionP->X_op_symbol;
operatorT op = expressionP->X_op;
valueT left, right;
@@ -2078,6 +2082,7 @@ resolve_expression (expressionS *express
left = right;
seg_left = seg_right;
add_symbol = op_symbol;
+ orig_add_symbol = expressionP->X_op_symbol;
op = O_symbol;
break;
}
@@ -2122,18 +2127,19 @@ resolve_expression (expressionS *express
{
if (op == O_bit_exclusive_or || op == O_bit_inclusive_or)
{
- if (seg_right != absolute_section || right != 0)
+ if (!(seg_right == absolute_section && right == 0))
{
seg_left = seg_right;
left = right;
add_symbol = op_symbol;
+ orig_add_symbol = expressionP->X_op_symbol;
}
op = O_symbol;
break;
}
else if (op == O_left_shift || op == O_right_shift)
{
- if (seg_left != absolute_section || left != 0)
+ if (!(seg_left == absolute_section && left == 0))
{
op = O_symbol;
break;
@@ -2149,6 +2155,7 @@ resolve_expression (expressionS *express
seg_left = seg_right;
left = right;
add_symbol = op_symbol;
+ orig_add_symbol = expressionP->X_op_symbol;
op = O_symbol;
break;
}
@@ -2158,11 +2165,11 @@ resolve_expression (expressionS *express
op = O_symbol;
break;
}
- else if (left != right
- || ((seg_left != reg_section || seg_right != reg_section)
- && (seg_left != undefined_section
- || seg_right != undefined_section
- || add_symbol != op_symbol)))
+ else if (!(left == right
+ && ((seg_left == reg_section && seg_right == reg_section)
+ || (seg_left == undefined_section
+ && seg_right == undefined_section
+ && add_symbol == op_symbol))))
return 0;
else if (op == O_bit_and || op == O_bit_inclusive_or)
{
@@ -2233,7 +2240,8 @@ resolve_expression (expressionS *express
op = O_constant;
else if (seg_left == reg_section && final_val == 0)
op = O_register;
- else if (add_symbol != expressionP->X_add_symbol)
+ else if (seg_left == undefined_section
+ && add_symbol != orig_add_symbol)
final_val += left;
expressionP->X_add_symbol = add_symbol;
}
Index: gas/testsuite/gas/i386/intelpic.d
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/i386/intelpic.d,v
retrieving revision 1.3
diff -u -p -r1.3 intelpic.d
--- gas/testsuite/gas/i386/intelpic.d 8 Oct 2009 12:44:57 -0000 1.3
+++ gas/testsuite/gas/i386/intelpic.d 28 Oct 2009 06:24:23 -0000
@@ -12,6 +12,6 @@ Disassembly of section .text:
0+1 <bar>:
[ ]*[a-f0-9]+: 8d 83 14 00 00 00 lea 0x14\(%ebx\),%eax
[ ]*[a-f0-9]+: 8b 83 00 00 00 00 mov 0x0\(%ebx\),%eax
-[ ]*[a-f0-9]+: ff 24 85 1a 00 00 00 jmp \*0x1a\(,%eax,4\)
+[ ]*[a-f0-9]+: ff 24 85 0d 00 00 00 jmp \*0xd\(,%eax,4\)
[ ]*[a-f0-9]+: 8d 83 14 00 00 00 lea 0x14\(%ebx\),%eax
#pass
--
Alan Modra
Australia Development Lab, IBM