public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* plugin help: Inserting a function call in gimple code?
@ 2008-01-02 23:15 Rob Johnson
  2008-01-03 10:32 ` Martin Jambor
  0 siblings, 1 reply; 3+ messages in thread
From: Rob Johnson @ 2008-01-02 23:15 UTC (permalink / raw)
  To: gcc

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

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: plugin help: Inserting a function call in gimple code?
  2008-01-02 23:15 plugin help: Inserting a function call in gimple code? Rob Johnson
@ 2008-01-03 10:32 ` Martin Jambor
  2008-01-03 21:26   ` Rob Johnson
  0 siblings, 1 reply; 3+ messages in thread
From: Martin Jambor @ 2008-01-03 10:32 UTC (permalink / raw)
  To: Rob Johnson; +Cc: gcc

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().

> 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;
> }
> -----------------
>
>

HTH

Martin

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: plugin help: Inserting a function call in gimple code?
  2008-01-03 10:32 ` Martin Jambor
@ 2008-01-03 21:26   ` Rob Johnson
  0 siblings, 0 replies; 3+ messages in thread
From: Rob Johnson @ 2008-01-03 21:26 UTC (permalink / raw)
  To: gcc

Martin Jambor wrote:
> 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().

Yes!  It seems it's slightly more complicated given that, with some 
optimization levels the code is sometimes turned into SSA and sometimes 
not, and that, depending on how the original program uses argv and argc, 
they may or may not already have default definitions.  If the original 
program doesn't touch argv/argc, then we also have to update the set of 
referenced vars.  Here's the code I wrote to construct the argc argument 
to the above call expression:

tree argc;

/* If we're doing SSA... */
if (cfun->gimple_df && cfun->gimple_df->default_defs)
   {
     argc = gimple_default_def (cfun, DECL_ARGUMENTS (cfun->decl));
     if (!argc)
       {
	argc = DECL_ARGUMENTS (cfun->decl);
	mark_sym_for_renaming (argc);
       }
     add_referenced_var (DECL_ARGUMENTS (cfun->decl));
   }
else
   argc = DECL_ARGUMENTS (cfun->decl);

The code for argv is similar.  Does that look right?

Once I get this plugin working, I will try to extract some useful 
building blocks for other plugin writers.  Thanks for your help!

Best,
Rob

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2008-01-03 21:26 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-01-02 23:15 plugin help: Inserting a function call in gimple code? Rob Johnson
2008-01-03 10:32 ` Martin Jambor
2008-01-03 21:26   ` Rob Johnson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).