📄 gcc-20030210-sh-linux-1.patch
字号:
+#if defined(HAVE_LD_EH_FRAME_HDR)+#undef LINK_EH_SPEC+#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "+#endif #undef STARTFILE_SPEC #define STARTFILE_SPEC \@@ -92,4 +127,40 @@ %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} \ %{!p:%{profile:gcrt1.o%s} \ %{!profile:crt1.o%s}}}} \- crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"+ crti.o%s %{static:crtbeginT.o%s}\+ %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}"++#undef FUNCTION_PROFILER+#define FUNCTION_PROFILER(STREAM,LABELNO) \+do \+{ \+ if (flag_pic) \+ { \+ fprintf (STREAM, " mov.l 3f,r1\n"); \+ fprintf (STREAM, " mova 3f,r0\n"); \+ fprintf (STREAM, " add r1,r0\n"); \+ fprintf (STREAM, " mov.l 1f,r1\n"); \+ fprintf (STREAM, " mov.l @(r0,r1),r1\n"); \+ } \+ else \+ { \+ fprintf (STREAM, " mov.l 1f,r1\n"); \+ } \+ fprintf (STREAM, " sts.l pr,@-r15\n"); \+ fprintf (STREAM, " mova 2f,r0\n"); \+ fprintf (STREAM, " jmp @r1\n"); \+ fprintf (STREAM, " lds r0,pr\n"); \+ fprintf (STREAM, " .align 2\n"); \+ if (flag_pic) \+ { \+ fprintf (STREAM, "1: .long mcount@GOT\n"); \+ fprintf (STREAM, "3: .long _GLOBAL_OFFSET_TABLE_\n"); \+ } \+ else \+ { \+ fprintf (STREAM, "1: .long mcount\n"); \+ } \+ fprintf (STREAM, "2: lds.l @r15+,pr\n"); \+} while (0)++#define NO_SHARED_LIBGCC_MULTILIBdiff -ruN gcc-20030210.orig/gcc/config/sh/sh-protos.h gcc-20030210/gcc/config/sh/sh-protos.h--- gcc-20030210.orig/gcc/config/sh/sh-protos.h Fri Feb 22 01:42:28 2002+++ gcc-20030210/gcc/config/sh/sh-protos.h Sat Feb 22 01:40:14 2003@@ -74,6 +74,7 @@ extern int shl_sext_length PARAMS ((rtx)); extern int gen_shl_sext PARAMS ((rtx, rtx, rtx, rtx)); extern rtx gen_datalabel_ref PARAMS ((rtx));+extern int shl_casesi_worker_length PARAMS ((rtx)); extern int regs_used PARAMS ((rtx, int)); extern void fixup_addr_diff_vecs PARAMS ((rtx)); extern int get_dest_uid PARAMS ((rtx, int));diff -ruN gcc-20030210.orig/gcc/config/sh/sh.c gcc-20030210/gcc/config/sh/sh.c--- gcc-20030210.orig/gcc/config/sh/sh.c Fri Feb 22 01:42:28 2002+++ gcc-20030210/gcc/config/sh/sh.c Sat Feb 22 01:40:14 2003@@ -2143,6 +2143,48 @@ return sym; } ++/* Function to be used in the length attribute of the casesi_worker+ instruction. Returns number of instructions, which is half of the+ length of bytes. */++int+shl_casesi_worker_length (insn)+ rtx insn;+{+ rtx set_src, label;+ rtx diff_vec;++ set_src = SET_SRC (XVECEXP (PATTERN (insn), 0, 0));+ if (!(GET_CODE (set_src) == UNSPEC+ && XINT (set_src, 1) == UNSPEC_CASESI))+ abort ();++ label = XVECEXP (set_src, 0, 2);+ if (GET_CODE (label) != LABEL_REF)+ abort ();++ diff_vec = PATTERN (next_real_insn (XEXP (label, 0)));++ if (GET_CODE (diff_vec) != ADDR_DIFF_VEC)+ abort ();++ switch (GET_MODE (diff_vec))+ {+ case SImode:+ return 2;+ case HImode:+ if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned)+ return 3;+ return 2;+ case QImode:+ if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned)+ return 2;+ return 1;+ default:+ abort ();+ }+} /* The SH cannot load a large constant into a register, constants have to come from a pc relative load. The reference of a pc relative load@@ -3190,7 +3232,7 @@ vec_lab = XEXP (XEXP (pat, 0), 0); /* Search the matching casesi_jump_2. */- for (prev = vec_lab; ; prev = PREV_INSN (prev))+ for (prev = vec_lab; prev; prev = PREV_INSN (prev)) { if (GET_CODE (prev) != JUMP_INSN) continue;@@ -3205,6 +3247,13 @@ break; } + if (prev == NULL)+ { /* Switch statement has been optimized out. */+ delete_insn (PREV_INSN (insn));+ delete_insn (insn);+ continue;+ }+ /* Emit the reference label of the braf where it belongs, right after the casesi_jump_2 (i.e. braf). */ braf_label = XEXP (XEXP (SET_SRC (XVECEXP (prevpat, 0, 0)), 1), 0);@@ -3223,7 +3272,7 @@ rtx barrier_or_label; { rtx next = next_real_insn (barrier_or_label), pat, prev;- int slot, credit, jump_to_next;+ int slot, credit, jump_to_next = 0; if (! next) return 0;@@ -4507,7 +4556,8 @@ if (current_function_varargs || current_function_stdarg) { /* This is not used by the SH3E calling convention */- if (TARGET_SH1 && ! TARGET_SH3E && ! TARGET_SH5 && ! TARGET_HITACHI)+ if (TARGET_SH1 && ! TARGET_SH3E && ! TARGET_SH5 && ! TARGET_HITACHI+ || TARGET_NO_IMPLICIT_FP) { /* Push arg regs as if they'd been provided by caller in stack. */ for (i = 0; i < NPARM_REGS(SImode); i++)@@ -5149,7 +5199,8 @@ tree f_next_o, f_next_o_limit, f_next_fp, f_next_fp_limit, f_next_stack; tree record; - if (TARGET_SH5 || (! TARGET_SH3E && ! TARGET_SH4) || TARGET_HITACHI)+ if (TARGET_SH5 || (! TARGET_SH3E && ! TARGET_SH4) || TARGET_HITACHI+ || TARGET_NO_IMPLICIT_FP) return ptr_type_node; record = make_node (RECORD_TYPE);@@ -5211,7 +5262,8 @@ return; } - if ((! TARGET_SH3E && ! TARGET_SH4) || TARGET_HITACHI)+ if ((! TARGET_SH3E && ! TARGET_SH4)+ || TARGET_HITACHI || TARGET_NO_IMPLICIT_FP) { std_expand_builtin_va_start (stdarg_p, valist, nextarg); return;@@ -5289,7 +5341,8 @@ rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD; pptr_type_node = build_pointer_type (ptr_type_node); - if (! TARGET_SH5 && (TARGET_SH3E || TARGET_SH4) && ! TARGET_HITACHI)+ if (! TARGET_SH5 && (TARGET_SH3E || TARGET_SH4)+ && ! TARGET_HITACHI && ! TARGET_NO_IMPLICIT_FP) { tree f_next_o, f_next_o_limit, f_next_fp, f_next_fp_limit, f_next_stack; tree next_o, next_o_limit, next_fp, next_fp_limit, next_stack;diff -ruN gcc-20030210.orig/gcc/config/sh/sh.h gcc-20030210/gcc/config/sh/sh.h--- gcc-20030210.orig/gcc/config/sh/sh.h Fri Feb 22 01:42:28 2002+++ gcc-20030210/gcc/config/sh/sh.h Sat Feb 22 01:40:14 2003@@ -147,10 +147,10 @@ #define HARD_SH4_BIT (1<<5) #define FPU_SINGLE_BIT (1<<7) #define SH4_BIT (1<<12)+#define NO_IMPLICIT_FP_BIT (1<<3) #define FMOVD_BIT (1<<4) #define SH5_BIT (1<<0) #define SPACE_BIT (1<<13)-#define BIGTABLE_BIT (1<<14) #define RELAX_BIT (1<<15) #define USERMODE_BIT (1<<16) #define HITACHI_BIT (1<<22)@@ -205,6 +205,9 @@ /* Nonzero if we should generate code for a SH5 CPU (either ISA). */ #define TARGET_SH5 (target_flags & SH5_BIT) +/* Nonzero if we should not use FPU implicitly. */+#define TARGET_NO_IMPLICIT_FP (target_flags & NO_IMPLICIT_FP_BIT)+ /* Nonzero if we should generate code using the SHcompact instruction set and 32-bit ABI. */ #define TARGET_SHCOMPACT (TARGET_SH5 && TARGET_SH1)@@ -225,6 +228,7 @@ /* Nonzero if we should generate code using SHmedia FPU instructions. */ #define TARGET_SHMEDIA_FPU (TARGET_SHMEDIA && TARGET_FPU_DOUBLE)+ /* Nonzero if we should generate fmovd. */ #define TARGET_FMOVD (target_flags & FMOVD_BIT) @@ -234,9 +238,6 @@ /* Nonzero if we should generate smaller code rather than faster code. */ #define TARGET_SMALLCODE (target_flags & SPACE_BIT) -/* Nonzero to use long jump tables. */-#define TARGET_BIGTABLE (target_flags & BIGTABLE_BIT)- /* Nonzero to generate pseudo-ops needed by the assembler and linker to do function call relaxing. */ #define TARGET_RELAX (target_flags & RELAX_BIT)@@ -297,7 +298,6 @@ {"5-compact-nofpu", TARGET_NONE, "" }, \ {"5-compact-nofpu", SH5_BIT|SH3_BIT|SH2_BIT|SH1_BIT, "Generate FPU-less SHcompact code" }, \ {"b", -LITTLE_ENDIAN_BIT, "" }, \- {"bigtable", BIGTABLE_BIT, "" }, \ {"dalign", DALIGN_BIT, "" }, \ {"fmovd", FMOVD_BIT, "" }, \ {"hitachi", HITACHI_BIT, "" }, \@@ -306,6 +306,7 @@ {"isize", ISIZE_BIT, "" }, \ {"l", LITTLE_ENDIAN_BIT, "" }, \ {"no-ieee", -IEEE_BIT, "" }, \+ {"no-implicit-fp", NO_IMPLICIT_FP_BIT, "" }, \ {"padstruct", PADSTRUCT_BIT, "" }, \ {"prefergot", PREFERGOT_BIT, "" }, \ {"relax", RELAX_BIT, "" }, \@@ -2493,16 +2494,22 @@ goto LABEL; \ } +extern int optimize; /* needed for gen_casesi. */+extern int optimize_size;+ /* Specify the machine mode that this machine uses for the index in the tablejump instruction. */-#define CASE_VECTOR_MODE (TARGET_BIGTABLE ? SImode : HImode)+#define CASE_VECTOR_MODE SImode #define CASE_VECTOR_SHORTEN_MODE(MIN_OFFSET, MAX_OFFSET, BODY) \ ((MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 127 \ ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 0, QImode) \ : (MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 255 \ ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 1, QImode) \- : (MIN_OFFSET) >= -32768 && (MAX_OFFSET) <= 32767 ? HImode \+ : (MIN_OFFSET) >= -32768 && (MAX_OFFSET) <= 32767 \+ ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 0, HImode) \+ : optimize_size && (MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 65535 \+ ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 1, HImode) \ : SImode) /* Define as C expression which evaluates to nonzero if the tablejump@@ -3038,10 +3045,7 @@ /* Output an absolute table element. */ #define ASM_OUTPUT_ADDR_VEC_ELT(STREAM,VALUE) \- if (TARGET_BIGTABLE) \- asm_fprintf ((STREAM), "\t.long\t%LL%d\n", (VALUE)); \- else \- asm_fprintf ((STREAM), "\t.word\t%LL%d\n", (VALUE)); \+ asm_fprintf ((STREAM), "\t.long\t%LL%d\n", (VALUE)) /* Output various types of constants. */ @@ -3167,8 +3171,6 @@ #define sh_cpu_attr ((enum attr_cpu)sh_cpu) extern enum processor_type sh_cpu; -extern int optimize; /* needed for gen_casesi. */- enum mdep_reorg_phase_e { SH_BEFORE_MDEP_REORG,diff -ruN gcc-20030210.orig/gcc/config/sh/sh.md gcc-20030210/gcc/config/sh/sh.md--- gcc-20030210.orig/gcc/config/sh/sh.md Sat Nov 23 04:58:06 2002+++ gcc-20030210/gcc/config/sh/sh.md Sat Feb 22 01:40:14 2003@@ -1242,7 +1242,7 @@ (clobber (reg:SI PR_REG)) (clobber (reg:SI R4_REG)) (use (match_operand:SI 1 "arith_reg_operand" "r"))]- "TARGET_SH1 && ! TARGET_SH4"+ "TARGET_SH1 && ! TARGET_SH4 || TARGET_NO_IMPLICIT_FP" "jsr @%1%#" [(set_attr "type" "sfunc") (set_attr "needs_delay_slot" "yes")])@@ -1336,7 +1336,7 @@ operands[3] = gen_reg_rtx (Pmode); /* Emit the move of the address to a pseudo outside of the libcall. */- if (TARGET_HARD_SH4 && TARGET_SH3E)+ if (TARGET_HARD_SH4 && TARGET_SH3E && !TARGET_NO_IMPLICIT_FP) { emit_move_insn (operands[3], gen_rtx_SYMBOL_REF (SImode, \"__udivsi3_i4\"));@@ -1391,7 +1391,7 @@ (clobber (reg:SI R2_REG)) (clobber (reg:SI R3_REG)) (use (match_operand:SI 1 "arith_reg_operand" "r"))]- "TARGET_SH1 && ! TARGET_SH4"+ "TARGET_SH1 && ! TARGET_SH4 || TARGET_NO_IMPLICIT_FP" "jsr @%1%#" [(set_attr "type" "sfunc") (set_attr "needs_delay_slot" "yes")])@@ -1476,7 +1476,7 @@ operands[3] = gen_reg_rtx (Pmode); /* Emit the move of the address to a pseudo outside of the libcall. */- if (TARGET_HARD_SH4 && TARGET_SH3E)+ if (TARGET_HARD_SH4 && TARGET_SH3E && !TARGET_NO_IMPLICIT_FP) { emit_move_insn (operands[3], gen_rtx_SYMBOL_REF (SImode, \"__sdivsi3_i4\"));@@ -6446,6 +6446,8 @@ case SImode: return \"shll2 %1\;mov.l @(r0,%1),%0\"; case HImode:+ if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned)+ return \"add %1,%1\;mov.w @(r0,%1),%0\;extu.w %0,%0\"; return \"add %1,%1\;mov.w @(r0,%1),%0\"; case QImode: if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned)@@ -6455,7 +6457,15 @@ abort (); } }"- [(set_attr "length" "4")])+ [(set (attr "length")+ (cond [(eq (symbol_ref "shl_casesi_worker_length (insn)") (const_int 1))+ (const_string "2")+ (eq (symbol_ref "shl_casesi_worker_length (insn)") (const_int 2))+ (const_string "4")+ ;; Put "match_dup" here so that insn_variable_length_p return 1.+ (ne (match_dup 2) (match_dup 2))+ (const_string "4")]+ (const_string "6")))]) (define_insn "casesi_shift_media" [(set (match_operand 0 "arith_reg_operand" "=r")diff -ruN gcc-20030210.orig/gcc/config/sh/sh3-linux.h gcc-20030210/gcc/config/sh/sh3-linux.h--- gcc-20030210.orig/gcc/config/sh/sh3-linux.h Thu Jan 1 09:00:00 1970+++ gcc-20030210/gcc/config/sh/sh3-linux.h Sat Feb 22 01:40:14 2003@@ -0,0 +1,29 @@+#undef TARGET_VERSION+#define TARGET_VERSION fputs (" (SH3 GNU/Linux with ELF)", stderr);++#undef CPP_SPEC+#define CPP_SPEC \+ "-D__LITTLE_ENDIAN__ \+ -D__SH3__ -D__sh3__ \+ -D__SIZE_TYPE__=unsigned\\ int \+ -D__PTRDIFF_TYPE__=int \+ %{fPIC:-D__PIC__ -D__pic__} \+ %{fpic:-D__PIC__ -D__pic__} \+ %{posix:-D_POSIX_SOURCE} \+ %{pthread:-D_REENTRANT -D_PTHREADS}"++#undef ASM_SPEC+#define ASM_SPEC "%{mrelax:-relax}"++#undef CC1_SPEC+#define CC1_SPEC \+ "-musermode -ml -m3 %{profile:-p}"++#undef LINK_SPEC+#define LINK_SPEC \+ "%{mrelax:-relax} \+ %{shared:-shared} \+ %{!static: \+ %{rdynamic:-export-dynamic} \+ %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \+ %{static:-static}"diff -ruN gcc-20030210.orig/gcc/config/sh/sh3eb-linux.h gcc-20030210/gcc/config/sh/sh3eb-linux.h--- gcc-20030210.orig/gcc/config/sh/sh3eb-linux.h Thu Jan 1 09:00:00 1970+++ gcc-20030210/gcc/config/sh/sh3eb-linux.h Sat Feb 22 01:40:14 2003@@ -0,0 +1,29 @@+#undef TARGET_VERSION+#define TARGET_VERSION fputs (" (SH3EB GNU/Linux with ELF)", stderr);++#undef CPP_SPEC+#define CPP_SPEC \+ "-D__BIG_ENDIAN__ \+ -D__SH3__ -D__sh3__ \+ -D__SIZE_TYPE__=unsigned\\ int \+ -D__PTRDIFF_TYPE__=int \+ %{fPIC:-D__PIC__ -D__pic__} \+ %{fpic:-D__PIC__ -D__pic__} \+ %{posix:-D_POSIX_SOURCE} \+ %{pthread:-D_REENTRANT -D_PTHREADS}"++#undef ASM_SPEC+#define ASM_SPEC "%{mrelax:-relax}"++#undef CC1_SPEC+#define CC1_SPEC \+ "-musermode -mb -m3 %{profile:-p}"++#undef LINK_SPEC+#define LINK_SPEC \+ "%{mrelax:-relax} \+ %{shared:-shared} \+ %{!static: \+ %{rdynamic:-export-dynamic} \+ %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \+ %{static:-static}"diff -ruN gcc-20030210.orig/gcc/config/sh/sh4-linux.h gcc-20030210/gcc/config/sh/sh4-linux.h--- gcc-20030210.orig/gcc/config/sh/sh4-linux.h Thu Jan 1 09:00:00 1970+++ gcc-20030210/gcc/config/sh/sh4-linux.h Sat Feb 22 01:40:14 2003@@ -0,0 +1,29 @@+#undef TARGET_VERSION+#define TARGET_VERSION fputs (" (SH4 GNU/Linux with ELF)", stderr);++#undef CPP_SPEC+#define CPP_SPEC \+ "-D__LITTLE_ENDIAN__ \+ -D__SH4__ \+ -D__SIZE_TYPE__=unsigned\\ int \+ -D__PTRDIFF_TYPE__=int \+ %{fPIC:-D__PIC__ -D__pic__} \+ %{fpic:-D__PIC__ -D__pic__} \+ %{posix:-D_POSIX_SOURCE} \+ %{pthread:-D_REENTRANT -D_PTHREADS}"++#undef ASM_SPEC+#define ASM_SPEC "%{mrelax:-relax}"+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -