Hi,
On Wed, Jan 02, 2008 at 06:13:37PM -0500, Rob Johnson wrote:
I'm experimenting with the gimple plugin infrastructure and I'm having
trouble instrumenting code in a way that is compatible with the optimizer.
Here's a simple example that is intended to insert the function call
"__memcheck_register_argv(argc, argv)" at the beginning of main. The code
runs during pass_plugin_gimple (which comes right after pass_apply_inline
in passes.c) and works great with -O0, but causes the compiler to crash
with -O1 or higher.
-------------------------------------
tree argv_registrar_type;
tree argv_registrar;
tree argv_registrar_call;
argv_registrar_type = build_function_type_list (void_type_node,
integer_type_node,
build_pointer_type
(build_pointer_type
(char_type_node)),
NULL_TREE);
argv_registrar = build_fn_decl ("__memcheck_register_argv",
argv_registrar_type);
argv_registrar_call = build_call_expr (argv_registrar, 2,
DECL_ARGUMENTS (cfun->decl),
TREE_CHAIN (DECL_ARGUMENTS
(cfun->decl)));
DECL_ARGUMENTS is a tree chain of PARM_DECLs and in SSA GIMPLE, scalar
operands (integers and pointer are both scalar, is_gimple_reg()
predicate is there to identify variables that need to be converted to
SSA) need to be SSA_NAMEs of declarations (PARM_DECLs and VAR_DECLs in
particular).
Therefore I suspect you need to create a different chain of respective
SSA_NAMES and pass that to build_call_expr(). You can get the default
SSA_NAME by calling gimple_default_def().