This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Issue with gimple_regimplify_operands, called from plug-in (GCC 4.5)


Hi,
I have a problem with gimple_regimplify_operands() from gimplify.c ,
which i execute from my custom plug-in-code. It could indicate a bug
in this procedure.

I'm developing a GCC-plug-in, which does some instrumentation of
C-programs on GIMPLE-Level.
Among others, I'm inserting logging functions, which output the
runtime-addresses of all in a function referenced variables.
Since i have to build ADDR_EXPR nodes for all these variables, which
invalidates some properties of GIMPLE,
I run gimple_regimplify_operands() for all statements in each basic-block.

My gimple_pass is inserted before the ssa-building pass.
It works fine with all my test-cases which doesn't contain SWITCH-CASE
constructs.

If my test program contains SWITCH-CASE statements, the
compile-process fails by executing gimple_regimplify_operands, called
from my pass.
I get an error like:
main3.c: In function âmainâ:
main3.c:24:1: internal compiler error: in gimplify_expr, at gimplify.c:7336

In order to find an error, i removed all my passes, and installed only
one pass, which runs regimplify_operands on NOT-instrumented GIMPLE.
I got the same error.
It indicates that either it is not allowed to run regimplify_operands
at this place ( just before the "ssa"-building-pass) or there is a bug
in this procedure.

Could someone comment or say what I'm doing wrong?

Regards,
Eugen

------------------------------------------------------------
My test_pass- procedure:
static unsigned int
execute_regimplify(void){
  basic_block bb;
  FOR_EACH_BB (bb)
    {
      gimple_stmt_iterator gsi;
      gimple_seq seq = bb_seq(bb);

      for (gsi = gsi_start(seq); !gsi_end_p(gsi); gsi_next(&gsi))
        {
          gimple stmt = gsi_stmt(gsi);
          gimple_regimplify_operands(stmt, &gsi);
        }
    }
  verify_stmts();
  return 0;
}
------------------------------------------------------------
plugin-installation code:
plugin_init()
...
  pass_info.pass = &pass_test_regimplify.pass;
  pass_info.reference_pass_name = "ssa";
  pass_info.ref_pass_instance_number = 0;
  pass_info.pos_op = PASS_POS_INSERT_BEFORE;
  register_callback (plugin_info->base_name, PLUGIN_PASS_MANAGER_SETUP,
      NULL, &pass_info);
return 0;
}


struct gimple_opt_pass pass_test_regimplify =
  {
    { GIMPLE_PASS, "test_regimplify", /* name */
    NULL,                               /* gate */
    execute_regimplify,                 /* execute */
    NULL,                               /* sub */
    NULL,                               /* next */
    0,                                  /* static_pass_number */
    TV_NONE,                            /* tv_id */
    PROP_cfg,                           /* properties_required */
    0,                                  /* properties_provided */
    0,                                  /* properties_destroyed */
    0,                                  /* todo_flags_start */
    0,                                  /* todo_flags_finish */
    } };
------------------------------------------------------------
the contents of main3.c:
int main(int argc, char **args){
  int a = 0;
  int b = 3;
  switch(b){
  case 1:
    a= 1;
    break;
  case 2:
    a=2;
    break;
  default:
   a=b;
  }
  return 0;
}
------------------------------------------------------------------------------
gdb's back-trace gives:

#0  gimplify_expr (expr_p=0xb7ff5418, pre_p=0xbffff080,
post_p=0xbfffecb4, gimple_test_f=0x82e7010 <is_gimple_val>,
    fallback=<value optimized out>) at ../../gcc/gimplify.c:7336
#1  0x08308f52 in gimplify_arg (arg_p=0xb7ff5418, pre_p=<value
optimized out>, call_location=<value optimized out>)
    at ../../gcc/gimplify.c:2216
#2  0x08309161 in gimplify_call_expr (expr_p=<value optimized out>,
pre_p=<value optimized out>,
    want_value=<value optimized out>) at ../../gcc/gimplify.c:2361
#3  0x0830189b in gimplify_expr (expr_p=0xb7f37f5c, pre_p=0xbffff080,
post_p=0xbfffee64,
    gimple_test_f=0x82e1a80 <is_gimple_stmt>, fallback=0) at
../../gcc/gimplify.c:6636
#4  0x0830bafb in gimplify_stmt (stmt_p=0xb7f37f5c, seq_p=0xbffff080)
at ../../gcc/gimplify.c:5277
#5  0x083013b7 in gimplify_statement_list (expr_p=0xb7ebad0c,
pre_p=0xbffff080, post_p=0xbfffef74,
    gimple_test_f=0x82e1a80 <is_gimple_stmt>, fallback=0) at
../../gcc/gimplify.c:1383
#6  gimplify_expr (expr_p=0xb7ebad0c, pre_p=0xbffff080,
post_p=0xbfffef74, gimple_test_f=0x82e1a80 <is_gimple_stmt>,
    fallback=0) at ../../gcc/gimplify.c:6982
#7  0x0830bafb in gimplify_stmt (stmt_p=0xb7ebad0c, seq_p=0xbffff080)
at ../../gcc/gimplify.c:5277
#8  0x08302ce6 in gimplify_bind_expr (expr_p=0xb7f60fd8,
pre_p=0xbffff138, post_p=0xbffff084,
    gimple_test_f=0x82e1a80 <is_gimple_stmt>, fallback=0) at
../../gcc/gimplify.c:1128
#9  gimplify_expr (expr_p=0xb7f60fd8, pre_p=0xbffff138,
post_p=0xbffff084, gimple_test_f=0x82e1a80 <is_gimple_stmt>,
    fallback=0) at ../../gcc/gimplify.c:6766
#10 0x0830bafb in gimplify_stmt (stmt_p=0xb7f60fd8, seq_p=0xbffff138)
at ../../gcc/gimplify.c:5277
#11 0x0830bbe0 in gimplify_body (body_p=0xb7f60fd8, fndecl=0xb7f60f80,
do_parms=1 '\001') at ../../gcc/gimplify.c:7578
#12 0x0830c011 in gimplify_function_tree (fndecl=0xb7f60f80) at
../../gcc/gimplify.c:7674
#13 0x08616398 in cgraph_analyze_function (node=0xb7f690b8) at
../../gcc/cgraphunit.c:873
#14 0x086191f7 in cgraph_analyze_functions () at ../../gcc/cgraphunit.c:1008
#15 0x0861a8a5 in cgraph_finalize_compilation_unit () at
../../gcc/cgraphunit.c:1113
#16 0x080db74b in c_write_global_declarations () at ../../gcc/c-decl.c:9520
#17 0x0842d68b in compile_file (argc=4, argv=0xbffff3f4) at
../../gcc/toplev.c:1065
#18 do_compile (argc=4, argv=0xbffff3f4) at ../../gcc/toplev.c:2417
#19 toplev_main (argc=4, argv=0xbffff3f4) at ../../gcc/toplev.c:2459
#20 0x081645ab in main (argc=4, argv=0xbffff3f4) at ../../gcc/main.c:35


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]