RE: ARM GCC: MOVT/MOVW reloacations error

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> -----Original Message-----
> From: Jie Zhang [mailto:jie@xxxxxxxxxxxxxxxx]
> Subject: Re: ARM GCC: MOVT/MOVW reloacations error
> 
> On 07/06/2010 08:50 AM, Pavel Pavlov wrote:
> > I'm compiling for armv7 windows mobile (coff-pe). The problem I have is that
> my build of gcc tries to use MOVT/MOVW in the following case:
> >
> > static void test_func(){}
> >
> > void test(struct teststruct * ts)
> > {
> > 	ts->func = test_func;
> > }
> >
> > The generated asm will be:
> > 	...
> > 	movw	r4, #:lower16:test_func
> > 	movt	r4, #:upper16:test_func
> >
> > When compiling I get this error:
> > GNU assembler version 2.20.51 (arm-mingw32ce) using BFD version (GNU
> > Binutils) 2.20.51.20091016
> > test.s: Assembler messages:
> > ...
> > test.s:10: Error: cannot represent BFD_RELOC_ARM_MOVW relocation in
> > this object file format
> > test.s:11: Error: cannot represent BFD_RELOC_ARM_MOVT relocation in
> > this object file format ...
> >
> >
> > basically, it simply fails in my case because such asm cannot work on windows,
> and I'm not sure if such thing can work anywhere else.
> 
> ARM ELF targets use movw/movt. But apparently binutils for ARM COFF targets
> cannot handle such relocations. So I think it might be a good to disable it for
> ARM COFF targets.
> 
> > Can somebody maybe recommend where I need to look for in gcc code to
> make gcc not generate movw/movt sequences for functions (or anything else
> that isn't a real constant at compile time)?
> >
> You could try this draft patch.
> 
> 

 [Pavel Pavlov] 
Thanks I'm rebuilding now and will write back if it fixes the problem. Initially, I modified arm_rtx_costs_1 to bump up costs of movt/movw pair so that gcc prefers to use regular load instruction.
The question I have about your patch: will it have negative effect on real constants: for example, if I had something like int x = 0x12439821; and the most the best way in this case is to use movt/movw pair, will gcc try to use ldr instead or your patch affects only relocatable symbols?
Thanks



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux