diff options
author | kan <kan@FreeBSD.org> | 2003-02-10 05:41:50 +0000 |
---|---|---|
committer | kan <kan@FreeBSD.org> | 2003-02-10 05:41:50 +0000 |
commit | 793833d7a78bb624965885760593495e7079d705 (patch) | |
tree | f843ff90d71b900271088361ed96ff82eb2a365d /contrib/gcc/config/rs6000 | |
parent | 1b04fed26051ebc88f26a7bb93c63c270970e773 (diff) | |
download | FreeBSD-src-793833d7a78bb624965885760593495e7079d705.zip FreeBSD-src-793833d7a78bb624965885760593495e7079d705.tar.gz |
Gcc 3.2.2-release.
Diffstat (limited to 'contrib/gcc/config/rs6000')
-rw-r--r-- | contrib/gcc/config/rs6000/linux.h | 46 | ||||
-rw-r--r-- | contrib/gcc/config/rs6000/rs6000-protos.h | 1 | ||||
-rw-r--r-- | contrib/gcc/config/rs6000/rs6000.c | 116 | ||||
-rw-r--r-- | contrib/gcc/config/rs6000/rs6000.md | 161 | ||||
-rw-r--r-- | contrib/gcc/config/rs6000/rtems.h | 7 | ||||
-rw-r--r-- | contrib/gcc/config/rs6000/sysv4.h | 18 | ||||
-rw-r--r-- | contrib/gcc/config/rs6000/t-aix43 | 2 | ||||
-rw-r--r-- | contrib/gcc/config/rs6000/t-rtems | 86 |
8 files changed, 361 insertions, 76 deletions
diff --git a/contrib/gcc/config/rs6000/linux.h b/contrib/gcc/config/rs6000/linux.h index 99c0453..f5cbd7a 100644 --- a/contrib/gcc/config/rs6000/linux.h +++ b/contrib/gcc/config/rs6000/linux.h @@ -1,7 +1,7 @@ /* Definitions of target machine for GNU compiler, for powerpc machines running Linux. - Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, - Inc. + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003 + Free Software Foundation, Inc. Contributed by Michael Meissner (meissner@cygnus.com). This file is part of GNU CC. @@ -91,12 +91,34 @@ enum { SIGNAL_FRAMESIZE = 64 }; long new_cfa_; \ int i_; \ \ - /* li r0, 0x7777; sc (rt_sigreturn) */ \ - /* li r0, 0x6666; sc (sigreturn) */ \ - if (((*(unsigned int *) (pc_+0) == 0x38007777) \ - || (*(unsigned int *) (pc_+0) == 0x38006666)) \ - && (*(unsigned int *) (pc_+4) == 0x44000002)) \ - sc_ = (CONTEXT)->cfa + SIGNAL_FRAMESIZE; \ + /* li r0, 0x7777; sc (sigreturn old) */ \ + /* li r0, 0x0077; sc (sigreturn new) */ \ + /* li r0, 0x6666; sc (rt_sigreturn old) */ \ + /* li r0, 0x00AC; sc (rt_sigreturn new) */ \ + if (*(unsigned int *) (pc_+4) != 0x44000002) \ + break; \ + if (*(unsigned int *) (pc_+0) == 0x38007777 \ + || *(unsigned int *) (pc_+0) == 0x38000077) \ + { \ + struct sigframe { \ + char gap[SIGNAL_FRAMESIZE]; \ + struct sigcontext sigctx; \ + } *rt_ = (CONTEXT)->cfa; \ + sc_ = &rt_->sigctx; \ + } \ + else if (*(unsigned int *) (pc_+0) == 0x38006666 \ + || *(unsigned int *) (pc_+0) == 0x380000AC) \ + { \ + struct rt_sigframe { \ + char gap[SIGNAL_FRAMESIZE]; \ + unsigned long _unused[2]; \ + struct siginfo *pinfo; \ + void *puc; \ + struct siginfo info; \ + struct ucontext uc; \ + } *rt_ = (CONTEXT)->cfa; \ + sc_ = &rt_->uc.uc_mcontext; \ + } \ else \ break; \ \ @@ -119,11 +141,13 @@ enum { SIGNAL_FRAMESIZE = 64 }; \ /* The unwinder expects the IP to point to the following insn, \ whereas the kernel returns the address of the actual \ - faulting insn. */ \ - sc_->regs->nip += 4; \ + faulting insn. We store NIP+4 in an unused register slot to \ + get the same result for multiple evaluation of the same signal \ + frame. */ \ + sc_->regs->gpr[47] = sc_->regs->nip + 4; \ (FS)->regs.reg[CR0_REGNO].how = REG_SAVED_OFFSET; \ (FS)->regs.reg[CR0_REGNO].loc.offset \ - = (long)&(sc_->regs->nip) - new_cfa_; \ + = (long)&(sc_->regs->gpr[47]) - new_cfa_; \ (FS)->retaddr_column = CR0_REGNO; \ goto SUCCESS; \ } while (0) diff --git a/contrib/gcc/config/rs6000/rs6000-protos.h b/contrib/gcc/config/rs6000/rs6000-protos.h index 19aeb07..f6024ec 100644 --- a/contrib/gcc/config/rs6000/rs6000-protos.h +++ b/contrib/gcc/config/rs6000/rs6000-protos.h @@ -77,6 +77,7 @@ extern int constant_pool_expr_p PARAMS ((rtx)); extern int toc_relative_expr_p PARAMS ((rtx)); extern int expand_block_move PARAMS ((rtx[])); extern int load_multiple_operation PARAMS ((rtx, enum machine_mode)); +extern const char * rs6000_output_load_multiple PARAMS ((rtx[])); extern int store_multiple_operation PARAMS ((rtx, enum machine_mode)); extern int branch_comparison_operator PARAMS ((rtx, enum machine_mode)); extern int branch_positive_comparison_operator diff --git a/contrib/gcc/config/rs6000/rs6000.c b/contrib/gcc/config/rs6000/rs6000.c index 2adb119..89808cc 100644 --- a/contrib/gcc/config/rs6000/rs6000.c +++ b/contrib/gcc/config/rs6000/rs6000.c @@ -1,6 +1,6 @@ /* Subroutines used for code generation on IBM RS/6000. Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - 2000, 2001, 2002 Free Software Foundation, Inc. + 2000, 2001, 2002, 2003 Free Software Foundation, Inc. Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu) This file is part of GNU CC. @@ -77,6 +77,9 @@ int rs6000_altivec_abi; /* Set to non-zero once AIX common-mode calls have been defined. */ static int common_mode_defined; +/* Private copy of original value of flag_pic for ABI_AIX. */ +static int rs6000_flag_pic; + /* Save information from a "cmpxx" operation until the branch or scc is emitted. */ rtx rs6000_compare_op0, rs6000_compare_op1; @@ -152,6 +155,7 @@ static void rs6000_elf_asm_out_destructor PARAMS ((rtx, int)); #ifdef OBJECT_FORMAT_COFF static void xcoff_asm_named_section PARAMS ((const char *, unsigned int)); #endif +static bool rs6000_binds_local_p PARAMS ((tree)); static int rs6000_adjust_cost PARAMS ((rtx, rtx, rtx, int)); static int rs6000_adjust_priority PARAMS ((rtx, int)); static int rs6000_issue_rate PARAMS ((void)); @@ -484,11 +488,8 @@ rs6000_override_options (default_cpu) if (flag_pic != 0 && DEFAULT_ABI == ABI_AIX) { + rs6000_flag_pic = flag_pic; flag_pic = 0; - - if (extra_warnings) - warning ("-f%s ignored (all code is position independent)", - (flag_pic > 1) ? "PIC" : "pic"); } #ifdef XCOFF_DEBUGGING_INFO @@ -5220,6 +5221,64 @@ store_multiple_operation (op, mode) return 1; } +/* Return a string to perform a load_multiple operation. + operands[0] is the vector. + operands[1] is the source address. + operands[2] is the first destination register. */ + +const char * +rs6000_output_load_multiple (operands) + rtx operands[3]; +{ + /* We have to handle the case where the pseudo used to contain the address + is assigned to one of the output registers. */ + int i, j; + int words = XVECLEN (operands[0], 0); + rtx xop[10]; + + if (XVECLEN (operands[0], 0) == 1) + return "{l|lwz} %2,0(%1)"; + + for (i = 0; i < words; i++) + if (refers_to_regno_p (REGNO (operands[2]) + i, + REGNO (operands[2]) + i + 1, operands[1], 0)) + { + if (i == words-1) + { + xop[0] = GEN_INT (4 * (words-1)); + xop[1] = operands[1]; + xop[2] = operands[2]; + output_asm_insn ("{lsi|lswi} %2,%1,%0\n\t{l|lwz} %1,%0(%1)", xop); + return ""; + } + else if (i == 0) + { + xop[0] = GEN_INT (4 * (words-1)); + xop[1] = operands[1]; + xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + 1); + output_asm_insn ("{cal %1,4(%1)|addi %1,%1,4}\n\t{lsi|lswi} %2,%1,%0\n\t{l|lwz} %1,-4(%1)", xop); + return ""; + } + else + { + for (j = 0; j < words; j++) + if (j != i) + { + xop[0] = GEN_INT (j * 4); + xop[1] = operands[1]; + xop[2] = gen_rtx_REG (SImode, REGNO (operands[2]) + j); + output_asm_insn ("{l|lwz} %2,%0(%1)", xop); + } + xop[0] = GEN_INT (i * 4); + xop[1] = operands[1]; + output_asm_insn ("{l|lwz} %1,%0(%1)", xop); + return ""; + } + } + + return "{lsi|lswi} %2,%1,%N0"; +} + /* Return 1 for a parallel vrsave operation. */ int @@ -10881,7 +10940,45 @@ rs6000_unique_section (decl, reloc) DECL_SECTION_NAME (decl) = build_string (len, string); } - + +static bool +rs6000_binds_local_p (exp) + tree exp; +{ + bool local_p; + tree attr; + + /* A non-decl is an entry in the constant pool. */ + if (!DECL_P (exp)) + local_p = true; + /* Static variables are always local. */ + else if (! TREE_PUBLIC (exp)) + local_p = true; + /* Otherwise, variables defined outside this object may not be local. */ + else if (DECL_EXTERNAL (exp)) + local_p = false; + /* Linkonce and weak data are never local. */ + else if (DECL_ONE_ONLY (exp) || DECL_WEAK (exp)) + local_p = false; + /* If PIC, then assume that any global name can be overridden by + * symbols resolved from other modules. */ + else if (flag_pic || rs6000_flag_pic) + local_p = false; + /* Uninitialized COMMON variable may be unified with symbols + * resolved from other modules. */ + else if (DECL_COMMON (exp) + && (DECL_INITIAL (exp) == NULL + || DECL_INITIAL (exp) == error_mark_node)) + local_p = false; + /* Otherwise we're left with initialized (or non-common) global data + * which is of necessity defined locally. */ + else + local_p = true; + + return local_p; +} + + /* If we are referencing a function that is static or is known to be in this file, make the SYMBOL_REF special. We can use this to indicate that we can branch to this function without emitting a no-op after the @@ -10897,8 +10994,7 @@ rs6000_encode_section_info (decl) if (TREE_CODE (decl) == FUNCTION_DECL) { rtx sym_ref = XEXP (DECL_RTL (decl), 0); - if ((TREE_ASM_WRITTEN (decl) || ! TREE_PUBLIC (decl)) - && ! DECL_WEAK (decl)) + if (rs6000_binds_local_p (decl)) SYMBOL_REF_FLAG (sym_ref) = 1; if (DEFAULT_ABI == ABI_AIX) @@ -10917,11 +11013,15 @@ rs6000_encode_section_info (decl) && DEFAULT_ABI == ABI_V4 && TREE_CODE (decl) == VAR_DECL) { + rtx sym_ref = XEXP (DECL_RTL (decl), 0); int size = int_size_in_bytes (TREE_TYPE (decl)); tree section_name = DECL_SECTION_NAME (decl); const char *name = (char *)0; int len = 0; + if (rs6000_binds_local_p (decl)) + SYMBOL_REF_FLAG (sym_ref) = 1; + if (section_name) { if (TREE_CODE (section_name) == STRING_CST) diff --git a/contrib/gcc/config/rs6000/rs6000.md b/contrib/gcc/config/rs6000/rs6000.md index 6e86d73..ec16c19 100644 --- a/contrib/gcc/config/rs6000/rs6000.md +++ b/contrib/gcc/config/rs6000/rs6000.md @@ -8734,65 +8734,120 @@ adjust_address (op1, SImode, i * 4)); }") -(define_insn "" +(define_insn "*ldmsi8" [(match_parallel 0 "load_multiple_operation" - [(set (match_operand:SI 1 "gpc_reg_operand" "=r") - (mem:SI (match_operand:SI 2 "gpc_reg_operand" "b")))])] - "TARGET_STRING" + [(set (match_operand:SI 2 "gpc_reg_operand" "") + (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b"))) + (set (match_operand:SI 3 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 4)))) + (set (match_operand:SI 4 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 8)))) + (set (match_operand:SI 5 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 12)))) + (set (match_operand:SI 6 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 16)))) + (set (match_operand:SI 7 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 20)))) + (set (match_operand:SI 8 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 24)))) + (set (match_operand:SI 9 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 28))))])] + "TARGET_STRING && XVECLEN (operands[0], 0) == 8" "* -{ - /* We have to handle the case where the pseudo used to contain the address - is assigned to one of the output registers. */ - int i, j; - int words = XVECLEN (operands[0], 0); - rtx xop[10]; +{ return rs6000_output_load_multiple (operands); }" + [(set_attr "type" "load") + (set_attr "length" "32")]) - if (XVECLEN (operands[0], 0) == 1) - return \"{l|lwz} %1,0(%2)\"; +(define_insn "*ldmsi7" + [(match_parallel 0 "load_multiple_operation" + [(set (match_operand:SI 2 "gpc_reg_operand" "") + (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b"))) + (set (match_operand:SI 3 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 4)))) + (set (match_operand:SI 4 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 8)))) + (set (match_operand:SI 5 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 12)))) + (set (match_operand:SI 6 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 16)))) + (set (match_operand:SI 7 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 20)))) + (set (match_operand:SI 8 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 24))))])] + "TARGET_STRING && XVECLEN (operands[0], 0) == 7" + "* +{ return rs6000_output_load_multiple (operands); }" + [(set_attr "type" "load") + (set_attr "length" "32")]) - for (i = 0; i < words; i++) - if (refers_to_regno_p (REGNO (operands[1]) + i, - REGNO (operands[1]) + i + 1, operands[2], 0)) - { - if (i == words-1) - { - xop[0] = operands[1]; - xop[1] = operands[2]; - xop[2] = GEN_INT (4 * (words-1)); - output_asm_insn (\"{lsi|lswi} %0,%1,%2\;{l|lwz} %1,%2(%1)\", xop); - return \"\"; - } - else if (i == 0) - { - xop[0] = operands[1]; - xop[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1); - xop[2] = GEN_INT (4 * (words-1)); - output_asm_insn (\"{cal %0,4(%0)|addi %0,%0,4}\;{lsi|lswi} %1,%0,%2\;{l|lwz} %0,-4(%0)\", xop); - return \"\"; - } - else - { - for (j = 0; j < words; j++) - if (j != i) - { - xop[0] = gen_rtx_REG (SImode, REGNO (operands[1]) + j); - xop[1] = operands[2]; - xop[2] = GEN_INT (j * 4); - output_asm_insn (\"{l|lwz} %0,%2(%1)\", xop); - } - xop[0] = operands[2]; - xop[1] = GEN_INT (i * 4); - output_asm_insn (\"{l|lwz} %0,%1(%0)\", xop); - return \"\"; - } - } +(define_insn "*ldmsi6" + [(match_parallel 0 "load_multiple_operation" + [(set (match_operand:SI 2 "gpc_reg_operand" "") + (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b"))) + (set (match_operand:SI 3 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 4)))) + (set (match_operand:SI 4 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 8)))) + (set (match_operand:SI 5 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 12)))) + (set (match_operand:SI 6 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 16)))) + (set (match_operand:SI 7 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 20))))])] + "TARGET_STRING && XVECLEN (operands[0], 0) == 6" + "* +{ return rs6000_output_load_multiple (operands); }" + [(set_attr "type" "load") + (set_attr "length" "32")]) - return \"{lsi|lswi} %1,%2,%N0\"; -}" +(define_insn "*ldmsi5" + [(match_parallel 0 "load_multiple_operation" + [(set (match_operand:SI 2 "gpc_reg_operand" "") + (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b"))) + (set (match_operand:SI 3 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 4)))) + (set (match_operand:SI 4 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 8)))) + (set (match_operand:SI 5 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 12)))) + (set (match_operand:SI 6 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 16))))])] + "TARGET_STRING && XVECLEN (operands[0], 0) == 5" + "* +{ return rs6000_output_load_multiple (operands); }" + [(set_attr "type" "load") + (set_attr "length" "32")]) + +(define_insn "*ldmsi4" + [(match_parallel 0 "load_multiple_operation" + [(set (match_operand:SI 2 "gpc_reg_operand" "") + (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b"))) + (set (match_operand:SI 3 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 4)))) + (set (match_operand:SI 4 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 8)))) + (set (match_operand:SI 5 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 12))))])] + "TARGET_STRING && XVECLEN (operands[0], 0) == 4" + "* +{ return rs6000_output_load_multiple (operands); }" + [(set_attr "type" "load") + (set_attr "length" "32")]) + +(define_insn "*ldmsi3" + [(match_parallel 0 "load_multiple_operation" + [(set (match_operand:SI 2 "gpc_reg_operand" "") + (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b"))) + (set (match_operand:SI 3 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 4)))) + (set (match_operand:SI 4 "gpc_reg_operand" "") + (mem:SI (plus:SI (match_dup 1) (const_int 8))))])] + "TARGET_STRING && XVECLEN (operands[0], 0) == 3" + "* +{ return rs6000_output_load_multiple (operands); }" [(set_attr "type" "load") (set_attr "length" "32")]) - (define_expand "store_multiple" [(match_par_dup 3 [(set (match_operand:SI 0 "" "") (match_operand:SI 1 "" "")) @@ -8837,7 +8892,7 @@ gen_rtx_REG (SImode, regno + i)); }") -(define_insn "" +(define_insn "*store_multiple_power" [(match_parallel 0 "store_multiple_operation" [(set (match_operand:SI 1 "indirect_operand" "=Q") (match_operand:SI 2 "gpc_reg_operand" "r")) @@ -8846,7 +8901,7 @@ "{stsi|stswi} %2,%P1,%O0" [(set_attr "type" "store")]) -(define_insn "" +(define_insn "*store_multiple_string" [(match_parallel 0 "store_multiple_operation" [(set (mem:SI (match_operand:SI 1 "gpc_reg_operand" "b")) (match_operand:SI 2 "gpc_reg_operand" "r")) diff --git a/contrib/gcc/config/rs6000/rtems.h b/contrib/gcc/config/rs6000/rtems.h index aa68130..cc8295a 100644 --- a/contrib/gcc/config/rs6000/rtems.h +++ b/contrib/gcc/config/rs6000/rtems.h @@ -1,5 +1,5 @@ /* Definitions for rtems targeting a PowerPC using elf. - Copyright (C) 1996, 1997, 2000, 2001, 2002 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. Contributed by Joel Sherrill (joel@OARcorp.com). This file is part of GNU CC. @@ -22,5 +22,8 @@ Boston, MA 02111-1307, USA. */ /* Specify predefined symbols in preprocessor. */ #undef CPP_PREDEFINES -#define CPP_PREDEFINES "-DPPC -D__rtems__ \ +#define CPP_PREDEFINES "-DPPC -D__rtems__ -D__USE_INIT_FINI__ \ -Asystem=rtems -Acpu=powerpc -Amachine=powerpc" + +#undef CPP_OS_DEFAULT_SPEC +#define CPP_OS_DEFAULT_SPEC "%(cpp_os_rtems)" diff --git a/contrib/gcc/config/rs6000/sysv4.h b/contrib/gcc/config/rs6000/sysv4.h index 635e926..ecc37ee 100644 --- a/contrib/gcc/config/rs6000/sysv4.h +++ b/contrib/gcc/config/rs6000/sysv4.h @@ -1,5 +1,5 @@ /* Target definitions for GNU compiler for PowerPC running System V.4 - Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001 + Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003 Free Software Foundation, Inc. Contributed by Cygnus Support. @@ -1318,6 +1318,21 @@ ncrtn.o%s" #define CPP_OS_NETBSD_SPEC "\ -D__powerpc__ -D__NetBSD__ -D__ELF__ -D__KPRINTF_ATTRIBUTE__" +/* RTEMS support. */ + +#define CPP_OS_RTEMS_SPEC "\ +%{!mcpu*: %{!Dppc*: %{!Dmpc*: -Dmpc750} } }\ +%{mcpu=403: %{!Dppc*: %{!Dmpc*: -Dppc403} } } \ +%{mcpu=505: %{!Dppc*: %{!Dmpc*: -Dmpc505} } } \ +%{mcpu=601: %{!Dppc*: %{!Dmpc*: -Dppc601} } } \ +%{mcpu=602: %{!Dppc*: %{!Dmpc*: -Dppc602} } } \ +%{mcpu=603: %{!Dppc*: %{!Dmpc*: -Dppc603} } } \ +%{mcpu=603e: %{!Dppc*: %{!Dmpc*: -Dppc603e} } } \ +%{mcpu=604: %{!Dppc*: %{!Dmpc*: -Dmpc604} } } \ +%{mcpu=750: %{!Dppc*: %{!Dmpc*: -Dmpc750} } } \ +%{mcpu=821: %{!Dppc*: %{!Dmpc*: -Dmpc821} } } \ +%{mcpu=860: %{!Dppc*: %{!Dmpc*: -Dmpc860} } }" + /* VxWorks support. */ /* VxWorks does all the library stuff itself. */ #define LIB_VXWORKS_SPEC "" @@ -1439,6 +1454,7 @@ ncrtn.o%s" { "cpp_os_linux", CPP_OS_LINUX_SPEC }, \ { "cpp_os_netbsd", CPP_OS_NETBSD_SPEC }, \ { "cpp_os_vxworks", CPP_OS_VXWORKS_SPEC }, \ + { "cpp_os_rtems", CPP_OS_RTEMS_SPEC }, \ { "cpp_os_default", CPP_OS_DEFAULT_SPEC }, /* Define this macro as a C expression for the initializer of an diff --git a/contrib/gcc/config/rs6000/t-aix43 b/contrib/gcc/config/rs6000/t-aix43 index 7be8ebc..9bbfe00 100644 --- a/contrib/gcc/config/rs6000/t-aix43 +++ b/contrib/gcc/config/rs6000/t-aix43 @@ -58,7 +58,7 @@ SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \ rm -f @multilib_dir@/shr.o # $(slibdir) double quoted to protect it from expansion while building # libgcc.mk. We want this delayed until actual install time. -SHLIB_INSTALL = $(INSTALL_DATA) @shlib_base_name@.a $$(slibdir)/ +SHLIB_INSTALL = $(INSTALL_DATA) @shlib_base_name@.a $$(DESTDIR)$$(slibdir)/ SHLIB_LIBS = -lc `case @shlib_base_name@ in *pthread*) echo -lpthread ;; esac` SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver diff --git a/contrib/gcc/config/rs6000/t-rtems b/contrib/gcc/config/rs6000/t-rtems new file mode 100644 index 0000000..364a22d --- /dev/null +++ b/contrib/gcc/config/rs6000/t-rtems @@ -0,0 +1,86 @@ +# Multilibs for powerpc RTEMS targets. + +MULTILIB_OPTIONS = \ +mcpu=403/mcpu=505/mcpu=601/mcpu=602/mcpu=603/mcpu=603e/mcpu=604/mcpu=750/mcpu=821/mcpu=860 \ +Dmpc509/Dmpc8260 \ +D_OLD_EXCEPTIONS \ +msoft-float + +MULTILIB_DIRNAMES = \ +m403 m505 m601 m602 m603 m603e m604 m750 m821 m860 \ +mpc509 \ +mpc8260 \ +roe \ +nof + +MULTILIB_EXTRA_OPTS = mrelocatable-lib mno-eabi mstrict-align + +# MULTILIB_MATCHES = ${MULTILIB_MATCHES_FLOAT} +MULTILIB_MATCHES = ${MULTILIB_MATCHES_ENDIAN} \ + ${MULTILIB_MATCHES_SYSV} \ + mcpu?505/Dmpc505=mcpu?505/Dmpc509 + +# +# RTEMS old/new-exceptions handling +# +# old-exception processing is depredicated, therefore +# +# * Cpu-variants supporting new exception processing are build +# with new exception processing only +# * Cpu-variants not having been ported to new exception processing are +# build with old and new exception processing +# + +# Cpu-variants supporting new exception processing only +MULTILIB_NEW_EXCEPTIONS_ONLY = \ +*mcpu=604*/*D_OLD_EXCEPTIONS* \ +*mcpu=750*/*D_OLD_EXCEPTIONS* \ +*mcpu=821*/*D_OLD_EXCEPTIONS* \ +*Dmpc8260*/*D_OLD_EXCEPTIONS* \ +*mcpu=860*/*D_OLD_EXCEPTIONS* + +# Soft-float only, default implies msoft-float +# NOTE: Must match with MULTILIB_MATCHES_FLOAT and MULTILIB_MATCHES +MULTILIB_SOFTFLOAT_ONLY = \ +mcpu=403/*msoft-float* \ +mcpu=821/*msoft-float* \ +mcpu=860/*msoft-float* + +# Hard-float only, take out msoft-float +MULTILIB_HARDFLOAT_ONLY = \ +mcpu=505/*msoft-float* + +MULTILIB_EXCEPTIONS = + +# Disallow -D_OLD_EXCEPTIONS without other options +MULTILIB_EXCEPTIONS += D_OLD_EXCEPTIONS* + +# Disallow -Dppc and -Dmpc without other options +MULTILIB_EXCEPTIONS += Dppc* Dmpc* + +MULTILIB_EXCEPTIONS += \ +${MULTILIB_NEW_EXCEPTIONS_ONLY} \ +${MULTILIB_SOFTFLOAT_ONLY} \ +${MULTILIB_HARDFLOAT_ONLY} + +# Special rules +# Take out all variants we don't want +MULTILIB_EXCEPTIONS += mcpu=403/Dmpc509* +MULTILIB_EXCEPTIONS += mcpu=403/Dmpc8260* +MULTILIB_EXCEPTIONS += mcpu=505/Dmpc509* +MULTILIB_EXCEPTIONS += mcpu=505/Dmpc8260* +MULTILIB_EXCEPTIONS += mcpu=601/Dmpc509* +MULTILIB_EXCEPTIONS += mcpu=601/Dmpc8260* +MULTILIB_EXCEPTIONS += mcpu=602/Dmpc509* +MULTILIB_EXCEPTIONS += mcpu=602/Dmpc8260* +MULTILIB_EXCEPTIONS += mcpu=603/Dmpc509* +MULTILIB_EXCEPTIONS += mcpu=603/Dmpc8260* +MULTILIB_EXCEPTIONS += mcpu=603e/Dmpc509* +MULTILIB_EXCEPTIONS += mcpu=604/Dmpc509* +MULTILIB_EXCEPTIONS += mcpu=604/Dmpc8260* +MULTILIB_EXCEPTIONS += mcpu=750/Dmpc509* +MULTILIB_EXCEPTIONS += mcpu=750/Dmpc8260* +MULTILIB_EXCEPTIONS += mcpu=821/Dmpc509* +MULTILIB_EXCEPTIONS += mcpu=821/Dmpc8260* +MULTILIB_EXCEPTIONS += mcpu=860/Dmpc509* +MULTILIB_EXCEPTIONS += mcpu=860/Dmpc8260* |