これは通常、GCC コードにアサーションが含まれている場合に発生しますfalse
。
行 1817 passes.c
( gcc
GCC ソース ツリーのサブディレクトリにある 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
これはおそらく間違っていることです。