MSP430: Define ASM_OUTPUT_ALIGNED_DECL_LOCAL
authorJozef Lawrynowicz <jozef.l@mittosystems.com>
Fri, 8 May 2020 13:45:20 +0000 (14:45 +0100)
committerJozef Lawrynowicz <jozef.l@mittosystems.com>
Tue, 12 May 2020 11:54:16 +0000 (12:54 +0100)
gcc/ChangeLog:

2020-05-12  Jozef Lawrynowicz  <jozef.l@mittosystems.com>

* config/msp430/msp430-protos.h (msp430_output_aligned_decl_common):
Update prototype to include "local" argument.
* config/msp430/msp430.c (msp430_output_aligned_decl_common): Add
"local" argument.  Handle local common decls.
* config/msp430/msp430.h (ASM_OUTPUT_ALIGNED_DECL_COMMON): Adjust
msp430_output_aligned_decl_common call with 0 for "local" argument.
(ASM_OUTPUT_ALIGNED_DECL_LOCAL): Define.

gcc/testsuite/ChangeLog:

2020-05-12  Jozef Lawrynowicz  <jozef.l@mittosystems.com>

* gcc.c-torture/execute/noinit-attribute.c: Skip for msp430
in the large memory model.

gcc/ChangeLog
gcc/config/msp430/msp430-protos.h
gcc/config/msp430/msp430.c
gcc/config/msp430/msp430.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/noinit-attribute.c

index b0a9212688a9e2b9ddf812546941516a87bec1bf..e2b01aaae27b7ab7b5ce68a530c23f77a560e5e0 100644 (file)
@@ -1,3 +1,13 @@
+2020-05-12  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
+
+       * config/msp430/msp430-protos.h (msp430_output_aligned_decl_common):
+       Update prototype to include "local" argument.
+       * config/msp430/msp430.c (msp430_output_aligned_decl_common): Add
+       "local" argument.  Handle local common decls.
+       * config/msp430/msp430.h (ASM_OUTPUT_ALIGNED_DECL_COMMON): Adjust
+       msp430_output_aligned_decl_common call with 0 for "local" argument.
+       (ASM_OUTPUT_ALIGNED_DECL_LOCAL): Define.
+
 2020-05-12  Richard Biener  <rguenther@suse.de>
 
        * cfghooks.c (split_edge): Preserve EDGE_DFS_BACK if set.
index 657af4c70751bfb3e52c2c8e1d9f7d1dd37d911b..29ce9babc4a41b4c9df609737cb58937ffcfa323 100644 (file)
@@ -39,7 +39,8 @@ bool    msp430_is_interrupt_func (void);
 const char * msp430x_logical_shift_right (rtx);
 const char * msp430_mcu_name (void);
 void    msp430_output_aligned_decl_common (FILE *, const tree, const char *,
-                                          unsigned HOST_WIDE_INT, unsigned);
+                                          unsigned HOST_WIDE_INT, unsigned,
+                                          int);
 void   msp430_output_labelref (FILE *, const char *);
 void   msp430_register_pragmas (void);
 rtx    msp430_return_addr_rtx (int);
index e77ca101599d9ed704575dcdb90eefa8b808b5c2..6bb1714f4658d2dbff5830b8fa830e26b8b88a7f 100644 (file)
@@ -2019,13 +2019,15 @@ msp430_unique_section (tree decl, int reloc)
 
 /* Emit a declaration of a common symbol.
    If a data region is in use then put the symbol into the
-   equivalent .bss section instead.  */
+   equivalent .bss section instead.
+   If LOCAL is 1, then DECL is for a local common variable.  */
 void
 msp430_output_aligned_decl_common (FILE *                stream,
                                   const tree             decl,
                                   const char *           name,
                                   unsigned HOST_WIDE_INT size,
-                                  unsigned int           align)
+                                  unsigned int           align,
+                                  int local)
 {
   /* Only emit a common symbol if the variable does not have a specific section
      assigned.  */
@@ -2039,6 +2041,12 @@ msp430_output_aligned_decl_common (FILE *                  stream,
       && !has_attr (ATTR_PERSIST, decl)
       && !has_attr (ATTR_NOINIT, decl))
     {
+      if (local)
+       {
+         fprintf (stream, LOCAL_ASM_OP);
+         assemble_name (stream, name);
+         fprintf (stream, "\n");
+       }
       fprintf (stream, COMMON_ASM_OP);
       assemble_name (stream, name);
       fprintf (stream, "," HOST_WIDE_INT_PRINT_UNSIGNED",%u\n",
@@ -2069,8 +2077,11 @@ msp430_output_aligned_decl_common (FILE *                  stream,
 
       switch_to_section (sec);
       ASM_OUTPUT_ALIGN (stream, floor_log2 (align / BITS_PER_UNIT));
-      targetm.asm_out.globalize_label (stream, name);
-      ASM_WEAKEN_LABEL (stream, name);
+      if (!local)
+       {
+         targetm.asm_out.globalize_label (stream, name);
+         ASM_WEAKEN_LABEL (stream, name);
+       }
       ASM_OUTPUT_LABEL (stream, name);
       ASM_OUTPUT_SKIP (stream, size ? size : 1);
     }
index 1042c592694a3ee132eb4aa6167509f600824143..f198981ad9e4540014f3b7985022fb3f9b7c5626 100644 (file)
@@ -517,7 +517,13 @@ void msp430_register_pre_includes (const char *sysroot ATTRIBUTE_UNUSED,
 #undef  USE_SELECT_SECTION_FOR_FUNCTIONS
 #define USE_SELECT_SECTION_FOR_FUNCTIONS 1
 
+#undef ASM_OUTPUT_ALIGNED_DECL_COMMON
 #define ASM_OUTPUT_ALIGNED_DECL_COMMON(FILE, DECL, NAME, SIZE, ALIGN)  \
-  msp430_output_aligned_decl_common ((FILE), (DECL), (NAME), (SIZE), (ALIGN))
+  msp430_output_aligned_decl_common ((FILE), (DECL), (NAME), (SIZE), (ALIGN), 0)
+
+#undef  ASM_OUTPUT_ALIGNED_DECL_LOCAL
+#define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN)   \
+  msp430_output_aligned_decl_common ((FILE), (DECL), (NAME), (SIZE), (ALIGN), 1)
+
 
 #define SYMBOL_FLAG_LOW_MEM (SYMBOL_FLAG_MACH_DEP << 0)
index da776417bd5ca392451f02f999c12ce3a555dfde..b83e0ee45a56f77e486ee53a986c216db9ce4906 100644 (file)
@@ -1,3 +1,8 @@
+2020-05-12  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
+
+       * gcc.c-torture/execute/noinit-attribute.c: Skip for msp430
+       in the large memory model.
+
 2020-05-12  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
 
        * gcc.target/msp430/region-attribute-misuse.c: Allow a .bss section to
index b99417c404eb516969859967dff5acf87d18ba00..20a2a452e79f16454a0e4019df2f84cb3290a89d 100644 (file)
@@ -1,8 +1,12 @@
 /* { dg-do run } */
 /* { dg-require-effective-target noinit } */
 /* { dg-options "-O2" } */
+/* { dg-skip-if "data LMA != VMA" { msp430-*-* } { "-mlarge" } } */
 
-/* This test checks that noinit data is handled correctly.  */
+/* This test checks that noinit data is handled correctly.
+   If data LMA != VMA (e.g. for simulating the copy of data from ROM to RAM),
+   then var_init will always be re-initialized to 2 and this test will loop
+   forever.  */
 
 extern void _start (void) __attribute__ ((noreturn));
 extern void abort (void) __attribute__ ((noreturn));