On Tue, Sep 15, 2020 at 5:14 PM Erick Ochoa
wrote:
>
> Hi,
>
> I am trying to instrument gimple so that "hello world" is printed after
> each call to malloc. I've tried instrumenting using the following code
>
> static void
> // G points to the gcall which corresponds to malloc
> call_hello_world(gimple* g)
> {
>gimple_stmt_iterator gsi = gsi_start(g);
>
>// create string constant "hello world\n"
>const char* _string = "hello world\n";
>// plus 1 for the null char
>const unsigned _size = strlen(_string) + 1;
>tree _string_cst = build_string (_size, _string);
>
>// create char*
>tree _char_ptr = build_pointer_type(char_type_node);
>
>// create variable hello_string
>tree _var_decl = build_decl(UNKNOWN_LOCATION, VAR_DECL,
> get_identifier("hellostring"), _char_ptr);
>
>// char* hello_string = "hello world\n";
>gassign *assign_stmt = gimple_build_assign(_var_decl, _string_cst);
>gsi_insert_after(&gsi, assign_stmt, GSI_NEW_STMT);
>update_stmt(assign_stmt);
you don't need the above stmt and the wrong thing is that you
forget the ADDR_EXPR around the "hello world\n" string. But you can
pass build_fold_addr_expr (_string_cst) directly as call argument
since it is an invariant.
>gcall *call_stmt =
> gimple_build_call(builtin_decl_explicit(BUILT_IN_PRINTF), 1, _var_decl);
>gsi_insert_after(&gsi, call_stmt, GSI_NEW_STMT);
>
>update_stmt(call_stmt);
> }
>
> but when GCC is compiled with these changes it segfaults in the
> following place:
>
>
> 0xcca9ff crash_signal
> /home/eochoa/code/ipa-dlo/gcc/gcc/toplev.c:327
> 0x9b99c0 useless_type_conversion_p(tree_node*, tree_node*)
> /home/eochoa/code/ipa-dlo/gcc/gcc/gimple-expr.c:71
> 0xd1a5a7 verify_gimple_assign_single
> /home/eochoa/code/ipa-dlo/gcc/gcc/tree-cfg.c:4440
> 0xd1a5a7 verify_gimple_assign
> /home/eochoa/code/ipa-dlo/gcc/gcc/tree-cfg.c:4667
> 0xd1a5a7 verify_gimple_stmt
> /home/eochoa/code/ipa-dlo/gcc/gcc/tree-cfg.c:4932
> 0xd2126b verify_gimple_in_cfg(function*, bool)
> /home/eochoa/code/ipa-dlo/gcc/gcc/tree-cfg.c:5418
> 0xbd6ca3 execute_function_todo
> /home/eochoa/code/ipa-dlo/gcc/gcc/passes.c:1992
> 0xbd7a63 do_per_function
> /home/eochoa/code/ipa-dlo/gcc/gcc/passes.c:1647
> 0xbd7ae3 execute_todo
> /home/eochoa/code/ipa-dlo/gcc/gcc/passes.c:2046
>
> This tells me that gimple was ill formed and that there's likely a bad
> type conversion... and that the type conversion was ill formed during
> the assign statement... but nothing is immediately obvious why the
> assignment statement is ill formed. Do I have to update something or
> make sure to have push_cfun the function that I'm modifying?
>
> Thanks!