> -----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