On 03/26/2018 11:57 PM, Cesar Philippidis wrote:
As noted in PR85056, the nvptx BE isn't declaring external arrays using
PTX array notation. Specifically, it's emitting code that's missing the
empty angle brackets '[]'.

[ FYI, see https://en.wikipedia.org/wiki/Bracket

For '[]' I find "square brackets, closed brackets, hard brackets, third brackets, crotchets, or brackets (US)".

Angle brackets are different symbols. ]

This patch corrects that problem.

Tom, in contrast to my earlier patch in the PR, this patch only
considers external arrays. The patch I posted incorrectly handled
zero-length arrays and empty structs.

I tested this patch with a standalone nvptx toolchain using newlib 3.0,
and I found no new regressions. However I'm still waiting for the
results that are using the older version of newlib. Is this patch OK for
trunk if the results come back clean?


OK for stage4 trunk.

[ A minor style nit: in submission emails, rather than having the very specific but rather non-descriptive subject "Fix PR85056", move the PR number to "[PATCH,nvptx,PR85056]" and add a subject line that describes the nature of the patch, f.i.: "Fix declaration of external array with unknown size".

So, something like:
...
[PATCH,nvptx,PR85056] Fix declaration of external array with unknown size
...

Then, use the subject line as commit log header line (dropping "PATCH", and the PR number):
...
[nvptx] Fix declaration of external array with unknown size
...
]

Thanks,
- Tom

Thanks,
Cesar


nvptx-extern-arrays.diff


2018-03-26  Cesar Philippidis  <ce...@codesourcery.com>

        gcc/

        PR target/85056
        * config/nvptx/nvptx.c (nvptx_assemble_decl_begin): Add '[]' to
        extern array declarations.

        gcc/testsuite/
        * testsuite/gcc.target/nvptx/pr85056.c: New test.
        * testsuite/gcc.target/nvptx/pr85056a.c: New test.


diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c
index 3cb33ae8c2d..38f25add6ab 100644
--- a/gcc/config/nvptx/nvptx.c
+++ b/gcc/config/nvptx/nvptx.c
@@ -2038,6 +2038,9 @@ static void
  nvptx_assemble_decl_begin (FILE *file, const char *name, const char *section,
                           const_tree type, HOST_WIDE_INT size, unsigned align)
  {
+  bool atype = (TREE_CODE (type) == ARRAY_TYPE)
+    && (TYPE_DOMAIN (type) == NULL_TREE);
+
    while (TREE_CODE (type) == ARRAY_TYPE)
      type = TREE_TYPE (type);
@@ -2077,6 +2080,8 @@ nvptx_assemble_decl_begin (FILE *file, const char *name, const char *section,
      /* We make everything an array, to simplify any initialization
         emission.  */
      fprintf (file, "[" HOST_WIDE_INT_PRINT_DEC "]", init_frag.remaining);
+  else if (atype)
+    fprintf (file, "[]");
  }
/* Called when the initializer for a decl has been completely output through
diff --git a/gcc/testsuite/gcc.target/nvptx/pr85056.c 
b/gcc/testsuite/gcc.target/nvptx/pr85056.c
new file mode 100644
index 00000000000..fe7f8af856e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/nvptx/pr85056.c
@@ -0,0 +1,20 @@
+/* { dg-do run } */
+/* { dg-additional-sources "pr85056a.c" } */
+
+extern void abort ();
+
+extern int a[];
+
+int
+main ()
+{
+  int i, sum;
+
+  for (i = 0; i < 10; i++)
+    sum += a[i];
+
+  if (sum != 55)
+    abort ();
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/nvptx/pr85056a.c 
b/gcc/testsuite/gcc.target/nvptx/pr85056a.c
new file mode 100644
index 00000000000..a45a5f2b07f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/nvptx/pr85056a.c
@@ -0,0 +1,3 @@
+/* { dg-skip-if "" { *-*-* } } */
+
+int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };


Reply via email to