GCC插件:pass.c中的“内部编译器错误”

时间:2012-06-05 11:23:37

标签: gcc plugins compiler-construction

我一直在编写一个GCC inter procedureural插件,我必须插入GIMPLE语句 在该计划的某些方面。在此之后,我对完成进行数据流分析 程序。当我完成分析后,我将删除那些新插入的GIMPLE语句。

我的分析已经完成,但在退出之前,会生成以下消息:

  

内部编译器错误:在execute_ipa_pass_list中,在pass.c:1817

这肯定是因为插入了GIMPLE语句,如果我不这样做,我将不会收到此错误消息。

有没有人可以帮我解释问题是什么以及如何解决?

1 个答案:

答案 0 :(得分:1)

当GCC代码包含一个结果为false的断言时,通常会发生这种情况。

passes.c中的第1817行(它是GCC源代码的一部分,位于GCC源代码树的gcc子目录中)有一段代码如下:

gcc_assert (some_condition);

在你的情况下,some_condition是错误的,但是编译器期望它总是true(这就是代码的作者首先编写断言的原因)。

你在插件中做了一些事情,使其成为false,你需要修复它。

你做错了什么?这真的取决于。打开passes.c找到该行,看看它正在检查什么。在我的GCC副本中,相关函数为:

void
execute_ipa_pass_list (struct opt_pass *pass)
{
  do
    {
      /* An assertion.  */
      gcc_assert (!current_function_decl);
      /* Another assertion.  */
      gcc_assert (!cfun);
      /* Another assertion.  */
      gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
      if (execute_one_pass (pass) && pass->sub)
        {
          if (pass->sub->type == GIMPLE_PASS)
            {
              invoke_plugin_callbacks (PLUGIN_EARLY_GIMPLE_PASSES_START, NULL);
              do_per_function_toporder ((void (*)(void *))execute_pass_list,
                                        pass->sub);
              invoke_plugin_callbacks (PLUGIN_EARLY_GIMPLE_PASSES_END, NULL);
            }
          else if (pass->sub->type == SIMPLE_IPA_PASS
                   || pass->sub->type == IPA_PASS)
            execute_ipa_pass_list (pass->sub);
          else
            gcc_unreachable ();
        }
      /* Another assertion.  */
      gcc_assert (!current_function_decl);
      cgraph_process_new_functions ();
      pass = pass->next;
    }
  while (pass);
}

有四个gcc_assert语句。你的插件导致其中一个变得虚假。即你搞砸了其中一个变量:

current_function_decl
cfun
pass->type

这可能是错的。