From mboxrd@z Thu Jan 1 00:00:00 1970 From: Richard Earnshaw To: raeburn@cygnus.com Cc: gas2@cygnus.com Subject: Inconsistent behaviour (in resolve_symbol_value?) Date: Mon, 05 Aug 1996 09:31:00 -0000 Message-id: <9608051502.AA02481@sun52.armltd> X-SW-Source: 1996/msg00071.html The following ARM assembler file should generate errors for both lines, but only generates an error for the second: foo.s: mov r0, #1 | bar mov r1, # bar | 1 as.new foo.s foo.s: Assembler messages: foo.s:2: Error: L0 set to illegal operation on non-absolute symbols The problem seems to be the code in resolve_symbol_value that handles various binary operations. I'm not sure what the code is trying to check for so I'm not sure what the fix should be. Both 'if' clauses involve checks for undefined sections, but the cases are very specific. Further, after the logical operation has been performed the type of the node is changed to O_constant, so it is no-longer possible to recover the operation in the back end. ... case O_bit_inclusive_or: ... case O_logical_or: resolve_symbol_value (symp->sy_value.X_add_symbol); resolve_symbol_value (symp->sy_value.X_op_symbol); seg_left = S_GET_SEGMENT (symp->sy_value.X_add_symbol); seg_right = S_GET_SEGMENT (symp->sy_value.X_op_symbol); if (seg_left != seg_right && seg_left != undefined_section && seg_right != undefined_section) { char *file; unsigned int line; if (expr_symbol_where (symp, &file, &line)) as_bad_where (file, line, "illegal operation on symbols in different sections"); else as_bad ("%s set to illegal operation on symbols in different section S_GET_NAME (symp)); } if ((S_GET_SEGMENT (symp->sy_value.X_add_symbol) != absolute_section) && symp->sy_value.X_op != O_subtract) { char *file; unsigned int line; if (expr_symbol_where (symp, &file, &line)) as_bad_where (file, line, "illegal operation on non-absolute symbols"); else as_bad ("%s set to illegal operation on non-absolute symbols", S_GET_NAME (symp)); } left = S_GET_VALUE (symp->sy_value.X_add_symbol); right = S_GET_VALUE (symp->sy_value.X_op_symbol); ... This is a serious problem for a user, since it quietly generating code that is incorrect.