1

プログラムの特定のポイントにGIMPLEステートメントを挿入する必要があるGCCインタープロシージャプラグインを作成しています。この後、プログラム全体でデータフロー分析を実行します。分析が終了したら、新しく挿入されたGIMPLEステートメントを削除します。

私の分析は完了していますが、分析を終了する直前に次のメッセージが生成されます。

内部コンパイラエラー:execute_ipa_pass_list、passs.c:1817

これは確かにGIMPLEステートメントの挿入によるものです。これを行わないと、このエラーメッセージは表示されません。

誰かが私を助けて、問題とは何か、そしてそれを修正する方法を説明できますか?

4

1 に答える 1

1

これは通常、GCC コードにアサーションが含まれている場合に発生しますfalse

行 1817 passes.c( gccGCC ソース ツリーのサブディレクトリにある GCC ソースの一部) には、次のようなコードがあります。

gcc_assert (some_condition);

あなたの場合some_conditionは false でしたが、コンパイラはそれが常にあることを期待しています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);
}

4つのgcc_assertステートメントがあります。プラグインが原因で、そのうちの 1 つが false になりました。つまり、変数の1つを台無しにしました:

current_function_decl
cfun
pass->type

これはおそらく間違っていることです。

于 2012-06-05T11:40:50.130 に答える