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