tech-toolchain archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: m68k build failure for 68040
On Mon, May 11, 2015 at 05:09:57PM +0100, Robert Swindells wrote:
>
> Martin Husemann wrote:
> >On Mon, May 11, 2015 at 04:43:18PM +0100, Robert Swindells wrote:
> >>
> >> Doing a build of current for mac68k with -m68040 defined in mk.conf I
> >> get the following error. It used to be possible to do an 040 build.
> >
> >What exactly are you doing? Accidently dropped all optimizations?
>
> I had got this in mk.conf:
>
> .if ${MACHINE_ARCH} == m68k
> COPTS+= -m68040
> LDFLAGS+= -m68040
> .endif
with those options turned on, the linker is putting the objects together in
a different order for some reason, with the effect that the branch target
of "PICJUMP $_exception_handler" is no longer within range of the 16-bit
branch displacement which that that macro produces.
curiously, the comment in that macro implies that someone expected that
the "bra" instruction would be assembled into an instruction with 32-bit
displacement:
.macro PICJUMP addr
/* ISA C has no bra.l instruction, and since this assembly file
gets assembled into multiple object files, we avoid the
bra instruction entirely. */
#if defined (__mcoldfire__) && !defined (__mcfisab__)
lea \addr-.-8,a0
jmp pc@(a0)
#else
bra \addr
#endif
.endm
but the assembler actually produces the 16-bit displacement branch.
forcing 32-bit displacement (ie. changing the "bra" to "bral")
fixes the build (though I haven't tried running the resulting binaries).
accord to the as info docs, the assembler really should be generating
a 32-bit displacement:
9.23.1 M680x0 Options
---------------------
...
`-l'
You can use the `-l' option to shorten the size of references to
undefined symbols. If you do not use the `-l' option, references
to undefined symbols are wide enough for a full `long' (32 bits).
(Since `as' cannot know where these symbols end up, `as' can only
allocate space for the linker to fill in later. Since `as' does
not know how far away these symbols are, it allocates as much
space as it can.) If you use this option, the references are only
one word wide (16 bits). This may be useful if you want the
object file to be as small as possible, and you know that the
relevant symbols are always less than 17 bits away.
...
`--disp-size-default-16 --disp-size-default-32'
If you use an addressing mode with a displacement, and the value
of the displacement is not known, `as' will normally assume that
the value is 32 bits. For example, if the symbol `disp' has not
been defined, `as' will assemble the addressing mode
`%a0@(disp,%d0)' as though `disp' is a 32 bit value. You may use
the `--disp-size-default-16' option to tell `as' to instead assume
that the displacement is 16 bits. In this case, `as' will
assemble `%a0@(disp,%d0)' as though `disp' is a 16 bit value. You
may use the `--disp-size-default-32' option to restore the default
behaviour.
we do not use "-l" or "--disp-size-default-16".
even specifying "--disp-size-default-32" does not produce the 32-bit
displacement version of the instruction. perhaps that option is not
supposed to affect branch displacements?
I looked at the gas sources a bit but didn't get very far yet.
-Chuck
Home |
Main Index |
Thread Index |
Old Index