我一直在编写一个 GCC 程序间插件,我必须在程序中的某些点插入 GIMPLE 语句。在此之后,我对整个程序进行数据流分析。当我完成分析后,我将删除那些新插入的 GIMPLE 语句。
我的分析已经完成,但在退出之前会生成以下消息:
内部编译器错误:在 execute_ipa_pass_list 中,在 pass.c:1817
这肯定是因为插入了 GIMPLE 语句,如果我不这样做,我将不会收到此错误消息。
谁能帮我解释一下问题是什么以及如何解决?
我一直在编写一个 GCC 程序间插件,我必须在程序中的某些点插入 GIMPLE 语句。在此之后,我对整个程序进行数据流分析。当我完成分析后,我将删除那些新插入的 GIMPLE 语句。
我的分析已经完成,但在退出之前会生成以下消息:
内部编译器错误:在 execute_ipa_pass_list 中,在 pass.c:1817
这肯定是因为插入了 GIMPLE 语句,如果我不这样做,我将不会收到此错误消息。
谁能帮我解释一下问题是什么以及如何解决?
这通常发生在 GCC 代码包含的断言结果是false
.
第 1817 行passes.c
(它是 GCC 源代码的一部分,位于 GCCgcc
源代码树的子目录中)有一段代码,如下所示:
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
这大概就是问题所在。