Commit 4dbdb061 by James E Wilson Committed by Jim Wilson

Add long_call attribute to mips port.

* config/mips/mips.c (mips_encode_section_info, mips_attribute_table,
TARGET_ENCODE_SECTION_INFO, TARGET_ATTRIBUTE_TABLE): New.
* config/mips/mips.h (SYMBOL_FLAG_LONG_CALL, SYMBOL_REF_LONG_CALL_P):
New.
* config/mips/predicates.md (const_call_insn_operand): Add check for
SYMBOL_REF_LONG_CALL_P.
* doc/extend.texi (long_call): Document the new attribute.

From-SVN: r102646
parent 9e254451
2005-08-01 James E Wilson <wilson@specifix.com>
* config/mips/mips.c (mips_encode_section_info, mips_attribute_table,
TARGET_ENCODE_SECTION_INFO, TARGET_ATTRIBUTE_TABLE): New.
* config/mips/mips.h (SYMBOL_FLAG_LONG_CALL, SYMBOL_REF_LONG_CALL_P):
New.
* config/mips/predicates.md (const_call_insn_operand): Add check for
SYMBOL_REF_LONG_CALL_P.
* doc/extend.texi (long_call): Document the new attribute.
2005-08-01 Ian Lance Taylor <ian@airs.com> 2005-08-01 Ian Lance Taylor <ian@airs.com>
Richard Henderson <rth@redhat.com> Richard Henderson <rth@redhat.com>
......
...@@ -406,6 +406,7 @@ static rtx mips_expand_builtin_compare (enum mips_builtin_type, ...@@ -406,6 +406,7 @@ static rtx mips_expand_builtin_compare (enum mips_builtin_type,
enum insn_code, enum mips_fp_condition, enum insn_code, enum mips_fp_condition,
rtx, tree); rtx, tree);
static rtx mips_expand_builtin_bposge (enum mips_builtin_type, rtx); static rtx mips_expand_builtin_bposge (enum mips_builtin_type, rtx);
static void mips_encode_section_info (tree, rtx, int);
/* Structure to be filled in by compute_frame_size with register /* Structure to be filled in by compute_frame_size with register
save masks, and offsets for the current function. */ save masks, and offsets for the current function. */
...@@ -689,6 +690,13 @@ const enum reg_class mips_regno_to_class[] = ...@@ -689,6 +690,13 @@ const enum reg_class mips_regno_to_class[] =
/* Map register constraint character to register class. */ /* Map register constraint character to register class. */
enum reg_class mips_char_to_class[256]; enum reg_class mips_char_to_class[256];
/* Table of machine dependent attributes. */
const struct attribute_spec mips_attribute_table[] =
{
{ "long_call", 0, 0, false, true, true, NULL },
{ NULL, 0, 0, false, false, false, NULL }
};
/* A table describing all the processors gcc knows about. Names are /* A table describing all the processors gcc knows about. Names are
matched in the order listed. The first mention of an ISA level is matched in the order listed. The first mention of an ISA level is
...@@ -1146,6 +1154,12 @@ static struct mips_rtx_cost_data const mips_rtx_cost_data[PROCESSOR_MAX] = ...@@ -1146,6 +1154,12 @@ static struct mips_rtx_cost_data const mips_rtx_cost_data[PROCESSOR_MAX] =
#undef TARGET_CANNOT_FORCE_CONST_MEM #undef TARGET_CANNOT_FORCE_CONST_MEM
#define TARGET_CANNOT_FORCE_CONST_MEM mips_cannot_force_const_mem #define TARGET_CANNOT_FORCE_CONST_MEM mips_cannot_force_const_mem
#undef TARGET_ENCODE_SECTION_INFO
#define TARGET_ENCODE_SECTION_INFO mips_encode_section_info
#undef TARGET_ATTRIBUTE_TABLE
#define TARGET_ATTRIBUTE_TABLE mips_attribute_table
struct gcc_target targetm = TARGET_INITIALIZER; struct gcc_target targetm = TARGET_INITIALIZER;
/* Classify symbol X, which must be a SYMBOL_REF or a LABEL_REF. */ /* Classify symbol X, which must be a SYMBOL_REF or a LABEL_REF. */
...@@ -10719,4 +10733,20 @@ mips_expand_builtin_bposge (enum mips_builtin_type builtin_type, rtx target) ...@@ -10719,4 +10733,20 @@ mips_expand_builtin_bposge (enum mips_builtin_type builtin_type, rtx target)
return target; return target;
} }
/* Set SYMBOL_REF_FLAGS for the SYMBOL_REF inside RTL, which belongs to DECL.
FIRST is true if this is the first time handling this decl. */
static void
mips_encode_section_info (tree decl, rtx rtl, int first)
{
default_encode_section_info (decl, rtl, first);
if (TREE_CODE (decl) == FUNCTION_DECL
&& lookup_attribute ("long_call", TYPE_ATTRIBUTES (TREE_TYPE (decl))))
{
rtx symbol = XEXP (rtl, 0);
SYMBOL_REF_FLAGS (symbol) |= SYMBOL_FLAG_LONG_CALL;
}
}
#include "gt-mips.h" #include "gt-mips.h"
...@@ -2301,6 +2301,11 @@ typedef struct mips_args { ...@@ -2301,6 +2301,11 @@ typedef struct mips_args {
else \ else \
asm_fprintf ((FILE), "%U%s", (NAME)) asm_fprintf ((FILE), "%U%s", (NAME))
/* Flag to mark a function decl symbol that requires a long call. */
#define SYMBOL_FLAG_LONG_CALL (SYMBOL_FLAG_MACH_DEP << 0)
#define SYMBOL_REF_LONG_CALL_P(X) \
((SYMBOL_REF_FLAGS (X) & SYMBOL_FLAG_LONG_CALL) != 0)
/* Specify the machine mode that this machine uses /* Specify the machine mode that this machine uses
for the index in the tablejump instruction. for the index in the tablejump instruction.
??? Using HImode in mips16 mode can cause overflow. */ ??? Using HImode in mips16 mode can cause overflow. */
......
...@@ -103,8 +103,10 @@ ...@@ -103,8 +103,10 @@
switch (symbol_type) switch (symbol_type)
{ {
case SYMBOL_GENERAL: case SYMBOL_GENERAL:
/* If -mlong-calls, force all calls to use register addressing. */ /* If -mlong-calls, force all calls to use register addressing. Also,
return !TARGET_LONG_CALLS; if this function has the long_call attribute, we must use register
addressing. */
return !TARGET_LONG_CALLS && !SYMBOL_REF_LONG_CALL_P (op);
case SYMBOL_GOT_GLOBAL: case SYMBOL_GOT_GLOBAL:
/* Without explicit relocs, there is no special syntax for /* Without explicit relocs, there is no special syntax for
......
...@@ -1942,6 +1942,14 @@ both the @option{-mlongcall} switch and, on the RS/6000 and PowerPC, the ...@@ -1942,6 +1942,14 @@ both the @option{-mlongcall} switch and, on the RS/6000 and PowerPC, the
@xref{RS/6000 and PowerPC Options}, for more information on whether long @xref{RS/6000 and PowerPC Options}, for more information on whether long
calls are necessary. calls are necessary.
@item long_call
@cindex indirect calls on MIPS
This attribute specifies how a particular function is called on MIPS@.
The attribute overrides the @option{-mlong-calls} (@pxref{MIPS Options})
command line switch. This attribute causes the compiler to always call
the function by first loading its address into a register, and then using
the contents of that register.
@item malloc @item malloc
@cindex @code{malloc} attribute @cindex @code{malloc} attribute
The @code{malloc} attribute is used to tell the compiler that a function The @code{malloc} attribute is used to tell the compiler that a function
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment