aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBernd Schmidt <bernd.schmidt@analog.com>2006-11-20 12:35:47 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2006-11-20 12:35:47 +0000
commit93147119042e5056f979d58573470a9cff2710b0 (patch)
tree063c50288c18fa68a3248dcdd6f9663aafa3c878 /gcc
parentd6f6753efec42c63c32b0e0cfa1e9944a2e9ac4a (diff)
downloadgcc-93147119042e5056f979d58573470a9cff2710b0.zip
gcc-93147119042e5056f979d58573470a9cff2710b0.tar.gz
gcc-93147119042e5056f979d58573470a9cff2710b0.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/config/bfin/bfin.c11
-rw-r--r--gcc/config/bfin/bfin.h1
-rw-r--r--gcc/config/bfin/bfin.md8
-rw-r--r--gcc/config/bfin/bfin.opt9
-rw-r--r--gcc/config/bfin/t-bfin-elf6
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 <pinskia@gmail.com>
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)