On Tue, Sep 15, 2020 at 5:14 PM Erick Ochoa
<erick.oc...@theobroma-systems.com> 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!

Reply via email to