diff mbox series

pdp11: Fix handling of common (local and global) vars [PR94134]

Message ID 20200311171210.GF2156@tucnak
State New
Headers show
Series pdp11: Fix handling of common (local and global) vars [PR94134] | expand

Commit Message

Li, Pan2 via Gcc-patches March 11, 2020, 5:12 p.m. UTC
Hi!

As mentioned in the PR, the generic code decides to put the a variable into
lcomm_section, which is a NOSWITCH section and thus the generic code doesn't
switch into a particular section before using
ASM_OUTPUT{_ALIGNED{,_DECL}_}_LOCAL, on many targets that results just in
.lcomm (or for non-local .comm) directives which don't need a switch to some
section, other targets put switch_to_section (bss_section) at the start of
that macro.
pdp11 doesn't do that (and doesn't have bss_section), and so emits the
lcomm/comm variables in whatever section is current (it has only .text/.data
and for DEC assembler rodata).

The following patch fixes that by putting it always into data section, and
additionally avoids emitting an empty line in the assembly for the lcomm
vars.

Tested on the testcase, I'm afraid I have no other way to test this target.
Ok for trunk?

2020-03-11  Jakub Jelinek  <jakub@redhat.com>

	PR target/94134
	* config/pdp11/pdp11.c (pdp11_asm_output_var): Call switch_to_section
	at the start to switch to data section.  Don't print extra newline if
	.globl directive has not been emitted.

	* gcc.c-torture/execute/pr94134.c: New test.


	Jakub

Comments

Li, Pan2 via Gcc-patches March 11, 2020, 5:19 p.m. UTC | #1
Ok, thanks.  

	paul

> On Mar 11, 2020, at 1:12 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> 
> Hi!
> 
> As mentioned in the PR, the generic code decides to put the a variable into
> lcomm_section, which is a NOSWITCH section and thus the generic code doesn't
> switch into a particular section before using
> ASM_OUTPUT{_ALIGNED{,_DECL}_}_LOCAL, on many targets that results just in
> .lcomm (or for non-local .comm) directives which don't need a switch to some
> section, other targets put switch_to_section (bss_section) at the start of
> that macro.
> pdp11 doesn't do that (and doesn't have bss_section), and so emits the
> lcomm/comm variables in whatever section is current (it has only .text/.data
> and for DEC assembler rodata).
> 
> The following patch fixes that by putting it always into data section, and
> additionally avoids emitting an empty line in the assembly for the lcomm
> vars.
> 
> Tested on the testcase, I'm afraid I have no other way to test this target.
> Ok for trunk?
> 
> 2020-03-11  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR target/94134
> 	* config/pdp11/pdp11.c (pdp11_asm_output_var): Call switch_to_section
> 	at the start to switch to data section.  Don't print extra newline if
> 	.globl directive has not been emitted.
> 
> 	* gcc.c-torture/execute/pr94134.c: New test.
> 
> --- gcc/config/pdp11/pdp11.c.jj	2020-01-12 11:54:36.382413876 +0100
> +++ gcc/config/pdp11/pdp11.c	2020-03-11 15:44:43.373970000 +0100
> @@ -743,6 +743,7 @@ void
> pdp11_asm_output_var (FILE *file, const char *name, int size,
> 		      int align, bool global)
> {
> +  switch_to_section (data_section);
>   if (align > 8)
>     fprintf (file, "\t.even\n");
>   if (TARGET_DEC_ASM)
> @@ -763,8 +764,8 @@ pdp11_asm_output_var (FILE *file, const
> 	{
> 	  fprintf (file, ".globl ");
> 	  assemble_name (file, name);
> +	  fprintf (file, "\n");
> 	}
> -      fprintf (file, "\n");
>       assemble_name (file, name);
>       fputs (":", file);
>       ASM_OUTPUT_SKIP (file, size);
> --- gcc/testsuite/gcc.c-torture/execute/pr94134.c.jj	2020-03-11 15:46:09.540710642 +0100
> +++ gcc/testsuite/gcc.c-torture/execute/pr94134.c	2020-03-11 15:40:18.538840663 +0100
> @@ -0,0 +1,14 @@
> +/* PR target/94134 */
> +
> +static volatile int a = 0;
> +static volatile int b = 1;
> +
> +int
> +main ()
> +{
> +  a++;
> +  b++;
> +  if (a != 1 || b != 2)
> +    __builtin_abort ();
> +  return 0;
> +}
> 
> 	Jakub
>
diff mbox series

Patch

--- gcc/config/pdp11/pdp11.c.jj	2020-01-12 11:54:36.382413876 +0100
+++ gcc/config/pdp11/pdp11.c	2020-03-11 15:44:43.373970000 +0100
@@ -743,6 +743,7 @@  void
 pdp11_asm_output_var (FILE *file, const char *name, int size,
 		      int align, bool global)
 {
+  switch_to_section (data_section);
   if (align > 8)
     fprintf (file, "\t.even\n");
   if (TARGET_DEC_ASM)
@@ -763,8 +764,8 @@  pdp11_asm_output_var (FILE *file, const
 	{
 	  fprintf (file, ".globl ");
 	  assemble_name (file, name);
+	  fprintf (file, "\n");
 	}
-      fprintf (file, "\n");
       assemble_name (file, name);
       fputs (":", file);
       ASM_OUTPUT_SKIP (file, size);
--- gcc/testsuite/gcc.c-torture/execute/pr94134.c.jj	2020-03-11 15:46:09.540710642 +0100
+++ gcc/testsuite/gcc.c-torture/execute/pr94134.c	2020-03-11 15:40:18.538840663 +0100
@@ -0,0 +1,14 @@ 
+/* PR target/94134 */
+
+static volatile int a = 0;
+static volatile int b = 1;
+
+int
+main ()
+{
+  a++;
+  b++;
+  if (a != 1 || b != 2)
+    __builtin_abort ();
+  return 0;
+}