2016-07-13 47 views
2

私は具体的に言及しているコンパイラオプションだけでCコードをコンパイルしたいと思います。したがって、私は何とか自動的に設定されているすべてのコンパイラオプションを無効にする必要があります。すべてのコンパイル時に設定され、表示されないデフォルトのGCCオプションを無効にする方法を教えてください。私は、この出力につながる次のコマンドgcc -Q -v example.cを使用して表示されるコンパイラオプションについて話しています:デフォルトのGCCコンパイラオプションを抑制する方法はありますか?

GNU C (Ubuntu 4.8.4-2ubuntu1~14.04.3) version 4.8.4 (x86_64-linux-gnu) 
    compiled by GNU C version 4.8.4, GMP version 5.1.3, MPFR version 3.1.2-p3, MPC version 1.0.1 
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
options passed: -v -imultiarch x86_64-linux-gnu example.c -mtune=generic 
-march=x86-64 -fstack-protector -Wformat -Wformat-security 
options enabled: -faggressive-loop-optimizations 
-fasynchronous-unwind-tables -fauto-inc-dec -fbranch-count-reg -fcommon 
-fdelete-null-pointer-checks -fdwarf2-cfi-asm -fearly-inlining 
-feliminate-unused-debug-types -ffunction-cse -fgcse-lm -fgnu-runtime 
-fgnu-unique -fident -finline-atomics -fira-hoist-pressure 
-fira-share-save-slots -fira-share-spill-slots -fivopts 
-fkeep-static-consts -fleading-underscore -fmath-errno 
-fmerge-debug-strings -fmove-loop-invariants -fpeephole 
-fprefetch-loop-arrays -freg-struct-return -fsched-critical-path-heuristic 
-fsched-dep-count-heuristic -fsched-group-heuristic -fsched-interblock 
-fsched-last-insn-heuristic -fsched-rank-heuristic -fsched-spec 
-fsched-spec-insn-heuristic -fsched-stalled-insns-dep -fshow-column 
-fsigned-zeros -fsplit-ivs-in-unroller -fstack-protector 
-fstrict-volatile-bitfields -fsync-libcalls -ftrapping-math 
-ftree-coalesce-vars -ftree-cselim -ftree-forwprop -ftree-loop-if-convert 
-ftree-loop-im -ftree-loop-ivcanon -ftree-loop-optimize 
-ftree-parallelize-loops= -ftree-phiprop -ftree-pta -ftree-reassoc 
-ftree-scev-cprop -ftree-slp-vectorize -ftree-vect-loop-version 
-funit-at-a-time -funwind-tables -fvar-tracking -fvar-tracking-assignments 
-fzero-initialized-in-bss -m128bit-long-double -m64 -m80387 
-maccumulate-outgoing-args -malign-stringops -mfancy-math-387 
-mfp-ret-in-387 -mfxsr -mglibc -mieee-fp -mlong-double-80 -mmmx -mno-sse4 
-mpush-args -mred-zone -msse -msse2 -mtls-direct-seg-refs 
Compiler executable checksum: a0a649d344b1ed798e33d30772d46437 

ここではデフォルトのコンパイラオプションがoptions enabledとして見ることができます。例を使用せずにこれらのオプションを無効にする方法を教えてください。ほとんどの場合-fno-...デフォルトのコンパイラオプションを適切に無効にする簡単な方法はありますか? options.txtという名前のファイルに

gcc -Q --help=optimizers | sed -e '/^[^[]*$/d' -e 's/ *\[.*$//' -e 's/^ -f/ -fno-/' 

保存結果をと@ -syntaxとgccのためにそれを渡します:

+1

すべての '-f ...'オプションをオフにすることでどのような効果が期待できますか?これらのオプションのうちのいくつかは、2つの異なる選択肢の中から選択するときに「オフ」にすることはできません。 '-mlong-double-80'は128ビットと80ビットの' long double'を選択します。 – fuz

+0

私が知っているすべてのデフォルトコンパイラオプションを無効にしたいと思います。その後、私は積極的に設定したコンパイラオプションだけを設定したい。これは、特定のコードをコンパイルするためにどのコンパイラオプションがアクティブ化されているかを実際に知るために必要です。 – Maximilian

+0

@FUZxxl:すべてのオプションを無効にすると、gccは人気のある1990年代の方言に似た方言を処理します。これには、コストが利益を上回るプラットフォームがあったか、存在していた可能性があるため、例えば、コードが符号付きの値を正の整数でスケーリングする必要がある場合、gccは現在のところ、 'x << = y;'をサポートすると思います。 'x =(int32)((uint32_t)x)<< y);'のようになりますが、次のgccリリースでは '-fno-silly-signed-shift'を追加する必要があるかどうかを知る方法がありません作業。 – supercat

答えて

2

はすべてオフ-fオプションのリストを生成するには、次のスクリプトを使用し

gcc @options.txt ... 

これは、-m...オプションなどの他のオプションを「オフ」にしないことに注意してください。彼らのほとんどは、スイッチがはい/いいえでないか、ABIを変更するためにスイッチが切られないため、「切る」ことはできません。

+0

gccの新しいバージョンに追加された「最適化」機能が、コンパイラが更新されたときにデフォルトで有効にならないようにするための純粋な方法はありますか? – supercat

+0

@supercat機能フラグを "オフ"にしても、コンパイラの慣れを緩和することはできません。 gccは標準Cのコンパイラです。従来のCをコンパイルする場合は、pccのような別のコンパイラを使うことを検討してください。 – fuz

+0

「標準C」は神話です。 1つのプログラムルールは、標準の作成者が、実装が完全に準拠しているにもかかわらず完全に役に立たない可能性(原理的にこれを認めている)を可能にするため、明示的に必要とされるもの以外の動作を実装が意図していることを明示しています。標準の作成者が、その実装を意図していなかった場合、結果がINT_MAX + 1uとUINT_MAXの間であった場合、既存の実装の大半が 'uint1 = ushort1 * ushort2; 'のようなものをどのように扱うかを述べた理由を示唆できますか? ... – supercat

関連する問題