2011-07-16 19 views
3

GCCプラグマ最適化を使用して、Cコードでグローバル最適化を設定しようとしています。 GCCのバージョンはUbuntu上で4.4.3です。基本的な考え方は、関数固有の最適化レベルを使用することです。#pragma GCCを使用したCコードの最適化

#pragma GCC optimize ("O3") 

私はちょうど私のCコード

での私のメインの関数の前にコンパイルエラー を取得するしかし、私はそれを構築する際に以下のように、私はコンパイルエラーを取得する - 私はREADMEを確認

passrecovery.c: In function âmainâ: 
passrecovery.c:493: internal compiler error: Segmentation fault 
Please submit a full bug report, 
with preprocessed source if appropriate. 
See <file:///usr/share/doc/gcc-4.4/README.Bugs> for instructions. 
make: *** [all] Error 1 

.Bugsファイルは、エラーで言及しましたが、これに関する手がかりは見つかりませんでした。

#pragma optimizeは4.4.3 GCCでサポートされていますか、そうではありませんか?

「はい」の場合、このプラグマを使用してコードを最適化する際に間違っていることがあります。

速度のコードを最適化するための他の代替GCC指令?

EDIT:私はその後も#pragma GCC optimize ("O3")とファイル#pragma GCC pop_optionsの終わりに#pragma GCC push_optionsを試してみました。同じエラー。あなたが別のコンパイル単位にそれを入れて、コマンドラインスイッチを使用することができます。:最後の質問については

答えて

8

ICE(内部コンパイラエラー)セグメンテーションフォールトにつながるには、必ずコンパイラのバグです、それがあなたにバグを報告するように頼む理由です。有効または無効のソースコードでコンパイラをクラッシュさせるべきではありません。 (無効なコードをコンパイルすることを拒否することが最も多いことがありますが、クラッシュはその1つではありません。)

GCC 4.6.1は最新のものなので、より最近のバージョンのGCC(4.4.3はそれほど古くはありません)。

バグレポートを送信する前に、再生を最小限に抑えるようにしてください。 494行目以降のものはすべて重要ではないでしょう。運があれば、線1と493の間の材料をほぼ500から20程度に減らすことができます。エラーを保存しながら、可能な限り減らすことを確かにする必要があります。コードをチョッピングする前に、コンパイラをクラッシュさせるバージョンを保存しておきます。クラッシュを維持しながらコードを正常に削除したら、連続する各バージョンをVCSにチェックインしてください。 (は、VCSを使用してですか?それは修辞的な質問です;そうでない場合は、今すぐ開始するのが良い時期です。取り消すことができない変更を避けるために必要です。標準ヘッダーを削除する前に、非標準ヘッダー(あなたが書いたヘッダー)を使用します。できるだけ多くのヘッダーを取り除くようにしてください。前処理されたソースの要求に注意してください。私が話しているコードの削減は、前処理されたソースのサイズを縮小します。

+0

FYI main()でこの最適化ディレクティブを使用しようとしました。それは問題のようです。このディレクティブは、他の関数(メイン以外)で使用するときれいに(Atleast compiled ok) – goldenmean

+0

@これを引き起こしているコードをもう少し目の当たりにしたいと思うでしょう。このコードで使用されるライブラリは、-lcrypt(crypt.h)、string.h、stdio.h、stdlib.h、ctype.hです。 – goldenmean

+0

@goldenmean:「」とそれに依存するものを最初に削除することをお勧めします。最初の490行にあるものを見て、クラッシュを維持しながら何が卸売価格で削除できるかを見てください。最初にコメントを使用してから削除することができます。コードの行を変更することはできません。しかし、それはかなりありそうもない。削除されたすべての行がメリットです。あなたのプログラムが自分のヘッダーを使用していないということは人生を単純化します。 –

4

-O3

関連する問題