nvptx-protos.h (nvptx_output_aligned_decl): Declare.
authorNathan Sidwell <nathan@acm.org>
Tue, 1 Dec 2015 20:13:02 +0000 (20:13 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 1 Dec 2015 20:13:02 +0000 (20:13 +0000)
gcc/
* config/nvptx/nvptx-protos.h (nvptx_output_aligned_decl): Declare.
* config/nvptx/nvptx.h (ASM_OUTPUT_ALIGNED_DECL_COMMON,
ASM_OUTPUT_ALIGNED_DECL_LOCAL): Forward to nvptx_output_aligned_decl.
* config/nvptx/nvptx.c (write_fn_marker, write_var_marker): New.
(write_fn_proto, write_fn_proto_from_insn): Call write_fn_marker.
(init_output_initializer): Call write_var_marker.
(nvptx_output_aligned_decl): New.
(nvptx_assemble_undefined_decl, nvptx_file_end): Call write_var_marker.

gcc/testsuite/
* gcc.target/nvptx/uninit-decl.c: New.

From-SVN: r231127

gcc/ChangeLog
gcc/config/nvptx/nvptx-protos.h
gcc/config/nvptx/nvptx.c
gcc/config/nvptx/nvptx.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/nvptx/uninit-decl.c [new file with mode: 0644]

index f90b4cdfb8aba4d397ef598aa46d13ddab99227a..c94f88b8cd6ce4a5489c9777e26c5ea4534ca2ec 100644 (file)
@@ -1,3 +1,14 @@
+2015-12-01  Nathan Sidwell  <nathan@acm.org>
+
+       * config/nvptx/nvptx-protos.h (nvptx_output_aligned_decl): Declare.
+       * config/nvptx/nvptx.h (ASM_OUTPUT_ALIGNED_DECL_COMMON,
+       ASM_OUTPUT_ALIGNED_DECL_LOCAL): Forward to nvptx_output_aligned_decl.
+       * config/nvptx/nvptx.c (write_fn_marker, write_var_marker): New.
+       (write_fn_proto, write_fn_proto_from_insn): Call write_fn_marker.
+       (init_output_initializer): Call write_var_marker.
+       (nvptx_output_aligned_decl): New.
+       (nvptx_assemble_undefined_decl, nvptx_file_end): Call write_var_marker.
+
 2015-12-01  Jan Hubicka  <hubicka@ucw.cz>
 
        * c-common.c (parse_optimize_options): Do not silently ignore
index 9fda531bed37729bed46c6e558378c76a81073fc..78b1c98a0f91cfc9dea3a6dbcb9f42d72d1c2a1e 100644 (file)
 extern void nvptx_declare_function_name (FILE *, const char *, const_tree decl);
 extern void nvptx_declare_object_name (FILE *file, const char *name,
                                       const_tree decl);
+extern void nvptx_output_aligned_decl (FILE *file, const char *name,
+                                      const_tree decl,
+                                      HOST_WIDE_INT size, unsigned align);
 extern void nvptx_function_end (FILE *);
 extern void nvptx_output_skip (FILE *, unsigned HOST_WIDE_INT);
 extern void nvptx_output_ascii (FILE *, const char *, unsigned HOST_WIDE_INT);
 extern void nvptx_register_pragmas (void);
-extern const char *nvptx_section_for_decl (const_tree);
 
 #ifdef RTX_CODE
 extern void nvptx_expand_oacc_fork (unsigned);
index 052cb0d5bdb27faa1602f1162687c8f061cf99f6..d3101c035da64fe0be66cbaa0a385181a4b16848 100644 (file)
@@ -366,6 +366,31 @@ write_as_kernel (tree attrs)
          || lookup_attribute ("omp target entrypoint", attrs) != NULL_TREE);
 }
 
+/* Emit a linker marker for a function decl or defn.  */
+
+static void
+write_fn_marker (std::stringstream &s, bool is_defn, bool globalize,
+                const char *name)
+{
+  s << "\n// BEGIN";
+  if (globalize)
+    s << " GLOBAL";
+  s << " FUNCTION " << (is_defn ? "DEF: " : "DECL: ");
+  s << name << "\n";
+}
+
+/* Emit a linker marker for a variable decl or defn.  */
+
+static void
+write_var_marker (FILE *file, bool is_defn, bool globalize, const char *name)
+{
+  fprintf (file, "\n// BEGIN%s VAR %s: ",
+          globalize ? " GLOBAL" : "",
+          is_defn ? "DEF" : "DECL");
+  assemble_name_raw (file, name);
+  fputs ("\n", file);
+}
+
 /* Write a .func or .kernel declaration or definition along with
    a helper comment for use by ld.  S is the stream to write to, DECL
    the decl for the function with name NAME.   For definitions, emit
@@ -386,11 +411,7 @@ write_fn_proto (std::stringstream &s, bool is_defn,
        name++;
     }
 
-  /* Emit the linker marker.  */
-  s << "\n// BEGIN";
-  if (TREE_PUBLIC (decl))
-    s << " GLOBAL";
-  s << " FUNCTION " << (is_defn ? "DEF" : "DECL") << ": " << name << "\n";
+  write_fn_marker (s, is_defn, TREE_PUBLIC (decl), name);
 
   /* PTX declaration.  */
   if (DECL_EXTERNAL (decl))
@@ -500,7 +521,7 @@ write_fn_proto_from_insn (std::stringstream &s, const char *name,
   else
     {
       name = nvptx_name_replacement (name);
-      s << "\n// BEGIN GLOBAL FUNCTION DECL: " << name << "\n";
+      write_fn_marker (s, false, true, name);
       s << "\t.extern .func ";
     }
 
@@ -1638,9 +1659,7 @@ static void
 init_output_initializer (FILE *file, const char *name, const_tree type,
                         bool is_public)
 {
-  fprintf (file, "\n// BEGIN%s VAR DEF: ", is_public ? " GLOBAL" : "");
-  assemble_name_raw (file, name);
-  fputc ('\n', file);
+  write_var_marker (file, true, is_public, name);
 
   if (TREE_CODE (type) == ARRAY_TYPE)
     type = TREE_TYPE (type);
@@ -1658,6 +1677,27 @@ init_output_initializer (FILE *file, const char *name, const_tree type,
   object_finished = false;
 }
 
+/* Output an uninitialized common or file-scope variable.  */
+
+void
+nvptx_output_aligned_decl (FILE *file, const char *name,
+                          const_tree decl, HOST_WIDE_INT size, unsigned align)
+{
+  write_var_marker (file, true, TREE_PUBLIC (decl), name);
+
+  /* If this is public, it is common.  The nearest thing we have to
+     common is weak.  */
+  if (TREE_PUBLIC (decl))
+    fprintf (file, ".weak ");
+
+  const char *sec = nvptx_section_for_decl (decl);
+  fprintf (file, "%s.align %d .b8 ", sec, align / BITS_PER_UNIT);
+  assemble_name (file, name);
+  if (size > 0)
+    fprintf (file, "[" HOST_WIDE_INT_PRINT_DEC"]", size);
+  fprintf (file, ";\n");
+}
+
 /* Implement TARGET_ASM_DECLARE_CONSTANT_NAME.  Begin the process of
    writing a constant variable EXP with NAME and SIZE and its
    initializer to FILE.  */
@@ -1720,11 +1760,10 @@ nvptx_assemble_undefined_decl (FILE *file, const char *name, const_tree decl)
 {
   if (TREE_CODE (decl) != VAR_DECL)
     return;
+
+  write_var_marker (file, false, TREE_PUBLIC (decl), name);
+
   const char *section = nvptx_section_for_decl (decl);
-  fprintf (file, "\n// BEGIN%s VAR DECL: ",
-          TREE_PUBLIC (decl) ? " GLOBAL" : "");
-  assemble_name_raw (file, name);
-  fputs ("\n", file);
   HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
   fprintf (file, ".extern %s .b8 ", section);
   assemble_name_raw (file, name);
@@ -3876,7 +3915,7 @@ nvptx_file_end (void)
       worker_bcast_size = (worker_bcast_size + worker_bcast_align - 1)
        & ~(worker_bcast_align - 1);
       
-      fprintf (asm_out_file, "\n// BEGIN VAR DEF: %s\n", worker_bcast_name);
+      write_var_marker (asm_out_file, true, false, worker_bcast_name);
       fprintf (asm_out_file, ".shared .align %d .u8 %s[%d];\n",
               worker_bcast_align,
               worker_bcast_name, worker_bcast_size);
@@ -3888,8 +3927,8 @@ nvptx_file_end (void)
 
       worker_red_size = ((worker_red_size + worker_red_align - 1)
                         & ~(worker_red_align - 1));
-      
-      fprintf (asm_out_file, "\n// BEGIN VAR DEF: %s\n", worker_red_name);
+
+      write_var_marker (asm_out_file, true, false, worker_red_name);
       fprintf (asm_out_file, ".shared .align %d .u8 %s[%d];\n",
               worker_red_align,
               worker_red_name, worker_red_size);
index 4228ec073b8c24d7e339da5603785884226a4ae6..cc5822bb10760072f2eab55a4e10925114b04e99 100644 (file)
@@ -304,38 +304,11 @@ struct GTY(()) machine_function
 
 #undef  ASM_OUTPUT_ALIGNED_DECL_COMMON
 #define ASM_OUTPUT_ALIGNED_DECL_COMMON(FILE, DECL, NAME, SIZE, ALIGN)  \
-  do                                                                   \
-    {                                                                  \
-      fprintf (FILE, "\n// BEGIN%s VAR DEF: ",                         \
-              TREE_PUBLIC (DECL) ? " GLOBAL" : "");                    \
-      assemble_name_raw (FILE, NAME);                                  \
-      fputc ('\n', FILE);                                              \
-      const char *sec = nvptx_section_for_decl (DECL);                 \
-      fprintf (FILE, ".visible%s.align %d .b8 ", sec,                  \
-              (ALIGN) / BITS_PER_UNIT);                                \
-      assemble_name ((FILE), (NAME));                                  \
-      if ((SIZE) > 0)                                                  \
-       fprintf (FILE, "[" HOST_WIDE_INT_PRINT_DEC"]", (SIZE));         \
-      fprintf (FILE, ";\n");                                           \
-    }                                                                  \
-  while (0)
+  nvptx_output_aligned_decl (FILE, NAME, DECL, SIZE, ALIGN)
 
 #undef  ASM_OUTPUT_ALIGNED_DECL_LOCAL
 #define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN)   \
-  do                                                                   \
-    {                                                                  \
-      fprintf (FILE, "\n// BEGIN VAR DEF: ");                          \
-      assemble_name_raw (FILE, NAME);                                  \
-      fputc ('\n', FILE);                                              \
-      const char *sec = nvptx_section_for_decl (DECL);                 \
-      fprintf (FILE, ".visible%s.align %d .b8 ", sec,                  \
-              (ALIGN) / BITS_PER_UNIT);                                \
-      assemble_name ((FILE), (NAME));                                  \
-      if ((SIZE) > 0)                                                  \
-       fprintf (FILE, "[" HOST_WIDE_INT_PRINT_DEC"]", (SIZE));         \
-      fprintf (FILE, ";\n");                                           \
-    }                                                                  \
-  while (0)
+  nvptx_output_aligned_decl (FILE, NAME, DECL, SIZE, ALIGN)
 
 #define CASE_VECTOR_PC_RELATIVE flag_pic
 #define JUMP_TABLES_IN_TEXT_SECTION flag_pic
index 7fd8b5540173dbe93f93e50ac6babef12adfa42f..abc4e9d31e65feb2765f2467af2129ff4c8fe5ab 100644 (file)
@@ -1,3 +1,7 @@
+2015-12-01  Nathan Sidwell  <nathan@acm.org>
+
+       * gcc.target/nvptx/uninit-decl.c: New.
+
 2015-12-01  Jan Hubicka  <hubicka@ucw.cz>
 
        * gcc.c-torture/execute/alias-1.c: New testcase.
diff --git a/gcc/testsuite/gcc.target/nvptx/uninit-decl.c b/gcc/testsuite/gcc.target/nvptx/uninit-decl.c
new file mode 100644 (file)
index 0000000..a9ca1dd
--- /dev/null
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+
+int __attribute__ ((used)) common;
+static int __attribute__ ((used)) local;
+
+/* { dg-final { scan-assembler ".weak .global\[^,\n\r\]*common" } } */
+/* { dg-final { scan-assembler "\[\n\r\].global\[^,\n\r\]*local" } } */