This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch] m68k: Fix binary compatibility problem with -mno-strict-align. (Take 2)
- From: Kazu Hirata <kazu at codesourcery dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: law at redhat dot com, schwab at suse dot de
- Cc: nathan at codesourcery dot com
- Cc: zippel at linux-m68k dot org
- Date: Sat, 25 Aug 2007 08:36:01 -0700
- Subject: [patch] m68k: Fix binary compatibility problem with -mno-strict-align. (Take 2)
Hi,
Attached is a revised patch to fix binary compatibility problem with
-mno-strict-align on m68k-elf.
The previous iteration of this patch is at:
http://gcc.gnu.org/ml/gcc-patches/2007-07/msg01437.html
In this iteration, Nathan has made a change to effectively comment out
TARGET_RETURN_IN_MEMORY and m68k_return_in_memory if
M68K_HONOR_TARGET_STRICT_ALIGNMENT is defined. This way, this patch
has no effect on m68k-linux, preserving the ABI.
Tested on m68k-elf. OK to apply?
Kazu Hirata
2007-08-25 Nathan Sidwell <nathan@codesourcery.com>
Kazu Hirata <kazu@codesourcery.com>
* gcc/config/m68k/linux.h
(M68K_HONOR_TARGET_STRICT_ALIGNMENT): Redefine as 0.
* config/m68k/m68k.c (TARGET_RETURN_IN_MEMORY): New.
(m68k_return_in_memory): New.
* gcc/config/m68k/m68k.h (M68K_HONOR_TARGET_STRICT_ALIGNMENT):
New.
Index: gcc/config/m68k/linux.h
===================================================================
--- gcc/config/m68k/linux.h (revision 127787)
+++ gcc/config/m68k/linux.h (working copy)
@@ -31,6 +31,8 @@ along with GCC; see the file COPYING3.
#undef STRICT_ALIGNMENT
#define STRICT_ALIGNMENT 0
+#undef M68K_HONOR_TARGET_STRICT_ALIGNMENT
+#define M68K_HONOR_TARGET_STRICT_ALIGNMENT 0
/* Here are four prefixes that are used by asm_fprintf to
facilitate customization for alternate assembler syntaxes.
Index: gcc/config/m68k/m68k.c
===================================================================
--- gcc/config/m68k/m68k.c (revision 127787)
+++ gcc/config/m68k/m68k.c (working copy)
@@ -134,6 +134,9 @@ static void m68k_compute_frame_layout (v
static bool m68k_save_reg (unsigned int regno, bool interrupt_handler);
static bool m68k_ok_for_sibcall_p (tree, tree);
static bool m68k_rtx_costs (rtx, int, int, int *);
+#if M68K_HONOR_TARGET_STRICT_ALIGNMENT
+static bool m68k_return_in_memory (tree, tree);
+#endif
/* Specify the identification number of the library being built */
@@ -205,6 +208,11 @@ int m68k_last_compare_had_fp_operands;
#undef TARGET_FUNCTION_OK_FOR_SIBCALL
#define TARGET_FUNCTION_OK_FOR_SIBCALL m68k_ok_for_sibcall_p
+#if M68K_HONOR_TARGET_STRICT_ALIGNMENT
+#undef TARGET_RETURN_IN_MEMORY
+#define TARGET_RETURN_IN_MEMORY m68k_return_in_memory
+#endif
+
static const struct attribute_spec m68k_attribute_table[] =
{
/* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
@@ -4386,3 +4394,25 @@ m68k_function_value (const_tree valtype,
else
return gen_rtx_REG (mode, D0_REG);
}
+
+/* Worker function for TARGET_RETURN_IN_MEMORY. */
+#if M68K_HONOR_TARGET_STRICT_ALIGNMENT
+static bool
+m68k_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED)
+{
+ enum machine_mode mode = TYPE_MODE (type);
+
+ if (mode == BLKmode)
+ return true;
+
+ /* If TYPE's known alignment is less than the alignment of MODE that
+ would contain the structure, then return in memory. We need to
+ do so to maintain the compatibility between code compiled with
+ -mstrict-align and that compiled with -mno-strict-align. */
+ if (AGGREGATE_TYPE_P (type)
+ && TYPE_ALIGN (type) < GET_MODE_ALIGNMENT (mode))
+ return true;
+
+ return false;
+}
+#endif
Index: gcc/config/m68k/m68k.h
===================================================================
--- gcc/config/m68k/m68k.h (revision 127787)
+++ gcc/config/m68k/m68k.h (working copy)
@@ -310,6 +310,7 @@ along with GCC; see the file COPYING3.
#define BIGGEST_ALIGNMENT (TARGET_ALIGN_INT ? 32 : 16)
#define STRICT_ALIGNMENT (TARGET_STRICT_ALIGNMENT)
+#define M68K_HONOR_TARGET_STRICT_ALIGNMENT 1
#define INT_TYPE_SIZE (TARGET_SHORT ? 16 : 32)