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:
Sa Liu 2006-12-11 00:53:42 +00:00 committed by Ben Elliston
parent ea6f5c57de
commit cc8d70cd9d
9 changed files with 40 additions and 295 deletions

View File

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

View File

@ -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) );
}

View File

@ -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) };

View File

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

View File

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

View File

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

View File

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

View File

@ -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) \

View File

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