This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
RE: Patch SH Assembler: Generates error in case of instruction mov #Imm,rd
- From: "Anil Paranjape" <AnilP1 at KPITCummins dot com>
- To: "Nick Clifton" <nickc at redhat dot com>,"Andreas Schwab" <schwab at suse dot de>
- Cc: <binutils at sources dot redhat dot com>
- Date: Tue, 13 Apr 2004 12:13:22 +0530
- Subject: RE: Patch SH Assembler: Generates error in case of instruction mov #Imm,rd
Hi all,
I think H8300-ELF assembler should generate error or warning like SH-ELF assembler does in case of following code,
.global _start
_start: mov.w #H'0f,r5
rts
.end
Any guidance on this is much appreciated.
Regards,
Anil
-----Original Message-----
From: Nick Clifton [mailto:nickc@redhat.com]
Sent: Friday, February 27, 2004 6:45 PM
To: Andreas Schwab
Cc: Anil Paranjape; binutils@sources.redhat.com
Subject: Re: Patch SH Assembler: Generates error in case of instruction
mov #Imm,rd
Hi Andreas,
>> Hi,
>>
>> In case of following instruction for SH,
>> mov #H'0f,r10
>> SH ELF assembler crashes and gives segmentation fault.
>> Instead SH ELF assembler should give error for wrong syntax.
>>
>> Please find patch below which fixes this problem in SH assembler.
>> No new regressions found in DejaGnu testsuite after pacth.
>
> What about
>
> .set foo,3
> mov #foo+1,r10
Good point.
I am revert Anil's patch and applying this one in its place. The
error message generated is not as helpful, but at least it will allow
expressions in the #Imm field.
Cheers
Nick
gas/ChangeLog
2004-02-27 Nick Clifton <nickc@redhat.com>
* config/tc-sh.c (get_operand): Revert previous delta.
(tc_gen_reloc): Check for an unknown reloc type before processing
the addend.
Index: gas/config/tc-sh.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-sh.c,v
retrieving revision 1.93
diff -c -3 -p -r1.93 tc-sh.c
*** gas/config/tc-sh.c 27 Feb 2004 12:21:57 -0000 1.93
--- gas/config/tc-sh.c 27 Feb 2004 13:11:24 -0000
*************** get_operand (char **ptr, sh_operand_info
*** 1426,1433 ****
if (src[0] == '#')
{
- if (! ISDIGIT (src[1]))
- as_bad (_("syntax error in #Imm"));
src++;
*ptr = parse_exp (src, op);
op->type = A_IMM;
--- 1426,1431 ----
*************** tc_gen_reloc (asection *section ATTRIBUT
*** 4193,4202 ****
rel->addend = 0;
rel->howto = bfd_reloc_type_lookup (stdoutput, r_type);
! #ifdef OBJ_ELF
! if (rel->howto->type == R_SH_IND12W)
! rel->addend += fixp->fx_offset - 4;
! #endif
if (rel->howto == NULL)
{
as_bad_where (fixp->fx_file, fixp->fx_line,
--- 4191,4197 ----
rel->addend = 0;
rel->howto = bfd_reloc_type_lookup (stdoutput, r_type);
!
if (rel->howto == NULL)
{
as_bad_where (fixp->fx_file, fixp->fx_line,
*************** tc_gen_reloc (asection *section ATTRIBUT
*** 4206,4211 ****
--- 4201,4210 ----
rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
assert (rel->howto != NULL);
}
+ #ifdef OBJ_ELF
+ else if (rel->howto->type == R_SH_IND12W)
+ rel->addend += fixp->fx_offset - 4;
+ #endif
return rel;
}