* symbols.c (resolve_symbol_value <O_uminus, O_bit_not,

O_logical_not>): Derive final_seg from add_symbol.
	<O_multiply..O_logical_or>: More final_seg twiddles.
This commit is contained in:
Alan Modra
2002-04-03 04:10:28 +00:00
parent dd0fd3cee7
commit 784b640dd5
2 changed files with 33 additions and 11 deletions

View File

@ -1,3 +1,9 @@
2002-04-03 Alan Modra <amodra@bigpond.net.au>
* symbols.c (resolve_symbol_value <O_uminus, O_bit_not,
O_logical_not>): Derive final_seg from add_symbol.
<O_multiply..O_logical_or>: More final_seg twiddles.
2002-04-01 Jessica Han <jessica@cup.hp.com> 2002-04-01 Jessica Han <jessica@cup.hp.com>
* config/tc-ia64.c (ia64_cons_fix_new): Handle 8 byte iplt reloc * config/tc-ia64.c (ia64_cons_fix_new): Handle 8 byte iplt reloc

View File

@ -986,6 +986,7 @@ resolve_symbol_value (symp)
case O_bit_not: case O_bit_not:
case O_logical_not: case O_logical_not:
left = resolve_symbol_value (add_symbol); left = resolve_symbol_value (add_symbol);
seg_left = S_GET_SEGMENT (add_symbol);
if (op == O_uminus) if (op == O_uminus)
left = -left; left = -left;
@ -996,7 +997,7 @@ resolve_symbol_value (symp)
final_val += left + symp->sy_frag->fr_address; final_val += left + symp->sy_frag->fr_address;
if (final_seg == expr_section || final_seg == undefined_section) if (final_seg == expr_section || final_seg == undefined_section)
final_seg = absolute_section; final_seg = seg_left;
resolved = symbol_resolved_p (add_symbol); resolved = symbol_resolved_p (add_symbol);
break; break;
@ -1062,15 +1063,19 @@ resolve_symbol_value (symp)
Don't emit messages unless we're finalizing the symbol value, Don't emit messages unless we're finalizing the symbol value,
otherwise we may get the same message multiple times. */ otherwise we may get the same message multiple times. */
if (op != O_eq && op != O_ne if ((op == O_eq || op == O_ne)
&& (seg_left != absolute_section || ((op == O_subtract
|| seg_right != absolute_section) || op == O_lt || op == O_le || op == O_ge || op == O_gt)
&& ((op != O_subtract && seg_left == seg_right
&& op != O_lt && op != O_le && op != O_ge && op != O_gt) && (seg_left != undefined_section
|| seg_left != seg_right || add_symbol == op_symbol))
|| (seg_left == undefined_section || (seg_left == absolute_section
&& add_symbol != op_symbol)) && seg_right == absolute_section))
&& finalize_syms) {
if (final_seg == expr_section || final_seg == undefined_section)
final_seg = absolute_section;
}
else if (finalize_syms)
{ {
char *file; char *file;
unsigned int line; unsigned int line;
@ -1105,6 +1110,9 @@ resolve_symbol_value (symp)
as_bad (_("invalid section for operation setting `%s'"), as_bad (_("invalid section for operation setting `%s'"),
S_GET_NAME (symp)); S_GET_NAME (symp));
} }
/* Prevent the error propagating. */
if (final_seg == expr_section || final_seg == undefined_section)
final_seg = absolute_section;
} }
/* Check for division by zero. */ /* Check for division by zero. */
@ -1160,7 +1168,15 @@ resolve_symbol_value (symp)
final_val += symp->sy_frag->fr_address + left; final_val += symp->sy_frag->fr_address + left;
if (final_seg == expr_section || final_seg == undefined_section) if (final_seg == expr_section || final_seg == undefined_section)
final_seg = absolute_section; {
if (seg_left == undefined_section
|| seg_right == undefined_section)
final_seg = undefined_section;
else if (seg_left == absolute_section)
final_seg = seg_right;
else
final_seg = seg_left;
}
resolved = (symbol_resolved_p (add_symbol) resolved = (symbol_resolved_p (add_symbol)
&& symbol_resolved_p (op_symbol)); && symbol_resolved_p (op_symbol));
break; break;