pdp11: Fix handling of common (local and global) vars [PR94134]
authorJakub Jelinek <jakub@redhat.com>
Wed, 11 Mar 2020 17:35:13 +0000 (18:35 +0100)
committerJakub Jelinek <jakub@redhat.com>
Wed, 11 Mar 2020 17:35:13 +0000 (18:35 +0100)
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.

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/ChangeLog
gcc/config/pdp11/pdp11.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr94134.c [new file with mode: 0644]

index 73339dc2c2cffa9e40ff8ed64b71b2decd9d13e0..818cf19e886064380385de643f5bfef06dd1693c 100644 (file)
@@ -1,3 +1,10 @@
+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.
+
 2020-03-11  Richard Biener  <rguenther@suse.de>
 
        * match.pd ((T *)(ptr - ptr-cst) -> &MEM[ptr + -ptr-cst]):
index c8612ad53d749cc68bed368eec6b1ba4d26ffe1c..25590be2b5c03d7f8ad0898a15ea49ec8f33b4b7 100644 (file)
@@ -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 char *name, int size,
        {
          fprintf (file, ".globl ");
          assemble_name (file, name);
+         fprintf (file, "\n");
        }
-      fprintf (file, "\n");
       assemble_name (file, name);
       fputs (":", file);
       ASM_OUTPUT_SKIP (file, size);
index e2442fba35a6398f473ce03d5dbf656e1615de3f..ba4cd147d8c07c9bf7ef350c5f87a7757fb7490e 100644 (file)
@@ -1,3 +1,8 @@
+2020-03-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/94134
+       * gcc.c-torture/execute/pr94134.c: New test.
+
 2020-03-11  Kito Cheng  <kito.cheng@sifive.com>
 
        * gcc.target/riscv/interrupt-2.c: Update testcase and expected output.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr94134.c b/gcc/testsuite/gcc.c-torture/execute/pr94134.c
new file mode 100644 (file)
index 0000000..b1b44c3
--- /dev/null
@@ -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;
+}