On Wed, 2016-04-27 at 12:34 +0300, Cristina Georgiana Opriceana wrote:
> Hello,
> 
> I tried to add a new global declaration of a pointer and I expected
> to
> see it in varpool nodes, but it does not appear there.
> 
> ustackptr = build_decl (UNKNOWN_LOCATION,
>                              VAR_DECL, get_identifier ("ustackptr"),
>                              build_pointer_type(void_type_node));
> TREE_ADDRESSABLE (ustackptr) = 1;
> TREE_USED (ustackptr) = 1;
> rest_of_decl_compilation (ustackptr, 1, 0);
> 
> and
> 
> struct varpool_node *node;
> FOR_EACH_VARIABLE (node) {
>         fprintf(stdout, "%s\n", get_name(node->decl));
> }

FWIW, in the the jit "frontend", I wasn't aware of
rest_of_decl_compilation. Instead I have the following code for
creating a global variable, which calls varpool_node::get_create and
varpool_node::finalize_decl directly on the VAR_DECL instance.

That said, maybe rest_of_decl_compilation is the best approach, but I'm
not sure why it isn't working for you.  (I'm not an expert at this, I
copied from the C frontend and hacked it up till it worked).

This is from gcc/jit/jit-playback.c (which has a family of wrapper classes 
around "tree", but hopefully the idea is clear):

/* Construct a playback::lvalue instance (wrapping a tree).  */

playback::lvalue *
playback::context::
new_global (location *loc,
            enum gcc_jit_global_kind kind,
            type *type,
            const char *name)
{
  gcc_assert (type);
  gcc_assert (name);
  tree inner = build_decl (UNKNOWN_LOCATION, VAR_DECL,
                           get_identifier (name),
                           type->as_tree ());
  TREE_PUBLIC (inner) = (kind != GCC_JIT_GLOBAL_INTERNAL);
  DECL_COMMON (inner) = 1;
  switch (kind)
    {
    default:
      gcc_unreachable ();

    case GCC_JIT_GLOBAL_EXPORTED:
      TREE_STATIC (inner) = 1;
      break;

    case GCC_JIT_GLOBAL_INTERNAL:
      TREE_STATIC (inner) = 1;
      break;

    case GCC_JIT_GLOBAL_IMPORTED:
      DECL_EXTERNAL (inner) = 1;
      break;
    }

  if (loc)
    set_tree_location (inner, loc);

  varpool_node::get_create (inner);

  varpool_node::finalize_decl (inner);

  m_globals.safe_push (inner);

  return new lvalue (this, inner);
}


Hope this is helpful
Dave

Reply via email to