predicates.md (const_call_insn_operand): Allow direct calls to locally-defined functions if TARGET_ABSOLUTE_ABICALLS.

* config/mips/predicates.md (const_call_insn_operand): Allow direct
	calls to locally-defined functions if TARGET_ABSOLUTE_ABICALLS.
	* config/mips/mips.md (jal_macro): Test TARGET_ABSOLUTE_ABICALLS.
	Use TARGET_OLDABI instead of !TARGET_NEWABI.
	(loadgp): Use mips_current_loadgp_style.
	(loadgp_noshared): New pattern.
	(sibcall_internal): Use MIPS_CALL.
	(sibcall_value_internal): Likewise.
	(sibcall_value_multiple_internal): Likewise.
	(call_internal): Likewise.
	(call_value_internal): Likewise.
	(call_value_multiple_internal): Likewise.
	(call_split): Use MIPS_CALL and add an 'S' constraint.
	(call_value_split): Likewise.
	(call_value_multiple_split): Likewise.
	* config/mips/mips.opt (-mabicalls): Tweak docstring.
	(-mshared): New option.
	* config/mips/mips-protos.h (mips_loadgp_style): New enum.
	(mips_current_loadgp_style): Declare.
	* config/mips/mips.c (mips_classify_symbol): Avoid using
	SYMBOL_GOT_LOCAL if TARGET_ABSOLUTE_ABICALLS.  Use SYMBOL_GENERAL
	rather than SYMBOL_GOT_GLOBAL for locally-binding symbols if
	TARGET_ABSOLUTE_ABICALLS.
	(override_options): Adjust comments.  Improve the warning that is
	issued when -mabicalls and -G are used together.
	(mips_file_start): Remove comment.
	(mips_current_loadgp_style): New function.
	(mips_gnu_local_gp): New variable.
	(mips_emit_loadgp): Use mips_current_loadgp_style.  Handle
	LOADGP_ABSOLUTE.
	(mips_output_function_prologue): Use mips_current_laodgp_style.
	(mips_expand_prologue): Call mips_emit_loadgp before emitting
	the cprestore instruction.
	(mips_extra_live_on_entry): Fix reversed test.  Don't make $25
	live for TARGET_ABSOLUTE_ABICALLS.
	* config/mips/mips.h (TARGET_ABSOLUTE_ABICALLS): New macro.
	(ASM_SPEC): Pass down -mshared and -mno-shared.
	(MIPS_CALL): New macro.
	* config/mips/netbsd.h (TARGET_OS_CPP_BUILTINS): Remove __ABICALLS__
	definition.
	* doc/invoke.texi (-mabicalls): Update documentation.
	(-mshared): Document.

From-SVN: r112261
This commit is contained in:
Richard Sandiford 2006-03-21 21:49:13 +00:00 committed by Richard Sandiford
parent 487d9a6153
commit d9870b7ef4
7 changed files with 232 additions and 67 deletions

View File

@ -1,3 +1,48 @@
2006-03-21 Richard Sandiford <richard@codesourcery.com>
* config/mips/predicates.md (const_call_insn_operand): Allow direct
calls to locally-defined functions if TARGET_ABSOLUTE_ABICALLS.
* config/mips/mips.md (jal_macro): Test TARGET_ABSOLUTE_ABICALLS.
Use TARGET_OLDABI instead of !TARGET_NEWABI.
(loadgp): Use mips_current_loadgp_style.
(loadgp_noshared): New pattern.
(sibcall_internal): Use MIPS_CALL.
(sibcall_value_internal): Likewise.
(sibcall_value_multiple_internal): Likewise.
(call_internal): Likewise.
(call_value_internal): Likewise.
(call_value_multiple_internal): Likewise.
(call_split): Use MIPS_CALL and add an 'S' constraint.
(call_value_split): Likewise.
(call_value_multiple_split): Likewise.
* config/mips/mips.opt (-mabicalls): Tweak docstring.
(-mshared): New option.
* config/mips/mips-protos.h (mips_loadgp_style): New enum.
(mips_current_loadgp_style): Declare.
* config/mips/mips.c (mips_classify_symbol): Avoid using
SYMBOL_GOT_LOCAL if TARGET_ABSOLUTE_ABICALLS. Use SYMBOL_GENERAL
rather than SYMBOL_GOT_GLOBAL for locally-binding symbols if
TARGET_ABSOLUTE_ABICALLS.
(override_options): Adjust comments. Improve the warning that is
issued when -mabicalls and -G are used together.
(mips_file_start): Remove comment.
(mips_current_loadgp_style): New function.
(mips_gnu_local_gp): New variable.
(mips_emit_loadgp): Use mips_current_loadgp_style. Handle
LOADGP_ABSOLUTE.
(mips_output_function_prologue): Use mips_current_laodgp_style.
(mips_expand_prologue): Call mips_emit_loadgp before emitting
the cprestore instruction.
(mips_extra_live_on_entry): Fix reversed test. Don't make $25
live for TARGET_ABSOLUTE_ABICALLS.
* config/mips/mips.h (TARGET_ABSOLUTE_ABICALLS): New macro.
(ASM_SPEC): Pass down -mshared and -mno-shared.
(MIPS_CALL): New macro.
* config/mips/netbsd.h (TARGET_OS_CPP_BUILTINS): Remove __ABICALLS__
definition.
* doc/invoke.texi (-mabicalls): Update documentation.
(-mshared): Document.
2006-03-21 Steve Ellcey <sje@cup.hp.com>
* config/ia64/unwind-hpux.c: New file.

View File

@ -105,6 +105,28 @@ enum mips_symbol_type {
};
#define NUM_SYMBOL_TYPES (SYMBOL_64_LOW + 1)
/* Identifiers a style of $gp initialization sequence.
LOADGP_NONE
No initialization sequence is needed.
LOADGP_OLDABI
The o32 and o64 PIC sequence (the kind traditionally generated
by .cpload).
LOADGP_NEWABI
The n32 and n64 PIC sequence (the kind traditionally generated
by .cpsetup).
LOADGP_ABSOLUTE
The GNU absolute sequence, as generated by loadgp_noshared. */
enum mips_loadgp_style {
LOADGP_NONE,
LOADGP_OLDABI,
LOADGP_NEWABI,
LOADGP_ABSOLUTE
};
extern bool mips_symbolic_constant_p (rtx, enum mips_symbol_type *);
extern int mips_regno_mode_ok_for_base_p (int, enum machine_mode, int);
extern bool mips_stack_address_p (rtx, enum machine_mode);
@ -194,6 +216,7 @@ extern rtx mips_rewrite_small_data (rtx);
extern HOST_WIDE_INT compute_frame_size (HOST_WIDE_INT);
extern HOST_WIDE_INT mips_initial_elimination_offset (int, int);
extern rtx mips_return_addr (int, rtx);
extern enum mips_loadgp_style mips_current_loadgp_style (void);
extern void mips_expand_prologue (void);
extern void mips_expand_epilogue (int);
extern int mips_can_use_return_insn (void);

View File

@ -1182,7 +1182,7 @@ mips_classify_symbol (rtx x)
{
if (TARGET_MIPS16)
return SYMBOL_CONSTANT_POOL;
if (TARGET_ABICALLS)
if (TARGET_ABICALLS && !TARGET_ABSOLUTE_ABICALLS)
return SYMBOL_GOT_LOCAL;
return SYMBOL_GENERAL;
}
@ -1197,13 +1197,8 @@ mips_classify_symbol (rtx x)
if (TARGET_MIPS16)
return SYMBOL_CONSTANT_POOL;
if (TARGET_ABICALLS)
return SYMBOL_GOT_LOCAL;
if (GET_MODE_SIZE (get_pool_mode (x)) <= mips_section_threshold)
return SYMBOL_SMALL_DATA;
return SYMBOL_GENERAL;
}
if (SYMBOL_REF_SMALL_P (x))
@ -1212,32 +1207,43 @@ mips_classify_symbol (rtx x)
if (TARGET_ABICALLS)
{
if (SYMBOL_REF_DECL (x) == 0)
return SYMBOL_REF_LOCAL_P (x) ? SYMBOL_GOT_LOCAL : SYMBOL_GOT_GLOBAL;
{
if (!SYMBOL_REF_LOCAL_P (x))
return SYMBOL_GOT_GLOBAL;
}
else
{
/* Don't use GOT accesses for locally-binding symbols if
TARGET_ABSOLUTE_ABICALLS. Otherwise, there are three
cases to consider:
/* There are three cases to consider:
- o32 PIC (either with or without explicit relocs)
- n32/n64 PIC without explicit relocs
- n32/n64 PIC with explicit relocs
- o32 PIC (either with or without explicit relocs)
- n32/n64 PIC without explicit relocs
- n32/n64 PIC with explicit relocs
In the first case, both local and global accesses will use an
R_MIPS_GOT16 relocation. We must correctly predict which of
the two semantics (local or global) the assembler and linker
will apply. The choice doesn't depend on the symbol's
visibility, so we deliberately ignore decl_visibility and
binds_local_p here.
In the first case, both local and global accesses will use an
R_MIPS_GOT16 relocation. We must correctly predict which of
the two semantics (local or global) the assembler and linker
will apply. The choice doesn't depend on the symbol's
visibility, so we deliberately ignore decl_visibility and
binds_local_p here.
In the second case, the assembler will not use R_MIPS_GOT16
relocations, but it chooses between local and global accesses
in the same way as for o32 PIC.
In the second case, the assembler will not use R_MIPS_GOT16
relocations, but it chooses between local and global accesses
in the same way as for o32 PIC.
In the third case we have more freedom since both forms of
access will work for any kind of symbol. However, there seems
little point in doing things differently. */
if (DECL_P (SYMBOL_REF_DECL (x))
&& TREE_PUBLIC (SYMBOL_REF_DECL (x))
&& !(TARGET_ABSOLUTE_ABICALLS
&& targetm.binds_local_p (SYMBOL_REF_DECL (x))))
return SYMBOL_GOT_GLOBAL;
}
In the third case we have more freedom since both forms of
access will work for any kind of symbol. However, there seems
little point in doing things differently. */
if (DECL_P (SYMBOL_REF_DECL (x)) && TREE_PUBLIC (SYMBOL_REF_DECL (x)))
return SYMBOL_GOT_GLOBAL;
return SYMBOL_GOT_LOCAL;
if (!TARGET_ABSOLUTE_ABICALLS)
return SYMBOL_GOT_LOCAL;
}
return SYMBOL_GENERAL;
@ -4753,15 +4759,18 @@ override_options (void)
target_flags &= ~MASK_ABICALLS;
}
/* -fpic (-KPIC) is the default when TARGET_ABICALLS is defined. We need
to set flag_pic so that the LEGITIMATE_PIC_OPERAND_P macro will work. */
/* ??? -non_shared turns off pic code generation, but this is not
implemented. */
if (TARGET_ABICALLS)
{
/* We need to set flag_pic for executables as well as DSOs
because we may reference symbols that are not defined in
the final executable. (MIPS does not use things like
copy relocs, for example.)
Also, there is a body of code that uses __PIC__ to distinguish
between -mabicalls and -mno-abicalls code. */
flag_pic = 1;
if (mips_section_threshold > 0)
warning (0, "-G is incompatible with PIC code which is the default");
warning (0, "%<-G%> is incompatible with %<-mabicalls%>");
}
/* mips_split_addresses is a half-way house between explicit
@ -5797,7 +5806,6 @@ mips_file_start (void)
/* Generate the pseudo ops that System V.4 wants. */
if (TARGET_ABICALLS)
/* ??? but do not want this (or want pic0) if -non-shared? */
fprintf (asm_out_file, "\t.abicalls\n");
if (TARGET_MIPS16)
@ -6493,22 +6501,55 @@ mips_output_cplocal (void)
output_asm_insn (".cplocal %+", 0);
}
/* Return the style of GP load sequence that is being used for the
current function. */
enum mips_loadgp_style
mips_current_loadgp_style (void)
{
if (!TARGET_ABICALLS || cfun->machine->global_pointer == 0)
return LOADGP_NONE;
if (TARGET_ABSOLUTE_ABICALLS)
return LOADGP_ABSOLUTE;
return TARGET_NEWABI ? LOADGP_NEWABI : LOADGP_OLDABI;
}
/* The __gnu_local_gp symbol. */
static GTY(()) rtx mips_gnu_local_gp;
/* If we're generating n32 or n64 abicalls, emit instructions
to set up the global pointer. */
static void
mips_emit_loadgp (void)
{
if (TARGET_ABICALLS && TARGET_NEWABI && cfun->machine->global_pointer > 0)
{
rtx addr, offset, incoming_address;
rtx addr, offset, incoming_address;
switch (mips_current_loadgp_style ())
{
case LOADGP_ABSOLUTE:
if (mips_gnu_local_gp == NULL)
{
mips_gnu_local_gp = gen_rtx_SYMBOL_REF (Pmode, "__gnu_local_gp");
SYMBOL_REF_FLAGS (mips_gnu_local_gp) |= SYMBOL_FLAG_LOCAL;
}
emit_insn (gen_loadgp_noshared (mips_gnu_local_gp));
break;
case LOADGP_NEWABI:
addr = XEXP (DECL_RTL (current_function_decl), 0);
offset = mips_unspec_address (addr, SYMBOL_GOTOFF_LOADGP);
incoming_address = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
emit_insn (gen_loadgp (offset, incoming_address));
if (!TARGET_EXPLICIT_RELOCS)
emit_insn (gen_loadgp_blockage ());
break;
default:
break;
}
}
@ -6588,7 +6629,7 @@ mips_output_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
HIGHEST_GP_SAVED == *FRAMEREG + FRAMESIZE + GPOFFSET => can find saved regs. */
}
if (TARGET_ABICALLS && !TARGET_NEWABI && cfun->machine->global_pointer > 0)
if (mips_current_loadgp_style () == LOADGP_OLDABI)
{
/* Handle the initialization of $gp for SVR4 PIC. */
if (!cfun->machine->all_noreorder_p)
@ -6775,12 +6816,12 @@ mips_expand_prologue (void)
stack_pointer_rtx)) = 1;
}
mips_emit_loadgp ();
/* If generating o32/o64 abicalls, save $gp on the stack. */
if (TARGET_ABICALLS && !TARGET_NEWABI && !current_function_is_leaf)
emit_insn (gen_cprestore (GEN_INT (current_function_outgoing_args_size)));
mips_emit_loadgp ();
/* If we are profiling, make sure no instructions are scheduled before
the call to mcount. */
@ -10674,13 +10715,13 @@ mips_encode_section_info (tree decl, rtx rtl, int first)
}
}
/* Implement TARGET_EXTRA_LIVE_ON_ENTRY. TARGET_ABICALLS makes
PIC_FUNCTION_ADDR_REGNUM live on entry to a function. */
/* Implement TARGET_EXTRA_LIVE_ON_ENTRY. PIC_FUNCTION_ADDR_REGNUM is live
on entry to a function when generating -mshared abicalls code. */
static void
mips_extra_live_on_entry (bitmap regs)
{
if (!TARGET_ABICALLS)
if (TARGET_ABICALLS && !TARGET_ABSOLUTE_ABICALLS)
bitmap_set_bit (regs, PIC_FUNCTION_ADDR_REGNUM);
}

View File

@ -149,6 +149,19 @@ extern const struct mips_rtx_cost_data *mips_cost;
#define TARGET_SPLIT_CALLS \
(TARGET_EXPLICIT_RELOCS && TARGET_ABICALLS && !TARGET_NEWABI)
/* True if we're generating a form of -mabicalls in which we can use
operators like %hi and %lo to refer to locally-binding symbols.
We can only do this for -mno-shared, and only then if we can use
relocation operations instead of assembly macros. It isn't really
worth using absolute sequences for 64-bit symbols because GOT
accesses are so much shorter. */
#define TARGET_ABSOLUTE_ABICALLS \
(TARGET_ABICALLS \
&& !TARGET_SHARED \
&& TARGET_EXPLICIT_RELOCS \
&& !ABI_HAS_64BIT_SYMBOLS)
/* True if we can optimize sibling calls. For simplicity, we only
handle cases in which call_insn_operand will reject invalid
sibcall addresses. There are two cases in which this isn't true:
@ -820,6 +833,7 @@ extern const struct mips_rtx_cost_data *mips_cost;
%(subtarget_asm_debugging_spec) \
%{mabi=*} %{!mabi*: %(asm_abi_default_spec)} \
%{mgp32} %{mgp64} %{march=*} %{mxgot:-xgot} \
%{mshared} %{mno-shared} \
%{msym32} %{mno-sym32} \
%{mtune=*} %{v} \
%(subtarget_asm_spec)"
@ -2281,6 +2295,26 @@ typedef struct mips_args {
its operands. */
#define MIPS_BRANCH(OPCODE, OPERANDS) \
"%*" OPCODE "%?\t" OPERANDS "%/"
/* Return the asm template for a call. INSN is the instruction's mnemonic
("j" or "jal"), OPERANDS are its operands, and OPNO is the operand number
of the target.
When generating -mabicalls without explicit relocation operators,
all calls should use assembly macros. Otherwise, all indirect
calls should use "jr" or "jalr"; we will arrange to restore $gp
afterwards if necessary. Finally, we can only generate direct
calls for -mabicalls by temporarily switching to non-PIC mode. */
#define MIPS_CALL(INSN, OPERANDS, OPNO) \
(TARGET_ABICALLS && !TARGET_EXPLICIT_RELOCS \
? "%*" INSN "\t%" #OPNO "%/" \
: REG_P (OPERANDS[OPNO]) \
? "%*" INSN "r\t%" #OPNO "%/" \
: TARGET_ABICALLS \
? (".option\tpic0\n\t" \
"%*" INSN "\t%" #OPNO "%/\n\t" \
".option\tpic2") \
: "%*" INSN "\t%" #OPNO "%/")
/* Control the assembler format that we output. */

View File

@ -166,14 +166,15 @@
;; This attribute is YES if the instruction is a jal macro (not a
;; real jal instruction).
;;
;; jal is always a macro in SVR4 PIC since it includes an instruction to
;; restore $gp. Direct jals are also macros in NewABI PIC since they
;; load the target address into $25.
;; jal is always a macro for o32 and o64 abicalls because it includes an
;; instruction to restore $gp. Direct jals are also macros for -mshared
;; abicalls because they first load the target address into $25.
(define_attr "jal_macro" "no,yes"
(cond [(eq_attr "jal" "direct")
(symbol_ref "TARGET_ABICALLS != 0")
(symbol_ref "TARGET_ABICALLS
&& (TARGET_OLDABI || !TARGET_ABSOLUTE_ABICALLS)")
(eq_attr "jal" "indirect")
(symbol_ref "(TARGET_ABICALLS && !TARGET_NEWABI) != 0")]
(symbol_ref "TARGET_ABICALLS && TARGET_OLDABI")]
(const_string "no")))
;; Classification of each insn.
@ -3982,7 +3983,7 @@
(define_insn_and_split "loadgp"
[(unspec_volatile [(match_operand 0 "" "")
(match_operand 1 "register_operand" "")] UNSPEC_LOADGP)]
"TARGET_ABICALLS && TARGET_NEWABI"
"mips_current_loadgp_style () == LOADGP_NEWABI"
"#"
""
[(set (match_dup 2) (match_dup 3))
@ -3996,6 +3997,19 @@
}
[(set_attr "length" "12")])
;; Likewise, for -mno-shared code. Operand 0 is the __gnu_local_gp symbol.
(define_insn_and_split "loadgp_noshared"
[(unspec_volatile [(match_operand 0 "" "")] UNSPEC_LOADGP)]
"mips_current_loadgp_style () == LOADGP_ABSOLUTE"
"#"
""
[(const_int 0)]
{
emit_move_insn (pic_offset_table_rtx, operands[0]);
DONE;
}
[(set_attr "length" "8")])
;; The use of gp is hidden when not using explicit relocations.
;; This blockage instruction prevents the gp load from being
;; scheduled after an implicit use of gp. It also prevents
@ -5060,9 +5074,7 @@
[(call (mem:SI (match_operand 0 "call_insn_operand" "j,S"))
(match_operand 1 "" ""))]
"TARGET_SIBCALLS && SIBLING_CALL_P (insn)"
"@
%*jr\t%0%/
%*j\t%0%/"
{ return MIPS_CALL ("j", operands, 0); }
[(set_attr "type" "call")])
(define_expand "sibcall_value"
@ -5082,9 +5094,7 @@
(call (mem:SI (match_operand 1 "call_insn_operand" "j,S"))
(match_operand 2 "" "")))]
"TARGET_SIBCALLS && SIBLING_CALL_P (insn)"
"@
%*jr\t%1%/
%*j\t%1%/"
{ return MIPS_CALL ("j", operands, 1); }
[(set_attr "type" "call")])
(define_insn "sibcall_value_multiple_internal"
@ -5095,9 +5105,7 @@
(call (mem:SI (match_dup 1))
(match_dup 2)))]
"TARGET_SIBCALLS && SIBLING_CALL_P (insn)"
"@
%*jr\t%1%/
%*j\t%1%/"
{ return MIPS_CALL ("j", operands, 1); }
[(set_attr "type" "call")])
(define_expand "call"
@ -5153,7 +5161,7 @@
(match_operand 1 "" ""))
(clobber (reg:SI 31))]
""
{ return TARGET_SPLIT_CALLS ? "#" : "%*jal\t%0%/"; }
{ return TARGET_SPLIT_CALLS ? "#" : MIPS_CALL ("jal", operands, 0); }
"reload_completed && TARGET_SPLIT_CALLS && (operands[2] = insn)"
[(const_int 0)]
{
@ -5166,12 +5174,12 @@
(set_attr "extended_mips16" "no,yes")])
(define_insn "call_split"
[(call (mem:SI (match_operand 0 "call_insn_operand" "c"))
[(call (mem:SI (match_operand 0 "call_insn_operand" "cS"))
(match_operand 1 "" ""))
(clobber (reg:SI 31))
(clobber (reg:SI 28))]
"TARGET_SPLIT_CALLS"
"%*jalr\t%0%/"
{ return MIPS_CALL ("jal", operands, 0); }
[(set_attr "type" "call")])
(define_expand "call_value"
@ -5193,7 +5201,7 @@
(match_operand 2 "" "")))
(clobber (reg:SI 31))]
""
{ return TARGET_SPLIT_CALLS ? "#" : "%*jal\t%1%/"; }
{ return TARGET_SPLIT_CALLS ? "#" : MIPS_CALL ("jal", operands, 1); }
"reload_completed && TARGET_SPLIT_CALLS && (operands[3] = insn)"
[(const_int 0)]
{
@ -5208,12 +5216,12 @@
(define_insn "call_value_split"
[(set (match_operand 0 "register_operand" "=df")
(call (mem:SI (match_operand 1 "call_insn_operand" "c"))
(call (mem:SI (match_operand 1 "call_insn_operand" "cS"))
(match_operand 2 "" "")))
(clobber (reg:SI 31))
(clobber (reg:SI 28))]
"TARGET_SPLIT_CALLS"
"%*jalr\t%1%/"
{ return MIPS_CALL ("jal", operands, 1); }
[(set_attr "type" "call")])
;; See comment for call_internal.
@ -5226,7 +5234,7 @@
(match_dup 2)))
(clobber (reg:SI 31))]
""
{ return TARGET_SPLIT_CALLS ? "#" : "%*jal\t%1%/"; }
{ return TARGET_SPLIT_CALLS ? "#" : MIPS_CALL ("jal", operands, 1); }
"reload_completed && TARGET_SPLIT_CALLS && (operands[4] = insn)"
[(const_int 0)]
{
@ -5241,7 +5249,7 @@
(define_insn "call_value_multiple_split"
[(set (match_operand 0 "register_operand" "=df")
(call (mem:SI (match_operand 1 "call_insn_operand" "c"))
(call (mem:SI (match_operand 1 "call_insn_operand" "cS"))
(match_operand 2 "" "")))
(set (match_operand 3 "register_operand" "=df")
(call (mem:SI (match_dup 1))
@ -5249,7 +5257,7 @@
(clobber (reg:SI 31))
(clobber (reg:SI 28))]
"TARGET_SPLIT_CALLS"
"%*jalr\t%1%/"
{ return MIPS_CALL ("jal", operands, 1); }
[(set_attr "type" "call")])
;; Call subroutine returning any type.

View File

@ -25,7 +25,7 @@ Target RejectNegative Joined
mabicalls
Target Report Mask(ABICALLS)
Use SVR4-style PIC
Generate code that can be used in SVR4-style dynamic objects
mad
Target Report Var(TARGET_MAD)
@ -185,6 +185,10 @@ mpaired-single
Target Report Mask(PAIRED_SINGLE_FLOAT)
Use paired-single floating-point instructions
mshared
Target Report Var(TARGET_SHARED) Init(1)
When generating -mabicalls code, make the code suitable for use in shared libraries
msingle-float
Target Report RejectNegative Mask(SINGLE_FLOAT)
Restrict the use of hardware floating-point instructions to 32-bit operations

View File

@ -103,6 +103,16 @@
switch (symbol_type)
{
case SYMBOL_GENERAL:
/* We can only use direct calls for TARGET_ABSOLUTE_ABICALLS if we
are sure that the target function does not need $25 to be live
on entry. This is true for any locally-defined function because
any such function will use %hi/%lo accesses to set up $gp. */
if (TARGET_ABSOLUTE_ABICALLS
&& !(GET_CODE (op) == SYMBOL_REF
&& SYMBOL_REF_DECL (op)
&& !DECL_EXTERNAL (SYMBOL_REF_DECL (op))))
return false;
/* If -mlong-calls, force all calls to use register addressing. Also,
if this function has the long_call attribute, we must use register
addressing. */