diff options
author | Richard Sandiford <richard@codesourcery.com> | 2007-04-25 08:03:55 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2007-04-25 08:03:55 +0000 |
commit | f5c7290e1e8e7401914ebcabff4f39067e5d8220 (patch) | |
tree | 3218b549c5120e1652fb8409aa7b2f31cf5b69e3 /gcc | |
parent | 3a35ee02c8c7a390a393085ecd66814c3debc47b (diff) | |
download | gcc-f5c7290e1e8e7401914ebcabff4f39067e5d8220.zip gcc-f5c7290e1e8e7401914ebcabff4f39067e5d8220.tar.gz gcc-f5c7290e1e8e7401914ebcabff4f39067e5d8220.tar.bz2 |
config.gcc (sh-wrs-vxworks): Don't include dbxelf.h.
gcc/
* config.gcc (sh-wrs-vxworks): Don't include dbxelf.h. Include
sh/elf.h, vx-common.h and vxworks.h.
* config/sh/sh.h: Include config/vxworks-dummy.h.
(SUBTARGET_OVERRIDE_OPTIONS): Define.
(OVERRIDE_OPTIONS): Use it.
* config/sh/sh.md (GOTaddr2picreg): Add suport for VxWorks RTPs.
(vxworks_picreg): New pattern.
* config/sh/vxworks.h (TARGET_OS_CPP_BUILTINS): Use
VXWORKS_OS_CPP_BUILTINS.
(LIB_SPEC, LINK_SPEC, STARTFILE_SPEC, ENDFILE_SPEC): Redefine
to their VXWORKS_* equivalents.
(SUBTARGET_OVERRIDE_OPTIONS, SUBTARGET_CPP_SPEC): Define.
(SUBTARGET_LINK_EMUL_SUFFIX, FUNCTION_PROFILER): Define.
* config/sh/lib1funcs.asm (NO_FPSCR_VALUES): Define for VxWorks PIC.
(set_fpscr, ic_invalidate): Add VxWorks PIC sequences.
* config/sh/t-vxworks (MULTILIB_OPTIONS): Add m4a, -mrtp and
-mrtp/-fPIC multilibs.
(MULTILIB_EXCEPTIONS): Generalize globs accordingly.
(MULTILIB_MATCHES, EXTRA_MULTILIB_PARTS): Define.
(MULTILIB_OSDIRNAMES): Delete.
From-SVN: r124145
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 23 | ||||
-rw-r--r-- | gcc/config.gcc | 2 | ||||
-rw-r--r-- | gcc/config/sh/lib1funcs.asm | 47 | ||||
-rw-r--r-- | gcc/config/sh/sh.h | 5 | ||||
-rw-r--r-- | gcc/config/sh/sh.md | 23 | ||||
-rw-r--r-- | gcc/config/sh/t-vxworks | 14 | ||||
-rw-r--r-- | gcc/config/sh/vxworks.h | 51 |
7 files changed, 128 insertions, 37 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8da90b3..f822391 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,26 @@ +2007-04-25 Richard Sandiford <richard@codesourcery.com> + + * config.gcc (sh-wrs-vxworks): Don't include dbxelf.h. Include + sh/elf.h, vx-common.h and vxworks.h. + * config/sh/sh.h: Include config/vxworks-dummy.h. + (SUBTARGET_OVERRIDE_OPTIONS): Define. + (OVERRIDE_OPTIONS): Use it. + * config/sh/sh.md (GOTaddr2picreg): Add suport for VxWorks RTPs. + (vxworks_picreg): New pattern. + * config/sh/vxworks.h (TARGET_OS_CPP_BUILTINS): Use + VXWORKS_OS_CPP_BUILTINS. + (LIB_SPEC, LINK_SPEC, STARTFILE_SPEC, ENDFILE_SPEC): Redefine + to their VXWORKS_* equivalents. + (SUBTARGET_OVERRIDE_OPTIONS, SUBTARGET_CPP_SPEC): Define. + (SUBTARGET_LINK_EMUL_SUFFIX, FUNCTION_PROFILER): Define. + * config/sh/lib1funcs.asm (NO_FPSCR_VALUES): Define for VxWorks PIC. + (set_fpscr, ic_invalidate): Add VxWorks PIC sequences. + * config/sh/t-vxworks (MULTILIB_OPTIONS): Add m4a, -mrtp and + -mrtp/-fPIC multilibs. + (MULTILIB_EXCEPTIONS): Generalize globs accordingly. + (MULTILIB_MATCHES, EXTRA_MULTILIB_PARTS): Define. + (MULTILIB_OSDIRNAMES): Delete. + 2007-04-25 Anatoly Sokolov <aesok@post.ru> PR target/18989 diff --git a/gcc/config.gcc b/gcc/config.gcc index 055503f..31b10d4 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -2236,7 +2236,7 @@ sh-*-rtems*) ;; sh-wrs-vxworks) tmake_file="$tmake_file sh/t-sh sh/t-elf sh/t-vxworks" - tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/embed-elf.h sh/vxworks.h" + tm_file="${tm_file} elfos.h svr4.h sh/elf.h sh/embed-elf.h vx-common.h vxworks.h sh/vxworks.h" ;; sh-*-*) tm_file="${tm_file} dbxcoff.h sh/coff.h" diff --git a/gcc/config/sh/lib1funcs.asm b/gcc/config/sh/lib1funcs.asm index 466b890..b4c5289 100644 --- a/gcc/config/sh/lib1funcs.asm +++ b/gcc/config/sh/lib1funcs.asm @@ -40,6 +40,13 @@ Boston, MA 02110-1301, USA. */ #include "lib1funcs.h" +/* t-vxworks needs to build both PIC and non-PIC versions of libgcc, + so it is more convenient to define NO_FPSCR_VALUES here than to + define it on the command line. */ +#if defined __vxworks && defined __PIC__ +#define NO_FPSCR_VALUES +#endif + #if ! __SH5__ #ifdef L_ashiftrt .global GLOBAL(ashiftrt_r4_0) @@ -1967,9 +1974,16 @@ GLOBAL(set_fpscr): lds r4,fpscr #ifdef __PIC__ mov.l r12,@-r15 +#ifdef __vxworks + mov.l LOCAL(set_fpscr_L0_base),r12 + mov.l LOCAL(set_fpscr_L0_index),r0 + mov.l @r12,r12 + mov.l @(r0,r12),r12 +#else mova LOCAL(set_fpscr_L0),r0 mov.l LOCAL(set_fpscr_L0),r12 add r0,r12 +#endif mov.l LOCAL(set_fpscr_L1),r0 mov.l @(r0,r12),r1 mov.l @r15+,r12 @@ -2004,8 +2018,15 @@ GLOBAL(set_fpscr): #endif .align 2 #ifdef __PIC__ +#ifdef __vxworks +LOCAL(set_fpscr_L0_base): + .long ___GOTT_BASE__ +LOCAL(set_fpscr_L0_index): + .long ___GOTT_INDEX__ +#else LOCAL(set_fpscr_L0): .long _GLOBAL_OFFSET_TABLE_ +#endif LOCAL(set_fpscr_L1): .long GLOBAL(fpscr_values@GOT) #else @@ -2080,12 +2101,22 @@ GLOBAL(ic_invalidate): .global GLOBAL(ic_invalidate) HIDDEN_FUNC(GLOBAL(ic_invalidate)) GLOBAL(ic_invalidate): - mov.l 0f,r1 #ifdef __pic__ - mova 0f,r0 - mov.l 1f,r2 +#ifdef __vxworks + mov.l 1f,r1 + mov.l 2f,r0 + mov.l @r1,r1 + mov.l 0f,r2 + mov.l @(r0,r1),r0 +#else + mov.l 1f,r1 + mova 1f,r0 + mov.l 0f,r2 add r1,r0 +#endif mov.l @(r0,r2),r1 +#else + mov.l 0f,r1 #endif ocbwb @r4 mov.l @(8,r1),r0 @@ -2098,9 +2129,13 @@ GLOBAL(ic_invalidate): 0: .long GLOBAL(ic_invalidate_array) #else /* __pic__ */ .global GLOBAL(ic_invalidate_array) - /* ??? Why won't the assembler allow to add these two constants? */ -0: .long _GLOBAL_OFFSET_TABLE_ -1: .long GLOBAL(ic_invalidate_array)@GOT +0: .long GLOBAL(ic_invalidate_array)@GOT +#ifdef __vxworks +1: .long ___GOTT_BASE__ +2: .long ___GOTT_INDEX__ +#else +1: .long _GLOBAL_OFFSET_TABLE_ +#endif ENDFUNC(GLOBAL(ic_invalidate)) #endif /* __pic__ */ #endif /* SH4 */ diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h index 2b208d2..4665f38 100644 --- a/gcc/config/sh/sh.h +++ b/gcc/config/sh/sh.h @@ -24,6 +24,8 @@ Boston, MA 02110-1301, USA. */ #ifndef GCC_SH_H #define GCC_SH_H +#include "config/vxworks-dummy.h" + #define TARGET_VERSION \ fputs (" (Hitachi SH)", stderr); @@ -530,10 +532,13 @@ extern enum sh_divide_strategy_e sh_div_strategy; #define SH_DIV_STRATEGY_DEFAULT SH_DIV_CALL #endif +#define SUBTARGET_OVERRIDE_OPTIONS (void) 0 + #define OVERRIDE_OPTIONS \ do { \ int regno; \ \ + SUBTARGET_OVERRIDE_OPTIONS; \ if (flag_finite_math_only == 2) \ flag_finite_math_only \ = !flag_signaling_nans && TARGET_SH2E && ! TARGET_IEEE; \ diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md index 8d64505..455a238 100644 --- a/gcc/config/sh/sh.md +++ b/gcc/config/sh/sh.md @@ -8288,6 +8288,14 @@ label: (set (match_dup 0) (plus:SI (match_dup 0) (reg:SI R0_REG)))] "" " { + if (TARGET_VXWORKS_RTP) + { + rtx gott_base = gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_BASE); + rtx gott_index = gen_rtx_SYMBOL_REF (Pmode, VXWORKS_GOTT_INDEX); + emit_insn (gen_vxworks_picreg (gott_base, gott_index)); + DONE; + } + operands[0] = gen_rtx_REG (Pmode, PIC_REG); operands[1] = gen_rtx_SYMBOL_REF (VOIDmode, GOT_SYMBOL_NAME); @@ -8330,6 +8338,21 @@ label: } ") +;; A helper for GOTaddr2picreg to finish up the initialization of the +;; PIC register. + +(define_expand "vxworks_picreg" + [(set (reg:SI PIC_REG) + (const:SI (unspec:SI [(match_operand:SI 0 "" "")] UNSPEC_PIC))) + (set (reg:SI R0_REG) + (const:SI (unspec:SI [(match_operand:SI 1 "" "")] UNSPEC_PIC))) + (set (reg:SI PIC_REG) + (mem:SI (reg:SI PIC_REG))) + (set (reg:SI PIC_REG) + (mem:SI (plus:SI (reg:SI PIC_REG) + (reg:SI R0_REG))))] + "TARGET_VXWORKS_RTP") + (define_insn "*ptb" [(set (match_operand 0 "target_reg_operand" "=b") (const (unspec [(match_operand 1 "" "Csy")] diff --git a/gcc/config/sh/t-vxworks b/gcc/config/sh/t-vxworks index 85a2114..66aa709 100644 --- a/gcc/config/sh/t-vxworks +++ b/gcc/config/sh/t-vxworks @@ -1,11 +1,9 @@ # Multilibs for VxWorks. -MULTILIB_OPTIONS = m2/m3/m4 ml - -MULTILIB_EXCEPTIONS = ml m2/ml - -MULTILIB_OSDIRNAMES = \ - m2=!SH7600gnu \ - m3=!SH7700gnu m3/ml=!SH7700gnule \ - m4=!SH7750gnu m4/ml=!SH7750gnule +MULTILIB_OPTIONS = mrtp fPIC m2/m3/m4/m4a ml +# Don't build -fPIC without -mrtp, or -ml without -m3/-m4. +MULTILIB_EXCEPTIONS = fPIC* ml* mrtp/ml* mrtp/fPIC/ml* *m2/ml* +MULTILIB_MATCHES = m2=m4-nofpu fPIC=fpic +# Restore a variable from t-vxworks clobbered by t-elf. +EXTRA_MULTILIB_PARTS = diff --git a/gcc/config/sh/vxworks.h b/gcc/config/sh/vxworks.h index 6f52524..63f2bbf 100644 --- a/gcc/config/sh/vxworks.h +++ b/gcc/config/sh/vxworks.h @@ -22,29 +22,36 @@ Boston, MA 02110-1301, USA. */ #define TARGET_OS_CPP_BUILTINS() \ - do { \ - builtin_define ("__vxworks"); \ - builtin_define ("CPU=SH7000"); \ - } while (0) - -/* VxWorks does all the library stuff itself. */ -#undef LIB_SPEC -#define LIB_SPEC "" - -/* VxWorks uses object files, not loadable images. Make the linker just - combine objects. */ -#undef LINK_SPEC -#define LINK_SPEC "-r" - -/* VxWorks provides the functionality of crt0.o and friends itself. */ -#undef STARTFILE_SPEC -#define STARTFILE_SPEC "" - -#undef ENDFILE_SPEC -#define ENDFILE_SPEC "" - -#undef TARGET_VERSION + do \ + { \ + builtin_define ("CPU=SH7000"); \ + VXWORKS_OS_CPP_BUILTINS (); \ + } \ + while (0) + +#undef SUBTARGET_OVERRIDE_OPTIONS +#define SUBTARGET_OVERRIDE_OPTIONS VXWORKS_OVERRIDE_OPTIONS + +#undef SUBTARGET_CPP_SPEC +#define SUBTARGET_CPP_SPEC VXWORKS_ADDITIONAL_CPP_SPEC + +#undef SUBTARGET_LINK_EMUL_SUFFIX +#define SUBTARGET_LINK_EMUL_SUFFIX "_vxworks" + +#undef LIB_SPEC +#define LIB_SPEC VXWORKS_LIB_SPEC +#undef LINK_SPEC +#define LINK_SPEC VXWORKS_LINK_SPEC " " SH_LINK_SPEC +#undef STARTFILE_SPEC +#define STARTFILE_SPEC VXWORKS_STARTFILE_SPEC +#undef ENDFILE_SPEC +#define ENDFILE_SPEC VXWORKS_ENDFILE_SPEC + +#undef TARGET_VERSION #define TARGET_VERSION fputs (" (SH/VxWorks)", stderr); /* There is no default multilib. */ #undef MULTILIB_DEFAULTS + +#undef FUNCTION_PROFILER +#define FUNCTION_PROFILER VXWORKS_FUNCTION_PROFILER |