Dear mailing list:

I solved my own problem.  This is how I construct a static variable:

--
static tree build_static(tree type, const char* name)
{
  tree ret = NULL;

  ret = build_decl(VAR_DECL, get_identifier(name), type);

  TREE_STATIC(ret) = 1;
assemble_variable(ret, 0, 0, 0); // tree decl, int top_level, int at_end, int dont_output_data
  add_referenced_var(ret);

  return ret;
}
--

By the way, this only works for static variables; for automatic variables, this is how I do it:

--
static tree build_automatic(tree type, const char* name)
{
  tree ret = NULL;

  ret = build_decl(VAR_DECL, get_identifier(name), type);

  DECL_ARTIFICIAL(ret) = 1;     // declared by the compiler
  DECL_IGNORED_P(ret) = 1;      // no debug info
  TREE_READONLY(ret) = 0;       // writable
  DECL_EXTERNAL(ret) = 0;       // defined
  TREE_STATIC(ret) = 0;         // automatic
  TREE_USED(ret) = 1;           // used
  DECL_CONTEXT(ret) = cfun->decl;

  create_var_ann(ret);
  add_referenced_var(ret);

  HOST_WIDE_INT decl_size;

  if(TYPE_SIZE(type) && TREE_CODE(TYPE_SIZE(type)) == INTEGER_CST)
    {
      decl_size = tree_low_cst(TYPE_SIZE(type), 0);
    }
  else
    {
      decl_size = 0;
    }

  rtx decl_rtl = assign_stack_local(DECL_MODE(ret), decl_size, 0);

  SET_DECL_RTL(ret, decl_rtl);

  return ret;
}
--

Sincerely,
Sean Callanan


On Jun 13, 2008, at 1:57 AM, Sean Callanan wrote:

Dear mailing list:

I am writing GCC code that constructs GIMPLE (after pass_apply_inline and before pass_all_optimizations) for a function- level static variable that gets assigned to and passed to another function. My problem is that I am getting undefined symbol errors for a renamed version of the symbol.
I define the variable as below:

--
static tree build_static(tree type, const char* name)
{
 tree ret = NULL;

 ret = build_decl(VAR_DECL, get_identifier(name), type);

 DECL_ARTIFICIAL(ret) = 1;     // declared by the compiler
 DECL_IGNORED_P(ret) = 1;      // no debug info
 TREE_READONLY(ret) = 0;       // writable
 DECL_EXTERNAL(ret) = 0;       // defined
 TREE_STATIC(ret) = 1;         // static
 TREE_USED(ret) = 1;           // used
 DECL_CONTEXT(ret) = cfun->decl;

 create_var_ann(ret);
 add_referenced_var(ret);

 return ret;
}
--

Here's an example where I use this function, and demonstrating how I use the variable.

--
 tree last_p = build_static(long_long_unsigned_type_node, "last_p");
 // ...
tree subtraction = build2(MINUS_EXPR, long_long_unsigned_type_node, end_time, start_time);
 build_gimple_modify_stmt(last_p, subtraction);
 // ...
tree last_p_temp = create_tmp_var(TREE_TYPE(last_p), get_name(last_p));
 tree last_p_name = make_ssa_name(last_p_temp, NULL);
tree last_p_assignment = build_gimple_modify_stmt(last_p_name, last_p);
 SSA_NAME_DEF_STMT(last_p_name) = last_p_assignment;
--

As seen above, I (try to) respect SSA when reading from this variable, and when assigning to it (I create an SSA_NAME when using the value, and assign directly to the VAR_DECL). I'm passing an SSA_NAME to the function. However, when I compile, I'm getting linker errors of the form:

--
[...]/test.c:4: undefined reference to `last_p.2610'
--

Oddly, I don't get undefined references for `last_p'; I find it very odd that it's being renamed. Does anyone know what's going on here? As always, I welcome corrections to my (admittedly novice- level) GIMPLE- and SSA-fu.
Thanks for looking at this.

Sincerely,
Sean Callanan

Reply via email to