This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Handle undefined extern vars in output_in_order


On Fri, 1 Jul 2016, Alexander Monakov wrote:
> On Thu, 23 Jun 2016, Alexander Monakov wrote:
> > Hi,
> > 
> > I've discovered that this assert in my patch was too restrictive:
> > 
> > +      if (DECL_HAS_VALUE_EXPR_P (pv->decl))
> > +	{
> > +	  gcc_checking_assert (lookup_attribute ("omp declare target link",
> > +						 DECL_ATTRIBUTES (pv->decl)));
> > 
> > Testing for the nvptx target uncovered that there's another case where a
> > global variable would have a value expr: emutls.  Sorry for not spotting it
> > earlier (but at least the new assert did its job).  I think we should always
> > skip here over decls that have value-exprs, just like hard-reg vars are
> > skipped.  The following patch does that.  Is this still OK?
> 
> Ping.

Ping^2.

> > (bootstrapped/regtested on x86-64)
> > 
> > Alexander
> > 
> > 	* 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.
> >  
> > diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
> > index 4bfcad7..e30fe6e 100644
> > --- a/gcc/cgraphunit.c
> > +++ b/gcc/cgraphunit.c
> > @@ -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;
> > diff --git a/gcc/varpool.c b/gcc/varpool.c
> > index ab615fa..e5f991e 100644
> > --- a/gcc/varpool.c
> > +++ b/gcc/varpool.c
> > @@ -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;
> > 
> > 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]