From 93147119042e5056f979d58573470a9cff2710b0 Mon Sep 17 00:00:00 2001 From: Bernd Schmidt Date: Mon, 20 Nov 2006 12:35:47 +0000 Subject: [PATCH] bfin.md (call_symbol, [...]): Allow these patterns if TARGET_LEAF_ID_SHARED_LIBRARY. * config/bfin/bfin.md (call_symbol, call_value_symbol, sibcall_symbol, sibcall_value_symbol): Allow these patterns if TARGET_LEAF_ID_SHARED_LIBRARY. * config/bfin/bfin.c (bfin_expand_call): Allow them here as well. (override_options): Turn on id shared library flags if -msep-data, but disallow the combination of these options on the command line. * config/bfin/bfin.h (TARGET_LEAF_ID_SHARED_LIBRARY, MASK_SEP_DATA MASK_LEAF_ID_SHARED_LIBRARY, TARGET_SEP_DATA): New macros. (DRIVER_SELF_SPECS): -mleaf-id-shared-library implies -mid-shared-library. (TARGET_SWITCHES): Add -mleaf-id-shared-library and -msep-data. * doc/invoke.texi (Blackfin Options): Document new switches. From-SVN: r119012 --- gcc/ChangeLog | 13 +++++++++++++ gcc/config/bfin/bfin.c | 11 ++++++++++- gcc/config/bfin/bfin.h | 1 + gcc/config/bfin/bfin.md | 8 ++++---- gcc/config/bfin/bfin.opt | 9 +++++++++ gcc/config/bfin/t-bfin-elf | 6 ++++-- 6 files changed, 41 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bafe4c42..e182213 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -12,6 +12,19 @@ functions. (TARGET_CANNOT_FORCE_CONST_MEM): New macro. + * config/bfin/bfin.md (call_symbol, call_value_symbol, sibcall_symbol, + sibcall_value_symbol): Allow these patterns if + TARGET_LEAF_ID_SHARED_LIBRARY. + * config/bfin/bfin.c (bfin_expand_call): Allow them here as well. + (override_options): Turn on id shared library flags if -msep-data, + but disallow the combination of these options on the command line. + * config/bfin/bfin.h (TARGET_LEAF_ID_SHARED_LIBRARY, MASK_SEP_DATA + MASK_LEAF_ID_SHARED_LIBRARY, TARGET_SEP_DATA): New macros. + (DRIVER_SELF_SPECS): -mleaf-id-shared-library implies + -mid-shared-library. + (TARGET_SWITCHES): Add -mleaf-id-shared-library and -msep-data. + * doc/invoke.texi (Blackfin Options): Document new switches. + 2006-11-19 Andrew Pinski PR rtl-opt/29879 diff --git a/gcc/config/bfin/bfin.c b/gcc/config/bfin/bfin.c index edc7cc4..6238690 100644 --- a/gcc/config/bfin/bfin.c +++ b/gcc/config/bfin/bfin.c @@ -948,6 +948,7 @@ bfin_expand_prologue (void) do_link (spreg, frame_size, false); if (TARGET_ID_SHARED_LIBRARY + && !TARGET_SEP_DATA && (current_function_uses_pic_offset_table || !current_function_is_leaf)) bfin_load_pic_reg (pic_offset_table_rtx); @@ -1780,7 +1781,7 @@ bfin_expand_call (rtx retval, rtx fnaddr, rtx callarg1, rtx cookie, int sibcall) else if ((!register_no_elim_operand (callee, Pmode) && GET_CODE (callee) != SYMBOL_REF) || (GET_CODE (callee) == SYMBOL_REF - && (flag_pic + && ((TARGET_ID_SHARED_LIBRARY && !TARGET_LEAF_ID_SHARED_LIBRARY) || bfin_longcall_p (callee, INTVAL (cookie))))) { callee = copy_to_mode_reg (Pmode, callee); @@ -2007,6 +2008,14 @@ override_options (void) if (TARGET_ID_SHARED_LIBRARY && TARGET_FDPIC) error ("ID shared libraries and FD-PIC mode can't be used together."); + /* Don't allow the user to specify -mid-shared-library and -msep-data + together, as it makes little sense from a user's point of view... */ + if (TARGET_SEP_DATA && TARGET_ID_SHARED_LIBRARY) + error ("cannot specify both -msep-data and -mid-shared-library"); + /* ... internally, however, it's nearly the same. */ + if (TARGET_SEP_DATA) + target_flags |= MASK_ID_SHARED_LIBRARY | MASK_LEAF_ID_SHARED_LIBRARY; + /* There is no single unaligned SI op for PIC code. Sometimes we need to use ".4byte" and sometimes we need to use ".picptr". See bfin_assemble_integer for details. */ diff --git a/gcc/config/bfin/bfin.h b/gcc/config/bfin/bfin.h index 00b6c29..69e60bb 100644 --- a/gcc/config/bfin/bfin.h +++ b/gcc/config/bfin/bfin.h @@ -51,6 +51,7 @@ extern int target_flags; #endif #define DRIVER_SELF_SPECS SUBTARGET_DRIVER_SELF_SPECS "\ + %{mleaf-id-shared-library:%{!mid-shared-library:-mid-shared-library}} \ %{mfdpic:%{!fpic:%{!fpie:%{!fPIC:%{!fPIE:\ %{!fno-pic:%{!fno-pie:%{!fno-PIC:%{!fno-PIE:-fpie}}}}}}}}} \ " diff --git a/gcc/config/bfin/bfin.md b/gcc/config/bfin/bfin.md index afd24e6..e509d03 100644 --- a/gcc/config/bfin/bfin.md +++ b/gcc/config/bfin/bfin.md @@ -1771,7 +1771,7 @@ (match_operand 1 "general_operand" "g")) (use (match_operand 2 "" ""))] "! SIBLING_CALL_P (insn) - && !TARGET_ID_SHARED_LIBRARY + && (!TARGET_ID_SHARED_LIBRARY || TARGET_LEAF_ID_SHARED_LIBRARY) && GET_CODE (operands[0]) == SYMBOL_REF && !bfin_longcall_p (operands[0], INTVAL (operands[2]))" "call %0;" @@ -1784,7 +1784,7 @@ (use (match_operand 2 "" "")) (return)] "SIBLING_CALL_P (insn) - && !TARGET_ID_SHARED_LIBRARY + && (!TARGET_ID_SHARED_LIBRARY || TARGET_LEAF_ID_SHARED_LIBRARY) && GET_CODE (operands[0]) == SYMBOL_REF && !bfin_longcall_p (operands[0], INTVAL (operands[2]))" "jump.l %0;" @@ -1797,7 +1797,7 @@ (match_operand 2 "general_operand" "g"))) (use (match_operand 3 "" ""))] "! SIBLING_CALL_P (insn) - && !TARGET_ID_SHARED_LIBRARY + && (!TARGET_ID_SHARED_LIBRARY || TARGET_LEAF_ID_SHARED_LIBRARY) && GET_CODE (operands[1]) == SYMBOL_REF && !bfin_longcall_p (operands[1], INTVAL (operands[3]))" "call %1;" @@ -1811,7 +1811,7 @@ (use (match_operand 3 "" "")) (return)] "SIBLING_CALL_P (insn) - && !TARGET_ID_SHARED_LIBRARY + && (!TARGET_ID_SHARED_LIBRARY || TARGET_LEAF_ID_SHARED_LIBRARY) && GET_CODE (operands[1]) == SYMBOL_REF && !bfin_longcall_p (operands[1], INTVAL (operands[3]))" "jump.l %1;" diff --git a/gcc/config/bfin/bfin.opt b/gcc/config/bfin/bfin.opt index 5fe54c9..5b53fec 100644 --- a/gcc/config/bfin/bfin.opt +++ b/gcc/config/bfin/bfin.opt @@ -40,10 +40,19 @@ mid-shared-library Target Report Mask(ID_SHARED_LIBRARY) Enabled ID based shared library +mleaf-id-shared-library +Target Report Mask(LEAF_ID_SHARED_LIBRARY) +Generate code that won't be linked against any other ID shared libraries, +but may be used as a shared library. + mshared-library-id= Target RejectNegative Joined UInteger Var(bfin_library_id) ID of shared library to build +msep-data +Target Report Mask(SEP_DATA) +Enable separate data segment + mlong-calls Target Report Mask(LONG_CALLS) Avoid generating pc-relative calls; use indirection diff --git a/gcc/config/bfin/t-bfin-elf b/gcc/config/bfin/t-bfin-elf index 8b30cf6..5f40318 100644 --- a/gcc/config/bfin/t-bfin-elf +++ b/gcc/config/bfin/t-bfin-elf @@ -22,10 +22,12 @@ GCC_CFLAGS += -N CRTSTUFF_T_CFLAGS = -fpic TARGET_LIBGCC2_CFLAGS = -fpic -MULTILIB_OPTIONS=mid-shared-library mfdpic +MULTILIB_OPTIONS=mid-shared-library mleaf-id-shared-library +MULTILIB_OPTIONS+=msep-data mfdpic MULTILIB_DEFAULTS= MULTILIB_DIRNAMES= -MULTILIB_EXCEPTIONS=mid-shared-library/mfdpic +MULTILIB_EXCEPTIONS=mid-shared-library*/mfdpic mleaf-id-shared-library* +MULTILIB_EXCEPTIONS+=*msep-data* # Assemble startup files. $(T)crti.o: $(srcdir)/config/bfin/crti.s $(GCC_PASSES) -- 2.7.4