2012-06-05 35 views
1

我一直在写一个GCC程序间的插件在那里我有插入在程序中的某些点GIMPLE语句 。在此之后我进行的完整 程序的数据流分析。当我完成分析时,我将删除那些新插入的GIMPLE语句。GCC插件:“内部编译器错误”在passes.c

是越来越完成我的分析只是从它退出之前产生以下消息:

internal compiler error: in execute_ipa_pass_list, at passes.c:1817

这无疑是因为GIMPLE语句插入的,如果我不这样做,我不会得到这个错误信息。

谁能帮我解释这是什么问题,如何解决?

回答

1

此时GCC代码包含原来是false断言通常发生。

线1817在passes.c(这是的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 

这可能是什么错误。