summaryrefslogtreecommitdiff
path: root/m68k-unknown-amigaos/recipes/patches/gcc/gcc.config.m68k.m68k.c.p
diff options
context:
space:
mode:
Diffstat (limited to 'm68k-unknown-amigaos/recipes/patches/gcc/gcc.config.m68k.m68k.c.p')
-rw-r--r--m68k-unknown-amigaos/recipes/patches/gcc/gcc.config.m68k.m68k.c.p513
1 files changed, 0 insertions, 513 deletions
diff --git a/m68k-unknown-amigaos/recipes/patches/gcc/gcc.config.m68k.m68k.c.p b/m68k-unknown-amigaos/recipes/patches/gcc/gcc.config.m68k.m68k.c.p
deleted file mode 100644
index 9ca42a1..0000000
--- a/m68k-unknown-amigaos/recipes/patches/gcc/gcc.config.m68k.m68k.c.p
+++ /dev/null
@@ -1,513 +0,0 @@
---- gcc-3.4.6/gcc/config/m68k/m68k.c 2013-05-19 20:09:27.000000000 +0200
-+++ gcc/config/m68k/m68k.c 2013-05-19 20:23:32.000000000 +0200
-@@ -123,6 +123,8 @@
- static tree m68k_handle_fndecl_attribute (tree *node, tree name,
- tree args, int flags,
- bool *no_add_attrs);
-+static tree m68k_handle_type_attribute (tree *, tree, tree, int, bool *);
-+static int m68k_comp_type_attributes (tree, tree);
- static void m68k_compute_frame_layout (void);
- static bool m68k_save_reg (unsigned int regno, bool interrupt_handler);
- static int const_int_cost (rtx);
-@@ -138,6 +140,8 @@
- const char *m68k_align_funcs_string;
- /* Specify the identification number of the library being built */
- const char *m68k_library_id_string;
-+/* Specify number of registers for integer, pointer and float arguments. */
-+const char *m68k_regparm_string;
-
- /* Specify power of two alignment used for loops. */
- int m68k_align_loops;
-@@ -145,6 +149,8 @@
- int m68k_align_jumps;
- /* Specify power of two alignment used for functions. */
- int m68k_align_funcs;
-+/* Specify number of registers for integer, pointer and float arguments. */
-+int m68k_regparm;
-
- /* Nonzero if the last compare/test insn had FP operands. The
- sCC expanders peek at this to determine what to do for the
-@@ -208,9 +214,30 @@
- {
- /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
- { "interrupt_handler", 0, 0, true, false, false, m68k_handle_fndecl_attribute },
-+
-+ /* Stkparm attribute specifies to pass arguments on the stack */
-+ { "stkparm", 0, 0, false, true, true, m68k_handle_type_attribute },
-+ /* Regparm attribute specifies how many integer arguments are to be
-+ passed in registers. */
-+ { "regparm", 0, 1, false, true, true, m68k_handle_type_attribute },
-+
-+#ifdef TARGET_AMIGAOS
-+ /* Stackext attribute specifies to generate stackextension code */
-+ { "stackext", 0, 0, false, true, true, amigaos_handle_type_attribute },
-+ /* Interrupt attribute specifies to generate a special exit code */
-+ { "interrupt", 0, 0, false, true, true, amigaos_handle_type_attribute },
-+ /* Saveds attribute specifies to generate baserel setup code */
-+ { "saveds", 0, 0, false, true, true, amigaos_handle_type_attribute },
-+ /* Chip attribute specifies to place data in a "special" section */
-+ { "chip", 0, 0, true, false, false, amigaos_handle_decl_attribute },
-+#endif
-+
- { NULL, 0, 0, false, false, false, NULL }
- };
-
-+#undef TARGET_COMP_TYPE_ATTRIBUTES
-+#define TARGET_COMP_TYPE_ATTRIBUTES m68k_comp_type_attributes
-+
- struct gcc_target targetm = TARGET_INITIALIZER;
-
- /* Sometimes certain combinations of command options do not make
-@@ -296,6 +323,23 @@
- m68k_align_funcs = i;
- }
-
-+ /* Validate -mregparm and -mregparm= value. */
-+ if (m68k_regparm_string)
-+ {
-+ m68k_regparm = atoi (m68k_regparm_string);
-+ if (m68k_regparm < 1 || m68k_regparm > M68K_MAX_REGPARM)
-+ error ("-mregparm=%d is not between 1 and %d",
-+ m68k_regparm, M68K_MAX_REGPARM);
-+ target_flags |= MASK_REGPARM;
-+ }
-+ else
-+ if (TARGET_REGPARM)
-+ m68k_regparm = M68K_DEFAULT_REGPARM;
-+
-+ /* XXX: FIXME: Workaround for a bug. */
-+ if (flag_pic >= 3)
-+ flag_strength_reduce = 0;
-+
- /* -fPIC uses 32-bit pc-relative displacements, which don't exist
- until the 68020. */
- if (!TARGET_68020 && !TARGET_COLDFIRE && (flag_pic == 2))
-@@ -312,12 +356,14 @@
- the PLT entry for `foo'. Doing function cse will cause the address of
- `foo' to be loaded into a register, which is exactly what we want to
- avoid when we are doing PIC on svr4 m68k. */
-- if (flag_pic)
-+ if (flag_pic && flag_pic < 3)
- flag_no_function_cse = 1;
-
- SUBTARGET_OVERRIDE_OPTIONS;
- }
-
-+/* Attributes support. */
-+
- /* Return nonzero if FUNC is an interrupt function as specified by the
- "interrupt_handler" attribute. */
- static bool
-@@ -350,6 +396,251 @@
- return NULL_TREE;
- }
-
-+/* Handle a "regparm" or "stkparm" attribute;
-+ arguments as in struct attribute_spec.handler. */
-+
-+static tree
-+m68k_handle_type_attribute (tree *node, tree name, tree args,
-+ int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
-+{
-+ if (TREE_CODE (*node) == FUNCTION_TYPE || TREE_CODE (*node) == METHOD_TYPE)
-+ {
-+ /* 'regparm' accepts one optional argument - number of registers in
-+ single class that should be used to pass arguments. */
-+ if (is_attribute_p ("regparm", name))
-+ {
-+ if (lookup_attribute ("stkparm", TYPE_ATTRIBUTES(*node)))
-+ {
-+ error ("`regparm' and `stkparm' are mutually exclusive");
-+ }
-+ if (args && TREE_CODE (args) == TREE_LIST)
-+ {
-+ tree numofregs = TREE_VALUE (args);
-+ if (numofregs)
-+ if (TREE_CODE (numofregs) != INTEGER_CST
-+/*
-+ || compare_tree_int(numofregs, 1) < 0
-+ || compare_tree_int(numofregs, M68K_MAX_REGPARM) > 0)
-+*/
-+ || TREE_INT_CST_HIGH (numofregs)
-+ || TREE_INT_CST_LOW (numofregs) < 1
-+ || TREE_INT_CST_LOW (numofregs) > M68K_MAX_REGPARM)
-+ {
-+ error ("invalid argument to `regparm' attribute");
-+ }
-+ }
-+ }
-+ else if (is_attribute_p ("stkparm", name))
-+ {
-+ if (lookup_attribute ("regparm", TYPE_ATTRIBUTES(*node)))
-+ {
-+ error ("`regparm' and `stkparm' are mutually exclusive");
-+ }
-+ }
-+ }
-+ else
-+ {
-+ warning ("`%s' attribute only applies to functions",
-+ IDENTIFIER_POINTER (name));
-+ *no_add_attrs = true;
-+ }
-+
-+ return NULL_TREE;
-+}
-+
-+/* Return zero if the attributes on TYPE1 and TYPE2 are incompatible,
-+ one if they are compatible, and two if they are nearly compatible
-+ (which causes a warning to be generated). */
-+
-+static int
-+m68k_comp_type_attributes (tree type1, tree type2)
-+{
-+ /* Functions or methods are incompatible if they specify mutually
-+ exclusive ways of passing arguments. */
-+ if (TREE_CODE (type1) == FUNCTION_TYPE || TREE_CODE (type1) == METHOD_TYPE)
-+ {
-+ tree arg1, arg2;
-+ if (!! lookup_attribute ("stkparm", TYPE_ATTRIBUTES (type1)) !=
-+ !! lookup_attribute ("stkparm", TYPE_ATTRIBUTES (type2))
-+ || !! lookup_attribute ("regparm", TYPE_ATTRIBUTES (type1)) !=
-+ !! lookup_attribute ("regparm", TYPE_ATTRIBUTES (type2)))
-+ return 0; /* 'regparm' and 'stkparm' are mutually exclusive. */
-+
-+ arg1 = lookup_attribute ("regparm", TYPE_ATTRIBUTES (type1));
-+ arg2 = lookup_attribute ("regparm", TYPE_ATTRIBUTES (type2));
-+ if (arg1 && arg2)
-+ {
-+ int num1 = 0, num2 = 0;
-+ if (TREE_VALUE (arg1) && TREE_CODE (TREE_VALUE (arg1)) == TREE_LIST)
-+ {
-+ tree numofregs = TREE_VALUE (TREE_VALUE (arg1));
-+ if (numofregs)
-+ num1 = TREE_INT_CST_LOW (numofregs);
-+ }
-+ if (TREE_VALUE (arg2) && TREE_CODE (TREE_VALUE (arg2)) == TREE_LIST)
-+ {
-+ tree numofregs = TREE_VALUE (TREE_VALUE (arg2));
-+ if (numofregs)
-+ num2 = TREE_INT_CST_LOW (numofregs);
-+ }
-+ if (num1 != num2)
-+ return 0; /* Different numbers, or no number in one type. */
-+ }
-+ }
-+#ifdef TARGET_AMIGAOS
-+ return amigaos_comp_type_attributes(type1, type2);
-+#else
-+ return 1;
-+#endif
-+}
-+
-+/* Argument-passing support functions. */
-+
-+/* Initialize a variable CUM of type CUMULATIVE_ARGS
-+ for a call to a function whose data type is FNTYPE.
-+ For a library call, FNTYPE is 0. */
-+
-+void
-+m68k_init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype)
-+{
-+ cum->last_arg_reg = -1;
-+ cum->regs_already_used = 0;
-+ if (fntype)
-+ {
-+ if (lookup_attribute ("stkparm", TYPE_ATTRIBUTES (fntype)))
-+ cum->num_of_regs = 0;
-+ else
-+ {
-+ tree ratree = lookup_attribute ("regparm", TYPE_ATTRIBUTES (fntype));
-+ if (ratree)
-+ {
-+ cum->num_of_regs = m68k_regparm ? m68k_regparm
-+ : M68K_DEFAULT_REGPARM;
-+ if (TREE_VALUE (ratree)
-+ && TREE_CODE (TREE_VALUE (ratree)) == TREE_LIST)
-+ {
-+ tree num_of_regs = TREE_VALUE (TREE_VALUE (ratree));
-+ cum->num_of_regs =
-+ num_of_regs ? TREE_INT_CST_LOW (num_of_regs) :
-+ (m68k_regparm ? m68k_regparm : M68K_DEFAULT_REGPARM);
-+ }
-+ }
-+ else
-+ cum->num_of_regs = m68k_regparm;
-+ }
-+ }
-+ else /* Libcall. */
-+ cum->num_of_regs = 0;
-+
-+ if (cum->num_of_regs)
-+ {
-+ /* If this is a vararg call, put all arguments on stack. */
-+ tree param, next_param;
-+ for (param = TYPE_ARG_TYPES (fntype); param; param = next_param)
-+ {
-+ next_param = TREE_CHAIN (param);
-+ if (!next_param && TREE_VALUE (param) != void_type_node)
-+ cum->num_of_regs = 0;
-+ }
-+ }
-+
-+#if ! defined (PCC_STATIC_STRUCT_RETURN) && defined (STRUCT_VALUE_REGNUM)
-+ /* If return value is a structure, and we pass the buffer address in a
-+ register, we can't use this register for our own purposes.
-+ FIXME: Something similar would be useful for static chain. */
-+ if (fntype && aggregate_value_p (TREE_TYPE (fntype), fntype))
-+ cum->regs_already_used |= (1 << STRUCT_VALUE_REGNUM);
-+#endif
-+}
-+
-+/* Update the data in CUM to advance over an argument. */
-+
-+void
-+m68k_function_arg_advance (CUMULATIVE_ARGS *cum)
-+{
-+ if (cum->last_arg_reg != -1)
-+ {
-+ int count;
-+ for (count = 0; count < cum->last_arg_len; count++)
-+ cum->regs_already_used |= (1 << (cum->last_arg_reg + count));
-+ cum->last_arg_reg = -1;
-+ }
-+}
-+
-+/* Define where to put the arguments to a function.
-+ Value is zero to push the argument on the stack,
-+ or a hard register in which to store the argument.
-+
-+ MODE is the argument's machine mode.
-+ TYPE is the data type of the argument (as a tree).
-+ This is null for libcalls where that information may
-+ not be available.
-+ CUM is a variable of type CUMULATIVE_ARGS which gives info about
-+ the preceding args and about the function being called. */
-+
-+struct rtx_def *
-+m68k_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type)
-+{
-+ if (cum->num_of_regs)
-+ {
-+ int regbegin = -1, altregbegin = -1, len;
-+
-+ /* FIXME: The last condition below is a workaround for a bug. */
-+ if (TARGET_68881 && FLOAT_MODE_P (mode) &&
-+ GET_MODE_UNIT_SIZE (mode) <= 12 &&
-+ (GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT || mode == SCmode))
-+ {
-+ regbegin = 16; /* FPx */
-+ len = GET_MODE_NUNITS (mode);
-+ }
-+ /* FIXME: Two last conditions below are workarounds for bugs. */
-+ else if (INTEGRAL_MODE_P (mode) && mode !=CQImode && mode != CHImode)
-+ {
-+ if (POINTER_TYPE_P (type))
-+ regbegin = 8; /* Ax */
-+ else
-+ regbegin = 0; /* Dx */
-+ altregbegin = 8 - regbegin;
-+ len = (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD;
-+ }
-+
-+ if (regbegin != -1)
-+ {
-+ int reg;
-+ long mask;
-+
-+look_for_reg:
-+ mask = 1 << regbegin;
-+ for (reg = 0; reg < cum->num_of_regs; reg++, mask <<= 1)
-+ if (!(cum->regs_already_used & mask))
-+ {
-+ int end;
-+ for (end = reg; end < cum->num_of_regs && end < reg + len;
-+ end++, mask <<= 1)
-+ if (cum->regs_already_used & mask)
-+ break;
-+ if (end == reg + len)
-+ {
-+ cum->last_arg_reg = reg + regbegin;
-+ cum->last_arg_len = len;
-+ break;
-+ }
-+ }
-+
-+ if (reg == cum->num_of_regs && altregbegin != -1)
-+ {
-+ regbegin = altregbegin;
-+ altregbegin = -1;
-+ goto look_for_reg;
-+ }
-+ }
-+
-+ if (cum->last_arg_reg != -1)
-+ return gen_rtx_REG (mode, cum->last_arg_reg);
-+ }
-+ return 0;
-+}
-+
- static void
- m68k_compute_frame_layout (void)
- {
-@@ -428,10 +719,14 @@
- static bool
- m68k_save_reg (unsigned int regno, bool interrupt_handler)
- {
-- if (flag_pic && current_function_uses_pic_offset_table
-+ if (flag_pic && flag_pic < 3 && current_function_uses_pic_offset_table
- && regno == PIC_OFFSET_TABLE_REGNUM)
- return true;
-
-+#ifdef EXTRA_SAVE_REG
-+ EXTRA_SAVE_REG(regno);
-+#endif
-+
- if (current_function_calls_eh_return)
- {
- unsigned int i;
-@@ -480,6 +775,9 @@
- m68k_output_function_prologue (FILE *stream, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
- {
- HOST_WIDE_INT fsize_with_regs;
-+#if !defined (DWARF2_DEBUGGING_INFO) && !defined (DWARF2_UNWIND_INFO)
-+#define dwarf2out_do_frame() 0
-+#endif
- HOST_WIDE_INT cfa_offset = INCOMING_FRAME_SP_OFFSET;
-
- m68k_compute_frame_layout();
-@@ -496,8 +794,17 @@
- if (TARGET_COLDFIRE && current_frame.reg_no > 2)
- fsize_with_regs += current_frame.reg_no * 4;
-
-+#ifdef PROLOGUE_BEGIN_HOOK
-+ PROLOGUE_BEGIN_HOOK (stream, fsize_with_regs);
-+#endif
-+
- if (frame_pointer_needed)
- {
-+#ifdef HAVE_ALTERNATE_FRAME_SETUP_F
-+ if (HAVE_ALTERNATE_FRAME_SETUP_F (fsize_with_regs))
-+ ALTERNATE_FRAME_SETUP_F (stream, fsize_with_regs);
-+ else
-+#endif
- if (current_frame.size == 0 && TARGET_68040)
- /* on the 68040, pea + move is faster than link.w 0 */
- fprintf (stream, MOTOROLA ?
-@@ -528,6 +835,10 @@
- cfa_offset += current_frame.size;
- }
- }
-+#ifdef HAVE_ALTERNATE_FRAME_SETUP
-+ else if (HAVE_ALTERNATE_FRAME_SETUP (fsize_with_regs))
-+ ALTERNATE_FRAME_SETUP (stream, fsize_with_regs);
-+#endif
- else if (fsize_with_regs) /* !frame_pointer_needed */
- {
- if (fsize_with_regs < 0x8000)
-@@ -658,7 +969,12 @@
- dwarf2out_reg_save (l, regno, -cfa_offset + n_regs++ * 4);
- }
- }
-- if (!TARGET_SEP_DATA && flag_pic &&
-+#ifdef HAVE_ALTERNATE_PIC_SETUP
-+ if (HAVE_ALTERNATE_PIC_SETUP)
-+ ALTERNATE_PIC_SETUP (stream);
-+ else
-+#endif
-+ if (!TARGET_SEP_DATA && flag_pic && flag_pic < 3 &&
- (current_function_uses_pic_offset_table ||
- (!current_function_is_leaf && TARGET_ID_SHARED_LIBRARY)))
- {
-@@ -921,6 +1237,11 @@
- }
- }
- if (frame_pointer_needed)
-+#ifdef HAVE_ALTERNATE_FRAME_DESTR_F
-+ if (HAVE_ALTERNATE_FRAME_DESTR_F (fsize_with_regs))
-+ ALTERNATE_FRAME_DESTR_F (stream, fsize_with_regs);
-+ else
-+#endif
- fprintf (stream, "\tunlk %s\n",
- reg_names[FRAME_POINTER_REGNUM]);
- else if (fsize_with_regs)
-@@ -958,10 +1279,17 @@
- }
- if (current_function_calls_eh_return)
- asm_fprintf (stream, "\tadd" ASM_DOT"l %Ra0,%Rsp\n");
-+#ifdef EPILOGUE_END_HOOK
-+ EPILOGUE_END_HOOK (stream);
-+#endif
- if (m68k_interrupt_function_p (current_function_decl))
- fprintf (stream, "\trte\n");
- else if (current_function_pops_args)
- asm_fprintf (stream, "\trtd %I%d\n", current_function_pops_args);
-+#ifdef HAVE_ALTERNATE_RETURN
-+ else if (HAVE_ALTERNATE_RETURN)
-+ ALTERNATE_RETURN (stream);
-+#endif
- else
- fprintf (stream, "\trts\n");
- }
-@@ -1454,12 +1782,20 @@
- /* First handle a simple SYMBOL_REF or LABEL_REF */
- if (GET_CODE (orig) == SYMBOL_REF || GET_CODE (orig) == LABEL_REF)
- {
-+#ifdef LEGITIMATE_BASEREL_OPERAND_P
-+ if (LEGITIMATE_BASEREL_OPERAND_P (orig))
-+ return orig;
-+#endif
-+
- if (reg == 0)
- abort ();
-
-- pic_ref = gen_rtx_MEM (Pmode,
-- gen_rtx_PLUS (Pmode,
-- pic_offset_table_rtx, orig));
-+ if (flag_pic < 3)
-+ pic_ref = gen_rtx_MEM (Pmode,
-+ gen_rtx_PLUS (Pmode,
-+ pic_offset_table_rtx, orig));
-+ else
-+ pic_ref = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, orig);
- current_function_uses_pic_offset_table = 1;
- RTX_UNCHANGING_P (pic_ref) = 1;
- emit_move_insn (reg, pic_ref);
-@@ -3001,6 +3337,10 @@
- fprintf (file, ":w"); break;
- case 2:
- fprintf (file, ":l"); break;
-+ case 3:
-+ fprintf (file, ":W"); break;
-+ case 4:
-+ fprintf (file, ":L"); break;
- default:
- break;
- }
-@@ -3488,7 +3828,7 @@
- xops[0] = DECL_RTL (function);
-
- /* Logic taken from call patterns in m68k.md. */
-- if (flag_pic)
-+ if (flag_pic && flag_pic < 3)
- {
- if (TARGET_PCREL)
- fmt = "bra.l %o0";
-@@ -3544,7 +3884,8 @@
-
- /* Value is true if hard register REGNO can hold a value of machine-mode MODE.
- On the 68000, the cpu registers can hold any mode except bytes in address
-- registers, but the 68881 registers can hold only SFmode or DFmode. */
-+ registers, but the 68881 registers can hold only SFmode or DFmode.
-+ The 68881 registers can't hold anything if 68881 use is disabled. */
- bool
- m68k_regno_mode_ok (int regno, enum machine_mode mode)
- {
-@@ -3569,6 +3910,7 @@
- smaller. */
- if ((GET_MODE_CLASS (mode) == MODE_FLOAT
- || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
-+ && TARGET_68881
- && GET_MODE_UNIT_SIZE (mode) <= 12)
- return true;
- }