* gcc/config/m68k/linux.h
authorNathan Sidwell <nathan@codesourcery.com>
Tue, 28 Aug 2007 13:51:20 +0000 (13:51 +0000)
committerKazu Hirata <kazu@gcc.gnu.org>
Tue, 28 Aug 2007 13:51:20 +0000 (13:51 +0000)
(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.

Co-Authored-By: Kazu Hirata <kazu@codesourcery.com>
From-SVN: r127858

gcc/ChangeLog
gcc/config/m68k/linux.h
gcc/config/m68k/m68k.c
gcc/config/m68k/m68k.h

index 3d9cdbb78cad3d6b11ee926f08a9f75045e77efa..fa17fc020ebec0a4d0f5f8c73dd24c2bab6c23db 100644 (file)
@@ -1,3 +1,13 @@
+2007-08-28  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.
+
 2007-08-28  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/32661
index f09a2c7e5512ede12d3163ace99c883cc0cfe33f..cdd510b2988de77beeb81ab77a33d7108032ad82 100644 (file)
@@ -31,6 +31,8 @@ along with GCC; see the file COPYING3.  If not see
 
 #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 395161fff6622192bb657590f7e782d7cc0c23a6..2b06b6c01d9919fa3846506fe73a44378e2d1129 100644 (file)
@@ -134,6 +134,9 @@ static void m68k_compute_frame_layout (void);
 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
 \f
 
 /* 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, const_tree func ATTRIBUTE_UNUSED)
   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 75d6d6a0e50557a3b00cfb19b847b114c0e62bc5..a5f6eedf07057a8c6400df6d0bf2e8231941bce1 100644 (file)
@@ -310,6 +310,7 @@ along with GCC; see the file COPYING3.  If not see
 #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)