plugin help: Inserting a function call in gimple code?

Rob Johnson rob@cs.sunysb.edu
Wed Jan 2 23:15:00 GMT 2008


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)));
bsi_insert_before (&iter, argv_registrar_call, BSI_SAME_STMT);
---------------------------------------

With -O1, I get the compiler failure

---------------
test.c: In function 'main':
test.c:2: error: expected an SSA_NAME object
test.c:2: error: in statement
__memcheck_register_argv (argc, argv);
test.c:2: internal compiler error: verify_ssa failed
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
----------------

when attempting to compile the code

-----------------
int main(int argc, char **argv)
{
   return 0;
}
-----------------


I've tried all kinds of combinations of gimplify_stmt, update_ssa, etc., 
but I just can't figure our the "correct" way to insert a function call 
into the gimple tree.  Any help would be greatly appreciated!

Best,
Rob



More information about the Gcc mailing list