spu-elf.h (STARTFILE_SPEC): Update.
* config/spu/spu-elf.h (STARTFILE_SPEC): Update. (ENDFILE_SPEC): Likewise. * config/spu/spu.opt (mstdmain): New option. * config/spu/crti.asm: Remove. * config/spu/crtn.asm: Likewise. * config/spu/crt0.c: Likewise. * config/spu/crtend.c: Likewise. * config/spu/t-spu-elf (EXTRA_MULTILIB_PARTS): Remove crt0 files listed above. ($(T)crti.o, $(T)crtn.o, $(T)crt1.o, $(T)crtend1.o): Remove. * doc/invoke.texi (SPU Options): Document -mstdmain. Co-Authored-By: Ben Elliston <bje@au.ibm.com> From-SVN: r119727
This commit is contained in:
parent
ea6f5c57de
commit
cc8d70cd9d
@ -1,3 +1,18 @@
|
||||
2006-12-11 Sa Liu <saliu@de.ibm.com>
|
||||
Ben Elliston <bje@au.ibm.com>
|
||||
|
||||
* config/spu/spu-elf.h (STARTFILE_SPEC): Update.
|
||||
(ENDFILE_SPEC): Likewise.
|
||||
* config/spu/spu.opt (mstdmain): New option.
|
||||
* config/spu/crti.asm: Remove.
|
||||
* config/spu/crtn.asm: Likewise.
|
||||
* config/spu/crt0.c: Likewise.
|
||||
* config/spu/crtend.c: Likewise.
|
||||
* config/spu/t-spu-elf (EXTRA_MULTILIB_PARTS): Remove crt0 files
|
||||
listed above.
|
||||
($(T)crti.o, $(T)crtn.o, $(T)crt1.o, $(T)crtend1.o): Remove.
|
||||
* doc/invoke.texi (SPU Options): Document -mstdmain.
|
||||
|
||||
2006-12-10 Zdenek Dvorak <dvorakz@suse.cz>
|
||||
|
||||
* doc/loop.texi: Document number_of_latch_executions and
|
||||
|
@ -1,131 +0,0 @@
|
||||
/* Copyright (C) 2006 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 2 of the License, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this file; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
02110-1301, USA. */
|
||||
|
||||
/* As a special exception, if you link this library with files compiled with
|
||||
GCC to produce an executable, this does not cause the resulting executable
|
||||
to be covered by the GNU General Public License. The exception does not
|
||||
however invalidate any other reasons why the executable file might be covered
|
||||
by the GNU General Public License. */
|
||||
|
||||
extern int main(int, unsigned long long, unsigned long long);
|
||||
void _start(int, unsigned long long, unsigned long long) __attribute__((__naked__));
|
||||
|
||||
extern void exit(int);
|
||||
|
||||
void _exit(int) __attribute__((__naked__));
|
||||
|
||||
typedef void (*func_ptr) (void);
|
||||
typedef __attribute__ ((__vector_size__(16))) unsigned int vec_uint4;
|
||||
|
||||
extern vec_uint4 __stack[];
|
||||
register vec_uint4 si_sp __asm__("$sp");
|
||||
register unsigned int si_r2 __asm__("$2");
|
||||
|
||||
extern char _end[];
|
||||
|
||||
/* If we want these aligned we need to do it in the linker script. */
|
||||
func_ptr __CTOR_LIST__[1]
|
||||
__attribute__ ((__section__(".ctors"), __aligned__(4)))
|
||||
= { (func_ptr) (-1) };
|
||||
|
||||
static func_ptr __DTOR_LIST__[1]
|
||||
__attribute__((__section__(".dtors"), __aligned__(4)))
|
||||
= { (func_ptr) (-1) };
|
||||
|
||||
void *__dso_handle = 0;
|
||||
|
||||
/* According to the BE Linux ABI an SPU module is called with these
|
||||
* parameters. Also, $2 is set to the Available Stack Size. */
|
||||
void
|
||||
_start(int spu_id,
|
||||
unsigned long long param,
|
||||
unsigned long long env)
|
||||
{
|
||||
unsigned int stack_size;
|
||||
unsigned int sp = (unsigned int)(__stack - 2);
|
||||
|
||||
/* Initialize the stack. __stack has been set to point to the top
|
||||
quadword of the stack. The ABI requires at least a NULL terminated
|
||||
back chain and lr save area. For example:
|
||||
+----------------+
|
||||
| 0 |
|
||||
+----------------+ <- __stack (e.g., 0x3fff0)
|
||||
| space for $lr |
|
||||
+----------------+
|
||||
| back chain |
|
||||
+----------------+ <- $sp (e.g., __stack - 32, 0x3ffd0)
|
||||
*/
|
||||
__stack[0] = (vec_uint4){0, 0, 0, 0};
|
||||
__stack[-1] = (vec_uint4){0, 0, 0, 0};
|
||||
|
||||
/* Initialize the Available Stack Size word of the Stack Pointer
|
||||
* information register. The BE Linux ABI passes the stack size in
|
||||
* $2, or use everything up to _end if $2 == 0. */
|
||||
stack_size = si_r2 == 0 ? sp - (unsigned int)_end : si_r2;
|
||||
|
||||
__stack[-2] = (vec_uint4){(unsigned int)__stack, stack_size, 0, 0};
|
||||
|
||||
si_sp = (vec_uint4){sp, stack_size, 0, 0};
|
||||
|
||||
|
||||
{
|
||||
extern func_ptr __CTOR_END__[];
|
||||
func_ptr *p;
|
||||
|
||||
/* The compiler assumes all symbols are 16 byte aligned, which is
|
||||
* not the case for __CTOR_END__. This inline assembly makes sure
|
||||
* the address is loaded into a register for which the compiler does
|
||||
* not assume anything about alignment. */
|
||||
__asm__ ("\n" : "=r" (p) : "0" (__CTOR_END__ - 1));
|
||||
|
||||
for (; *p != (func_ptr) -1; p--)
|
||||
(*p) ();
|
||||
}
|
||||
|
||||
exit(main(spu_id, param, env));
|
||||
__asm__ volatile ( " stop 0x20ff");
|
||||
}
|
||||
|
||||
/* C99 requires _Exit */
|
||||
void _Exit(int) __attribute__((__weak__, __alias__("_exit")));
|
||||
|
||||
void
|
||||
_exit(int rc)
|
||||
{
|
||||
{
|
||||
static func_ptr *p = 0;
|
||||
if (!p)
|
||||
{
|
||||
/* See comment for __CTOR_END__ above. */
|
||||
__asm__ ("" : "=r" (p) : "0" (__DTOR_LIST__ + 1));
|
||||
for (; *p; p++)
|
||||
(*p) ();
|
||||
}
|
||||
}
|
||||
/* Some self modifying code to return 'rc' in the 'stop' insn. */
|
||||
__asm__ volatile (
|
||||
" ori $3, %0,0\n"
|
||||
" lqr $4, 1f\n"
|
||||
" cbd $5, 1f+3($sp)\n"
|
||||
" shufb $0, %0, $4, $5\n"
|
||||
" stqr $0, 1f\n"
|
||||
" sync\n"
|
||||
"1:\n"
|
||||
" stop 0x2000\n"
|
||||
: : "r" (rc) );
|
||||
}
|
||||
|
@ -1,32 +0,0 @@
|
||||
/* Copyright (C) 2006 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 2 of the License, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this file; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
02110-1301, USA. */
|
||||
|
||||
/* As a special exception, if you link this library with files compiled with
|
||||
GCC to produce an executable, this does not cause the resulting executable
|
||||
to be covered by the GNU General Public License. The exception does not
|
||||
however invalidate any other reasons why the executable file might be covered
|
||||
by the GNU General Public License. */
|
||||
|
||||
typedef void (*func_ptr) (void);
|
||||
|
||||
func_ptr __CTOR_END__[1]
|
||||
__attribute__ ((section(".ctors"), aligned(sizeof(func_ptr))))
|
||||
= { (func_ptr) (0) };
|
||||
|
||||
func_ptr __DTOR_END__[1]
|
||||
__attribute__((section(".dtors"), aligned(sizeof(func_ptr))))
|
||||
= { (func_ptr) (0) };
|
@ -1,53 +0,0 @@
|
||||
# Copyright (C) 2006 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; you can redistribute it and/or modify it under
|
||||
# the terms of the GNU General Public License as published by the Free
|
||||
# Software Foundation; either version 2 of the License, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# This file is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this file; see the file COPYING. If not, write to the Free
|
||||
# Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301, USA. */
|
||||
#
|
||||
# As a special exception, if you link this library with files
|
||||
# compiled with GCC to produce an executable, this does not cause
|
||||
# the resulting executable to be covered by the GNU General Public License.
|
||||
# This exception does not however invalidate any other reasons why
|
||||
# the executable file might be covered by the GNU General Public License.
|
||||
#
|
||||
|
||||
# This file just make a stack frame for the contents of the .fini and
|
||||
# .init sections. Users may put any desired instructions in those
|
||||
# sections.
|
||||
|
||||
# Note - this macro is complimented by the FUNC_END macro
|
||||
# in crtn.asm. If you change this macro you must also change
|
||||
# that macro match.
|
||||
.macro FUNC_START
|
||||
# Create a stack frame and save any call-preserved registers
|
||||
ai $sp, $sp, -16
|
||||
stqd $lr, 0($sp)
|
||||
.endm
|
||||
|
||||
.file "crti.asm"
|
||||
|
||||
.section ".init"
|
||||
.align 2
|
||||
.global _init
|
||||
_init:
|
||||
FUNC_START
|
||||
|
||||
|
||||
.section ".fini"
|
||||
.align 2
|
||||
.global _fini
|
||||
_fini:
|
||||
FUNC_START
|
||||
|
||||
# end of crti.asm
|
@ -1,54 +0,0 @@
|
||||
# Copyright (C) 2006 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; you can redistribute it and/or modify it under
|
||||
# the terms of the GNU General Public License as published by the Free
|
||||
# Software Foundation; either version 2 of the License, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
# This file is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this file; see the file COPYING. If not, write to the Free
|
||||
# Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301, USA. */
|
||||
#
|
||||
# As a special exception, if you link this library with files
|
||||
# compiled with GCC to produce an executable, this does not cause
|
||||
# the resulting executable to be covered by the GNU General Public License.
|
||||
# This exception does not however invalidate any other reasons why
|
||||
# the executable file might be covered by the GNU General Public License.
|
||||
#
|
||||
|
||||
# This file just makes sure that the .fini and .init sections do in
|
||||
# fact return. Users may put any desired instructions in those sections.
|
||||
# This file is the last thing linked into any executable.
|
||||
|
||||
# Note - this macro is complimented by the FUNC_START macro
|
||||
# in crti.asm. If you change this macro you must also change
|
||||
# that macro match.
|
||||
#
|
||||
# Note - we do not try any fancy optimisations of the return
|
||||
# sequences here, it is just not worth it. Instead keep things
|
||||
# simple. Restore all the save resgisters, including the link
|
||||
# register and then perform the correct function return instruction.
|
||||
.macro FUNC_END
|
||||
lqd $lr, 0($sp)
|
||||
ai $sp, $sp, 16
|
||||
bi $lr
|
||||
.endm
|
||||
|
||||
|
||||
.file "crtn.asm"
|
||||
|
||||
.section ".init"
|
||||
;;
|
||||
FUNC_END
|
||||
|
||||
.section ".fini"
|
||||
;;
|
||||
FUNC_END
|
||||
|
||||
# end of crtn.asm
|
@ -25,11 +25,18 @@
|
||||
asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
|
||||
|
||||
|
||||
#undef STARTFILE_SPEC
|
||||
#define STARTFILE_SPEC "crt1%O%s"
|
||||
|
||||
/* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add
|
||||
the GNU/Linux magical crtbegin.o file (see crtstuff.c) which
|
||||
provides part of the support for getting C++ file-scope static
|
||||
object constructed before entering `main'. */
|
||||
|
||||
#undef STARTFILE_SPEC
|
||||
#define STARTFILE_SPEC "%{mstdmain: crt2.o%s} %{!mstdmain: crt1.o%s} \
|
||||
crti.o%s crtbegin.o%s"
|
||||
|
||||
#undef ENDFILE_SPEC
|
||||
#define ENDFILE_SPEC "crtend1%O%s"
|
||||
#define ENDFILE_SPEC "crtend.o%s crtn.o%s"
|
||||
|
||||
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
|
||||
|
||||
|
@ -36,6 +36,10 @@ munsafe-dma
|
||||
Target Report RejectNegative InverseMask(SAFE_DMA)
|
||||
volatile must be specified on any memory that is effected by DMA
|
||||
|
||||
mstdmain
|
||||
Target Report Mask(STD_MAIN)
|
||||
Use standard main function as entry for startup
|
||||
|
||||
mbranch-hints
|
||||
Target Report Mask(BRANCH_HINTS)
|
||||
Generate branch hints for branches
|
||||
|
@ -54,31 +54,11 @@ CRTSTUFF_T_CFLAGS =
|
||||
# Neither gcc or newlib seem to have a standard way to generate multiple
|
||||
# crt*.o files. So we don't use the standard crt0.o name anymore.
|
||||
|
||||
EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o crti.o crtn.o crt1.o crtend1.o
|
||||
EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o
|
||||
|
||||
LIBGCC = stmp-multilib
|
||||
INSTALL_LIBGCC = install-multilib
|
||||
|
||||
# Assemble startup files.
|
||||
$(T)crti.o: $(srcdir)/config/spu/crti.asm $(GCC_PASSES)
|
||||
$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
|
||||
-c -o $(T)crti.o -x assembler-with-cpp $(srcdir)/config/spu/crti.asm
|
||||
|
||||
$(T)crtn.o: $(srcdir)/config/spu/crtn.asm $(GCC_PASSES)
|
||||
$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
|
||||
-c -o $(T)crtn.o -x assembler-with-cpp $(srcdir)/config/spu/crtn.asm
|
||||
|
||||
$(T)crt1.o: $(srcdir)/config/spu/crt0.c $(GCC_PASSES)
|
||||
$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
|
||||
-O2 \
|
||||
-c -o $(T)crt1.o $(srcdir)/config/spu/crt0.c
|
||||
|
||||
$(T)crtend1.o: $(srcdir)/config/spu/crtend.c $(GCC_PASSES)
|
||||
$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \
|
||||
-O2 \
|
||||
-c -o $(T)crtend1.o $(srcdir)/config/spu/crtend.c
|
||||
|
||||
|
||||
spu.o: $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
|
||||
$(RTL_H) $(REGS_H) hard-reg-set.h \
|
||||
real.h insn-config.h conditions.h insn-attr.h flags.h $(RECOG_H) \
|
||||
|
@ -733,7 +733,7 @@ See RS/6000 and PowerPC Options.
|
||||
@gccoptlist{-mwarn-reloc -merror-reloc @gol
|
||||
-msafe-dma -munsafe-dma @gol
|
||||
-mbranch-hints @gol
|
||||
-msmall-mem -mlarge-mem}
|
||||
-msmall-mem -mlarge-mem -mstdmain}
|
||||
|
||||
@emph{System V Options}
|
||||
@gccoptlist{-Qy -Qn -YP,@var{paths} -Ym,@var{dir}}
|
||||
@ -12920,6 +12920,15 @@ By default, GCC generates code assuming that addresses are never larger
|
||||
than 18 bits. With @option{-mlarge-mem} code is generated that assumes
|
||||
a full 32 bit address.
|
||||
|
||||
@item -mstdmain
|
||||
@opindex mstdmain
|
||||
|
||||
By default, GCC links against startup code that assumes the SPU-style
|
||||
main function interface (which has an unconventional parameter list).
|
||||
With @option{-mstdmain}, GCC will link your program against startup
|
||||
code that assumes a C99-style interface to @code{main}, including a
|
||||
local copy of @code{argv} strings.
|
||||
|
||||
@end table
|
||||
|
||||
@node System V Options
|
||||
|
Loading…
Reference in New Issue
Block a user