From: Mitch D. <mj...@hp...> - 2000-05-04 13:33:00
|
Dear Kaz (and others), Tomorrow Greg and I will (finally) put binutils/gcc/gdb etc under CVS like we've done with the Linux kernel source. I hope this makes it easier for new users, and smooths the way to have the SuperH changes folded back into the official versions. For this, we need to know the recommended base versions, patches, procedure for building, etc. If we don't hear anything, we will use the procedure and versions as outlined in the 7-Feb-2000 edition of Ludovic's FAQ. If you (or anyone else) thinks we should use some other version, patch, feature, aardvark, you name it, please let us know as soon as possible. Thanks, Mitch. -- | mailto:mj...@au... | Not the official view of: | | mailto:mj...@al... | Australian Calculator Opn | | Certified Linux Evangelist! | Hewlett Packard Australia | |
From: kaz K. <kk...@rr...> - 2000-05-04 23:40:46
|
Hi Mitch, > Tomorrow Greg and I will (finally) put binutils/gcc/gdb etc > under CVS like we've done with the Linux kernel source. I > hope this makes it easier for new users, and smooths the way > to have the SuperH changes folded back into the official > versions. > > For this, we need to know the recommended base versions, patches, > procedure for building, etc. Please use the most recent versions. Currently you can get gcc: gcc-2.95.2 + gcc-2.95.2-000228.diff.gz gdb: gdb-4.18 + gdb-4.18-sh-linux-000110.diff.gz libc: glibc-2.1.3 + glibc-2.1.3-000427.diff.gz from my junkyard. About binutils, the combination binutils-000218.tar.bz2 + binutils-000218-000219.diff.gz + binutils-more-patch-000305 which can be get from Niibe-san's ftp machine, is recommended. There is a problem of the visibility of the symbols in libgcc.a at the bootstrap of ld.so and Niibe-san's gcc-patch for the symbol visibility ftp://ftp.m17n.org/pub/linux-sh/gcc-symbol-vis-000501.diff.gz solves it. Notice that it may be temporary since there is no rigid specification of the symbol visibility and its ABI. Now gcc guys discuss about the shared libgcc library. I think it will also solve the above problem. Anyway, we should wait a while. kaz |
From: NIIBE Y. <gn...@ch...> - 2000-05-14 09:07:10
|
Here is the patch against current CVS of GCC. -------------------------- diff --exclude CVS -ruN gcc-core/gcc/config/fp-bit.c gcc-2.95.2+kaz+g/gcc/config/fp-bit.c --- gcc-core/gcc/config/fp-bit.c Sun May 7 22:44:44 2000 +++ gcc-2.95.2+kaz+g/gcc/config/fp-bit.c Mon May 1 16:52:02 2000 @@ -779,6 +779,9 @@ } +#ifdef HAVE_VISIVILITY_HIDDEN +__attribute__ ((hidden)) +#endif FLO_type add (FLO_type arg_a, FLO_type arg_b) { @@ -795,6 +798,9 @@ return pack_d (res); } +#ifdef HAVE_VISIVILITY_HIDDEN +__attribute__ ((hidden)) +#endif FLO_type sub (FLO_type arg_a, FLO_type arg_b) { @@ -985,6 +991,9 @@ return tmp; } +#ifdef HAVE_VISIVILITY_HIDDEN +__attribute__ ((hidden)) +#endif FLO_type multiply (FLO_type arg_a, FLO_type arg_b) { @@ -1092,6 +1101,9 @@ } } +#ifdef HAVE_VISIVILITY_HIDDEN +__attribute__ ((hidden)) +#endif FLO_type divide (FLO_type arg_a, FLO_type arg_b) { @@ -1493,7 +1505,14 @@ This is needed for some 8-bit ports that can't handle well values that are 8-bytes in size, so we just don't support double for them at all. */ +#ifdef HAVE_VISIVILITY_HIDDEN +__attribute__ ((hidden)) +#endif extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype frac); +#ifdef HAVE_VISIVILITY_HIDDEN +asm(".hidden __make_dp"); +asm(".global __make_dp"); +#endif #if defined(L_sf_to_df) #ifdef HAVE_VISIVILITY_HIDDEN @@ -1515,7 +1534,14 @@ #ifndef FLOAT +#ifdef HAVE_VISIVILITY_HIDDEN +__attribute__ ((hidden)) +#endif extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype); +#ifdef HAVE_VISIVILITY_HIDDEN +asm(".hidden __make_fp"); +asm(".global __make_fp"); +#endif #if defined(L_make_df) #ifdef HAVE_VISIVILITY_HIDDEN diff --exclude CVS -ruN gcc-core/gcc/config/sh/elf.h gcc-2.95.2+kaz+g/gcc/config/sh/elf.h --- gcc-core/gcc/config/sh/elf.h Sun May 7 22:24:17 2000 +++ gcc-2.95.2+kaz+g/gcc/config/sh/elf.h Mon May 1 16:52:02 2000 @@ -42,12 +42,21 @@ /* Be ELF-like. */ #include "svr4.h" +/* For builtin library routins (e.g. __udivsi3), we explicitly declare + the symbol as .globl with .hidden. */ + +#undef ASM_OUTPUT_EXTERNAL_LIBCALL +#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \ + ASM_HIDDEN_GLOBAL_LABEL (FILE, XSTR (FUN, 0)) + /* The prefix to add to user-visible assembler symbols. Note that svr4.h redefined it from the original value (that we want) in sh.h */ +#if 0 #undef USER_LABEL_PREFIX #define USER_LABEL_PREFIX "_" +#endif #undef LOCAL_LABEL_PREFIX #define LOCAL_LABEL_PREFIX "." diff --exclude CVS -ruN gcc-core/gcc/config/sh/lib1funcs-gnu.asm gcc-2.95.2+kaz+g/gcc/config/sh/lib1funcs-gnu.asm --- gcc-core/gcc/config/sh/lib1funcs-gnu.asm Sun May 7 22:26:03 2000 +++ gcc-2.95.2+kaz+g/gcc/config/sh/lib1funcs-gnu.asm Mon May 1 17:02:05 2000 @@ -25,4 +25,6 @@ #define GLOBAL(X) __##X +#define __NOFPU_DIV__ + #include "sh/lib1funcs.asm" diff --exclude CVS -ruN gcc-core/gcc/config/sh/lib1funcs.asm gcc-2.95.2+kaz+g/gcc/config/sh/lib1funcs.asm --- gcc-core/gcc/config/sh/lib1funcs.asm Sun May 7 22:44:45 2000 +++ gcc-2.95.2+kaz+g/gcc/config/sh/lib1funcs.asm Mon May 1 17:02:05 2000 @@ -969,7 +969,7 @@ #ifdef L_sdivsi3 /* __SH4_SINGLE_ONLY__ keeps this part for link compatibility with sh3e code. */ -#if ! defined(__SH4__) && ! defined (__SH4_SINGLE__) +#if (! defined(__SH4__) && ! defined (__SH4_SINGLE__)) || defined(__NOFPU_DIV__) !! !! Steve Chamberlain !! sa...@cy... @@ -1168,7 +1168,7 @@ #ifdef L_udivsi3 /* __SH4_SINGLE_ONLY__ keeps this part for link compatibility with sh3e code. */ -#if ! defined(__SH4__) && ! defined (__SH4_SINGLE__) +#if (! defined(__SH4__) && ! defined (__SH4_SINGLE__)) || defined(__NOFPU_DIV__) !! !! Steve Chamberlain !! sa...@cy... diff --exclude CVS -ruN gcc-core/gcc/config/sh/linux.h gcc-2.95.2+kaz+g/gcc/config/sh/linux.h --- gcc-core/gcc/config/sh/linux.h Sun May 7 22:44:45 2000 +++ gcc-2.95.2+kaz+g/gcc/config/sh/linux.h Wed May 10 15:29:49 2000 @@ -65,6 +65,14 @@ #undef ASM_SPEC #define ASM_SPEC "%{!mb:-little} %{mrelax:-relax}" +#undef CC1_SPEC +#define CC1_SPEC \ + "-musermode" + +#undef CC1PLUS_SPEC +#define CC1PLUS_SPEC \ + "-musermode" + #undef LINK_SPEC #define LINK_SPEC \ "%{!mb:-m shlelf_linux} %{mrelax:-relax} \ @@ -72,7 +80,7 @@ %{!static: \ %{rdynamic:-export-dynamic} \ %{!dynamic-linker:-dynamic-linker /lib/ld.so.1} \ - } \ + %{!rpath:-rpath /lib}} \ %{static:-static}" #undef LIB_SPEC @@ -87,10 +95,71 @@ %{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}" + crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}" #define ENDFILE_SPEC \ - "%{!shared:crtend.o%s} crtn.o%s" + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + +/* On svr4, we *do* have support for the .init and .fini sections, and we + can put stuff in there to be executed before and after `main'. We let + crtstuff.c and other files know this by defining the following symbols. + The definitions say how to change sections to the .init and .fini + sections. This is the same for all known svr4 assemblers. */ +#define INIT_SECTION_ASM_OP ".section\t.init" +#define FINI_SECTION_ASM_OP ".section\t.fini" + +/* SH constant pool breaks the devices in crtstuff.c to control section + in where code resides. We have to write it as asm code. */ +#ifndef __PIC__ +#define CALL_IN_INIT_SECTION(func) \ + asm (INIT_SECTION_ASM_OP "\n\ + mov.l\t1f,r1\n\ + jsr\t@r1\n\ + nop\n\ + bra\t2f\n\ + nop\n\ + .align\t2\n\ + 1:\t.long\t" #func "\n\ + 2:\n"); + +#define CALL_IN_FINI_SECTION(func) \ + asm (FINI_SECTION_ASM_OP "\n\ + mov.l\t1f,r1\n\ + jsr\t@r1\n\ + nop\n\ + bra\t2f\n\ + nop\n\ + .align\t2\n\ + 1:\t.long\t" #func "\n\ + 2:\n"); +#else +#define CALL_IN_INIT_SECTION(func) \ + asm (INIT_SECTION_ASM_OP "\n\ + mov.l\t1f,r1\n\ + mova\t1f,r0\n\ + add\tr0,r1\n\ + jsr\t@r1\n\ + nop\n\ + bra\t2f\n\ + nop\n\ + .align\t2\n\ + 1:\t.long\t" #func "@PLT\n\ + 2:\n"); + +#define CALL_IN_FINI_SECTION(func) \ + asm (FINI_SECTION_ASM_OP "\n\ + mov.l\t1f,r1\n\ + mova\t1f,r0\n\ + add\tr0,r1\n\ + jsr\t@r1\n\ + nop\n\ + bra\t2f\n\ + nop\n\ + .align\t2\n\ + 1:\t.long\t" #func "@PLT\n\ + 2:\n"); + +#endif /* Make DWARF2 an option, but keep DBX as the default for now. Use -gdwarf-2 to turn on DWARF2. */ diff --exclude CVS -ruN gcc-core/gcc/config/sh/sh.c gcc-2.95.2+kaz+g/gcc/config/sh/sh.c --- gcc-core/gcc/config/sh/sh.c Sun May 7 22:24:17 2000 +++ gcc-2.95.2+kaz+g/gcc/config/sh/sh.c Mon May 1 16:52:02 2000 @@ -388,8 +388,9 @@ entry_name = get_identifier ("__movstrSI12_i4"); sym = gen_rtx (SYMBOL_REF, Pmode, IDENTIFIER_POINTER (entry_name)); + assemble_external_libcall (sym); if (flag_pic) - sym = legitimize_builtin_function_address (sym); + sym = legitimize_function_address (SImode, sym, 0); func_addr_rtx = copy_to_mode_reg (Pmode, sym); force_into (XEXP (operands[0], 0), r4); force_into (XEXP (operands[1], 0), r5); @@ -410,8 +411,9 @@ ? "__movstr_i4_odd" : "__movstr_i4_even"); sym = gen_rtx (SYMBOL_REF, Pmode, IDENTIFIER_POINTER (entry_name)); + assemble_external_libcall (sym); if (flag_pic) - sym = legitimize_builtin_function_address (sym); + sym = legitimize_function_address (SImode, sym, 0); func_addr_rtx = copy_to_mode_reg (Pmode, sym); force_into (XEXP (operands[0], 0), r4); force_into (XEXP (operands[1], 0), r5); @@ -436,8 +438,9 @@ sprintf (entry, "__movstrSI%d", bytes); entry_name = get_identifier (entry); sym = gen_rtx (SYMBOL_REF, Pmode, IDENTIFIER_POINTER (entry_name)); + assemble_external_libcall (sym); if (flag_pic) - sym = legitimize_builtin_function_address (sym); + sym = legitimize_function_address (SImode, sym, 0); func_addr_rtx = copy_to_mode_reg (Pmode, sym); force_into (XEXP (operands[0], 0), r4); force_into (XEXP (operands[1], 0), r5); @@ -459,8 +462,9 @@ entry_name = get_identifier ("__movstr"); sym = gen_rtx (SYMBOL_REF, Pmode, IDENTIFIER_POINTER (entry_name)); + assemble_external_libcall (sym); if (flag_pic) - sym = legitimize_builtin_function_address (sym); + sym = legitimize_function_address (SImode, sym, 0); func_addr_rtx = copy_to_mode_reg (Pmode, sym); force_into (XEXP (operands[0], 0), r4); force_into (XEXP (operands[1], 0), r5); @@ -728,8 +732,8 @@ rtx insn; rtx op; { - struct { rtx lab, reg, op; } this; - char *jump; + struct { rtx lab, reg, op, lab2; } this; + const char *jump; int far; int offset = branch_dest (insn) - insn_addresses[INSN_UID (insn)]; @@ -767,19 +771,29 @@ if (dbr_sequence_length ()) print_slot (final_sequence); - this.reg = gen_rtx (REG, SImode, 13); - output_asm_insn ("mov.l " REGISTER_PREFIX "r13,@-" REGISTER_PREFIX "r15", 0); + this.reg = gen_rtx_REG (SImode, 13); + output_asm_insn ("mov.l " REGISTER_PREFIX "r13,@-" + REGISTER_PREFIX "r15", 0); output_asm_insn (jump, &this.lab); - output_asm_insn ("mov.l @" REGISTER_PREFIX "r15+," REGISTER_PREFIX "r13", 0); + output_asm_insn ("mov.l @" REGISTER_PREFIX "r15+," + REGISTER_PREFIX "r13", 0); + } + if (flag_pic && far) + { + this.lab2 = gen_label_rtx (); + ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L", + CODE_LABEL_NUMBER (this.lab2)); } if (far) output_asm_insn (".align 2", 0); ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (this.lab)); this.op = op; - if (flag_pic) - output_asm_insn (far ? ".long %O2-%O0" : ".word %O2-%O0", &this.lab); + if (flag_pic && far) + output_asm_insn (".long %O2-%O3", &this.lab); + else if (far) + output_asm_insn (".long %O2", &this.lab); else - output_asm_insn (far ? ".long %O2" : ".word %O2-%O0", &this.lab); + output_asm_insn (".word %O2-%O0", &this.lab); return ""; } @@ -1282,8 +1296,9 @@ sprintf (func, "__ashiftrt_r4_%d", value); func_name = get_identifier (func); sym = gen_rtx (SYMBOL_REF, Pmode, IDENTIFIER_POINTER (func_name)); + assemble_external_libcall (sym); if (flag_pic) - sym = legitimize_builtin_function_address (sym); + sym = legitimize_function_address (SImode, sym, 0); emit_move_insn (wrk, sym); emit_insn (gen_ashrsi3_n (GEN_INT (value), wrk)); emit_move_insn (operands[0], gen_rtx (REG, SImode, 4)); @@ -5100,19 +5115,6 @@ } rtx -legitimize_builtin_function_address (orig) - rtx orig; -{ - rtx new; -#if 0 - new = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, orig), 13); - return gen_rtx_CONST (VOIDmode, new); -#else - return legitimize_function_address (SImode, orig, 0); -#endif -} - -rtx legitimize_pic_address (orig, mode, reg) rtx orig; enum machine_mode mode; @@ -5303,15 +5305,6 @@ case UNSPEC: if ((XVECLEN (x, 0)) > 3) abort (); - if (XINT (x, 1) == 12) - { - output_pic_addr_const (file, XVECEXP (x, 0, 0)); - fputs ("@PLT", file); - fputs ("+", file); - fputs (".-2-", file); - output_pic_addr_const (file, XVECEXP (x, 0, 2)); - break; - } output_pic_addr_const (file, XVECEXP (x, 0, 0)); switch (XINT (x, 1)) { @@ -5329,6 +5322,12 @@ case 10: case 11: /* _GLOBAL_OFFSET_TABLE_ reference */ + break; + case 12: + fputs ("@PLT", file); + fputs ("+", file); + fputs (".-2-", file); + output_pic_addr_const (file, XVECEXP (x, 0, 2)); break; case 13: break; diff --exclude CVS -ruN gcc-core/gcc/config/sh/sh.h gcc-2.95.2+kaz+g/gcc/config/sh/sh.h --- gcc-core/gcc/config/sh/sh.h Sun May 7 22:24:17 2000 +++ gcc-2.95.2+kaz+g/gcc/config/sh/sh.h Mon May 1 17:02:05 2000 @@ -107,6 +107,7 @@ #define BIGTABLE_BIT (1<<14) #define RELAX_BIT (1<<15) #define HITACHI_BIT (1<<22) +#define NOFPU_DIV_BIT (1<<23) #define USERMODE_BIT (1<<24) #define SMALLPOOLS_BIT (1<<25) #define PREFERGOT_BIT (1<<26) @@ -180,6 +181,9 @@ /* Nonzero if generating code for a little endian SH. */ #define TARGET_LITTLE_ENDIAN (target_flags & LITTLE_ENDIAN_BIT) +/* Nonzero if we should prefer not to use FPU in interger division. */ +#define TARGET_NOFPU_DIV (target_flags & NOFPU_DIV_BIT) + /* Nonzero if we should do everything in userland. */ #define TARGET_USERMODE (target_flags & USERMODE_BIT) @@ -209,6 +213,7 @@ {"isize", ISIZE_BIT}, \ {"l", LITTLE_ENDIAN_BIT}, \ {"no-ieee", -IEEE_BIT}, \ + {"nofpu-idiv", NOFPU_DIV_BIT}, \ {"padstruct", PADSTRUCT_BIT}, \ {"usermode", USERMODE_BIT}, \ {"smallpools",SMALLPOOLS_BIT}, \ @@ -223,7 +228,7 @@ /* This are meant to be redefined in the host dependent files */ #define SUBTARGET_SWITCHES -#define TARGET_DEFAULT (0) +#define TARGET_DEFAULT (SH3_BIT|SH2_BIT|LITTLE_ENDIAN_BIT) #define OPTIMIZATION_OPTIONS(LEVEL,SIZE) \ do { \ @@ -1546,7 +1551,6 @@ } extern struct rtx_def *legitimize_function_address (); -extern struct rtx_def *legitimize_builtin_function_address (); /* Specify the machine mode that this machine uses for the index in the tablejump instruction. */ @@ -2055,6 +2059,15 @@ /* Output a globalising directive for a label. */ #define ASM_GLOBALIZE_LABEL(STREAM,NAME) \ (fprintf ((STREAM), "\t.global\t"), \ + assemble_name ((STREAM), (NAME)), \ + fputc ('\n', (STREAM))) + +/* Output a hidden&global directive for a label. */ +#define ASM_HIDDEN_GLOBAL_LABEL(STREAM,NAME) \ + (fprintf ((STREAM), "\t.global\t"), \ + assemble_name ((STREAM), (NAME)), \ + fputc ('\n', (STREAM)), \ + fprintf ((STREAM), "\t.hidden\t"), \ assemble_name ((STREAM), (NAME)), \ fputc ('\n', (STREAM))) diff --exclude CVS -ruN gcc-core/gcc/config/sh/sh.md gcc-2.95.2+kaz+g/gcc/config/sh/sh.md --- gcc-core/gcc/config/sh/sh.md Sun May 7 22:24:17 2000 +++ gcc-2.95.2+kaz+g/gcc/config/sh/sh.md Mon May 1 17:02:05 2000 @@ -865,7 +865,7 @@ (clobber (reg:SI 1)) (clobber (reg:SI 2)) (use (match_operand:SI 1 "arith_reg_operand" "r"))] - "! TARGET_SH4" + "! (TARGET_SH4 && ! TARGET_NOFPU_DIV)" "jsr @%1%#" [(set_attr "type" "sfunc") (set_attr "needs_delay_slot" "yes")]) @@ -885,7 +885,7 @@ (clobber (reg:SI 5)) (use (reg:PSI 48)) (use (match_operand:SI 1 "arith_reg_operand" "r"))] - "TARGET_SH4 && ! TARGET_FPU_SINGLE" + "(TARGET_SH4 && ! TARGET_NOFPU_DIV) && ! TARGET_FPU_SINGLE" "jsr @%1%#" [(set_attr "type" "sfunc") (set_attr "needs_delay_slot" "yes")]) @@ -904,7 +904,7 @@ (clobber (reg:SI 4)) (clobber (reg:SI 5)) (use (match_operand:SI 1 "arith_reg_operand" "r"))] - "TARGET_HARD_SH4 && TARGET_FPU_SINGLE" + "(TARGET_HARD_SH4 && ! TARGET_NOFPU_DIV) && TARGET_FPU_SINGLE" "jsr @%1%#" [(set_attr "type" "sfunc") (set_attr "needs_delay_slot" "yes")]) @@ -925,11 +925,12 @@ emit_move_insn (gen_rtx (REG, SImode, 4), operands[1]); emit_move_insn (gen_rtx (REG, SImode, 5), operands[2]); - if (TARGET_HARD_SH4) + if (TARGET_HARD_SH4 && ! TARGET_NOFPU_DIV) { sym = gen_rtx_SYMBOL_REF (SImode, \"__udivsi3_i4\"); + assemble_external_libcall (sym); if (flag_pic) - sym = legitimize_builtin_function_address (sym); + sym = legitimize_function_address (SImode, sym, 0); emit_move_insn (operands[3], sym); if (TARGET_FPU_SINGLE) emit_insn (gen_udivsi3_i4_single (operands[0], operands[3])); @@ -939,8 +940,9 @@ else { sym = gen_rtx_SYMBOL_REF (SImode, \"__udivsi3\"); + assemble_external_libcall (sym); if (flag_pic) - sym = legitimize_builtin_function_address (sym); + sym = legitimize_function_address (SImode, sym, 0); emit_move_insn (operands[3], sym); emit_insn (gen_udivsi3_i3 (operands[0], operands[3])); } @@ -957,7 +959,7 @@ (clobber (reg:SI 2)) (clobber (reg:SI 3)) (use (match_operand:SI 1 "arith_reg_operand" "r"))] - "! TARGET_SH4" + "! (TARGET_SH4 && ! TARGET_NOFPU_DIV)" "jsr @%1%#" [(set_attr "type" "sfunc") (set_attr "needs_delay_slot" "yes")]) @@ -974,7 +976,7 @@ (clobber (reg:SI 2)) (use (reg:PSI 48)) (use (match_operand:SI 1 "arith_reg_operand" "r"))] - "TARGET_SH4 && ! TARGET_FPU_SINGLE" + "(TARGET_SH4 && ! TARGET_NOFPU_DIV) && ! TARGET_FPU_SINGLE" "jsr @%1%#" [(set_attr "type" "sfunc") (set_attr "needs_delay_slot" "yes")]) @@ -990,7 +992,7 @@ (clobber (reg:SI 1)) (clobber (reg:SI 2)) (use (match_operand:SI 1 "arith_reg_operand" "r"))] - "TARGET_HARD_SH4 && TARGET_FPU_SINGLE" + "(TARGET_HARD_SH4 && ! TARGET_NOFPU_DIV) && TARGET_FPU_SINGLE" "jsr @%1%#" [(set_attr "type" "sfunc") (set_attr "needs_delay_slot" "yes")]) @@ -1011,11 +1013,12 @@ emit_move_insn (gen_rtx (REG, SImode, 4), operands[1]); emit_move_insn (gen_rtx (REG, SImode, 5), operands[2]); - if (TARGET_HARD_SH4) + if (TARGET_HARD_SH4 && ! TARGET_NOFPU_DIV) { sym = gen_rtx_SYMBOL_REF (SImode, \"__sdivsi3_i4\"); + assemble_external_libcall (sym); if (flag_pic) - sym = legitimize_builtin_function_address (sym); + sym = legitimize_function_address (SImode, sym, 0); emit_move_insn (operands[3], sym); if (TARGET_FPU_SINGLE) emit_insn (gen_divsi3_i4_single (operands[0], operands[3])); @@ -1025,8 +1028,9 @@ else { sym = gen_rtx_SYMBOL_REF (SImode, \"__sdivsi3\"); + assemble_external_libcall (sym); if (flag_pic) - sym = legitimize_builtin_function_address (sym); + sym = legitimize_function_address (SImode, sym, 0); emit_move_insn (operands[3], sym); emit_insn (gen_divsi3_i3 (operands[0], operands[3])); } @@ -1135,8 +1139,10 @@ { /* The address must be set outside the libcall, since it goes into a pseudo. */ - rtx addr = force_reg (SImode, gen_rtx_SYMBOL_REF (SImode, \"__mulsi3\")); + rtx sym = gen_rtx_SYMBOL_REF (SImode, \"__mulsi3\"); + rtx addr = force_reg (SImode, sym); rtx insns = gen_mulsi3_call (operands[0], operands[1], operands[2], addr); + assemble_external_libcall (sym); first = XVECEXP (insns, 0, 0); last = XVECEXP (insns, 0, XVECLEN (insns, 0) - 1); emit_insn (insns); diff --exclude CVS -ruN gcc-core/gcc/config/sh/t-linux gcc-2.95.2+kaz+g/gcc/config/sh/t-linux --- gcc-core/gcc/config/sh/t-linux Sun May 7 23:12:05 2000 +++ gcc-2.95.2+kaz+g/gcc/config/sh/t-linux Mon May 1 16:53:41 2000 @@ -1,4 +1,4 @@ -TARGET_LIBGCC2_CFLAGS=-DHAVE_VISIVILITY_HIDDEN +TARGET_LIBGCC2_CFLAGS=-DHAVE_VISIVILITY_HIDDEN -fpic LIBGCC1 = libgcc1-asm.a CROSS_LIBGCC1 = libgcc1-asm.a LIB1ASMSRC = sh/lib1funcs-gnu.asm @@ -30,3 +30,20 @@ LIBGCC = stmp-multilib INSTALL_LIBGCC = install-multilib + +EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o + +# Compile crtbeginS.o and crtendS.o with pic. +CRTSTUFF_T_CFLAGS_S = -fPIC + +tcrtbeginS.o: crtstuff.c $(GCC_PASSES) $(CONFIG_H) \ + defaults.h frame.h gbl-ctors.h + $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -g0 \ + -finhibit-size-directive -fno-inline-functions -fno-exceptions $(CRTSTUFF_T_CFLAGS_S) \ + -c $(srcdir)/crtstuff.c -DCRT_BEGIN -o tcrtbeginS$(objext) + +tcrtendS.o: crtstuff.c $(GCC_PASSES) $(CONFIG_H) \ + defaults.h frame.h gbl-ctors.h + $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -g0 \ + -finhibit-size-directive -fno-inline-functions -fno-exceptions $(CRTSTUFF_T_CFLAGS_S) \ + -c $(srcdir)/crtstuff.c -DCRT_END -o tcrtendS$(objext) diff --exclude CVS -ruN gcc-core/gcc/config/sh/t-sh gcc-2.95.2+kaz+g/gcc/config/sh/t-sh --- gcc-core/gcc/config/sh/t-sh Sun May 7 22:24:17 2000 +++ gcc-2.95.2+kaz+g/gcc/config/sh/t-sh Mon May 1 16:51:22 2000 @@ -1,13 +1,8 @@ LIBGCC1 = libgcc1-asm.a CROSS_LIBGCC1 = libgcc1-asm.a -ifneq (,$(findstring gnu,$(target))) -LIB1ASMSRC = sh/lib1funcs-gnu.asm -else LIB1ASMSRC = sh/lib1funcs.asm -endif LIB1ASMFUNCS = _ashiftrt _ashiftrt_n _ashiftlt _lshiftrt _movstr \ - _movstr_i4 _mulsi3 _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ - _ic_invalidate + _movstr_i4 _mulsi3 _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr # These are really part of libgcc1, but this will cause them to be # built correctly, so... diff --exclude CVS -ruN gcc-core/gcc/configure gcc-2.95.2+kaz+g/gcc/configure --- gcc-core/gcc/configure Sun May 7 22:44:44 2000 +++ gcc-2.95.2+kaz+g/gcc/configure Mon May 1 16:55:31 2000 @@ -5312,6 +5312,7 @@ tm_file=sh/linux.h tmake_file="sh/t-linux" xmake_file=x-linux + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" gas=yes gnu_ld=yes if test x$enable_threads = xyes; then thread_file='posix' diff --exclude CVS -ruN gcc-core/gcc/configure.in gcc-2.95.2+kaz+g/gcc/configure.in --- gcc-core/gcc/configure.in Sun May 7 22:44:44 2000 +++ gcc-2.95.2+kaz+g/gcc/configure.in Mon May 1 16:51:22 2000 @@ -3007,6 +3007,7 @@ tm_file=sh/linux.h tmake_file="sh/t-linux" xmake_file=x-linux + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" gas=yes gnu_ld=yes if test x$enable_threads = xyes; then thread_file='posix' diff --exclude CVS -ruN gcc-core/gcc/crtstuff.c gcc-2.95.2+kaz+g/gcc/crtstuff.c --- gcc-core/gcc/crtstuff.c Sun May 7 22:09:28 2000 +++ gcc-2.95.2+kaz+g/gcc/crtstuff.c Mon May 1 16:51:22 2000 @@ -181,6 +181,9 @@ /* Stick a call to __do_global_dtors_aux into the .fini section. */ +#if defined(CALL_IN_FINI_SECTION) +CALL_IN_FINI_SECTION (__do_global_dtors_aux) +#else static void __attribute__ ((__unused__)) fini_dummy (void) { @@ -191,6 +194,7 @@ #endif asm (TEXT_SECTION_ASM_OP); } +#endif /* defined(CALL_IN_FINI_SECTION) */ #ifdef EH_FRAME_SECTION_ASM_OP /* Stick a call to __register_frame_info into the .init section. For some @@ -205,6 +209,9 @@ __register_frame_info (__EH_FRAME_BEGIN__, &object); } +#if defined(CALL_IN_INIT_SECTION) +CALL_IN_INIT_SECTION (frame_dummy) +#else static void __attribute__ ((__unused__)) init_dummy (void) { @@ -215,6 +222,7 @@ #endif asm (TEXT_SECTION_ASM_OP); } +#endif /* defined(CALL_IN_INIT_SECTION) */ #endif /* EH_FRAME_SECTION_ASM_OP */ #else /* OBJECT_FORMAT_ELF */ @@ -370,6 +378,9 @@ /* Stick a call to __do_global_ctors_aux into the .init section. */ +#if defined(CALL_IN_INIT_SECTION) +CALL_IN_INIT_SECTION (__do_global_ctors_aux) +#else static void __attribute__ ((__unused__)) init_dummy (void) { @@ -395,6 +406,7 @@ } #endif } +#endif /* defined(CALL_IN_INIT_SECTION) */ #else /* OBJECT_FORMAT_ELF */ |
From: Mitch D. <mj...@au...> - 2000-05-18 05:16:30
|
NIIBE Yutaka wrote: > > Here is the patch against current CVS of GCC. Hi, I have checked this in. Running "cvs up -P -d" should give you this update. Guys, if you have a chance to test the tools in the next day or so, could you please try it out? Regards, Mitch. -- | mailto:mj...@au... | Not the official view of: | | mailto:mj...@al... | Australian Calculator Opn | | Certified Linux Evangelist! | Hewlett Packard Australia | |