最近、Android ndk-r9 の使用に切り替えましたが、コンパイラの最適化に関連していると思われるアプリで問題が発生しています。私は次の機能を持っています:
int GetTouchPos(GTouchEvents * pEvents, GPointF * pPos, int * pButton = 0)
{
int count = 0;
GTouchEvent * pEvent;
if (pEvents->GetCount(&count) == GResult_Ok)
{
GDebugLog((GS("GetTouchPos: count = %d"), count));
if (pEvents->GetEvent(0, &pEvent) == GResult_Ok)
{
pEvent->GetTapPos(pPos);
if (pButton)
{
pEvent->GetButton(pButton);
}
pEvent->Release();
}
}
return(count);
}
プロジェクトをビルドして実行すると、GDebugLog の呼び出しによって変数「count」の値がフォーマットされ、ログに記録されます。これを行うと、「カウント」は 1 になり、アプリは正しく動作します。ただし、GDebugLog の行をコメント アウトすると (その他の変更を行わない場合)、アプリを実行すると機能しなくなります。関数 GTouchEvents::GetCount では、返される内容も記録しており、値は常に正しく「1」です。また、上記の関数 (つまり、GetTouchPos) への呼び出しからの戻りをログに記録します。GDebugLog 行が存在する場合、ログに記録された戻り値は正しい値 '1' です。しかし、GDebugLog 呼び出しをコメント アウトすると、ログに記録された戻り値は乱数のように見え、初期化されていない変数のように見えます。
r8b を使用していたとき、これはすべて GDebugLog 行なしで動作することに注意してください。また、最適化をオフにすると、デバッグ行が存在するかどうかに関係なく、このコードは r9 を使用して完全に機能することに注意してください。また、この動作は、ARM プロセッサ用にコンパイルする場合にのみ発生することに注意してください。x86 用にビルドしたバージョンは問題なく動作します。
オプティマイザーが間違ったコードを生成する原因となっている何か疑わしいことをしていますか?
何が起こっているのかについて誰かが光を当てることができますか?
ありがとう。