2005-07-28 James E Wilson * 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. Index: config/mips/mips.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/config/mips/mips.c,v retrieving revision 1.517 diff -p -p -r1.517 mips.c *** config/mips/mips.c 23 Jul 2005 08:36:52 -0000 1.517 --- config/mips/mips.c 30 Jul 2005 01:06:10 -0000 *************** static rtx mips_expand_builtin_compare ( *** 406,411 **** --- 406,412 ---- enum insn_code, enum mips_fp_condition, rtx, tree); 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 save masks, and offsets for the current function. */ *************** const enum reg_class mips_regno_to_class *** 689,694 **** --- 690,702 ---- /* Map register constraint character to register class. */ 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 matched in the order listed. The first mention of an ISA level is *************** static struct mips_rtx_cost_data const m *** 1126,1131 **** --- 1134,1145 ---- #undef TARGET_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; /* Classify symbol X, which must be a SYMBOL_REF or a LABEL_REF. */ *************** mips_expand_builtin_bposge (enum mips_bu *** 10699,10702 **** --- 10713,10732 ---- 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" Index: config/mips/mips.h =================================================================== RCS file: /cvs/gcc/gcc/gcc/config/mips/mips.h,v retrieving revision 1.400 diff -p -p -r1.400 mips.h *** config/mips/mips.h 23 Jul 2005 08:36:53 -0000 1.400 --- config/mips/mips.h 30 Jul 2005 01:06:11 -0000 *************** typedef struct mips_args { *** 2300,2305 **** --- 2300,2310 ---- else \ 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 for the index in the tablejump instruction. ??? Using HImode in mips16 mode can cause overflow. */ Index: config/mips/predicates.md =================================================================== RCS file: /cvs/gcc/gcc/gcc/config/mips/predicates.md,v retrieving revision 1.8 diff -p -p -r1.8 predicates.md *** config/mips/predicates.md 23 Jul 2005 08:36:54 -0000 1.8 --- config/mips/predicates.md 30 Jul 2005 01:06:11 -0000 *************** *** 103,110 **** switch (symbol_type) { case SYMBOL_GENERAL: ! /* If -mlong-calls, force all calls to use register addressing. */ ! return !TARGET_LONG_CALLS; case SYMBOL_GOT_GLOBAL: /* Without explicit relocs, there is no special syntax for --- 103,112 ---- switch (symbol_type) { case SYMBOL_GENERAL: ! /* If -mlong-calls, force all calls to use register addressing. Also, ! 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: /* Without explicit relocs, there is no special syntax for Index: doc/extend.texi =================================================================== RCS file: /cvs/gcc/gcc/gcc/doc/extend.texi,v retrieving revision 1.262 diff -p -p -r1.262 extend.texi *** doc/extend.texi 23 Jul 2005 08:36:43 -0000 1.262 --- doc/extend.texi 30 Jul 2005 01:06:09 -0000 *************** both the @option{-mlongcall} switch and, *** 1942,1947 **** --- 1942,1955 ---- @xref{RS/6000 and PowerPC Options}, for more information on whether long 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 @cindex @code{malloc} attribute The @code{malloc} attribute is used to tell the compiler that a function