handle undefined extern vars in output_in_order
authorAlexander Monakov <amonakov@ispras.ru>
Fri, 15 Jul 2016 11:01:23 +0000 (14:01 +0300)
committerAlexander Monakov <amonakov@gcc.gnu.org>
Fri, 15 Jul 2016 11:01:23 +0000 (14:01 +0300)
* cgraphunit.c (cgraph_order_sort_kind): New entry ORDER_VAR_UNDEF.
(output_in_order): Loop over undefined variables too.  Output them
via assemble_undefined_decl.  Skip variables that correspond to hard
registers or have value-exprs.
* varpool.c (symbol_table::output_variables): Handle undefined
variables together with defined ones.

From-SVN: r238371

gcc/ChangeLog
gcc/cgraphunit.c
gcc/varpool.c

index 7e04fe94814142409f8cad8d9747265a1a0e9de8..e2c0598d43d2a9d84e4de319d5c5bbdcf827bab6 100644 (file)
@@ -1,3 +1,12 @@
+2016-07-15  Alexander Monakov  <amonakov@ispras.ru>
+
+       * cgraphunit.c (cgraph_order_sort_kind): New entry ORDER_VAR_UNDEF.
+       (output_in_order): Loop over undefined variables too.  Output them
+       via assemble_undefined_decl.  Skip variables that correspond to hard
+       registers or have value-exprs.
+       * varpool.c (symbol_table::output_variables): Handle undefined
+       variables together with defined ones.
+
 2016-07-15  Richard Biener  <rguenther@suse.de>
 
        * tree-ssa-pre.c (get_representative_for): Make sure to return
index 4bfcad78f59865e50f533d1547b69fd0e56b94df..e30fe6e423b3a2f16875dd46d787e85c28abaab8 100644 (file)
@@ -2141,6 +2141,7 @@ enum cgraph_order_sort_kind
   ORDER_UNDEFINED = 0,
   ORDER_FUNCTION,
   ORDER_VAR,
+  ORDER_VAR_UNDEF,
   ORDER_ASM
 };
 
@@ -2187,16 +2188,20 @@ output_in_order (bool no_reorder)
        }
     }
 
-  FOR_EACH_DEFINED_VARIABLE (pv)
-    if (!DECL_EXTERNAL (pv->decl))
-      {
-       if (no_reorder && !pv->no_reorder)
-           continue;
-       i = pv->order;
-       gcc_assert (nodes[i].kind == ORDER_UNDEFINED);
-       nodes[i].kind = ORDER_VAR;
-       nodes[i].u.v = pv;
-      }
+  /* There is a similar loop in symbol_table::output_variables.
+     Please keep them in sync.  */
+  FOR_EACH_VARIABLE (pv)
+    {
+      if (no_reorder && !pv->no_reorder)
+       continue;
+      if (DECL_HARD_REGISTER (pv->decl)
+         || DECL_HAS_VALUE_EXPR_P (pv->decl))
+       continue;
+      i = pv->order;
+      gcc_assert (nodes[i].kind == ORDER_UNDEFINED);
+      nodes[i].kind = pv->definition ? ORDER_VAR : ORDER_VAR_UNDEF;
+      nodes[i].u.v = pv;
+    }
 
   for (pa = symtab->first_asm_symbol (); pa; pa = pa->next)
     {
@@ -2222,16 +2227,13 @@ output_in_order (bool no_reorder)
          break;
 
        case ORDER_VAR:
-#ifdef ACCEL_COMPILER
-         /* Do not assemble "omp declare target link" vars.  */
-         if (DECL_HAS_VALUE_EXPR_P (nodes[i].u.v->decl)
-             && lookup_attribute ("omp declare target link",
-                                  DECL_ATTRIBUTES (nodes[i].u.v->decl)))
-           break;
-#endif
          nodes[i].u.v->assemble_decl ();
          break;
 
+       case ORDER_VAR_UNDEF:
+         assemble_undefined_decl (nodes[i].u.v->decl);
+         break;
+
        case ORDER_ASM:
          assemble_asm (nodes[i].u.a->asm_str);
          break;
index ab615fa33fc5f678f5d4e2218671d57cb6a3dad4..e5f991eb759272e0634145a8c94a492000f2daea 100644 (file)
@@ -733,11 +733,6 @@ symbol_table::output_variables (void)
 
   timevar_push (TV_VAROUT);
 
-  FOR_EACH_VARIABLE (node)
-    if (!node->definition
-       && !DECL_HAS_VALUE_EXPR_P (node->decl)
-       && !DECL_HARD_REGISTER (node->decl))
-      assemble_undefined_decl (node->decl);
   FOR_EACH_DEFINED_VARIABLE (node)
     {
       /* Handled in output_in_order.  */
@@ -747,20 +742,19 @@ symbol_table::output_variables (void)
       node->finalize_named_section_flags ();
     }
 
-  FOR_EACH_DEFINED_VARIABLE (node)
+  /* There is a similar loop in output_in_order.  Please keep them in sync.  */
+  FOR_EACH_VARIABLE (node)
     {
       /* Handled in output_in_order.  */
       if (node->no_reorder)
        continue;
-#ifdef ACCEL_COMPILER
-      /* Do not assemble "omp declare target link" vars.  */
-      if (DECL_HAS_VALUE_EXPR_P (node->decl)
-         && lookup_attribute ("omp declare target link",
-                              DECL_ATTRIBUTES (node->decl)))
+      if (DECL_HARD_REGISTER (node->decl)
+         || DECL_HAS_VALUE_EXPR_P (node->decl))
        continue;
-#endif
-      if (node->assemble_decl ())
-        changed = true;
+      if (node->definition)
+       changed |= node->assemble_decl ();
+      else
+       assemble_undefined_decl (node->decl);
     }
   timevar_pop (TV_VAROUT);
   return changed;