Age | Commit message (Collapse) | Author |
|
with a test of ELF_TOOLCHAIN provided by bsd.own.mk.
No functional change.
|
|
|
|
compiler can be built on one particular m88k system and output code for another
with the proper options, but it only does half the job since there is too much
knowledge of the native toolchain embedded (at compile-time) in the compiler.
Building code for a different operating system and toolchain is what
cross-compiler are for.
Remove support for SDB debug information (only used by SVR3) and tdesc debug
information (only used by SVR4). The latter is questionable, but this helps
making the code less entangled.
Tell m88k.h to not rewrite almost all ASM_WHATEVER macros gratuitously on the
false pretense that `all m88k assemblers use the same syntax for pseudo-ops'.
This was already not true with SVR4, and is getting worse with our ELF
toolchain.
|
|
used for more than registers).
Convert all output of registers to asm_fprintf with %R.
Stop altering reg_names[] at runtime depending on the selected register prefix.
|
|
|
|
in the m88k backend; as a result, SHORT_ADDRESS_P() will always return 0,
therefore remove all code depending on it being nonzero.
|
|
-m{no-,}optimize-arg-area doesn't do anything either since the arg area has
been removed in gcc 2.95.
|
|
- add the frame pointer to EPILOGUE_USES when profiling
- when the initial stack adjustement is larger than 64KB and requires a
temporary register to be used, add a REG_FRAME_RELATED_EXPR of the original
computation (not constrained by the adjustement size) to the REG_NOTES of
the stack pointer adjustement sequence. Borrowed from alpha which has a
similar issue.
|
|
with the same value.
|
|
need to sync with upstream anymore) to make things a bit simpler and get
rid of unintended bitrotting.
This time:
- remove the small-data feature. It was only supported for COFF binaries
anyway. This allows us to stop providing TARGET_ASM_SELECT_SECTION and
use the default flavour, from which this backend had derived a bit in
addition to sdata support, so this is a good thing...
- remove the -midentify-version option
- remove the -mbig-pic option, it has been superseded by -fPIC since years
and was supposed to be removed `in a future version' since a long time
as well.
- remove the old MONITOR_GCC debug hooks.
|
|
|
|
Assembler supports a register prefix of `#' when configured for SVR4, and `%'
when configured for OpenBSD. Pseudo-ops do not need a leading dot, except
when configured for OpenBSD, allowing the `set' instruction to be recognized
correctly.
Based upon various unfinished or unreliable works, including smurph@'s early
work in 2003, my own attempts in 2004 and 2005, and Michael Kato's binutils
2.15 diff from 2005. Support for register prefixes, as well as fixing an
evil off-by-one in resolving 16-bit pc-relative relocations in ld (which would
only affect kernel .S files branching to global symbols), came as part of the
2012 work.
Not enabled yet (needs Makefile.bsd-wrapper, bfd/config.bfd and
gdb/configure.tgt updates to completely enable) so as not to disturb the
existing a.out toolchain builds; will hopefully be enabled very soon.
|
|
|
|
|
|
ok miod@
|
|
ok miod@
|
|
of files to include, in proper order, as tm_file at configure time. This
requires openbsd.h to be split, as also encountered on other platforms, and will
make further work easier.
No functional change introduced.
|
|
|
|
is used, a frame pointer is required for all non-leaf functions, and for leaf
functions unless -momit-leaf-frame-pointer is specified. Also, a frame pointer
is mandatory when profiling.
This used to be mostly harmless with gcc 2.95, but is required with gcc 3 to
get profiling to work.
|
|
DWARF debugging information to be produced, but define DWARF2_UNWIND_INFO
to zero to prevent it from being output yet.
This exposes dire weaknesses in the way the dwarf unwinder recognizes stack
frame setup instructions, so borrow code from rs6000 to rewrite and annotate
them as dwarf-edible instructions.
No functional change intended - although this enables one more optimization
code path in gcc.
|
|
Reorganize soft frame pointer so that locals are below it and grow
downwards. Tested by miod@, jasper@. OK miod@.
|
|
Reorganize soft frame pointer so that locals are below it and grow
downwards. Thanks Nick for the access. OK miod@.
|
|
after switching to __guard_local. OK matthew@, miod@.
|
|
if reload_completed; INITIAL_ELIMINATION_OFFSET() invokes it (which is very
likely a source for more bugs, to be investigated)
|
|
The array_size was uninitialized and used to work by accident.
Spotted with SSP on MIPS.
OK miod@. Tested by jasper@.
|
|
the following manner:
([reg:A & -8] << (64 - (((reg:FP+reg:B) & 0x7) << 3))) >> 56
This fails when we're doing loads with the offset from the frame
pointer %8. Since it's aligned, optimizer makes it a zero. The
correct expression is:
([reg:A & -8] << (56 - (((reg:FP+reg:B-1) & 0x7) << 3))) >> 56
This is actually a 13-year-old bug. Checked by Miod; a few files
in the kernel were affected. Spotted with SSP for Alpha.
OK miod@. Tested by naddy@.
|
|
|
|
|
|
one, gas, to correctly output pc-relative jumps.
|
|
considerations.
|
|
been done.
|
|
it reports the dest and source parts of the set insn are identical, we need
to check whether they are volatile memory references, and return 0 (not a
noop) in that case.
This allows `*volatile_ptr = *volatile_ptr;' constructs to no longer be
incorrectly optimized away on platforms which can perform memory to memory
transfers in a single instruction (i.e. m68k and vax).
Found the hard way on vax, where some systems need to frob the interrupt
stack early, before being able to handle faults, and a gcc3-built kernel
would have this operation optimized away, leading to a quick system reset.
|
|
|
|
|
|
protector code will conflict with the way variadic functions spill the
registers on the stack, causing the latter to be partially overwritten with
the value of __guard. Core dumps and hilarity ensues. This can probably be
fixed by changing the time registers are spilled from the backend for
__builtin_expand_saveregs(), to setup_incoming_varargs(), as done on e.g.
rs6000. But that's far from a trivial change, and I'd like to be able to
exercize gcc 3 a bit more on m88k before sacrificing more brain cells to
the gcc evil deities.
|
|
No functional change.
|
|
per-platform basis.
|
|
CPP_PREDEFINES; try to deuglify CPP_SPEC whenever possible as well.
|
|
them to all platforms). Both of them had been added very late in a release
cycle, which caused us to prefer workarounds with minimal side effects.
Since the issue they are avoiding may happen on other platforms, there is no
harm in making sure no other platform gets bitten by them. And at the moment
no supported platform runs gcc 3, so this does not cause any regression.
|
|
flavour. From etoh@'s gcc 3.4 tree. While there, also kill
change_arg_use_of_insns_2() which is now a dim wrapper around
change_arg_use_of_insns(), from etoh@'s tree as well.
|
|
predecrement cases with gcc 2.95. This had been needed for m68k but somehow
etoh@ missed this when porting the gcc 2.95 fixes back to its 3.3, then 3.4
tree.
This fixes passing of struct by value on m68k, and lets gcc 3 reliably
bootstrap itself now.
|
|
va_arg(). __vfprintf() still unhappy in some edge cases I am investigating.
|
|
variadic arguments passed in registers: these functions may pass a va_list to
another function, which will then need to rely upon a properly filled
__va_list struct and can't assume anything about the way arguments have been
passed to its caller.
|
|
spill the registers on __va_reg instead of calling move_block_from_reg().
|
|
of memory which will be used for the __va_reg register spill.
|
|
varagrs implementation being utterly wrong.
This is the same logic as the one I wrote for gcc 2.95, with a few more
optimizations whenever possible (such as not outputting instructions to fill
fields of the __va_list struct we know won't be accessed, now that we have
total control of the struct in the compiler).
It should now be possible to mix varags code compiled by gcc 2.95, with code
compiled with gcc 3, with the following exception: as I have finally found and
fixed the buglet causing all arguments to be passed on the stack if any of the
named arguments (before varargs) is a struct of 32 bytes or more passed by
value, such a (pretty uncommon) case will not be interoperable. One such case
can be found as va-arg-4.c in gcc's testsuite.
With these changes, all the following varargs exercizers from gcc's testsuite
now pass when compiled with the in-tree gcc 3:
gcc.c-torture/execute/920625-1.c
gcc.c-torture/execute/931004-10.c
gcc.c-torture/execute/931004-12.c
gcc.c-torture/execute/931004-14.c
gcc.c-torture/execute/931004-4.c
gcc.c-torture/execute/931004-6.c
gcc.c-torture/execute/931004-8.c
gcc.c-torture/execute/strct-varg-2.c
gcc.c-torture/execute/va-arg-1.c
gcc.c-torture/execute/va-arg-2.c
gcc.c-torture/execute/va-arg-4.c
gcc.c-torture/execute/va-arg-5.c
gcc.c-torture/execute/va-arg-6.c
as well as the few others of my own I had been using while working on gcc 2.95
more than 8 years ago.
|
|
if null_prologue(), i.e. if there is no stack frame to undo and no r1 to
restore.
Make the "epilogue" insn construct no longer depend on "return", but rather
on "(use (const_int 0))" as "prologue" and as generally done on other backends.
On the other hand, make it unconditionnal, instead of "! null_prologue()".
These changes make sure than a leaf procedure call does not end up "returning"
(i.e. jmp r1) upon return from the call, without restoring r1 and r30 (whenever
applicable) from the existing stack frame.
This makes a gcc3-compiled __main() (from libgcc2.c) no longer spin after
invoking the constructors, and gives the real payload (i.e. main() and whatever
follows from there) a chance to run.
|
|
string if not defined already, when cross-compiling. (curse words censored)
|
|
clobbered (e.g. in leaf functions). While saving it helps debugging, reading
it back is just useless in that case.
|
|
as recommended by the documentation. I have not seen a difference in the
generated code so far, but I'd rather play safe at the moment.
|