日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.4-RELEASE-K, 13.0-RELEASE-K から 13.3-RELEASE-K, 14.0-RELEASE-K から 14.1-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
GCC(1) GNU GCC(1) 名称 gcc - GNU プロジェクト C と C++ コンパイラ 書式 gcc [-c|-S|-E] [-std=standard] [-g] [-pg] [-Olevel] [-Wwarn...] [-pedantic] [-Idir...] [-Ldir...] [-Dmacro[=defn]...] [-Umacro] [-foption...] [-mmachine-option...] [-o outfile] [@file] infile... 最も役に立つオプションだけがここにリストされています。残りについては下 記を参照してください。g++ は gcc とほとんど同じオプションを受け付けま す。 解説 GCC を呼び出すとき、通常、前処理、コンパイル、アセンブリとリンクを行い ます。"全般的なオプション" によって、利用者は、中間的なステージでこのプ ロセスを停止することができます。例えば、-c オプションは、リンカを実行し ないようにします。次に、オブジェクトファイルから成る出力は、アセンブラ によって行われます。 他のオプションは、1 つのプロセスのステージで渡されます。いくつかのオプ ションは、プリプロセッサを制御し、他のものはコンパイラ自体を制御しま す。さらに、他のオプションはアセンブラとリンカを制御します。それらを使 用する必要がめったにないので、これらの大部分は、ここで文書化されていま せん。 利用者が GCC で使用することができるコマンドラインオプションのほとんど は、C プログラムの役に立ちます。オプションが他の言語 (通常 C++) によっ てのみ役に立つとき、明らか説明します。特定のオプションのための記述が ソース言語について言及しないなら、利用者はすべてのサポートされた言語で そのオプションを使用することができます。 gcc プログラムは、オプションとファイル名をオペランドとして受け付けま す。多くのオプションには、意味が同じで指定文字が異なる複数の名前があり ます。したがって、複数の単一文字のオプションは分類できません: -dr は -d -r とは大変異なっています。 オプションと他の引数を混ぜることができます。ほとんどは、使用する順序は 重要ではありません。同じ種類のいくつかのオプションを使用するとき、順序 は重要です。例えば、複数の -L を指定するなら、ディレクトリは指定された 順序で検索されます。 多くのオプションには、-f または -W --- 例えば、-fmove-loop-invariants, -Wformat その他、で始まる長い名前があります。これらのほとんどには、肯定 (positive) 形式と否定 (negative) 形式の両方があります。-ffoo の否定形式 は -fno-foo です。このマニュアルは、どちらかデフォルトでない、これらの 2 つの形式の 1 つだけが文書化されています。 オプション オプションの概要 ここに、種類によってグループ化されたすべてのオプションの概要を示しま す。説明は以下のセクションにあります。 全般的なオプション -c -S -E -o file -combine -pipe -pass-exit-codes -x language -v -### --help --target-help --version @file C 言語オプション -ansi -std=standard -fgnu89-inline -aux-info filename -fno-asm -fno-builtin -fno-builtin-function -fhosted -ffreestanding -fopenmp -fms-extensions -trigraphs -no-integrated-cpp -traditional -traditional-cpp -fallow-single-precision -fcond-mismatch -fsigned-bitfields -fsigned-char -funsigned-bitfields -funsigned-char -funsigned-bitfields -funsigned-char C++ 言語オプション -fabi-version=n -fno-access-control -fcheck-new -fconserve-space -ffriend-injection -fno-elide-constructors -fno-enforce-eh-specs -ffor-scope -fno-for-scope -fno-gnu-keywords -fno-implicit-templates -fno-implicit-inline-templates -fno-implement-inlines -fms-extensions -fno-nonansi-builtins -fno-operator-names -fno-optional-diags -fpermissive -frepo -fno-rtti -fstats -ftemplate-depth-n -fno-threadsafe-statics -fuse-cxa-atexit -fno-weak -nostdinc++ -fno-default-inline -fvisibility-inlines-hidden -Wabi -Wctor-dtor-privacy -Wnon-virtual-dtor -Wreorder -Weffc++ -Wno-deprecated -Wstrict-null-sentinel -Wno-non-template-friend -Wold-style-cast -Woverloaded-virtual -Wno-pmf-conversions -Wsign-promo 言語独立のオプション -fmessage-length=n -fdiagnostics-show-location=[once|every-line] -fdiagnostics-show-option 警告オプション -fsyntax-only -pedantic -pedantic-errors -w -Wextra -Wall -Waddress -Waggregate-return -Wno-attributes -Wc++-compat -Wcast-align -Wcast-qual -Wchar-subscripts -Wcomment -Wconversion -Wno-deprecated-declarations -Wdisabled-optimization -Wno-div-by-zero -Wno-endif-labels -Werror -Werror=* -Werror-implicit-function-declaration -Wfatal-errors -Wfloat-equal -Wformat -Wformat=2 -Wno-format-extra-args -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wimplicit -Wimplicit-function-declaration -Wimplicit-int -Wimport -Wno-import -Winit-self -Winline -Wno-int-to-pointer-cast -Wno-invalid-offsetof -Winvalid-pch -Wlarger-than-len -Wunsafe-loop-optimizations -Wlong-long -Wmain -Wmissing-braces -Wmissing-field-initializers -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-noreturn -Wno-multichar -Wnonnull -Wno-overflow -Woverlength-strings -Wpacked -Wpadded -Wparentheses -Wpointer-arith -Wno-pointer-to-int-cast -Wredundant-decls -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -Wstack-protector -Wstrict-aliasing -Wstrict-aliasing=2 -Wstrict-overflow -Wstrict-overflow=n -Wswitch -Wswitch-default -Wswitch-enum -Wsystem-headers -Wtrigraphs -Wundef -Wuninitialized -Wunknown-pragmas -Wno-pragmas -Wunreachable-code -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wvariadic-macros -Wvolatile-register-var -Wwrite-strings C のみの警告オプション -Wbad-function-cast -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wold-style-definition -Wstrict-prototypes -Wtraditional -Wdeclaration-after-statement -Wpointer-sign デバッグオプション -dletters -dumpspecs -dumpmachine -dumpversion -fdump-noaddr -fdump-unnumbered -fdump-translation-unit[-n] -fdump-class-hierarchy[-n] -fdump-ipa-all -fdump-ipa-cgraph -fdump-tree-all -fdump-tree-original[-n] -fdump-tree-optimized[-n] -fdump-tree-inlined[-n] -fdump-tree-cfg -fdump-tree-vcg -fdump-tree-alias -fdump-tree-ch -fdump-tree-ssa[-n] -fdump-tree-pre[-n] -fdump-tree-ccp[-n] -fdump-tree-dce[-n] -fdump-tree-gimple[-raw] -fdump-tree-mudflap[-n] -fdump-tree-dom[-n] -fdump-tree-dse[-n] -fdump-tree-phiopt[-n] -fdump-tree-forwprop[-n] -fdump-tree-copyrename[-n] -fdump-tree-nrv -fdump-tree-vect -fdump-tree-sink -fdump-tree-sra[-n] -fdump-tree-salias -fdump-tree-fre[-n] -fdump-tree-vrp[-n] -ftree-vectorizer-verbose=n -fdump-tree-storeccp[-n] -feliminate-dwarf2-dups -feliminate-unused-debug-types -feliminate-unused-debug-symbols -femit-class-debug-always -fmem-report -fprofile-arcs -frandom-seed=string -fsched-verbose=n -ftest-coverage -ftime-report -fvar-tracking -g -glevel -gcoff -gdwarf-2 -ggdb -gstabs -gstabs+ -gvms -gxcoff -gxcoff+ -p -pg -print-file-name=library -print-libgcc-file-name -print-multi-directory -print-multi-lib -print-prog-name=program -print-search-dirs -Q -save-temps -time 最適化オプション -falign-functions=n -falign-jumps=n -falign-labels=n -falign-loops=n -fbounds-check -fmudflap -fmudflapth -fmudflapir -fbranch-probabilities -fprofile-values -fvpt -fbranch-target-load-optimize -fbranch-target-load-optimize2 -fbtr-bb-exclusive -fcaller-saves -fcprop-registers -fcse-follow-jumps -fcse-skip-blocks -fcx-limited-range -fdata-sections -fdelayed-branch -fdelete-null-pointer-checks -fearly-inlining -fexpensive-optimizations -ffast-math -ffloat-store -fforce-addr -ffunction-sections -fgcse -fgcse-lm -fgcse-sm -fgcse-las -fgcse-after-reload -fcrossjumping -fif-conversion -fif-conversion2 -finline-functions -finline-functions-called-once -finline-limit=n -fkeep-inline-functions -fkeep-static-consts -fmerge-constants -fmerge-all-constants -fmodulo-sched -fno-branch-count-reg -fno-default-inline -fno-defer-pop -fmove-loop-invariants -fno-function-cse -fno-guess-branch-probability -fno-inline -fno-math-errno -fno-peephole -fno-peephole2 -funsafe-math-optimizations -funsafe-loop-optimizations -ffinite-math-only -fno-toplevel-reorder -fno-trapping-math -fno-zero-initialized-in-bss -fomit-frame-pointer -foptimize-register-move -foptimize-sibling-calls -fprefetch-loop-arrays -fprofile-generate -fprofile-use -fregmove -frename-registers -freorder-blocks -freorder-blocks-and-partition -freorder-functions -frerun-cse-after-loop -frounding-math -frtl-abstract-sequences -fschedule-insns -fschedule-insns2 -fno-sched-interblock -fno-sched-spec -fsched-spec-load -fsched-spec-load-dangerous -fsched-stalled-insns=n -fsched-stalled-insns-dep=n -fsched2-use-superblocks -fsched2-use-traces -fsee -freschedule-modulo-scheduled-loops -fsection-anchors -fsignaling-nans -fsingle-precision-constant -fstack-protector -fstack-protector-all -fstrict-aliasing -fstrict-overflow -ftracer -fthread-jumps -funroll-all-loops -funroll-loops -fpeel-loops -fsplit-ivs-in-unroller -funswitch-loops -fvariable-expansion-in-unroller -ftree-pre -ftree-ccp -ftree-dce -ftree-loop-optimize -ftree-loop-linear -ftree-loop-im -ftree-loop-ivcanon -fivopts -ftree-dominator-opts -ftree-dse -ftree-copyrename -ftree-sink -ftree-ch -ftree-sra -ftree-ter -ftree-lrs -ftree-fre -ftree-vectorize -ftree-vect-loop-version -ftree-salias -fipa-pta -fweb -ftree-copy-prop -ftree-store-ccp -ftree-store-copy-prop -fwhole-program --param name=value -O -O0 -O1 -O2 -O3 -Os プリプロセッサオプション -Aquestion=answer -A-question[=answer] -C -dD -dI -dM -dN -Dmacro[=defn] -E -H -idirafter dir -include file -imacros file -iprefix file -iwithprefix dir -iwithprefixbefore dir -isystem dir -imultilib dir -isysroot dir -M -MM -MF -MG -MP -MQ -MT -nostdinc -P -fworking-directory -remap -trigraphs -undef -Umacro -Wp,option -Xpreprocessor option アセンブラオプション -Wa,option -Xassembler option リンカオプション object-file-name -llibrary -nostartfiles -nodefaultlibs -nostdlib -pie -rdynamic -s -static -static-libgcc -shared -shared-libgcc -symbolic -Wl,option -Xlinker option -u symbol ディレクトリオプション -Bprefix -Idir -iquotedir -Ldir -specs=file -I- --sysroot=dir ターゲットオプション -V version -b machine マシン依存のオプション ARC オプション -EB -EL -mmangle-cpu -mcpu=cpu -mtext=text- section -mdata=data-section -mrodata=readonly-data-section ARM オプション -mapcs-frame -mno-apcs-frame -mabi=name -mapcs-stack-check -mno-apcs-stack-check -mapcs-float -mno-apcs-float -mapcs-reentrant -mno-apcs-reentrant -msched-prolog -mno-sched-prolog -mlittle-endian -mbig-endian -mwords-little-endian -mfloat-abi=name -msoft-float -mhard-float -mfpe -mthumb-interwork -mno-thumb-interwork -mcpu=name -march=name -mfpu=name -mstructure-size-boundary=n -mabort-on-noreturn -mlong-calls -mno-long-calls -msingle-pic-base -mno-single-pic-base -mpic-register=reg -mnop-fun-dllimport -mcirrus-fix-invalid-insns -mno-cirrus-fix-invalid-insns -mpoke-function-name -mthumb -marm -mtpcs-frame -mtpcs-leaf-frame -mcaller-super-interworking -mcallee-super-interworking -mtp=name AVR オプション -mmcu=mcu -msize -minit-stack=n -mno-interrupts -mcall-prologues -mno-tablejump -mtiny-stack -mint8 Blackfin オプション -momit-leaf-frame-pointer -mno-omit-leaf-frame-pointer -mspecld-anomaly -mno-specld-anomaly -mcsync-anomaly -mno-csync-anomaly -mlow-64k -mno-low64k -mid-shared-library -mno-id-shared-library -mshared-library-id=n -mlong-calls -mno-long-calls CRIS オプション -mcpu=cpu -march=cpu -mtune=cpu -mmax-stack-frame=n -melinux-stacksize=n -metrax4 -metrax100 -mpdebug -mcc-init -mno-side-effects -mstack-align -mdata-align -mconst-align -m32-bit -m16-bit -m8-bit -mno-prologue-epilogue -mno-gotplt -melf -maout -melinux -mlinux -sim -sim2 -mmul-bug-workaround -mno-mul-bug-workaround CRX オプション -mmac -mpush-args Darwin オプション -all_load -allowable_client -arch -arch_errors_fatal -arch_only -bind_at_load -bundle -bundle_loader -client_name -compatibility_version -current_version -dead_strip -dependency-file -dylib_file -dylinker_install_name -dynamic -dynamiclib -exported_symbols_list -filelist -flat_namespace -force_cpusubtype_ALL -force_flat_namespace -headerpad_max_install_names -image_base -init -install_name -keep_private_externs -multi_module -multiply_defined -multiply_defined_unused -noall_load -no_dead_strip_inits_and_terms -nofixprebinding -nomultidefs -noprebind -noseglinkedit -pagezero_size -prebind -prebind_all_twolevel_modules -private_bundle -read_only_relocs -sectalign -sectobjectsymbols -whyload -seg1addr -sectcreate -sectobjectsymbols -sectorder -segaddr -segs_read_only_addr -segs_read_write_addr -seg_addr_table -seg_addr_table_filename -seglinkedit -segprot -segs_read_only_addr -segs_read_write_addr -single_module -static -sub_library -sub_umbrella -twolevel_namespace -umbrella -undefined -unexported_symbols_list -weak_reference_mismatches -whatsloaded -F -gused -gfull -mmacosx-version-min=version -mkernel -mone-byte-bool DEC Alpha オプション -mno-fp-regs -msoft-float -malpha-as -mgas -mieee -mieee-with-inexact -mieee-conformant -mfp-trap-mode=mode -mfp-rounding-mode=mode -mtrap-precision=mode -mbuild-constants -mcpu=cpu-type -mtune=cpu-type -mbwx -mmax -mfix -mcix -mfloat-vax -mfloat-ieee -mexplicit-relocs -msmall-data -mlarge-data -msmall-text -mlarge-text -mmemory-latency=time DEC Alpha/VMS オプション -mvms-return-codes FRV オプション -mgpr-32 -mgpr-64 -mfpr-32 -mfpr-64 -mhard-float -msoft-float -malloc-cc -mfixed-cc -mdword -mno-dword -mdouble -mno-double -mmedia -mno-media -mmuladd -mno-muladd -mfdpic -minline-plt -mgprel-ro -multilib-library-pic -mlinked-fp -mlong-calls -malign-labels -mlibrary-pic -macc-4 -macc-8 -mpack -mno-pack -mno-eflags -mcond-move -mno-cond-move -moptimize-membar -mno-optimize-membar -mscc -mno-scc -mcond-exec -mno-cond-exec -mvliw-branch -mno-vliw-branch -mmulti-cond-exec -mno-multi-cond-exec -mnested-cond-exec -mno-nested-cond-exec -mtomcat-stats -mTLS -mtls -mcpu=cpu GNU/Linux オプション -muclibc H8/300 オプション -mrelax -mh -ms -mn -mint32 -malign-300 HPPA オプション -march=architecture-type -mbig-switch -mdisable-fpregs -mdisable-indexing -mfast-indirect-calls -mgas -mgnu-ld -mhp-ld -mfixed-range=register-range -mjump-in-delay -mlinker-opt -mlong-calls -mlong-load-store -mno-big-switch -mno-disable-fpregs -mno-disable-indexing -mno-fast-indirect-calls -mno-gas -mno-jump-in-delay -mno-long-load-store -mno-portable-runtime -mno-soft-float -mno-space-regs -msoft-float -mpa-risc-1-0 -mpa-risc-1-1 -mpa-risc-2-0 -mportable-runtime -mschedule=cpu-type -mspace-regs -msio -mwsio -munix=unix-std -nolibdld -static -threads i386 と x86-64 オプション -mtune=cpu-type -march=cpu-type -mfpmath=unit -masm=dialect -mno-fancy-math-387 -mno-fp-ret-in-387 -msoft-float -msvr3-shlib -mno-wide-multiply -mrtd -malign-double -mpreferred-stack-boundary=num -mmmx -msse -msse2 -msse3 -mssse3 -m3dnow -mthreads -mno-align-stringops -minline-all-stringops -mpush-args -maccumulate-outgoing-args -m128bit-long-double -m96bit-long-double -mregparm=num -msseregparm -mstackrealign -momit-leaf-frame-pointer -mno-red-zone -mno-tls-direct-seg-refs -mcmodel=code-model -m32 -m64 -mlarge-data-threshold=num IA-64 オプション -mbig-endian -mlittle-endian -mgnu-as -mgnu-ld -mno-pic -mvolatile-asm-stop -mregister-names -mno-sdata -mconstant-gp -mauto-pic -minline-float-divide-min-latency -minline-float-divide-max-throughput -minline-int-divide-min-latency -minline-int-divide-max-throughput -minline-sqrt-min-latency -minline-sqrt-max-throughput -mno-dwarf2-asm -mearly-stop-bits -mfixed-range=register-range -mtls-size=tls-size -mtune=cpu-type -mt -pthread -milp32 -mlp64 -mno-sched-br-data-spec -msched-ar-data-spec -mno-sched-control-spec -msched-br-in-data-spec -msched-ar-in-data-spec -msched-in-control-spec -msched-ldc -mno-sched-control-ldc -mno-sched-spec-verbose -mno-sched-prefer-non-data-spec-insns -mno-sched-prefer-non-control-spec-insns -mno-sched-count-spec-in-critical-path M32R/D オプション -m32r2 -m32rx -m32r -mdebug -malign-loops -mno-align-loops -missue-rate=number -mbranch-cost=number -mmodel=code-size-model-type -msdata=sdata-type -mno-flush-func -mflush-func=name -mno-flush-trap -mflush-trap=number -G num M32C オプション -mcpu=cpu -msim -memregs=number M680x0 オプション -m68000 -m68020 -m68020-40 -m68020-60 -m68030 -m68040 -m68060 -mcpu32 -m5200 -mcfv4e -m68881 -mbitfield -mc68000 -mc68020 -mnobitfield -mrtd -mshort -msoft-float -mpcrel -malign-int -mstrict-align -msep-data -mno-sep-data -mshared-library-id=n -mid-shared-library -mno-id-shared-library M68hc1x オプション -m6811 -m6812 -m68hc11 -m68hc12 -m68hcs12 -mauto-incdec -minmax -mlong-calls -mshort -msoft-reg-count=count MCore オプション -mhardlit -mno-hardlit -mdiv -mno-div -mrelax-immediates -mno-relax-immediates -mwide-bitfields -mno-wide-bitfields -m4byte-functions -mno-4byte-functions -mcallgraph-data -mno-callgraph-data -mslow-bytes -mno-slow-bytes -mno-lsim -mlittle-endian -mbig-endian -m210 -m340 -mstack-increment MIPS オプション -EL -EB -march=arch -mtune=arch -mips1 -mips2 -mips3 -mips4 -mips32 -mips32r2 -mips64 -mips16 -mno-mips16 -mabi=abi -mabicalls -mno-abicalls -mshared -mno-shared -mxgot -mno-xgot -mgp32 -mgp64 -mfp32 -mfp64 -mhard-float -msoft-float -msingle-float -mdouble-float -mdsp -mpaired-single -mips3d -mlong64 -mlong32 -msym32 -mno-sym32 -Gnum -membedded-data -mno-embedded-data -muninit-const-in-rodata -mno-uninit-const-in-rodata -msplit-addresses -mno-split-addresses -mexplicit-relocs -mno-explicit-relocs -mcheck-zero-division -mno-check-zero-division -mdivide-traps -mdivide-breaks -mmemcpy -mno-memcpy -mlong-calls -mno-long-calls -mmad -mno-mad -mfused-madd -mno-fused-madd -nocpp -mfix-r4000 -mno-fix-r4000 -mfix-r4400 -mno-fix-r4400 -mfix-vr4120 -mno-fix-vr4120 -mfix-vr4130 -mfix-sb1 -mno-fix-sb1 -mflush-func=func -mno-flush-func -mbranch-likely -mno-branch-likely -mfp-exceptions -mno-fp-exceptions -mvr4130-align -mno-vr4130-align MMIX オプション -mlibfuncs -mno-libfuncs -mepsilon -mno-epsilon -mabi=gnu -mabi=mmixware -mzero-extend -mknuthdiv -mtoplevel-symbols -melf -mbranch-predict -mno-branch-predict -mbase-addresses -mno-base-addresses -msingle-exit -mno-single-exit MN10300 オプション -mmult-bug -mno-mult-bug -mam33 -mno-am33 -mam33-2 -mno-am33-2 -mreturn-pointer-on-d0 -mno-crt0 -mrelax MT オプション -mno-crt0 -mbacc -msim -march=cpu-type PDP-11 オプション -mfpu -msoft-float -mac0 -mno-ac0 -m40 -m45 -m10 -mbcopy -mbcopy-builtin -mint32 -mno-int16 -mint16 -mno-int32 -mfloat32 -mno-float64 -mfloat64 -mno-float32 -mabshi -mno-abshi -mbranch-expensive -mbranch-cheap -msplit -mno-split -munix-asm -mdec-asm PowerPC オプション RS/6000 と PowerPC オプション参照。 RS/6000 と PowerPC オプション -mcpu=cpu-type -mtune=cpu-type -mpower -mno-power -mpower2 -mno-power2 -mpowerpc -mpowerpc64 -mno-powerpc -maltivec -mno-altivec -mpowerpc-gpopt -mno-powerpc-gpopt -mpowerpc-gfxopt -mno-powerpc-gfxopt -mmfcrf -mno-mfcrf -mpopcntb -mno-popcntb -mfprnd -mno-fprnd -mnew-mnemonics -mold-mnemonics -mfull-toc -mminimal-toc -mno-fp-in-toc -mno-sum-in-toc -m64 -m32 -mxl-compat -mno-xl-compat -mpe -malign-power -malign-natural -msoft-float -mhard-float -mmultiple -mno-multiple -mstring -mno-string -mupdate -mno-update -mfused-madd -mno-fused-madd -mbit-align -mno-bit-align -mstrict-align -mno-strict-align -mrelocatable -mno-relocatable -mrelocatable-lib -mno-relocatable-lib -mtoc -mno-toc -mlittle -mlittle-endian -mbig -mbig-endian -mdynamic-no-pic -maltivec -mswdiv -mprioritize-restricted-insns=priority -msched-costly-dep=dependence_type -minsert-sched-nops=scheme -mcall-sysv -mcall-netbsd -maix-struct-return -msvr4-struct-return -mabi=abi-type -msecure-plt -mbss-plt -misel -mno-isel -misel=yes -misel=no -mspe -mno-spe -mspe=yes -mspe=no -mvrsave -mno-vrsave -mmulhw -mno-mulhw -mdlmzb -mno-dlmzb -mfloat-gprs=yes -mfloat-gprs=no -mfloat-gprs=single -mfloat-gprs=double -mprototype -mno-prototype -msim -mmvme -mads -myellowknife -memb -msdata -msdata=opt -mvxworks -mwindiss -G num -pthread S/390 と zSeries オプション -mtune=cpu-type -march=cpu-type -mhard-float -msoft-float -mlong-double-64 -mlong-double-128 -mbackchain -mno-backchain -mpacked-stack -mno-packed-stack -msmall-exec -mno-small-exec -mmvcle -mno-mvcle -m64 -m31 -mdebug -mno-debug -mesa -mzarch -mtpf-trace -mno-tpf-trace -mfused-madd -mno-fused-madd -mwarn-framesize -mwarn-dynamicstack -mstack-size -mstack-guard Score オプション -meb -mel -mnhwloop -muls -mmac -mscore5 -mscore5u -mscore7 -mscore7d SH オプション -m1 -m2 -m2e -m3 -m3e -m4-nofpu -m4-single-only -m4-single -m4 -m4a-nofpu -m4a-single-only -m4a-single -m4a -m4al -m5-64media -m5-64media-nofpu -m5-32media -m5-32media-nofpu -m5-compact -m5-compact-nofpu -mb -ml -mdalign -mrelax -mbigtable -mfmovd -mhitachi -mrenesas -mno-renesas -mnomacsave -mieee -misize -mpadstruct -mspace -mprefergot -musermode -multcost=number -mdiv=strategy -mdivsi3_libfunc=name -madjust-unroll -mindexed-addressing -mgettrcost=number -mpt-fixed -minvalid-symbols SPARC オプション -mcpu=cpu-type -mtune=cpu-type -mcmodel=code-model -m32 -m64 -mapp-regs -mno-app-regs -mfaster-structs -mno-faster-structs -mfpu -mno-fpu -mhard-float -msoft-float -mhard-quad-float -msoft-quad-float -mimpure-text -mno-impure-text -mlittle-endian -mstack-bias -mno-stack-bias -munaligned-doubles -mno-unaligned-doubles -mv8plus -mno-v8plus -mvis -mno-vis -threads -pthreads -pthread System V オプション -Qy -Qn -YP,paths -Ym,dir TMS320C3x/C4x オプション -mcpu=cpu -mbig -msmall -mregparm -mmemparm -mfast-fix -mmpyi -mbk -mti -mdp-isr-reload -mrpts=count -mrptb -mdb -mloop-unsigned -mparallel-insns -mparallel-mpy -mpreserve-float V850 オプション -mlong-calls -mno-long-calls -mep -mno-ep -mprolog-function -mno-prolog-function -mspace -mtda=n -msda=n -mzda=n -mapp-regs -mno-app-regs -mdisable-callt -mno-disable-callt -mv850e1 -mv850e -mv850 -mbig-switch VAX オプション -mg -mgnu -munix x86-64 オプション i386 と x86-64 オプション参照。 Xstormy16 オプション -msim Xtensa オプション -mconst16 -mno-const16 -mfused-madd -mno-fused-madd -mtext-section-literals -mno-text-section-literals -mtarget-align -mno-target-align -mlongcalls -mno-longcalls zSeries オプション S/390 と zSeries オプション参照。 コード生成オプション -fcall-saved-reg -fcall-used-reg -ffixed-reg -fexceptions -fnon-call-exceptions -funwind-tables -fasynchronous-unwind-tables -finhibit-size-directive -finstrument-functions -fno-common -fno-ident -fpcc-struct-return -fpic -fPIC -fpie -fPIE -fno-jump-tables -freg-struct-return -fshort-enums -fshort-double -fshort-wchar -fverbose-asm -fpack-struct[=n] -fstack-check -fstack-limit-register=reg -fstack-limit-symbol=sym -fargument-alias -fargument-noalias -fargument-noalias-global -fargument-noalias-anything -fleading-underscore -ftls-model=model -ftrapv -fwrapv -fbounds-check -fvisibility 出力の種類を制御するオプション コンパイルは最大 4 つのステージを必要とします: 前処理 (プリプロセス)、 コンパイル自体、アセンブリ、とリンクで、常にその順序で行われます。GCC は、いくつかのファイルを前処理して、コンパイルして、いくつかのアセンブ ラ入力ファイル、または、1 つのアセンブラ入力ファイルにすることができま す。次に、それぞれのアセンブラ入力ファイルはオブジェクトファイルを生成 し、リンクは、すべてのオブジェクトファイル (新しくコンパイルされ、入力 として指定されたもの) を実行形式ファイルに結合します。 任意の与えられた入力ファイルについて、ファイル名のサフィックスは、どの ようなコンパイルを行うかを決定します: file.c 前処理されなければならない C ソースコード。 file.i 前処理されるべきでない C ソースコード。 file.ii 前処理されるべきでない C++ ソースコード。 file.h プリコンパイルされたヘッダに変えられる C または C++ ヘッダファイ ル。 file.cc file.cp file.cxx file.cpp file.CPP file.c++ file.C 前処理されなければならない C++ ソースコード。.cxx に関して、最後の 2 つの文字はともに定数 x でなければならないことに注意してください、 同様に、.C は定数の大文字 C です。 file.hh file.H プリコンパイルされたヘッダに変えられる C++ ヘッダファイル。 file.f file.for file.FOR 前処理されるべきでない固定形式の Fortran ソースコード。 file.F file.fpp file.FPP (伝統的なプリプロセッサで) 前処理されなければならない固定形式の Fortran ソースコード。 file.f90 file.f95 前処理されるべきでない自由形式の Fortran ソースコード。 file.F90 file.F95 (伝統的なプリプロセッサで) 前処理されなければならない自由形式の Fortran ソースコード。 file.ads ライブラリユニット宣言 (パッケージ、サブプログラム、または汎用体 (generic) の宣言、または汎用体具体化 (generic instantiation))、また はライブラリユニット改名宣言 (パッケージ、汎用体、またはサブプログ ラム改名宣言) を含む Ada ソースコードファイル。また、そのようなファ イルは specs と呼ばれます。 file.adb ライブラリユニットのボディ (サブプログラムまたはパッケージのボディ) を含む Ada ソースコードファイル。また、そのようなファイルは bodies と呼ばれます。 file.s アセンブラコード。 file.S 前処理されなければならないアセンブラコード。 other 直接リンクに渡されるオブジェクトファイル。認識されないサフィックス がついたすべてのファイル名は、このように扱われます。 利用者は、-x オプションで明示的に入力言語を指定することができます: -x language (コンパイラがファイル名のサフィックスに基づくデフォルトを選択するよ りむしろ) 続く入力ファイルのための language を明示的に指定します。 このオプションは、次の -x オプションまで、すべての後に続く入力ファ イルに適用されます。language のために指定できる値は次の通りです: c c-header c-cpp-output c++ c++-header c++-cpp-output assembler assembler-with-cpp ada f95 f95-cpp-input java treelang -x none それに続くファイルが、それらのファイル名サフィックスにしたがって、 (まるで、それらに -x が全く使用されていないかのように) 取り扱われる ように、言語のあらゆる指定をオフにします。 -pass-exit-codes 通常、gcc プログラムは、コンパイラの任意のフェーズで成功でないリ ターンコードを返すなら、1 のコードで終了します。-pass-exit-codes を 指定するなら、gcc プログラムは、代わりにエラーを示して返った任意の フェーズによって生成された数値的に最も高いエラーとともに返ります。 内部コンパイラエラーに遭遇するなら、C、C++ と Fortran フロントエン ドは、4 を返します。 コンパイルのあるステージのみを望んでいるなら、利用者は、-x (または、 ファイル名のサフィックス) を使用して、gcc にどこで始まるかを伝えること ができ、オプション -c, -S または -E の 1 つを使用して gcc がどこで停止 するかを伝えます。いくつかの組み合わせ (例えば、-x cpp-output -E) は、 gcc に何もしないように指示することに注意してください。 -c ソースファイルをコンパイルするか、またはアセンブルしますが、リンク しません。単にリンクステージを実行しません。最終的な出力は、各ソー スファイルのためのオブジェクトファイルの形式です。 デフォルトでは、ソースファイルに対するオブジェクトファイル名は、サ フィックス .c, .i, .s、その他を .o に置き換えたものになります。 コンパイルまたはアセンブリを必要としない、認識されていない入力ファ イルは、無視されます。 -S コンパイル自体のステージの後で停止します。アセンブルは行いません。 出力は、指定された各アセンブラでない入力ファイルのためのアセンブラ コードファイルの形式です。 デフォルトでは、ソースファイルに対するアセンブラファイル名は、サ フィックス .c, .i、その他を .s に置き換えたものになります。 コンパイルを必要としない入力ファイルは、無視されます。 -E 前処理ステージの後に停止します。コンパイラ自体は、実行されません。 出力は、(標準出力に送られる) 前処理されたソースコードの形式です。 前処理を必要としない入力ファイルは、無視されます。 -o file 出力をファイル file にします。これは、実行形式ファイル、オブジェク トファイル、アセンブラファイルまたは前処理された C コードであろうと なかろうと、生成される出力の種類にかかわらず適用します。 -o が指定されないなら、デフォルトでは、a.out に実行形式ファイルを、 source.o に source.suffix のオブジェクトファイルを、source.s のその アセンブラファイルを、source.suffix.gch にプリコンパイルされたヘッ ダファイルを、そして標準出力にすべての前処理された C ソースを置きま す。 -v コンパイルのステージで実行されたコマンドを (標準エラー出力で) 印刷 (表示) します。また、コンパイラドライバプログラムとプリプロセッサと コンパイラ自体のバージョン番号を印刷 (表示) します。 -### コマンドは実行されず、すべてコマンドの引数がクォート (引用) される ことを除いて、-v に似ています。これは、ドライバが生成したコマンドラ インを獲得するためのシェルスクリプトに役に立ちます。 -pipe コンパイル様々なステージの間の通信のために一時ファイルでなくパイプ を使用します。これは、アセンブラがパイプから読み込むことができない いくつかのシステムで失敗します。しかし、GNU アセンブラは問題ありま せん。 -combine 利用者が複数のソースファイルをコンパイルしているなら、このオプショ ンは、(コンパイラが処理できるそれらの言語に対して) 同時にすべての ソースファイルをコンパイラに渡すようにドライバに伝えます。これに よって、インタモジュール (intermodule) 分析 (IMA) をコンパイラに よって実行できます。現在、これがサポートされる唯一の言語は、C で す。利用者が、このオプションを使用して複数の言語のためのソースファ イルをドライバに渡すなら、ドライバは、適切なすべてのソースファイル を各コンパイラに渡して、それぞれ一度、IMA をサポートする (複数の) コンパイラを呼び出します。IMA をサポートしないそれらの言語に関し て、このオプションは無視され、コンパイラは、その言語の各ソースファ イルのために一度呼び出されます。利用者が、-save-temps とともにこの オプションを使用するなら、コンパイラは、(各ソースファイルあたり 1 つ) 複数の前処理されたファイルを生成しますが、(結合された) .o また は .s ファイルだけです。 --help gcc によって解釈されるコマンドラインオプションの説明を (標準出力に) 印刷 (表示) します。-v オプションも指定されるなら、様々なプロセスが 受け付けるコマンドラインオプションを表示できるように、gcc によって 呼び出される様々なプロセスに --help を渡します。-Wextra オプション も指定されるなら、コマンドに関連している文書化されていないコマンド ラインオプションも表示されます。 --target-help 各ツールのためのターゲット特有のコマンドラインオプションの説明を (標準出力に) 印刷 (表示) します。 --version 呼び出された GCC のバージョン番号と著作権を表示します。 @file file からコマンドラインのオプションを読み込みます。読み込まれたオプ ションは、オリジナルの @file オプションの場所に代わって挿入されま す。file が存在しないか、または読み込むことができないなら、オプショ ンは、文字通りに扱われ、取り除かれません。 file 中のオプションは、空白類によって分離されます。空白類の文字は、 シングルクォートまたはダブルクォートのいずれかで全体のオプションを 囲むことによって、オプションに含めることができます。(バックスラッ シュを含む) 任意の文字は、バックスラッシュを文字を前に置くことに よって、含めることができます。file は、それ自体に、追加の @file オ プションを含むことができます。そのようなオプションは、再帰的に処理 されます。 C++ プログラムのコンパイル C++ ソースファイルは伝統的にサフィックス .C, .cc, .cpp, .CPP, .c++, .cp または .cxx の 1 つを使用します。C++ のヘッダファイルはしばしば .hh ま たは .H を使用します。そして、前処理された C++ ファイルはサフィックス .ii 使用します。利用者が (通常、名前 gcc で) C プログラムをコンパイルす るのと同じ方法で、コンパイラを呼び出しても、GCC は、これらの名前のファ イルを認識して、C++ プログラムとしてそれらをコンパイルします。 しかしながら、gcc の使用は、C++ ライブラリを追加しません。g++ は、GCC を呼び出し、-x が使用されていないなら、C ソースファイルの代わりに C++ ソースファイルとして .c, .h と .i ファイルを取り扱い、C++ ライブラリに 対して自動的にリンクすることを指定するプログラムです。また、このプログ ラムは、C++ のコンパイルで使用される .h 拡張子がある C ヘッダファイルを プリコンパイルするとき、役に立ちます。また、多くのシステムでは、g++ は、名前 c++ でインストールされます。 C++ プログラムをコンパイルするとき、利用者は、任意の言語で、プログラム をコンパイルするために使用するのと同じ多くのコマンドラインオプション、 または、C と関連する言語に意味があるコマンドラインオプション、または、 C++ プログラムのみに意味があるオプションを指定することができます。 C の方言を制御するオプション 次のオプションは、コンパイラが受け付ける C (または、C++ のような C から 派生した言語) の方言を制御します: -ansi C モードで、すべての ISO C90 プログラムをサポートします。C++ モード で、ISO C++ と競合る GNU 拡張子を取り除きます。 これは、"asm" と "typeof" キーワードと利用者が使用しているシステム のタイプを識別する "unix" と "vax" のような事前に定義されたマクロの ように、(C コードをコンパイルするとき) ISO C90 または (C++ コードを コンパイルするとき) 標準の C++ と互換性がない、GCC の特定の機能をオ フにします。また、望ましくなく、めったに使用されない ISO トライグラ フ機能を有効にします。C コンパイラのために、"inline" キーワードと同 様に C++ スタイルの // コメントの認識を無効にします。 代替のキーワード "__asm__", "__extension__", "__inline__" と "__typeof__" は、-ansi にもかかわらず動作します。もちろん ISO C プ ログラムでそれらを使用したくないかもしれませんが、-ansi で行われる コンパイルに含まれるかもしれないヘッダファイルに、それらを入れるた めにに役に立ちます。また、"__unix__" と "__vax__" のような代替の事 前に定義されたマクロも -ansi の有無にかかわらず利用可能です。 -ansi オプションによって、ISO でないプログラムは、根拠もなく拒否さ れません。それに関しては、-pedantic が -ansi に加えて必要です。 マクロ "__STRICT_ANSI__" は、-ansi オプションが使用されるとき、事前 に定義されます。いくつかのヘッダファイルは、このマクロに気付いて、 ISO 標準が要求しない、特定の関数を宣言するか、または特定のマクロを 定義することを控えます。これは、他のものにこれらの名前を使用するか もしれない任意のプログラムとの干渉を防ぐためです。 通常、組み込まれていますが、ISO C によって定義されたセマンティクス (意味) を持っていない ("alloca" と "ffs" のような) 関数は、-ansi で 使用される組み込み関数ではありません。 -std= 言語の標準を決定します。このオプションは、現在、C または C++ をコン パイルするときのみ、サポートされています。このオプションのための値 が提供されなければなりません。利用可能な値は次の通りです。 c89 iso9899:1990 ISO C90 (-ansi と同様)。 iso9899:199409 改正 1 として変更された ISO C90。 c99 c9x iso9899:1999 iso9899:199x ISO C99。この標準はまだ完全にサポートされていないことに注意して ください。詳細については、 <http://gcc.gnu.org/gcc-4.2/c99status.html> を参照してくださ い。名前 c9x と iso9899:199x は古くて推奨されません。 gnu89 デフォルトの ISO C90 に GNU 拡張 (いくつかの C99 の機能を含んで いる) を追加したもの。 gnu99 gnu9x ISO C99 に GNU 拡張を追加したもの。ISO C99 が GCC で完全に実装 されるとき、これはデフォルトになるでしょう。名前 gnu9x は古くて 推奨されません。 c++98 1998 年の ISO C++ 標準に改定を追加したもの。 gnu++98 -std=c++98 に GNU 拡張を追加したものと同じです。これは C++ コー ドのためのデフォルトです。 このオプションが指定されないときでさえ、以前の C の標準と競合しない 限りにおいて、より新しい標準の機能のいくつかを使用することができま す。例えば、利用者は、-std=c99 が指定されないときでさえ、 "__restrict__" を使用することができます。 ISO C のあるバージョンを指定する -std オプションは、ISO C90 ではな いが、指定されたバージョンにある機能 (例えば、ISO C99 の // コメン トと "inline" キーワード) が無効でないことを除いて、-ansi と同じ効 果があります。 -fgnu89-inline オプション -fgnu89-inline は、C99 モードのときに、"inline" 関数のた めの伝統的な GNU セマンティクスを使用するように GCC に伝えます。こ のオプションを使用することは、"gnu_inline" 関数属性をすべてのインラ イン関数に追加するのとほぼ同等です。 このオプションは、GCC バージョン 4.1.3 以上で受け付けられます。4.3 より前の GCC バージョンでは、C99 のインラインセマンティクスは、サ ポートされず、したがって、このオプションは、それが指定されているか どうかにかかわらず、事実上存在していると仮定されます。明白にそれを 指定するという唯一の影響は、C99 モードでインライン関数を使用して警 告を無効にすることです。同様に、オプション -fno-gnu89-inline は、 4.3 より前の GCC のバージョンでサポートされていません。それは、C89 または gnu89 モードでサポートされず、C99 または gnu99 モードでのみ サポートされます。 プリプロセッサマクロ "__GNUC_GNU_INLINE__" と "__GNUC_STDC_INLINE__" は、どのようなセマンティクスが "inline" 関数 で効力があるかをチェックするために使用されます。 -aux-info filename 変換ユニットで定義され、および/または宣言される、すべての関数のため のプロトタイプ宣言を、ヘッダファイルにそれらを含んで、与えられた ファイル名に出力します。このオプションは C 以外の言語で黙って無視さ れます。 宣言のほかに、ファイルは、宣言が暗黙でか、プロトタイプ宣言された か、またはプロトタイプ宣言れていないか (行番号とコロンの後の最初の 文字が、それぞれ I、新しい N、古い O) どうか、宣言または定義 (続く 文字が、それぞれ、C または F) から来たかどうかを、コメントでそれぞ れの宣言の起源を (ソースファイルと行で) 示します。関数定義の場合 に、K&R-スタイルの引数のリストに続くそれらの宣言は、宣言の後で、コ メント内に提供されます。 -fno-asm "asm", "inline" または "typeof" をキーワードとして認識しません。そ れにより、コードは、識別子としてこれらの単語を使用することができま す。利用者は代わりにキーワード "__asm__", "__inline__" と "__typeof__" を使用することができます。-ansi は -fno-asm の意味を含 みます。 C++ では、このスイッチは、"asm" と "inline" が標準のキーワードであ るので "typeof" キーワードにのみ影響します。利用者は、同じ効果があ る、-fno-gnu-keywords フラグを代わりに使用したいかもしれません。C99 モード (-std=c99 または -std=gnu99) では、このスイッチは、"inline" が ISO C99 の標準のキーワードであるので、"asm" と "typeof" キーワー ドにのみ影響します。 -fno-builtin -fno-builtin-function プレフィックスとして __builtin_ で始まらない組み込み関数を認識しま せん。 通常、GCC は、より効率的に特定の組み込み関数を扱うための特別なコー ドを生成します。例えば、"alloca" への呼び出しは、直接スタックを調整 する単一の命令になり、"memcpy" への呼び出しはインラインコピーのルー プになります。結果のコードは、しばしば小さくてより速いですが、関数 呼び出しのようなものとして現れないので、利用者はそれらの呼び出しに ブレークポイントを設定することができませんし、異なったライブラリを リンクすることによって、関数の振る舞いを変更することができません。 さらに、関数が組み込み関数として認識されるとき、GCC は、その関数へ の呼び出しでの問題に警告するか、または、たとえ結果のコードがまだそ の関数への呼び出し含んでいても、より効率的なコードを生成するため に、その関数に関する情報を使用します。例えば、"printf" が組み込まれ ていて、"strlen" がグローバルなメモリを変更しないことを知っていると き、"printf" への悪い呼び出しに対して -Wformat で警告が与えられま す。 -fno-builtin-function オプションでのみ、組み込み関数 function を無 効とします。function は __builtin_ で始まってはいけません。GCC のこ のバージョンで組み込みでない関数が指定されるなら、このオプションは 無視されます。対応する -fbuiltin-function オプションはありません。 -fno-builtin または -ffreestanding を使用するとき、組み込み関数を選 択的に有効にしたいなら、利用者は次のようなマクロを定義することがで きます: #define abs(n) __builtin_abs ((n)) #define strcpy(d, s) __builtin_strcpy ((d), (s)) -fhosted ホスト環境 (hosted environment) で行われるコンパイルをアサートしま す。これは -fbuiltin の意味を含んでいます。ホスト環境は、標準ライブ ラリの全部が利用可能であり、"main" が "int" のタイプを返す環境で す。実例はカーネルを除いてほとんどすべてです。これは -fno-freestanding と同等です。 -ffreestanding フリースタンディング (独立した) 環境 (freestanding environment) で 行われるコンパイルをアサートします。これは -fno-builtin の意味を含 んでいます。フリースタンディング環境は、標準ライブラリが存在しない かもしれなくて、プログラムが "main" で開始される必要がない環境で す。最も明らかな例は OS のカーネルです。これは -fno-hosted と同等で す。 -fopenmp C/C++ の OpenMP ディレクティブ "#pragma omp" と Fortran の "!$omp" の操作を有効にします。-fopenmp が指定されるとき、コンパイラは、 OpenMP Application Program Interface v2.5 <http://www.openmp.org/> にしたがって並列実行コードを生成します。 -fms-extensions Microsoft ヘッダファイルで使用されるいくつかの標準的でない構造を受 け付けます。 構造体と共用体の無名のフィールドの場合は、このオプションでのみ受け 付けられます。 -trigraphs ISO C トライグラフをサポートします。-ansi オプション (と、厳格な ISO C 準拠のための -std オプション) は、-trigraphs の意味を含んでい ます。 -no-integrated-cpp 2 つのパスでコンパイルを実行します: 前処理とコンパイルです。このオ プションによって、-B オプションによってユーザによって供給された "cc1", "cc1plus" または "cc1obj" を使用することができます。次に、 ユーザが供給したコンパイルステップは、通常の前処理の後で、コンパイ ルの前に追加前処理ステップとして追加することができます。デフォルト では統合 cpp (内部の cpp) を使用します。 このオプションのセマンティクス (意味) は、"cc1", "cc1plus" と "cc1obj" がマージされているなら、変更されます。 -traditional -traditional-cpp 以前は、これらのオプションによって、GCC は、標準化以前 (pre standard) の C コンパイラのエミュレートを試みました。それらは現在、 -E スイッチでのみサポートされています。プリプロセッサは、標準化以前 モードをサポートし続けています。詳細については、GNU CPP マニュアル を参照してください。 -fcond-mismatch 2 番目と 3 番目の引数で適合しないタイプがある条件演算子を許可しま す。そのような式の値は void です。このオプションは C++ ではサポート されていません。 -funsigned-char タイプ "char" を "unsigned char" のように符号無しとします。 マシンの種類毎に、"char" が何であるべきかのデフォルトがあります。デ フォルトで "unsigned char" のようか、またはデフォルトで "signed char" のようかのいずれかです。 理想的には、移植性のあるプログラムは、オブジェクトの符号の状態に依 存するとき、常に "signed char" または "unsigned char" を使用するべ きです。しかし、多くのプログラムは単に "char" を使用して書かれてお り、プログラムが書かれたマシンによって、符号付きを期待するか、また は符号無しを期待しています。このオプションとその逆で、利用者は、そ のようなプログラムをデフォルトの反対に動作させることができます。 たとえ、振る舞いは、常にそれらの 2 のうちの 1 つのようですが、タイ プ "char" は常に、それぞれの "signed char" または "unsigned char" とは異なったタイプです。 -fsigned-char タイプ "char" を "signed char" のように符号付きとします。 これは、-funsigned-char の否定形式である、-fno-unsigned-char と同等 であることに注意してください。同様に、オプション -fno-signed-char は -funsigned-char と同等です。 -fsigned-bitfields -funsigned-bitfields -fno-signed-bitfields -fno-unsigned-bitfields これらのオプションは、宣言が "signed" または "unsigned" のどちらも 使用しないとき、ビットフィールドが符号付きか符号無しかどうかを制御 します。デフォルトでは、これが次のように一貫しているので、そのよう なビットフィールドは符号付きです: "int" のような基本的な整数タイプ は符号付きタイプです。 C++ 方言を制御するオプション このセクションは C++ プログラムのみに重要なコマンドラインオプションにつ いて説明しています。しかし、また、利用者のプログラムがどのような言語で あるかにかかわらず GNU コンパイラオプションの大部分を使用することができ ます。例えば、利用者は、次にようにファイル "firstClass.C" をコンパイル するかもしれません: g++ -g -frepo -O -c firstClass.C この例では、-frepo だけが C++ プログラムのみに意味があるオプションで す。利用者は GCC によってサポートされるあらゆる言語と共に他のオプション を使用することができます。 ここに、C++ プログラムをコンパイルするためのみのオプションのリストを示 します: -fabi-version=n C++ ABI のバージョン n を使用します。バージョン 2 は G++ 3.4 ではじ めて登場した C++ ABI のバージョンです。バージョン 1 は G++ 3.2 では じめて登場した C++ ABI のバージョンです。バージョン 0 は常に C++ ABI 仕様にもっとも適合するバージョンです。したがって、バージョン 0 を使用して取得された ABI は、ABI バグが修正されるように変化します。 デフォルトはバージョン 2 です。 -fno-access-control すべてのアクセスチェックをオフにします。このスイッチは主にアクセス 制御コードでバグを回避して動作するのに役に立ちます。 -fcheck-new "operator new" によって返されたポインタが割り付けられた記憶域の変更 を試みる前に、NULL でないかチェックします。C++ 標準は、throw() で宣 言されるなら、"operator new" が 0 のみを返すことを指定するので、こ のチェックは、通常不要です。その場合、コンパイラはこのオプションが なくても返り値を常にチェックします。他のすべての場合には、"operator new" に、ノンエンプティ例外指定があるとき、メモリを使い尽くしたこと は、"std::bad_alloc" を投げることによって、シグナルが起こされます。 また、new (nothrow) を参照してください。 -fconserve-space 初期化されていないか、または実行に初期化されるグローバル変数を C が 行うように共通セグメントに入れます。これは複製された定義を診断しな いことを犠牲にして実行形式の空間を節約します。このフラグでコンパイ ルして、利用者のプログラムが "main()" が終了した後に不可解にクラッ シュするなら、2 つの定義がマージされたので、二度破壊されているオブ ジェクトがあるかもしれません。 現在、それらを共有せずに BSS に変数を入れるようにサポートが追加され ているので、このオプションはほとんどのターゲットで、もはや役に立ち ません、 -ffriend-injection それらが宣言されるクラスの範囲の外側で目に見えることができるよう に、囲まれた名前空間に friend 関数を注入 (inject) します。friend 関 数は、古い Annotated C++ Reference Manual でこのように動作するよう に文書化され、4.1 より前の G++ のバージョンは、常にそのように動作し ます。しかしながら、ISO C++ では、引数に依存する検索を使用して、囲 まれたスコープで宣言されない friend 関数を見つけることだけができま す。このオプションによって、friend を、以前のリリースとして注入しま す。 このオプションは、互換性のためであり、G++ の今後のリリースで削除さ れるかもしれません。 -fno-elide-constructors C++ 標準によって、実装は、同じタイプの別のオブジェクトを初期化する ためにだけ使用されるテンポラリの作成を省略することができます。この オプションを指定することは、その最適化を無効にし、G++ がすべての場 合にコピーコンストラクタの呼び出すように強制します。 -fno-enforce-eh-specs 実行時に例外指定の侵犯をチェックするためのコードを生成しません。こ のオプションは、C++ 標準に違反していますが、NDEBUG を定義することと よく似て、製品の構築でコードサイズを削減するために役に立ちます。こ れは例外指定の侵犯で例外を投げる許可をユーザコードに与えません。コ ンパイラは、それでも、仕様に基づいて最適化されるので、予期していな かった例外を投げられると、未定義の振る舞いの結果となります。 -ffor-scope -fno-for-scope -ffor-scope が指定されるなら、for-init-statement で宣言された変数の スコープ (範囲) は、C++ 標準によって指定されるように、for ループ自 体に制限されます。-fno-for-scope が指定されるなら、for-init- statement で宣言された変数のスコープ (範囲) は、G++ の古いバージョ ンと他の (伝統的な) C++ 実装の場合にように、囲まれたスコープの終り まで拡張されます。 どちらのフラグも与えられない場合のデフォルトは、標準に従いますが、 そうでなければ、不正であるか、または異なった振る舞いがある古いスタ イルのコードのために警告を与えて許可します。 -fno-gnu-keywords キーワードとし "typeof" を認識せずに、コードが識別子としてこのワー ドを使用することができるようにします。利用者は、代わりにキーワード "__typeof__" を使用することができます。-ansi は -fno-gnu-keywords の意味を含みます。 -fno-implicit-templates (すなわち、使用することによって) 暗黙のうちにインスタンスを作成され る非インラインテンプレートのためのコードを決して出力しません。明示 的なインスタンス化のためのコードのみを出力します。 -fno-implicit-inline-templates 暗黙のうちにインスタンス化されるインラインテンプレートのためのコー ドを出力しません。コンパイルの最適化のあるなしにかかわらず、同じ セットの明示的なインスタンス化を必要なので、デフォルトではインライ ンを異なって取り扱います。 -fno-implement-inlines 記憶域を節約するには、#pragma implementation によって制御されたイン ライン関数の調和していない (out-of-line) コピーを出力しません。これ らの関数が呼び出されているすべての場所でインライン化されていないな ら、これはリンカのエラーを引き起こします。 -fms-extensions 暗黙の int と標準でない構文によってメンバ関数へのポインタを取得する ような、MFC で使用されている構造に関する杓子定規な警告を無効にしま す。 -fno-nonansi-builtins ANSI/ISO C によって強制されない関数の組み込みの宣言を無効にします。 これらは "ffs", "alloca", "_exit", "index", "bzero", "conjf" と他の 関連する関数を含んでいます。 -fno-operator-names オペレータ名のキーワード "and", "bitand", "bitor", "compl", "not", "or" と "xor" をキーワードの同義語として取り扱いません。 -fno-optional-diags 標準によってコンパイラが出力する必要はないと述べられている診断を無 効にします。現在、G++ によって出力されるそのような診断は、クラス内 に複数の意味を持っている名前に対するもののみです。 -fpermissive 不適合なコードに関するいくつかの診断をエラーから警告まで格下げしま す。したがって、-fpermissive を使用することは、いくつかの不適合な コードをコンパイルできるようにします。 -frepo リンク時に自動的なテンプレートのインスタンス化を有効にします。ま た、このオプションは -fno-implicit-templates の意味を含みます。 -fno-rtti C++ 実行時タイプ識別機能 (dynamic_cast と typeid) によって使用する 仮想関数であらゆるクラスに関する情報の生成を無効にします。言語のそ れらの部品を使用しないなら、利用者は、このフラグを使用することに よって、いくらかの空間を節約することができます。例外操作は、同じ情 報を使用しますが、必要に応じてそれを生成することに注意してくださ い。dynamic_cast 演算子は、まだ、ランタイムタイプ情報を必要としない キャストのために使用されます、すなわち、"void *" または明白な基底ク ラスへのキャスト。 -fstats コンパイルの終わりでフロントエンド処理に関する統計を出力します。こ の情報は、一般的に、G++ 開発チームのみ役に立ちます。 -ftemplate-depth-n テンプレートクラスのための最大のインスタンス化の深さを n に設定しま す。テンプレートのインスタンス化の深さの制限は、テンプレートクラス のインスタンス化の間の無限の繰り返しを検出するために必要です。 ANSI/ISO C++ 適合プログラムは、17 より大きい最大の深さを当てにして はいけません。 -fno-threadsafe-statics ローカルで静的な (static) のスレッドセーフの初期化のために C++ ABI で指定されたルーチンを使用する特別のコードを出力しません。利用者 は、スレッドセーフであるある必要はないコードのコードサイズをわずか に減少させるためにこのオプションを使用することができます。 -fuse-cxa-atexit "atexit" 関数よりはむしろ "__cxa_atexit" 関数で静的記憶域期間でオブ ジェクトのためのデストラクタを登録します。このオプションは、静的な デストラクタの完全な標準準拠の取り扱いに必要ですが、利用者の C ライ ブラリが "__cxa_atexit" をサポートする場合にだけ動作します。 -fno-use-cxa-get-exception-ptr "__cxa_get_exception_ptr" ランタイムルーチンを使用しません。これに よって、"std::uncaught_exception" を不正としますが、ランタイムルー チンが利用可能でないなら、必要です。 -fvisibility-inlines-hidden このスイッチは、ユーザが、2 つの関数のアドレスが別の共有オブジェク トで取られたインライン方法へのポインタを比較することを試みないと宣 言します。 事実上、この効果は、DSO のエクスポートテーブルに現れないで、DSO 内 で使用されるとき、PLT 間接指定を要求できないように、"__attribute__ ((visibility ("hidden")))" でインライン方法を GCC が、マークするこ とです。このオプションを有効にすることは、ライブラリがテンプレート の頻繁な使用を行うとき、動的なエクスポートクテーブルのサイズを大幅 に減少させるように、ロード時と DSO のリンク時に動的な効果をもつこと ができます。 このスイッチの振る舞いは、関数へのローカルな静的変数に影響しない か、またはコンパイラが、関数は、1 つの共有オブジェクトだけで定義さ れることを推論するので、直接隠される方法をマークするのとまったく同 じではありません。 利用者は、そのメソッドのためにスイッチの効果を無効にするために明白 に可視性があるメソッドとしてマークできます。例えば、特定のインライ ンメソッドへのポインタを比較したいなら、利用者は、デフォルトの可視 性があるとしてそれをマークするかもしれません。明白な可視性がある囲 まれたクラスをマークすることは、なんの効果もありません。 それらのリンケージが、共有ライブラリの境界に別の方法で交差するかも しれないので、明白に例示されたインラインメソッドは、このオプション によって影響を受けません。 -fno-weak リンカによって提供されていても、ウィーク (weak, 弱い) シンボルのサ ポートを使用しません。デフォルトでは、G++ は、それらが利用可能であ るなら、ウィークシンボルを使用します。このオプションは、テストする ためだけに存在し、エンドユーザによって使用されるべきではありませ ん。それは、質の劣ったコードをもたらし、なんの利益もありません。こ のオプションは、G++ の今後のリリースで削除されるかもしれません。 -nostdinc++ C++ に特有の標準ディレクトリのヘッダファイルを検索しませんが、それ でも、他の標準ディレクトリは検索します。(このオプションは、C++ ライ ブラリを構築するとき使用されます。) さらに、これらの最適化、警告とコード生成オプションは、C++ プログラムの ためだけに意味があります: -fno-default-inline クラスのスコープの内側で定義された関数をインラインと仮定しません。 これらの関数にはインライン関数のようなリンケージ (linkage) があるこ とに注意してください。それらはデフォルトで単にインラインとされない でしょう。 -Wabi (C++ のみ) G++ が、ベンダ中立の C++ ABI とおそらく互換性がないコードを生成する とき、警告します。そのようなすべての場合に警告を行うように努力をし ていますが、G++ が互換性のないコードを生成するにもかかわらず、警告 されないいくらかの場合がたぶんあります。また、生成されたコードが互 換性があるにもかかわらず、警告が出される場合があるかもしれません。 G++ によって生成されたコードが他のコンパイラによって生成されるコー ドとバイナリ互換性がないかもしれないという事実に関して心配している なら、利用者、これらの警告を回避するためにコードを書き直すべきで す。 現時点で知られている非互換性には次のものがあります: * ビットフィールドの末尾のパディング (詰め物) の不正確な取り扱 い。G++ は、データを基底クラスと同じバイトに詰め込むことを試み ます。例えば: struct A { virtual void f(); int f1 : 1; }; struct B : public A { int f2 : 1; }; この場合、G++ は、"A::f1" と同じバイトに "B::f2" を置きます。他 のコンパイラはそうしません。利用者は、サイズがプラットフォーム のバイトサイズの倍数とするように、"A" を明示的にパディングする ことによってこの問題を回避することができます。それによって、G++ と他のコンパイラは、完全に同じように "B" を配置 (レイアウト) し ます。 * 仮想ベースの末尾のパディング (詰め物) の不正確な取り扱い。G++ は仮想ベースを配置するとき、末尾のパディングを使用しません。例 えば: struct A { virtual void f(); char c1; }; struct B { B(); char c2; }; struct C : public A, public virtual B {}; この場合、G++ は "B" を "A" のための末尾のパディングに置きませ ん。他のコンパイラはそうします。利用者は、サイズが (仮想の基底 クラスを無視して) 整列の倍数とするように、"A" を明示的にパディ ングすることによってこの問題を回避することができます。それに よって、G++ と他のコンパイラは、完全に同じように "C" を配置しま す。 * ビットフィールドが共用体 (union) に現れるとき、宣言しているビッ トフィールドの幅がそれらの基本的なタイプのものより大きいビット フィールドの不正確な取り扱い。例えば: union U { int i : 4096; }; "int" が 4096 ビットもなく、G++ が、"int" のビットの数によっ て、共用体を小さ過ぎるものにすることを仮定します。 * 空クラスを不正確なオフセットに置くことができます。例えば: struct A {}; struct B { A a; virtual void f (); }; struct C : public B, public A {}; G++ は "C" の "A" 基底クラスを 0 でないオフセットに置きます。そ れはオフセット 0 に置かれるべきです。G++ は、"B" の "A" データ メンバが既にオフセット 0 にあると誤って信じています。 * タイプが "typename" であること必要とするテンプレート関数の名 前、またはテンプレート template パラメータを間違って台無しにす るかもしれません。 template <typename Q> void f(typename Q::X) {} template <template <typename> class Q> void f(typename Q<int>::X) {} これらのテンプレートのインスタンス化は間違って台無しにされま す。 -Wctor-dtor-privacy (C++ のみ) そのクラスでのすべてのコンストラクタまたはデストラクタは、プライ ベート (private) であり、friend もパブリック (public) の静的なメン バ関数もないので、クラスが使用不可能に思えるとき警告します。 -Wnon-virtual-dtor (C++ のみ) クラスが多様型 (polymorphic) であるように思われ、その結果、仮想のデ ストラクタを必要し、さらに、仮想でないものを宣言しているとき、警告 します。また、この警告は-Weffc++ が指定されているなら、有効にされま す。 -Wreorder (C++ のみ) コードで与えられているメンバ初期化子 (initializer) の順序がそれらを 実行しなければならない順序と一致しないとき、警告します。例えば: struct A { int i; int j; A(): j (0), i (1) { } }; コンパイラは、i と j のメンバ初期化子をメンバの宣言の順序と一致する ように再調整し、その効果について警告を出力します。この警告は -Wall によって有効にされます。 次の -W... オプションは -Wall によって影響されません。 -Weffc++ (C++ のみ) Scott Meyers の Effective C++ の本から、次のスタイルガイドラインの 違反について警告します: * 項目 11: コピーコンストラクタと動的に割り付けられたメモリがある クラスのための代入演算子を定義します。 * 項目 12: コンストラクタの代入のための望ましい初期化。 * 項目 14: 基底クラスでデストラクタを仮想にする。 * 項目 15: "operator=" を *this への参照を返すようにする。 * 項目 23: オブジェクトを返さなければならないとき、参照を返さない ようにする。 また、Scott Meyers の More Effective C++ の本から次のスタイルガイド ラインの違反を警告します: * 項目 6: インクリメントとデクリメント演算子のプレフィックスとポ ストフィックスの形式を区別する。 * 項目 7: "&&", "||" または "," を決してオーバロード (多重定義) しない。 このオプションを選択するとき、標準ライブラリヘッダが、これらのすべ てのガイドラインに従わないことを承知してください。それらの警告を フィルタするためには grep -v を使用します。 -Wno-deprecated (C++ のみ) 推奨しない機能の使用に警告しません。 -Wstrict-null-sentinel (C++ のみ) また、見張りとしてキャストされない "NULL" の使用に関して警告しま す。GCC でのみコンパイルするとき、これは、"NULL" が "__null" と定義 されるように、有効な見張りです。NULL ポインタ定数は、NULL ポインタ ではありませんが、ポインタと同じサイズであることが保証されます。し かし、この使用は、別のコンパイラに渡って移植性はありません。 -Wno-non-template-friend (C++ のみ) テンプレート化されていない friend 関数がテンプレート内に宣言される とき、警告を無効にします。G++ の明示的なテンプレート仕様のサポート の出現以来、friend の名前が無資格の ID (すなわち、friend foo(int)) であるなら、C++ 言語仕様は、friend が非テンプレート関数の通常の宣言 または定義することを要求します。(セクション 14.5.3)。G++ が明示的な 仕様を実装する前には、無資格の ID は、テンプレート化された関数の特 殊なものと解釈されていました。この適合しない振る舞いは、もはや G++ のデフォルトの振る舞いではないので、-Wnon-template-friend によって コンパイラは、トラブルの可能性がある箇所の既存のコードをチェックす ることができます、それはデフォルトでオンです。 -Wno-non-template-friend によって、この新しいコンパイラの振る舞いを オフにすることができます。それは、不適合なコンパイラのコードはその ままですが、有用な警告を無効にします。 -Wold-style-cast (C++ のみ) void でないタイプへの古いスタイル (C-スタイル) のキャスト (cast) が C++ プログラムの中で使用されるなら、警告します。新しいスタイルの キャスト (dynamic_cast, static_cast, reinterpret_cast と const_cast) は、意図されない効果に対して強く、検索をより容易にしま す。 -Woverloaded-virtual (C++ のみ) 関数宣言が基底クラスから仮想関数を隠すとき警告します。例えば、次の 中で: struct A { virtual void f(); }; struct B: public A { void f(int); }; "f" の "A" クラスバージョンは、"B" に隠されます、そして、次のような コードは: B* b; b->f(); コンパイルに失敗します。 -Wno-pmf-conversions (C++ のみ) メンバ関数へのバインドされたポインタを普通のポインタに変換すること に関する診断を無効にします。 -Wsign-promo (C++ のみ) オーバロードの解決が、同じサイズの符号無し (unsigned) タイプへの変 換の間、符号無し (unsigned) または列挙型 (enumerated type) から符号 付き (signed) タイプへの昇格を選択するとき、警告します。G++ の以前 のバージョンは、符号無しを保存しようと試みますが、標準は、現在の振 る舞いを指令します。 struct A { operator int (); A& operator = (int); }; main () { A a,b; a = b; } この例では、G++ は、デフォルトの A& operator = (const A&); を合成し ますが、一方 cfront はユーザ定義の operator = を使用します。 診断メッセージの書式化を制御するオプション 伝統的に、診断メッセージは出力デバイスの状況 (例えば、幅、...) にかかわ りなく書式化されていました。診断メッセージの書式化アルゴリズムを制御す るために、以下で説明されたオプションを使用することができます、例えば、1 行あたり何文字、どれくらいの頻度でソース位置情報が報告されるべきである か。現時点では、C++ フロントエンドのみ、これらのオプションをサポートで きます。しかしながら、近い将来、残っているフロントエンドは、正しくそれ らを要約できると期待されています。 -fmessage-length=n およそ n 文字の行に適合できるようにエラーメッセージの書式化を試みま す。デフォルトは、g++ では 72 文字で、GCC によってサポートされた残 りのフロントエンドでは 0 です。n が 0 あるなら、行の折り返しは行わ れません。各エラーメッセージは、単一の行に表示されます。 -fdiagnostics-show-location=once 行の折り返し (line-wrapping) モードでのみ意味があります。一度ソース 位置情報を出力するように診断メッセージレポータに指示します。すなわ ち、メッセージが物理的な 1 行に適合しないくらい長く、折り返しされる 場合、ソース位置は、継続行で、何度も、再び (プレフィックスとして) 出力されません。これはデフォルトの振る舞いです。 -fdiagnostics-show-location=every-line 行の折り返し (line-wrapping) モードでのみ意味があります。1 行に適合 しないくらい長過ぎるメッセージを改行する処理から結果の物理的な行の ために (プレフィックスとして) 同じソース位置情報を出力するように、 診断メッセージレポータに指示します。 -fdiagnostics-show-option このオプションは、そのようなオプションが診断機構に知られていると き、どのコマンドラインオプションが、直接その診断を制御するかを示 す、出力された各診断にテキストを追加するよう診断機構に指示します。 警告を要求するか、または抑制するオプション 警告は、本質的に誤っていませんが、危険な、またはエラーがあったかもしれ ないと示唆する構成を報告する診断メッセージです。 利用者は、-W で始まるオプションで多くの特有の警告、例えば、暗黙の宣言に 関する警告を要求する -Wimplicit、を要求することができます。また、各これ らの特有の警告オプションには、警告をオフにするための -Wno- で始まる否定 形式があります。例えば、-Wno-implicit です。このマニュアルでは、どちか らデフォルトでない、2 つの形式の 1 つだけをリストしています。 次のオプションは GCC によって作成される警告の量と種類を制御します。さら に、言語特有のオプションについて、C++ 方言オプションも参照してくださ い。 -fsyntax-only コードの構文エラーをチェックしますが、そのほかに何もしません。 -pedantic 厳密な ISO C と ISO C++ で要求されたすべての警告を出力します。禁じ られた拡張を使用するすべてのプログラムおよび ISO C と ISO C++ に 従っていない他のプログラムを拒否します。ISO C のためには、使用され た任意の -std オプションによって指定された ISO C 標準のバージョンに 従います。 正当な ISO C と ISO C++ プログラムは、このオプションのあるなしにか かわらず適切にコンパイルするはずです (が、まれに ISO C の必要なバー ジョンを指定する -ansi または -std オプション必要とします)。しかし ながら、このオプションがなければ、特定の GNU 拡張と伝統的な C およ び C++ の機能は同様にサポートされます。このオプションがあれば、それ らは拒否されます。 -pedantic によって、名前が __ で始まり終わる代替キーワードの使用の ための警告メッセージを生じません。また、ペダンチックな (pedantic) 警告は "__extension__" に続く表現で無効にされます。しかしながら、シ ステムヘッダファイルだけがこれらのエスケープルーチンを使用するべき です。アプリケーションプログラムは、それらを避けるべきです。 一部のユーザは、厳密な ISO C に適応しているかプログラムをチェックす るために -pedantic を使用することを試みます。彼らは、すぐに、彼らが 望んでいることをまったく行われないことがわかります: いくつかの ISO でない慣例を見つけますが、すべて見つけるというわけではありません。 --- ISO C が診断を要求するもの、と診断が追加された他のものだけで す。 ISO C に適合に失敗することを報告する機能は、ある場合に役に立つかも しれませんが、かなりの追加作業を必要とし、-pedantic と全く異なるも のになるでしょう。近い将来、そのような機能をサポートする計画はあり ません。 -std で指定された標準が gnu89 または gnu99 のような C の GNU 拡張方 言を表すところで、GNU 拡張方言がベースにしている ISO C のバージョン である、対応するベース標準があります。-pedantic からの警告は、それ らがベース標準によって必要とされるところで与えられます。(C の GNU 方言の定義で、与えられたオプションでコンパイラがサポートするすべて の機能を含み、何も警告することはないので、指定された GNU C 方言でな い機能のためだけに与えられているそのような警告に対してのために意味 がありません。) -pedantic-errors 警告よりむしろエラーを出すことを除いて、-pedantic に似ています。 -w すべての警告メッセージを抑制します。 -Wno-import #import の使用に関する警告メッセージを抑制します。 -Wchar-subscripts 配列の添字が、タイプ "char" であるなら、警告します。プログラマは、 しばしばこのタイプがあるマシンで符号付きであることを忘れるので、こ れはよくあるエラーの原因です。この警告は、-Wall よって有効にされま す。 -Wcomment コメントの開始シーケンス /* が /* コメント内に現れるときはいつで も、または、バックスラッシュ-改行が // コメント内に現れるときはいつ でも、警告します。この警告は、-Wall よって有効にされます。 -Wfatal-errors このオプションによって、コンパイラは、コンパイルし続け、さらなるエ ラーメッセージを印刷しようとするよりむしろ、最初のエラーでコンパイ ルを中止します。 -Wformat "printf" と "scanf" などの呼び出しをチェックして、供給された引数に は、指定された書式 (フォーマット) 文字列のための適切なタイプがあ り、書式の文字列の指定された変換とつじつまが合うことを確かめます。 これは、"printf", "scanf", "strftime" と "strfmon" (X/Open 拡張で、 C 標準でない) ファミリ (または、他のターゲット特有のファミリ) で、 標準関数と書式属性によって指定された他のものを含んでいます。どの関 数が、選択された標準のバージョンに依存する指定されている形式属性な しでチェックされるかと、指定された属性のない関数のそのようなチェッ クは、-ffreestanding または -fno-builtin によって無効にされます。 書式は、GNU libc バージョン 2.2 によってサポートされた書式機能に対 してチェックされます。これらは、Single Unix Specification といくつ かの BSD と GNU 拡張の機能と同様に、すべての ISO C90 と C99 機能を 含みます。他のライブラリ実装は、これらのすべての機能をサポートする わけではありません。GCC は、特殊なライブラリの制限を越える機能に関 しての警告をサポートしません。しかしながら、-pedantic が、-Wformat と共に使用されているなら、選択された標準バージョンでない書式機能に 警告を与えます (が、それらが、C 標準のあらゆるバージョンでないの で、"strfmon" 書式のためではありません)。 また、-Wformat は、いくつかの関数のための null 書式引数をチェックす るので、-Wformat また、-Wnonnull の意味を含みます。 -Wformat は -Wall に含まれています。書式のチェックのある局面の制御 に関して、オプション -Wformat-y2k, -Wno-format-extra-args, -Wno-format-zero-length, -Wformat-nonliteral, -Wformat-security と -Wformat=2 が利用可能ですが、-Wall には含まれていません。 -Wformat-y2k また、-Wformat が指定されるなら、2 桁の年しか与えられていない "strftime" 書式に警告します。 -Wno-format-extra-args -Wformat が指定されるなら、"printf" または "scanf" 書式関数への余分 な引数に警告しません。C 標準では、そのような引数は無視されると明記 しています。 $ オペランド数指定で指定される使用される引数と間に未使用の引数がが あるところで、未使用の引数をスキップするるために、どのようなタイプ を "va_arg" に渡すか、実装では知ることができないので、通常まだ警告 を与えられます。しかしながら、"scanf" 書式の場合には、Single Unix Specification では、そのような未使用の引数が許可されていると述べら れているので、このオプションは、未使用の引数がすべてポインタである なら、警告を抑制します。 -Wno-format-zero-length -Wformat が指定されるなら、長さ 0 の書式に警告しません。C 標準で は、長さ 0 の書式は許可されていると明記しています。 -Wformat-nonliteral また、-Wformat が指定されるなら、書式文字列が文字列リテラルでないの でチェックすることができなくて、書式関数が "va_list" として書式引数 を取らないなら、警告します。 -Wformat-security また、-Wformat が指定されるなら、セキュリティ問題を示す可能性がある 書式関数の使用に警告します。現在のところ、これは、書式文字列が文字 列リテラルでなく、"printf (foo);" のように書式引数がない場合、 "printf" と "scanf" 関数への呼び出しに関して警告します。書式文字列 が信頼されていない入力から来て、%n を含んでいるなら、これはセキュリ ティホールとなるかもしれません。(これは、現在 -Wformat-nonliteral が警告するものに関するサブセットですが、将来には、 -Wformat-nonliteral に含まれていない -Wformat-security に警告が追加 されるかもしれません。) -Wformat=2 -Wformat に -Wformat に含まれていない書式チェックを追加したものを有 効にします。現在、-Wformat -Wformat-nonliteral -Wformat-security -Wformat-y2k に同等です。 -Wnonnull "nonnull" 関数属性によって NULL でない値が要求されるように、マーク された引数のための NULL ポインタを渡すことに関して、警告します。 -Wnonnull は -Wall と -Wformat に含まれています。それは、 -Wno-nonnull オプションで無効にすることができます。 -Winit-self (C, C++ のみ) それら自体で初期化される初期化されていない変数に関して、警告しま す。-O1 とそれ以上でのみ動作する、-Wuninitialized とともに、このオ プションを使用できることに注意してください、 例えば、GCC は -Winit-self が指定されたときのみ、次の断片で初期化さ ていない "i" に警告します: int f() { int i = i; return i; } -Wimplicit-int 宣言がタイプを指定していないとき、警告します。この警告は、-Wall よって有効にされます。 -Wimplicit-function-declaration -Werror-implicit-function-declaration 関数が宣言される前に使用されるときはいつでも、警報 (またはエラー) を出します。形式 -Wno-error-implicit-function-declaration は、サ ポートされていません。この警告は、(エラーではなく、警告として) -Wall によって有効にされます。 -Wimplicit -Wimplicit-int と -Wimplicit-function-declaration と同じです。この 警告は、-Wall よって有効にされます。 -Wmain main のタイプが疑わしいなら、警告します。main は、外部リンクされ、 int を返し、引数が 0 か、適切なタイプの 2 または 3 個の引数のいずれ かを取る関数であるべきです。この警告は、-Wall よって有効にされま す。 -Wmissing-braces 集合体 (aggregate) または共用体 (union) の初期化子が完全に角括弧で 囲まれていないなら、警告します。次の例では、a のための初期化子は、 完全に角括弧で囲まれていませんが、b のための初期化子は、完全に角括 弧で囲まれています。 int a[2][2] = { 0, 1, 2, 3 }; int b[2][2] = { { 0, 1 }, { 2, 3 } }; この警告は、-Wall よって有効にされます。 -Wmissing-include-dirs (C と C++ のみ) ユーザによって供給されたインクルードディレクトリが存在しないなら、 警告します。 -Wparentheses 真の値が予期されるコンテキストで、代入があるか、または、人々がしば しば当惑する優先順位で演算子がネストされるときのような、括弧がある コンテキスト (文脈) で省略されているなら、警告します。C++ をコンパ イルするとき、真の値がサポートされているとして使用される代入のため だけ警告します。他の警告は、C をコンパイルするときだけ、サポートさ れています。 また、x<=y<=z のような比較が現れるなら、警告します。これは、普通の 数学的表記のものとは異なって解釈される (x<=y ? 1 : 0) <= z と同等で す。 また、"if" 文の "else" ブランチが属するところで混乱がある構造に関し て、警告します。ここに、そのような場合の例を示します: { if (a) if (b) foo (); else bar (); } C では、すべての "else" ブランチは、できるだけ最も深い "if" 文に属 します、この例では、"if (b)" です、これは、上記の例でプログラマが選 んだインデントによって図解されるような、プログラマが期待したことと はしばしば異なります。このような混乱の可能性があり、このフラグが指 定されるとき、GCC は、警報を出します。警告を排除するために、最も深 い "if" のまわりに明示的に大括弧を追加して、"else" が囲まれた "if" に属することしか方法がないようになります。結果のコードは、次のよう になるでしょう: { if (a) { if (b) foo (); else bar (); } } この警告は、-Wall よって有効にされます。 -Wsequence-point C と C++ 標準でのシーケンスポイント規則の違反のために、未定義のセマ ンティクスがあるコードに警告します。 C と C++ 標準は、C C/C++ プログラムの式が、プログラムの部分の実行の 間の部分的な順序を表す、シーケンスポイントに関して評価される順序を 定義します: シーケンスポイントの前に実行されたもの、とそれ後に実行 されたものです。これらは、完全な式 (より大きな式の一部でないもの) の評価の後、"&&", "||", "? :" または "," (コンマ) 演算子の最初のオ ペランドの評価の後、関数が呼び出される前 (しかし、引数の評価と呼び 出された関数を意味する式の後に)、および他の特定の場所で起こります。 シーケンスポイント規則によって表現される以外、式の副式の評価の順序 は指定されていません。例えば、2 つの関数が 1 つの式の中で、それらの 間のシーケンスポイントなしで呼び出されるなら、関数が呼び出される順 序が指定されないので、これらのすべての規則は、全体の順序よりむしろ 部分的な順序についてのみ記述しています。しかしながら、標準委員会 は、関数呼び出しがオーバラップしない規則があります。 シーケンスポイントの間でオブジェクトの値への変更が実施されるとき は、指定されていません。これによる決まる振る舞いのプログラムは未定 義の振る舞いの状態になります。C と C++ 標準は、"前と次のシーケンス ポイントの間で、オブジェクトは式の評価によって多くても一度変更され た値を格納した値を持つものとします。さらに、以前の値は、格納される 値を決定するためだけに読み込み専用となるものとします。" と明記され ています。プログラムがこれらの規則を破るなら、特定の実装の結果は、 まったく予測できません。 未定義の振る舞いがあるコードの例は、"a = a++;", "a[n] = b[n++]" と "a[i++] = i;" です。いくつかのより複雑な場合は、このオプションに よって診断されません、そして、時々の誤った肯定的な結果を与えるかも しれませんが、一般的に、プログラムのこの種類の問題を検出するところ でかなり効果的であることがわかります。 標準は、紛らわしい言葉で表現されています、したがって、微妙な場合に はシーケンスポイント規則の正確な意味に関する何らかの討論がありま す。提案されている公式の定義を含む問題の議論へのリンクは <http://gcc.gnu.org/readings.html> の GCC 見解ページにあります。 この警告は、C and C++ のために -Wall よって有効にされます。 -Wreturn-type 関数が "int" をデフォルトとするリターンタイプで定義されるときはいつ も、警告します。また、関数のリターンタイプが "void" でないリターン 値なしのあらゆる "return" 文に警告します。 また、C に関して、関数のリターンタイプに、"const" のようなタイプ修 飾子があるなら、警告します。そのようなタイプ修飾子は、関数によって 返された値が左辺値 (lvalue) でないので、効果は、ありません。ISO C は、関数定義で修飾された "void" リターンタイプを禁止するので、その ようなリターンタイプは、常にこのオプションがなくても警告を受けま す。 C++ のために、リターンタイプのない関数は、-Wno-return-type が指定さ れるときでさえ、常に診断メッセージを生成します。唯一の例外は、main とシステムヘッダで定義された関数です。 この警告は、-Wall よって有効にされます。 -Wswitch "switch" 文には、列挙タイプのインデックスがあり、その列挙型の指定さ れたコードのために複数の "case" が欠けているときはいつも、警告しま す。("default" ラベルが存在すれば、この警告を抑制します。) また、列 挙型の範囲外の "case" ラベルは、このオプションが使用されていると き、警告を招きます。この警告は、-Wall よって有効にされます。 -Wswitch-default "switch" 文に "default" ケースがないときはいつも、警告します。 -Wswitch-enum "switch" 文には、列挙タイプのインデックスがあり、その列挙型の指定さ れたコードのために複数の "case" が欠けているときはいつも、警告しま す。また、列挙型の範囲外の "case" ラベルは、このオプションが使用さ れているとき、警告を招きます。 -Wtrigraphs プログラムの意味を変えるかもしれないなんらかのトライグラフに遭遇す るなら、警告します (コメントの中のトライグラフに関しては警告されま せん)。この警告は、-Wall よって有効にされます。 -Wunused-function 静的な関数が宣言されていますが、定義されていないか、またはインライ ンでない静的な関数が未使用であるときはいつも、警告します。この警告 は、-Wall よって有効にされます。 -Wunused-label ラベルが宣言されていますが、使用されないときはいつも、警告します。 この警告は、-Wall よって有効にされます。 この警告を抑制するためには、unused 属性を使用してください。 -Wunused-parameter 関数パラメータが宣言はさておき未使用であるときはいつも、警告しま す。 この警告を抑制するためには、unused 属性を使用してください。 -Wunused-variable ローカル変数または定数でない静的変数が宣言はさておき未使用であると きはいつも、警告します。この警告は、-Wall よって有効にされます。 この警告を抑制するためには、unused 属性を使用してください。 -Wunused-value 文が明らかに使用されていない結果を計算するときはいつも、警告しま す。この警告は、-Wall よって有効にされます。 この警告を抑制するためには、式を void にキャストしてください。 -Wunused 上記のすべての -Wunused オプションを結合したものです。 未使用の関数パラメータに関する警告を得るためには、利用者は、-Wextra -Wunused (-Wall は -Wunused の意味を含むことに注意) か、または別々 に -Wunused-parameter のいずれかを指定しなければなりません。 -Wuninitialized 最初に初期化されていない自動変数が使用されるか、または変数が "setjmp" 呼び出しによって上書きされるかもしれないなら、警告します。 これらの警告は、最適化するときだけ計算されるデータフロー情報を必要 とするので、コンパイルを最適化するためだけ可能です。-O を指定しない なら、利用者はこれらの警告を得ません。代わりに、GCC は、-O を必要と する -Wuninitialized に関して警報を出します。 変数の初期化されていない値を、それ自身の初期化子で使用するコードに 関して警告したいなら、-Winit-self オプションを使用してください。 これらの警告は、まとめて非初期化されるか、または上書きされる変数と 同様に、構造体、共用体または配列変数の個々に非初期化されるか、また は上書きされる要素に対して生じます。それらは、"volatile" と宣言され た変数または要素に対して生じません。これらの警告は、最適化に依存す るので、警告がある的確な変数または要素は、使用される GCC の厳密な最 適化オプションとバージョンに依存します。 そのような計算は、警告が印刷 (表示) される前にデータフロー解析に よって削除されるので、決して使用されないそれ自体の値を計算するだけ に使用される変数に警告しないものがあることに注意してください。 GCC は、エラーがあるように思えるにもかかわらず、コードが正しいかも しれないすべての理由をわかることができるくらいには賢くないので、こ れらの警告は、オプションにされています。ここに、これがどのように起 こるかの 1 つの例を示します: { int x; switch (y) { case 1: x = 1; break; case 2: x = 4; break; case 3: x = 5; } foo (x); } "y" の値が常に 1、2 または 3 であるなら、"x" は常に初期化されます が、GCC はこれを知りません。ここに、他のよくある例を示します: { int save_y; if (change_y) save_y = y, y = new_y; ... if (change_y) y = save_y; } これには、それが設定される場合にだけ "save_y" が使用されるので、バ グはありません。 また、このオプションは、非揮発性 (non-volatile) の自動変数が "longjmp" への呼び出しによって変更されるかもしれないとき、警告しま す。これらの警告は、同様にコンパイルの最適化でのみ起こり得ます。 コンパイラは "setjmp" への呼び出しだけを見ています。コンパイラは、 "longjmp" がどこで呼び出されているかを知ることができません。実際に は、シグナルハンドラは、コードの任意の点で、それを呼び出すことがで きます。結果として、"longjmp" は、問題を引き起こす場所で事実上呼び 出すことができないので、たとえ実際には問題がないときでさえ警告を得 るかもしれません。 利用者が、使用する "noreturn" として決して返らないすべての関数を宣 言するなら、いくつかの偽りの警告を避けることができます。 この警告は、-Wall よって有効にされます。 -Wunknown-pragmas GCC に解釈されない #pragma 指示に遭遇するとき、警告します。このコマ ンドラインオプションが使用されるなら、システムヘッダファイル中の未 知のプラグマ (pragma) に対しても警告を出力します。これは、警告が -Wall コマンドラインオプションによって有効ににされただけであるな ら、そうではありません。 -Wno-pragmas 不正確なパラメータ、不正な構文、またはプラグマ (pragma) の間の競合 のような、プラグマの誤用に警告しません。また、-Wunknown-pragmas を 参照してください。 -Wstrict-aliasing このオプションは、-fstrict-aliasing がアクティブであるときのみ、ア クティブです。コンパイラが最適化に使用している厳密なエイリアシング 規則を破るかもしれないコードに関して、警告します。警告は、すべての 場合を捕らえるわけではありませんが、より一般的な落とし穴を捕らえる ことを試みます。それは -Wall に含まれています。 -Wstrict-aliasing=2 このオプションは、-fstrict-aliasing がアクティブであるときだけ、ア クティブです。コンパイラが最適化のために使用している厳しいエイリア シング規則を破るかもしれないコードに警告します。この警告は、 -Wstrict-aliasing より多くの場合を捕らえますが、また、いくつかの安 全であいまいな場合のために警告を与えます。 -Wstrict-overflow -Wstrict-overflow=n このオプションは、-fstrict-overflow がアクティブであるときだけ、ア クティブです。コンパイラが、符号のオーバフローが起こらないという仮 定に基づいて最適化される場合に警告します。コードがオーバフローする かもしれないすべての場合に警告するというわけではないことに注意して ください: それは、コンパイラが、何らかの最適化を実装する場合に警告 するだけです。したがって、この警告は、最適化レベルに依存します。 符号のオーバフローが起こらないと仮定した最適化は、関与する変数の値 が、実際に決してオーバフローが生じないなら、完全に安全です。した がって、この警告は、容易に誤検出を起こすかもしれません: 実際に問題 でないコードに関する警告。重要な課題に焦点を当てて助けるために、い くつかの警告レベルが定義されています。ループが必要とするいくつの繰 り返しを予測するとき、特に、ループがとにかく実行されているかどうか 決定するときに、未定義の符号オーバフローの使用に対して警告を行いま せん。 @option<-Wstrict-overflow=1> 疑わしくて、避けやすい場合に警告します。例えば: "x + 1 > x"。 -fstrict-overflow で、コンパイラは、単にこれを 1 にします。この -Wstrict-overflow のレベルは、-Wall によって有効にされます。よ り高いレベルは、なく、明白に要求しなければなりません。 @option<-Wstrict-overflow=2> また、比較が定数に単純化される他の場合に警告します。例えば: "abs (x) >= 0"。"abs (INT_MIN)" が、0 未満である "INT_MIN" に オーバフローするので、-fstrict-overflow が効力のあるとき、これ を簡素化することができます。(レベルのない) -Wstrict-overflow は、-Wstrict-overflow=2 と同じです。 @option<-Wstrict-overflow=3> また、比較が単純化される他の場合に警告します。例えば: "x + 1 > 1" は、"x > 0" に単純化されます。 @option<-Wstrict-overflow=4> また、上記の場合にカバーされなかった他の単純化を警告します。例 えば: "(x * 10) / 5" は、"x * 2" に単純化されます。 @option<-Wstrict-overflow=5> また、コンパイラが比較にかかわる定数の大きさを減少させる場合に 警告します。例えば: "x + 2 > y" は、"x + 1 >= y" に単純化されま す。この単純化は、多くの比較に適用され、この警告レベルが、非常 に多くの誤検出を起こすかもしれないので、最も高い警告レベルのみ を報告します。 -Wall 上記のすべての -W オプションを結合したものです。これは、マクロと併 せても、あるユーザが疑わしいと見なし、簡単に避けれる (または、警告 を避けるための変更する) 構造に関するすべての警告を有効にします。ま た、これは C++ 方言オプションで説明されているいくつかの言語特有の警 告を有効にします。 次の -W... オプションは、-Wall の意味は含まれません。それらのいくつか は、ユーザが一般的に疑わしいとにみなしませんが、時々利用者がチェックし たい構造に警告します。他のものは、いくつかの場合に必要であるか、または 避けことが難しく、警告を抑制するためにコードを変更する簡単な方法がない 構造に警告します。 -Wextra (このオプションは以前は -W と呼ばれていました。古い名前はまだサポー トされていますが、新しい名前はより記述的です。) これらのイベントの ための特別な警告メッセージを印刷します: * 関数は、値の有無にかかわらず返ることができます。(関数本体の終り から抜けることは、値なしで返るとみなされます。) 例えば、次の関 数はそのような警告を引き起こすでしょう: foo (a) { if (a > 0) return a; } * 副作用を含まない、式文またはコンマ式の左辺。警告を抑制するため には、未使用の式を void にキャストしてください。例えば、x[i,j] のような式は、警告を引き起こますが、x[(void)i,j] は警告しませ ん。 * 符号無しの値は、0 と < または >= と比較されます。 * "static" のような記憶域クラス指定子が、宣言で最初のものではあり ません。C 標準によれは、この使用法は廃れかかっています。 * また、-Wall または -Wunused が指定されるなら、未使用の引数に関 して、警告します。 * 符号付きと符号無しの値での比較は、符号付きが符号無しに変換され るとき、不正確な結果を生じるかもしれません。(ただし、 -Wno-sign-compare も指定されるなら、警告しません。) * 集合体には、すべてのメンバを初期化しなし初期化子があります。 -Wmissing-field-initializers によって、この警告を独立して制御で きます。 * 指定された初期化子 (initializer) を使用するとき、副作用のない初 期化されたフィールドは、上書きされます。-Woverride-init によっ て、この警告を独立して制御できます。 * 関数パラメータは K&R-スタイルの関数のタイプ指定子なしで宣言され ます。 void foo(bar) { } * 空の本体は if または else 文で起こります。 * ポインタは、整数 0 に対して <, <=, > または >= で比較されます。 * 変数は longjmp または vfork によって変更されるかもしれません。 *<(C++ のみ)> 条件式に現れる列挙子と非列挙子。 *<(C++ のみ)> コンストラクタなしでクラスに現れる、静的でない参照または静的で ない const メンバ。 *<(C++ のみ)> あいまいな仮想ベース。 *<(C++ のみ)> register と宣言されている配列の添字。 *<(C++ のみ)> register と宣言されている変数のアドレスを取る。 *<(C++ のみ)> 基底クラスは、派生されたクラスのコピーコンストラクタで初期化さ れません。 -Wno-div-by-zero コンパイル時の 0 による整数除算を警告しません。無限大と NaN を取得 する正当な方法であるで、0 による浮動小数点除算は警告されません。 -Wsystem-headers システムヘッダファイルで見つけられた構造に対して警告メッセージを印 刷します。それらが通常実際の問題を示さないで、コンパイラ出力を読む ことを難しくするだけであるという仮定の下に、通常、システムヘッダか らの警告は抑圧されます。このコマンドラインオプションを使用して、ま るでそれらがユーザのコードで起こるかのようにシステムヘッダから警告 を出すように GCC に伝えます。しかしながら、このオプションに関連して -Wall を使用することは、システムヘッダで未知のプラグマ (pragma) を 警告しないことに注意してください --- また、それのためには、 -Wunknown-pragmas を使用しなければなりません。 -Wfloat-equal 浮動小数点の値が等価比較で使用されるなら、警告します。 この背景の考えは、限りなく正確な実数に近似している浮動小数点の値と みなすために (プログラマのために) しばしば便利であるということで す。利用者がこれを行うなら、計算を導入する最大または、ほぼ最大のエ ラーを (コードを解析するか、またはある他の方法によって) 計算するこ とが必要であり、比較を実行するとき (そして、出力を生成するとき、そ れは異なった問題ですが)、それを考慮します。特に、等価をテストする代 わりに、利用者は 2 つの値には重なる範囲があるかどうか確かめるために チェックするでしょう。そして、比較演算子でこれを行うので、等価比較 はたぶん間違いです。 -Wtraditional (C のみ) 伝統的な C と ISO C で異なって振る舞う特定の構造に関して、警告しま す。また、伝統的な C と同等でない ISO C の構造、および避けられるべ きである問題のある構造に関して、警告します。 * マクロ本体の文字列リテラル内に現れるマクロパラメータ。伝統的な C では、マクロ置換は、文字列リテラル内で行われますが、ISO C で は行われません。 * 伝統的な C では、いくつかのプリプロセッサ指示は存在しませんでし た。伝統的なプリプロセッサは、行のカラム 1 に # が現れる場合の み、行が指示であるとみなしていました。したがって、-Wtraditional は伝統的な C が理解しているが、# が行の最初の文字として現れない ので、無視される指示に関して、警告します。また、インデントする ことによって伝統的な C によって理解されない #pragma のような指 示を隠すことを勧めます。いくつかの伝統的な実装は、#elif を認識 しないので、それを完全に避けることを勧めます。 * 引数なしで現れる関数のようなマクロ。 * 単項プラス演算子。 * U 整数定数サフィックス、または F または L 浮動小数点定数サ フィックス。(伝統的な C は整数定数で L サフィックスをサポートし ます。) これらのサフィックスは、ごく最近のシステムのシステム ヘッダ、例えば、"<limits.h>" の _MIN/_MAX マクロ、で定義された マクロに現れることに注意してください。通常、ユーザコード内のこ れらのマクロの使用は、偽りの警告を導くかもしれませんが、GCC の 統合プリプロセッサは、これらの場合に警告を避けるための十分なコ ンテキストがあります。 * 1 つのブロックで external と宣言される関数と、次にブロックの終 りの後に使用された機能。 * "switch" 文には、タイプ "long" のオペランドがあります。 * "static" でない関数宣言は "static" ものに続きます。この構造は、 いくつかの伝統的な C コンパイラによって受け付けられません。 * 整数定数の ISO タイプには、伝統的なタイプとは異なる幅または符号 があります。定数のベースが 10 である場合にだけこの警告を出しま す。すなわち、通常ビットパターンを表す 16 進または 8 進値は、警 告されません。 * ISO 文字列連結の使用法は検出されます。 * 自動集合体の初期設定。 * ラベルと衝突する識別子。伝統的な C にはラベルのための個別の名前 空間が不足しています。 * 共用体の初期化。初期化子が 0 であるなら、警告は省略されます。 ユーザコードの 0 初期化子が条件とされている、例えば、不足してい る初期化子の警告を避けるための "__STDC__" と伝統的な C の場合に デフォルトで 0 に初期化することを当てにする、と思われる仮定の元 に行われます。 * 固定/浮動小数点の値とのプロトタイプによる変換、とその逆。伝統的 な C でコンパイルするとき、これらのプロトタイプの欠如は、深刻な 問題を引き起こすでしょう。これは利用可能な変換の警告のサブセッ トで、フルセットは -Wconversion を使用します。 * ISO C スタイル関数定義の使用。libiberty の伝統的な C 互換マク ロ、"PARAMS" と "VPARAMS" を使用するとき、これらの ISO C 機能が 利用者コードに現れるので、プロトタイプ宣言または variadic 関数 のために、この警告は、故意に出されません。また、この警告は、そ の機能が既に GCC 拡張であり、したがって、伝統的な C との互換性 に関連していないので、入れ子にされた関数のために回避されます。 -Wdeclaration-after-statement (C のみ) 宣言がブロック内の文の後に見つけられるとき、警告します。C++ で知ら れている、この構造は、ISO C99 で導入され、デフォルトによって GCC で 許可されています。それは、ISO C90 によってサポートされず、GCC 3.0 以前の GCC バージョンでもサポートされていません。 -Wundef 未定義の識別子が #if 指示で評価されるなら、警告します。 -Wno-endif-labels #else または #endif の後にテキストが続いている場合でもつねに警告し ません。 -Wshadow ローカル変数が別のローカル変数、パラメータまたはグローバル変数を隠 すときはいつも、または、組み込み関数が隠されるときはいつも、警告し ます。 -Wlarger-than-len len バイトより大きいオブジェクトが定義されるときはいつも、警告しま す。 -Wunsafe-loop-optimizations コンパイラが、ループのインデックスの範囲で何も仮定できなかったの で、ループを最適化できないなら警告します。 -funsafe-loop-optimizations で、コンパイラが、そのような仮定を行う なら警告します。 -Wpointer-arith 関数タイプまたは "void" の "size of" によるものは何でも警告します。 GNU C は、"void *" ポインタと関数へのポインタの計算で便宜上、それら のタイプを size of 1 に割り当てます。 -Wbad-function-cast (C のみ) 関数呼び出しが適合しないタイプにキャストされるときはいつも、警告し ます。例えば、"int malloc()" が "anything *" にキャストされるなら、 警告します。 -Wc++-compat ISO C と ISO C++ の共通の部分集合の外にある ISO C 構成に警告しま す、例えば、"void *" から、非 "void" タイプへのポインタに暗黙の変換 に対する要求。 -Wcast-qual ポインタがターゲットタイプからタイプ修飾子を削除するためにキャスト されるときはいつも、警告します。例えば、"const char *" が普通の "char *" にキャストされるなら、警告します。 -Wcast-align ポインタが、ターゲットの要求される整列 (alignment) が増加されるよう にキャスト (cast) されるときはいつも、警告します。例えば、整数が 2 バイトまたは 4 バイトの境界でのみアクセスできるマシンで、"char *" が "int *" にキャストされるなら、警告します。 -Wwrite-strings C をコンパイルするとき、あるアドレスを非 "const" "char *" ポインタ にコピーすると警告が得られるように、タイプ "const char[length]" 文 字列定数に与えます。C++ をコンパイルするとき、文字列リテラルから "char *" への推奨されない変換に関して、警告します。この警告は、C++ プログラムのためにデフォルトで有効にされます。これらの警告は、文字 列定数に書き込むようにするかもしれないコードをコンパイル時に見つけ ることを助けますが、宣言とプロトタイプで "const" を使用して非常に注 意していた場合のみです。そうでなければ、単に迷惑を掛けます。これ は、我々がこれらの警告を -Wall 要求に含めなかった理由です。 -Wconversion プロトタイプによって、プロトタイプがない同じ引数に何が起こるかの違 いでタイプ変換を引き起こすなら、警告します。これは、固定小数点から 浮動小数点への変換やその逆と、デフォルトの特典と同じときを除いて、 固定小数点の引数の幅または符号を変更する変換を含みます。 また、負の整数定数表現が、暗黙的に符号無しタイプに変換されるなら、 警告します。例えば、"x = -1" if "x" が符号無しの代入に関して、警告 します。しかし、"(unsigned) -1" のような明白なキャストに関して、警 告しません。 -Wsign-compare 符号付きと符号無しの値での比較は、符号付きが符号無しに変換されると き、不正確な結果を生じるかもしれないとき、警告します。また、この警 告は -Wextra のよって有効にされます。この警告なしで、-Wextra の他の 警告を得るためには、-Wextra -Wno-sign-compare を使用します。 -Waddress メモリアドレスの疑わしい使用に警告します。これらは、"void func(void); if (func)" のような条件式での関数のアドレスを使用するこ と、と "if (x == "abc")" のような文字列リテラルのメモリアドレスに対 する比較を含んでいます。そのような使用は、通常プログラマのエラーを 示します: 関数のアドレスは、常に真と評価されるので、それらの条件内 での使用は、プログラマが関数呼び出しで括弧を忘れたことを通常示しま す。そして、文字列リテラルに対する比較は、明示されていない振る舞い をもたらし、C での移植性がないので、通常、それらは、プログラマが "strcmp" を使用するつもりであったことを示します。この警告は、-Wall よって有効にされます。 -Waggregate-return 構造体または共有体を返す任意の関数が定義されるか、または呼び出され るなら、警告します。(配列を返すことができる言語では、これはまた、警 告を引き出します。) -Wno-attributes 認識されていない属性、変数に適用された関数属性などのような、予期し ていない "__attribute__" が使用される場合、警告しません。これは、サ ポートされた属性の不正な使用のためのエラーを停止しません。 -Wstrict-prototypes (C のみ) 関数が引数のタイプを指定しないで宣言されるか、または定義されるな ら、警告します。(古いスタイルの関数定義は、引数のタイプを指定する宣 言が先行しているなら、警告なしで許可されます。) -Wold-style-definition (C のみ) 古いスタイルの関数定義が使用されているなら、警告します。以前にプロ トタイプがあっても、警告が与えられます。 -Wmissing-prototypes (C のみ) グローバル関数が以前のプロトタイプ宣言なしで定義されているなら、警 告します。定義自体がプロトタイプを提供したとしても、この警告は出さ れます。この目的は、ヘッダファイル中に宣言されていないグローバル関 数を検出することです。 -Wmissing-declarations (C のみ) グローバル関数が、以前の宣言なしで定義されるなら、警告します。定義 自体がプロトタイプを提供したとしても、警告します。ヘッダファイル中 に宣言されないグローバル関数を検出するために、このオプションを使用 します。 -Wmissing-field-initializers 構造体の初期化子にいくつかのフィールドの不足があるなら警告します。 例えば、次のコードは、"x.h" は、暗黙で 0 であるので、そのような警告 を生じます: struct s { int f, g, h; }; struct s x = { 3, 4 }; このオプションは、指定された初期化子に警告しないので、次の変更は警 告の引き金となりません: struct s { int f, g, h; }; struct s x = { .f = 3, .g = 4 }; この警告は、-Wextra に含まれています。これなしで他の -Wextra 警告を 得るには、-Wextra -Wno-missing-field-initializers を使用します。 -Wmissing-noreturn 属性 "noreturn" の候補となるかもしれない関数に関して、警告します。 これらは絶対的ものではなく、可能性がある候補にすぎないことに注意し てください。"noreturn" 属性を追加する前に、関数が実際に決して返らな いことを手動で確認するために、特別な注意が払われなければなりませ ん。そうでなければ、微妙なコード生成バグを導入するかもしれません。 利用者は、ホストの C 環境で "main" のための警告を得ません。 -Wmissing-format-attribute "format" 属性の候補となるかもしれない関数ポインタに警告します。これ らは、絶対的ものではなく、可能性がある候補にすぎないことに注意して ください。GCC は、代入、初期化、パラメータを渡すこと、またはリター ン文で使用される "format" 属性がある関数ポインタは、結果のタイプの 対応する "format" 属性があるべきであると推測します。すなわち、ま た、それぞれ、代入または初期化の左辺側、パラメータ変数のタイプ、ま たは関数を含むリターンタイプには、警告を避ける "format" 属性がある べきです。 また、GCC は、"format" 属性の候補であるかもしれない関数定義を警告し ます。かさねて、これらは可能性がある候補にすぎません。GCC は、 "format" 属性が "vprintf" または "vscanf" のような関数を呼び出す任 意の関数に適切であるかもしれませんが、これは常にその場合であるかも しれなくて、"format" 属性が適切であるいくつかの関数が検出されない、 と推測します。 -Wno-multichar マルチキャラクタ定数 ('FOOF') が使用されるなら、警告ません。それら には実装定義 (implementation-defined) した値があり、移植性のある コードに使用するべきでないとき、通常、それらは、ユーザコードのタイ ポ (誤植) を示します。 -Wnormalized=<none|id|nfc|nfkc> ISO C と ISO C++ では、それらが異なった文字のシーケンスであるなら、 2 つの識別子は、異なります。しかしながら、とくどき、基本的な ASCII 文字セットの外の文字が使用されるとき、利用者は、同じに見える 2 つの 異なった文字シーケンスを持つことができます。混乱を避けるために、ISO 10646 規格は、適用されるとき、同じに見える 2 つのシーケンスが同じ シーケンスに変えられることを確実にする、いくつかの正規化規則 (normalization rules) を設定しています。GCC は、利用者が正規化され ていない識別子を使用しているなら、利用者に警告できます。このオプ ションは、その警告を制御します。 GCC がサポートする 4 つのレベルの警告があります。デフォルトは、ISO 10646 "C" 正規化形式、NFC ではない、任意の識別子に警告する、 -Wnormalized=nfc です。NFC は、ほとんどの使用のためのお勧めの形式で す。 残念ながら、ISO C と ISO C++ によって NFC に変えられるとき、識別子 として許可できない識別子で認められたいくつかの文字があります。すな わち、移植性のある ISO C または C++ のこれらのシンボルを使用し、NFC の利用者のすべての識別子を持つ方法はありません。-Wnormalized=id は、これらの文字のための警告を抑制します。関連する規格の将来のバー ジョンで、これを修正することが望まれています、だから、このオプショ ンは、デフォルトではありません。 利用者は、書き込み -Wnormalized=none によってすべての文字のための警 告をオフにすることができます。利用者は、ある他の正規化スキーム ("D" のような) を使用している場合にだけ、これを行いたいでしょう、そうで なければ、利用者は、そのまま見ることが不可能なバグを作成できるから です。 ISO 10646 のいくつかの文字は、異なった意味がありますが、特に形式が いったん適用されると、いくつかのフォントまたは表示の方法が同じに見 えます。例えば、"\u207F", "SUPERSCRIPT LATIN SMALL LETTER N" は、 ちょうど、上付き文字として置かれた通常の "n" のように表示すます。 ISO 10646 は、同様に、これらをすべて標準形式に変換するために NFKC 正規化スキームを定義し、GCC は、利用者のコードが NFKC でなく、利用 者が -Wnormalized=nfkc を使用するなら、警告します。この警告は、数値 0 と混乱するかもしれないので、文字 O を含むあらゆる識別子を警告する ことに似ていて、それにデフォルトではありませんが、プログラミング環 境がこれらの文字を区別して表示するために固定できないなら、局所的な コーディング規約として役に立ちます。 -Wno-deprecated-declarations "deprecated" 属性を使用することによって推奨されないとしてマークされ た関数、変数とタイプの使用に警告しません。 -Wno-overflow 定数の式におけるコンパイル時のオーバフローに警告しません。 -Woverride-init 指定された初期化子を使用するとき、副作用のない初期化されたフィール ドが上書きされるなら、警告します。 この警告は、-Wextra に含まれています。これなしで他の -Wextra 警告を 得るには、-Wextra -Wno-override-init を使用します。 -Wpacked 構造体に packed 属性が与えられるが、packed 属性に構造体のレイアウト またはサイズに効果がないなら、警告します。そのような構造体は、わず かの利益のために誤って整列されるかもしれません。例えば、次コードで は、"struct bar" が、それ自体に packed 属性がなくても、"struct bar" の変数 "f.x" は誤って整列されます。 struct foo { int x; char a, b, c, d; } __attribute__((packed)); struct bar { char z; struct foo f; }; -Wpadded 構造体の要素を整列するためにか、または構造体全体を整列するために、 構造体に詰め物 (パディング) が含まれているなら、警告します。時々こ れが起こるとき、詰め物を減らし、構造体をより小さくするために構造体 のフィールドを再配置することができます。 -Wredundant-decls 多重宣言が有効であり何も変更されない場合でも、同じスコープで複数 回、何かを宣言するなら、警告します。 -Wnested-externs (C のみ) 関数の中で "extern" 宣言に遭遇するなら、警告します。 -Wunreachable-code コンパイラが決して実行されないコードを検出するなら、警告します。 このオプションは、いくつかの条件が決して満たされないので、または、 決して返らない手続きであるので、コンパイラが、少なくともソースコー ドの 1 行全体が決して実行されないことを検出するとき、警告することを 目的としています。 たとえ影響を受ける行の一部を実行することができる状況があったとして も、このオプションが警告を生成することは可能なので、明らかに到達で きないコードを削除するとき、特別の注意が払われなければなりません。 例えば、関数かインラインのとき、警告は、行が関数のただ 1 つのインラ インコピーで到達できないことを、意味します。 プログラムのデバッグバージョンで、プログラムの正しい機能をチェック する多くのコードがしばしばあり、うまくいけば、プログラムが動作する ため到達できないので、このオプションは、-Wall の一部にはなっていま せん。他の到達できないコードの一般的の使用は、コンパイル時に選択可 能な振る舞いを提供することです。 -Winline 関数をインラインにすることができず、インラインとして宣言されている なら、警告します。このオプションがあったとしても、コンパイラは、シ ステムヘッダで宣言されたインライン関数の失敗に関して、警告しませ ん。 コンパイラは、関数をインラインにするかどうかを決定するためにさまざ まな発見的手法を使用します。例えば、コンパイラがインライン化される 関数のサイズと、現在の関数で既に行われたインラインの総量を考慮に入 れます。したがって、ソースプログラムの外見的には重要でない変更は、 -Winline によって生成された警告が、現れたり、消したりすることができ ます。 -Wno-invalid-offsetof (C++ のみ) POD でないタイプに offsetof マクロを適用して警告を抑制します。1998 ISO C++ 標準によると、offsetof を POD でないタイプに適用することは 未定義です。しかしながら、既存の C++ 実装では、ある種類の POD でな いタイプに適用されるとき、通常 offsetof は重要な結果を与えます。(コ ンストラクタを持っているという理由だけで POD タイプとなることに失敗 する単純な struct などです。) このフラグは、移植性がないコードを書 いていることを承知していて、それに関する警告を無視するために故意に 選んだ、ユーザのためのものです。 offsetof での制限は、C++ 標準の将来のバージョンで緩和されるかもしれ ません。 -Wno-int-to-pointer-cast (C のみ) キャストから異なったサイズの整数のポインタタイプまで警告を抑制しま す。 -Wno-pointer-to-int-cast (C のみ) ポインタから異なったサイズの整数タイプまでの警告を抑制します。 -Winvalid-pch プリコンパイルされたヘッダが検索パスで見つけられますが、使用するこ とができないなら、警告します。 -Wlong-long long long タイプが使用されているなら、警告します。これはデフォルト です。警告メッセージを抑制するためには、-Wno-long-long を使用しま す。フラグ -Wlong-long と -Wno-long-long は、-pedantic フラグが使 用される場合のみ、考慮に入れられます。 -Wvariadic-macros 可変長マクロが、杓子定規な ISO C90 モード、または杓子定規な ISO C90 モードのときに、GNU 代替構文で使用されるなら、警告します。これは、 デフォルトです。警告メッセージを抑制するためには、 -Wno-variadic-macros を使用します。 -Wvolatile-register-var レジスタ変数が、volatile (揮発性) と宣言されているなら警告します。 volatile 修飾子は、レジスタ変数への読み込みおよび/または書き込みを 排除するかもしれない、すべての最適化を抑制するというわけではありま せん。 -Wdisabled-optimization 要求された最適化パスが無効であるなら、警告します。一般的に、この警 告は、利用者のコードに何か悪いものがあることを示しません。それは、 GCC のオプティマイザがコードを効率的に取り扱うことができなかったこ とを単に示します。しばしば、問題は、利用者のコードが大き過ぎるか、 または複雑過ぎるということです。GCC は、最適化自体がとてつもない量 の時間がかかりそうなとき、プログラムを最適化することを拒否します。 -Wpointer-sign 異なったサイン (signedness) でポインタ引数の引き渡しか、または代入 に警告します。このオプション、は C のためだけサポートされます。 -Wno-pointer-sign で無効にすることができる、-Wall と -pedantic に よって暗黙に定義されます。 -Werror すべての警告をエラーにします。 -Werror= 指定された警告をエラーにします。警告のための指定子が追加され、例え ば、-Werror=switch は、-Wswitch によって制御される警告をエラーに変 えます。このスイッチは、特定の警告のために -Werror を否定するために 使用される否定形を取ります、例えば、-Wno-error=switch は、-Werror が有効であるときにさえ、エラーでない -Wswitch 警告を行います。利用 者は、このオプションで何を使用したらよいかを決定するために、それを 制御するオプションで、それぞれの制御可能な警告を改正するために -fdiagnostics-show-option オプションを使用できます。 -Werror=foo を指定することは、-Wfoo の意味が含まれていることに注意 してください。しかしながら、-Wno-error=foo は、何の意味も含まれませ ん。 -Wstack-protector -fstack-protector がアクティブであるときにだけ、このオプションは、 アクティブです。それはスタックの破壊に対して保護されない関数に警告 します。 -Woverlength-strings C 標準で指定された "minimum maximum" 長より長い文字列定数に警告しま す。一般的に現代のコンパイラによって、標準の最小の制限よりずっと長 い文字列定数を許可しますが、たいへん移植性のあるプログラムは、より 長い文字列を使用することを避けるべきです。 制限は、文字列定数の連結の後に適用して、後続する NUL (ヌル文字) を 数えません。C89 では、制限は、509 文字でした。C99 では、それは 4095 まで引き上げられました。C++98 は、標準的な最小最大を指定しないの で、我々は、C++ の長さがオーバする文字列を診断しません。 このオプションは、-Wno-overlength-strings で無効にすることができ る、-pedantic の意味を含みます。 利用者のプログラムまたは GCC をデバッグするためのオプション GCC には、利用者のプログラムまたは GCC のいずれかをデバッグするために使 用される様々な特別のオプションがあります: -g オペレーティングシステムのネイティブ形式 (stabs, COFF, XCOFF または DWARF 2) でデバッグ情報を生成します。GDB は、このデバッグ情報を使用 して動作することができます。 stabs 形式を使用する、ほとんどのシステムでは、-g は GDB だけが使用 することができる特別のデバッグ情報の使用を有効にします。この特別の 情報は、GDB でデバッグすることをより良くしますが、他のデバッガで は、たぶんクラッシュさせるか、またはプログラムを読み込むことを拒否 することになります。特別の情報を生成するかどうかを確実に制御したい なら、-gstabs+, -gstabs, -gxcoff+, -gxcoff または -gvms (下記参照) を使用していください。 GCC で、利用者は、-O とともに -g を使用することができます。最適化さ れたコードによって行われたショートカットは、時々驚異的な結果を生む かもしれません: 利用者が宣言したいくつかの変数が存在しないかもしれ ません。制御の流れが利用者が予想しなかったところにあっさりと移動す るかもしれません。いくつかの文は、定数の結果を計算したり、それらの 値が既に手元にあるので、実行されないかもしれません。いくつかの文 は、それらがループに外に移動され、異なった場所で実行されるかもしれ ません。 それにもかかわらず、最適化された出力をデバッグすることが可能である と分かります。これによって、バグがあるかもしれないプログラムに対し てオプティマイザを使用することが妥当になります。 次のオプションは、GCC が複数のデバッグ形式の能力を生成するとき、役 に立ちます。 -ggdb GDB によって使用するデバッグ情報を生成します。これは、可能であれ ば、GDB 拡張を含んで、(DWARF 2, stabs またはそれらのいずれかがサ ポートされているならネイティブ形式) で利用可能な最も表現に富む形式 を使用することを意味します。 -gstabs (サポートされるなら) GDB 拡張なしで stabs 形式でデバッグ情報を生成 します。これは、ほとんどの BSD システムで DBX によって使用される形 式です。MIPS, Alpha の System V Release 4 システムでは、このオプ ションは、DBX または SDB によって解釈されない stabs デバッグ出力を 生成します。System V Release 4 システムでは、このオプションは GNU アセンブラを必要とします。 -feliminate-unused-debug-symbols (サポートされているなら) 実際に使用されるシンボルためだけの stabs 形式のデバッグ情報を生成します。 -femit-class-debug-always たった 1 つのオブジェクトファイルの C++ クラスのためのデバッグ情報 を出力する代わりに、クラスを使用するすべてのオブジェクトファイルで それを出力します。このオプションを使用することは、デバッグ情報のサ イズが 2 の倍数と同じくらいに増加されるので、このオプションは、GCC が通常、クラスのためのデバッグ情報を出力する方法を扱うことができな いデバッガだけでのみ使用されるべきです。 -gstabs+ GNU デバッガ (GDB) だけによって解釈される GNU 拡張を使用して、(サ ポートされているなら) stabs 形式のデバッグ情報を生成します。これら の拡張の使用は、おそらく、他のデバッガをクラッシュさせるか、または プログラムを読み込むことを拒否するかもしれません。 -gcoff (サポートされているなら) COFF 形式のデバッグ情報を生成します。これ は、System V Release 4 以前のほとんどの System V システムで SDB に よって使用された形式です。 -gxcoff (サポートされているなら) XCOFF 形式のデバッグ情報を生成します。これ は、IBM RS/6000 システムで DBX デバッガによって使用される形式です。 -gxcoff+ GNU デバッガ (GDB) だけによって解釈される GNU 拡張を使用して、(サ ポートされているなら) XCOFF 形式のデバッグ情報を生成します。これら の拡張の使用は、おそらく、他のデバッガをクラッシュさせるか、または プログラムを読み込むことを拒否し、GNU アセンブラ (GAS) 以外のアセン ブラがエラーで失敗するかもしれません。 -gdwarf-2 (サポートされているなら) DWARF バージョン 2 形式のデバッグ情報を生 成します。これは、IRIX 6 の DBX によって使用される形式です。このオ プションで、GCC は、それらが役に立つとき、DWARF バージョン 3 の機能 を使用します。バージョン 3 は、バージョン 2 と上位互換性があります が、まだ、古いデバッガで問題を起こすかもしれません。 -gvms (サポートされているなら) VMS デバッグ形式のデバッグ情報を生成しま す。これは、VMS システムの DEBUG によって使用される形式です。 -glevel -ggdblevel -gstabslevel -gcofflevel -gxcofflevel -gvmslevel デバッグ情報を要求し、また、どのくらい多くの情報かを指定するために level 使用します。デフォルトのレベルは 2 です。 レベル 1 は、利用者がデバッグを計画していないプログラムの部分でバッ クトレースをするのに十分な、最小限の情報を生成します。これは、関数 と外部変数の記述を含んでいますが、ローカル変数と行番号に関する情報 を含んでいません。 レベル 3 は、プログラムに存在しているすべてのマクロ定義のような、特 別の情報を含んでいます。いくつかのデバッガは、利用者が -g3 を使用す るとき、マクロ展開をサポートします。 GCC は、あまりに混乱させられる、(バージョン 2 とたいへん異なってい る) DWARF 形式のバージョン 1 のデバッグ情報を生成することを意味する オプション -gdwarf をサポートするために使用するので、-gdwarf-2 は、 連結されたデバッグレベルを受け付けません。そのデバッグ形式は、長い 間時代遅れですが、現在、オプションを変更することができません。代わ りに、DWARF2 のデバッグレベルを変更するために、追加の -glevel オプ ションを使用します。 -feliminate-dwarf2-dups 各シンボルに関する重複した情報を取り除くことによって、DWARF2 デバッ グ情報を圧縮します。-gdwarf-2 で DWARF2 デバッグ情報を生成するとき だけ、このオプションは意味があります。 -p 解析プログラム prof のために適切なプロファイル情報を書き込むための 特別のコードを生成します。データが欲しいソースファイルをコンパイル するとき、このオプションを使用しなければなりません、そして、リンク するときもそれを使用しなければなりません。 -pg 解析プログラム gprof のために適切なプロファイル情報を書き込むための 特別のコードを生成します。データが欲しいソースファイルをコンパイル するとき、このオプションを使用しなければなりません、そして、リンク するときもそれを使用しなければなりません。 -Q コンパイラは、コンパイルされる各関数名を印刷し、終了したとき、各パ スに関するいくつかの統計を印刷するようにします。 -ftime-report コンパイラは、終了したとき各パスによって消費した時間に関するいくつ かの統計を印刷するようにします。 -fmem-report コンパイラは、終了したとき永久的なメモリ割り付けに関するいくつかの 統計を印刷するようにします。 -fprofile-arcs プログラムフロー arcs が備え付けられるように、コードを追加します。 実行の間、プログラムは、各分岐と呼び出しが何回実行されたか、および それが何回試みられ返されたかを記録します。コンパイルされたプログラ ムが終了するとき、このデータを各ソースファイルに対して auxname.gcda と呼ばれるファイルに保存します。このデータは、プロファイルで指示さ れた最適化 (-fbranch-probabilities) またはテストカバレッジ分析 (-ftest-coverage) で使用されます。各オブジェクトファイルの auxname は、明示的に指定され、最後の実行形式でなければ、出力ファイルの名前 から生成され、そうでなければ、ソースファイルの basename です。訳注: basename はソースファイルからサフィックスを取り除いた名前、 basename(1) を参照。どちらの場合も、任意のサフィックスが削除されま す (例えば、入力ファイルが dir/foo.c なら foo.gcda、-o dir/foo.o と 指定された出力ファイルなら dir/foo.gcda です)。 --coverage このオプションは、カバレッジ分析のために備えられているコンパイルと コードリンクのために使用されます。オプションは、-fprofile-arcs -ftest-coverage (コンパイルするとき) と -lgcov (リンクするとき) の ための同義語です。それらのオプションのより詳しい情報については、文 書を参照してください。 * ソースファイルを -fprofile-arcs に最適化とコード生成オプション を追加してコンパイルします。テストカバレッジ分析のためには、追 加の -ftest-coverage オプションを使用します。利用者はプログラム のすべてのソースファイルのプロファイルを行う必要はありません。 * 利用者のオブジェクトファイルを -lgcov または -fprofile-arcs (後 者は前者の意味を含みます) つきでリンクします。 * arc プロファイル情報を生成するために、典型的な仕事量 (workload) でプログラムを実行します。これは任意の回数繰り返されます。利用 者は、プログラムのインスタンスを並列 (concurrent) に実行するこ とができ、ロックをサポートするファイルシステムが提供され、デー タファイルは、正しく更新されます。訳注: 原文がおかしく訳せませ ん。また、"fork" 呼び出しは、検出されて、正しく取り扱われます (二重のカウントは起こらないでしょう)。 * プロファイル指示された最適化のために、同じ最適化とコード生成オ プションに -fbranch-probabilities を加えて再びソースファイルを コンパイルします。 * テストカバレッジ分析のために、.gcno and .gcda ファイルから人間 に解読可能な情報を生成するために gcov を使用します。詳細につい ては gcov の文書を参照してください。 -fprofile-arcs をつけて、利用者のプログラムの各関数のために、GCC は プログラムフローグラフを作成し、次にグラフのためのスパニングツリー を見つけます。スパニングツリーにない arc のみ計装されなければなりま せん: コンパイラは、これらの arc が実行される回数をカウントするため のコードを追加します。arc が単にブロックで終了するか、または単にブ ロックに入るとき、計装コードをブロックに追加することができます。そ うでなければ、計装コードを保持するために新しい基本ブロックを作成し なければなりません。 -ftest-coverage gcov コードカバレッジユーティリティがプログラムのカバレッジを表示す るために使用することができるノートファイルを生成します。各ソース ファイルのノートファイルは auxname.gcno と呼ばれます。auxname の説 明とテストカバレッジデータをどうのように生成するかに関する指示につ いては、上記の -fprofile-arcs オプションを参照してください。カバ レッジデータは、利用者が最適化しないなら、より密接にソースファイル に適合します。 -dletters -fdump-rtl-pass コンパイルの間に、letters によって指定される時期にデバッグのダンプ を行うように指示します。これは、コンパイラの RTL ベースのパスをデ バッグするために使用されます。ほとんどのダンプのファイル名は、パス 番号と単語を dumpname に追加することによって作られます。dumpname は、明白に指定され、実行形式でなければ、出力ファイルの名前から生成 され、そうでなければ、ソースファイルの basename です。 文字を -d オプションにわたすか、または長い -fdump-rtl スイッチで、 ほとんどのデバッグダンプを有効にすることができます。ここに、指定で きる letter と pass で使用される文字とその意味を示します: -dA その他のデバッグ情報をつけてアセンブラ出力に注釈つけます。 -dB -fdump-rtl-bbro ブロックの並べ替えの後に、file.148r.bbro にダンプします。 -dc -fdump-rtl-combine 命令結合の後に、ファイル file.129r.combine ダンプします。 -dC -fdump-rtl-ce1 -fdump-rtl-ce2 -dC と -fdump-rtl-ce1 は、変換されるなら、最初の後に、ファイル file.117r.ce1 へのダンプを有効にします。-dC と -fdump-rtl-ce2 は、変換されるなら、2 番目の後にファイル file.130r.ce2 へのダン プを有効にします。 -dd -fdump-rtl-btl -fdump-rtl-dbr -dd と -fdump-rtl-btl は、ブランチターゲットロード最適化の後に ファイル file.31.btl へのダンプを有効にします。-dd と -fdump-rtl-dbr は、遅延ブランチスケジューリングの後に file.36.dbr へのダンプを有効にします。 -dD 通常の出力に加えて、前処理の終わりに、すべてのマクロ定義をダン プします。 -dE -fdump-rtl-ce3 変換されるなら、3 番目の後に、file.146r.ce3 へダンプします。 -df -fdump-rtl-cfg -fdump-rtl-life -df と -fdump-rtl-cfg は、制御とデータフロー解析の後に、 file.116r.cfg へのダンプを有効にします。-df と -fdump-rtl-cfg は、生存解析の後に、file.128r.life1 と file.135r.life2 へのダン プを有効にします。 -dg -fdump-rtl-greg グローバルレジスタの割り付けの後に、file.139r.greg へダンプしま す。 -dG -fdump-rtl-gcse -fdump-rtl-bypass -dG と -fdump-rtl-gcse は、GCSE の後に、file.114r.gcse へのダン プを有効にします。-dG と -fdump-rtl-bypass は、ジャンプバイパス と制御フロー最適化の後に、file.115r.bypass へのダンプを有効にし ます。 -dh -fdump-rtl-eh EH 操作コードの確定化 (finalization) の後に、file.02.eh にダン プします。 -di -fdump-rtl-sibling シブリング (sibling, 兄弟) 呼び出し最適化の後に、 file.106r.sibling にダンプします。 -dj -fdump-rtl-jump 最初のジャンプ最適化の後に、file.112r.jump にダンプします。 -dk -fdump-rtl-stack レジスタからスタックへの変換の後に、file.152r.stack にダンプし ます。 -dl -fdump-rtl-lreg ローカルレジスタ割り付けの後に、file.138r.lreg にダンプします。 -dL -fdump-rtl-loop2 -dL と -fdump-rtl-loop2 は、ループ最適化パスの後に file.119r.loop2, file.120r.loop2_init, file.121r.loop2_invariant と file.125r.loop2_done へのダンプを 有効にします。 -dm -fdump-rtl-sms モジュロ (modulo) スケジューリングの後に、file.136r.sms にダン プします。 -dM -fdump-rtl-mach マシンに依存する再編成パスを実行した後に、file.155r.mach にダン プします。 -dn -fdump-rtl-rnreg レジスタの再番号付けの後に、file.147r.rnreg にダンプします。 -dN -fdump-rtl-regmove レジスタ移動パスの後に、file.132r.regmove にダンプします。 -do -fdump-rtl-postreload ポストリロード (post-reload) 最適化の後に、file.24.postreload にダンプします。 -dr -fdump-rtl-expand RTL 生成の後に、file.104r.expand にダンプします。 -dR -fdump-rtl-sched2 2 番目のスケジューリングパスの後に、file.150r.sched2 にダンプし ます。 -ds -fdump-rtl-cse CSE (しばしば CSE に続くジャンプ最適化を含む) の後に、 file.113r.cse にダンプします。 -dS -fdump-rtl-sched 最初のスケジューリングパスの後に、file.21.sched にダンプしま す。 -dt -fdump-rtl-cse2 2 番目の CSE パス (しばしば CSE に続くジャンプ最適化を含む) の 後に、file.127r.cse2 にダンプします。 -dT -fdump-rtl-tracer トレーサを実行した後に、file.118r.tracer にダンプします。 -dV -fdump-rtl-vpt -fdump-rtl-vartrack -dV と -fdump-rtl-vpt は、値のプロファイル変換の後に、 file.10.vpt へのダンプを有効にします。-dV と -fdump-rtl-vartrack は、変数追跡の後に、file.154r.vartrack への ダンプを有効にします。 -dw -fdump-rtl-flow2 2 番目のフローパスの後に、file.142r.flow2 にダンプします。 -dz -fdump-rtl-peephole2 ピープホール (peephole, のぞき穴) パスの後に、 file.145r.peephole2 にダンプします。 -dZ -fdump-rtl-web ライブ範囲分割の後に、file.126r.web にダンプします。 -da -fdump-rtl-all 上にリストされたすべてのダンプを行います。 -dH エラーが起こるときはいつも、コアダンプを行います。 -dm 実行の終りにメモリ使用量の統計を標準エラーに印刷します。 -dp どのパターンと代替手段が使用されたかを示すコメントをつけてアセ ンブラ出力を注釈します。各命令の長さも印刷されます。 -dP 各命令の前にコメントとしてアセンブラ出力に RTL をダンプします。 -dp 注釈もオンにします。 -dv (-d または -fdump-rtl-pass のいずれかで) 他に示されたダンプファ イルごとに、VCG で表示される適切な制御フローグラフの表現を file.pass.vcg にダンプします。 -dx 関数をコンパイルする代わりに関数のための RTL を単に生成します。 通常、r (-fdump-rtl-expand) で使用されます。 -dy 構文解析の間にデバッグ情報を標準エラーにダンプします。 -fdump-noaddr デバッグダンプ (上記の -d オプション参照) を行うとき、アドレス出力 を抑制します。これで、異なったコンパイラバイナリ、および/または、異 なった text / bss / data / heap / stack / dso 開始位置で、コンパイ ラ呼び出しのためにデバッグダンプで異なった使用のためによりふさわし くします。 -fdump-unnumbered デバッグダンプ (上記の -d オプション参照) を行うとき、指示番号、行 番号の注意、とアドレス出力を抑制します。これによって、異なったオプ ションをつけて、特に -g のあるなしにかかわらず、コンパイラ実行のた めのデバッグダンプで diff を使用することをより実行可能とします。 -fdump-translation-unit (C++ のみ) -fdump-translation-unit-options (C++ のみ) 変換ユニット全体のツリー構造の表現をファイルにダンプします。ファイ ル名は、ソースファイル名に .tu を追加して作成されます。-options 形 式が使用されるなら、options は -fdump-tree オプションで説明されてい るダンプの詳細を制御します。 -fdump-class-hierarchy (C++ のみ) -fdump-class-hierarchy-options (C++ のみ) 各クラスの階層構造と仮想関数テーブルのレイアウトの表現をファイルに ダンプします。ファイル名は、ソースファイル名に .class を追加して作 成されます。-options 形式が使用されるなら、options は -fdump-tree オプションで説明されているダンプの詳細を制御します。 -fdump-ipa-switch 様々なステージの相互手続きの解析言語ツリーをファイルにダンプするこ とを制御します。ファイル名は、ソースファイル名にスイッチ特有のの接 尾辞を追加することによって生成されます。次のダンプが利用可能です: all すべての相互手続きの解析ダンプを有効にします。現在、唯一の生産 されるダンプは、cgraph ダンプです。 cgraph 呼び出しグラフの最適化、未使用関数の削除、とインライン化の決定 に関する情報をダンプします。 -fdump-tree-switch -fdump-tree-switch-options 中間言語ツリーを処理する様々なステージでファイルへのダンプを制御し ます。ファイル名は、スイッチ特有のサフィックスをソースファイル名に 追加することによって生成されます。-options 形式が使用されるなら、 options はダンプの詳細を制御する - で区切られたリストです。すべての オプションがすべてのダンプに適用可能というわけではなく、意味のない ものは無視されます。次のオプションが利用可能です: address それぞれのノードのアドレスを印刷します。通常、これは、環境と ソースファイルにしたがって変化するので、重要ではありません。主 要な使用は、ダンプファイルとデバッグ環境を結びつけることです。 slim 単にスコープが到達しているので、スコープのメンバまたは関数の本 体のダンプを抑制します。項目がある他のパスによって直接到達可能 であるとき、単にそのような項目をダンプします。ツリーを清書プリ ント (pretty-print) でダンプするとき、このオプションは、制御構 造体の本体をダンプすることを抑制します。 raw ツリーの生の表現を印刷 (表示) します。デフォルトで、ツリーは、C のような表現で清書プリントされます。 details (すべてのダンプオプションによって指示されるわけではない) より詳 細なダンプを有効にします。 stats (すべてのダンプオプションによって指示されるわけではない) パスに 関する様々な統計値のダンプを有効にします。 blocks (生のダンプで無効にされる) 基本的なブロック境界の表示を有効にし ます。 vops すべての文のための仮想のオペランドの表示を有効にします。 lineno 文のための行番号の表示を有効にします。 uid 各変数のためのユニークな ID ("DECL_UID") の表示を有効にします。 all raw, slim と lineno を除いて、すべてのオプションをオンにしま す。 次のツリーダンプが可能です: original 任意のツリーベースの最適化の前に、file.original にダンプしま す。 optimized すべてのツリーベースの最適化の後に、file.optimized にダンプしま す。 inlined 関数のインライン化の後に、file.inlined にダンプします。 gimple gimplification パスの前後の各関数をファイルにダンプします。ファ イル名は、ソースファイル名に .gimple を追加することによって作ら れます。 cfg 各関数の制御フローグラフをファイルにダンプします。ファイル名 は、ソースファイル名に .cfg を追加することによって作られます。 vcg 各関数の制御フローグラフを VCG 形式でファイルにダンプします。 ファイル名は、ソースファイル名に .vcg を追加することによって作 られます。ファイルが複数の関数を含んでいるなら、直接 VCG によっ て生成されたファイルを使用できないことに注意してください。利用 者は、最初に、各関数のグラフをそれ自体の別々のファイルにカット アンドペーストする必要ああります。 ch ループヘッダをコピーした後に、各関数をダンプします。ファイル名 は、ソースファイル名に .ch を追加することによって作られます。 ssa SSA 関連の情報をファイルにダンプします。ファイル名は、ソース ファイル名に .ssa を追加することによって作られます。 salias 構造体エイリアシング変数情報をファイルにダンプします。ファイル 名は、ソースファイル名に .salias を追加することによって作られま す。 alias 各関数のためのエイリアシング情報をダンプします。ファイル名は、 ソースファイル名に .alias を追加することによって作られます。 ccp CCP の後に各関数をダンプします。ファイル名は、ソースファイル名 に .ccp を追加することによって作られます。 storeccp STORE-CCP の後に各関数をダンプします。ファイル名は、ソースファ イル名に .storeccp を追加することによって作られます。 pre 部分的な冗長性の除去の後にツリーをダンプします。ファイル名は、 ソースファイル名に .pre を追加することによって作られます。 fre 完全な冗長性の除去の後にツリーをダンプします。ファイル名は、 ソースファイル名に .fre を追加することによって作られます。 copyprop コピー伝播の後にツリーをダンプします。ファイル名は、ソースファ イル名に .copyprop を追加することによって作られます。 store_copyprop コピー伝播を格納した後にツリーをダンプします。ファイル名は、 ソースファイル名に .store_copyprop を追加することによって作られ ます。 dce 死んでいるコード (dead code) の除去の後に各関数をダンプします。 ファイル名は、ソースファイル名に .dce を追加することによって作 られます。 mudflap 泥よけ (mudflap) 計装を加えた後に各関数をダンプします。ファイル 名は、ソースファイル名に .mudflap を追加することによって作られ ます。 sra 集合体のスカラ置換を実行した後に各関数をダンプします。ファイル 名は、ソースファイル名に .sra を追加することによって作られま す。 sink コード sinking (沈没) を実行した後に各関数をダンプします。ファ イル名は、ソースファイル名に .sink を追加することによって作られ ます。 dom dominator (支配者) ツリーの最適化を適用した後に各関数をダンプし ます。ファイル名は、ソースファイル名に .dom を追加することに よって作られます。 dse 死んでいる格納 (dead store) の除去を適用した後に各関数をダンプ します。ファイル名は、ソースファイル名に .dse を追加することに よって作られます。 phiopt PHI ノードを直線的コードに最適化した後に各関数をダンプします。 ファイル名は、ソースファイル名に .phiopt を追加することによって 作られます。 forwprop 単一使用変数の前方伝播の後に各関数をダンプします。ファイル名 は、ソースファイル名に .forwprop を追加することによって作られま す。 copyrename コピー改名最適化を適用した後に各関数をダンプします。ファイル名 は、ソースファイル名に .copyrename を追加することによって作られ ます。 nrv 一般的なツリーで指定された返り値の最適化適用した後に各関数をダ ンプします。ファイル名は、ソースファイル名に .nrv を追加するこ とによって作られます。 vect ループのベクトル化を適用した後に各関数をダンプします。ファイル 名は、ソースファイル名に .vect を追加することによって作られま す。 vrp Value Range Propagation (VRP) の後に各関数をダンプします。ファ イル名は、ソースファイル名に .vrp を追加することによって作られ ます。 all このオプションで提供されているフラグをつけて利用可能なツリーダ ンプを有効にします。 -ftree-vectorizer-verbose=n このオプションは、デバッグ出力 vectorizer (ベクトル化プログラム) 印 刷の量を制御します。この情報は、通常ダンプリストファイル、.vect へ の出力されますが、-fdump-tree-all または -fdump-tree-vect が指定さ れないなら、標準エラーに書き込まれます。n=0 に関しては、診断情報 は、報告されません。n=1 なら、vectorizer は、ベクトル化された各ルー プとベクトル化されたループの合計数を報告します。また、n=2 なら、 vectorizer は、最初の解析フェーズ (vect_analyze_loop_form) に渡され たベクトル化されていないループ - すなわち、countable, inner-most, single-bb, single-entry/exit ループ、を報告します。これは、 -fdump-tree-vect-stats が使用する同じ冗長レベルです。より高い冗長レ ベルは、それぞれの報告されたループのためにダンプされたされたより詳 しい情報か、またはより多くのループに対してを報告された同じ量の情報 のいずれかを意味します: n=3 なら、整列に関連する情報が、報告に追加 されます。n=4 なら、データ参照に関連する情報 (例えば、メモリの依存 関係、メモリアクセスパターン) が、報告に追加されます。また、n=5 な ら、vectorizer は、最初の解析フェーズ (すなわち、カウントされなかっ たか、または複雑な制御フローがあるかもしれない) に渡されなかったベ クトル化されていない inner-most ループを報告します。n=6 なら、 vectorizer は、ベクトル化されていない入れ子にされたループを報告しま す。n=7 に関しては、vectorizer がその解析と変換の間に生成されるすべ ての情報が報告されます。これは、-fdump-tree-vect-details が使用する 同じ冗長レベルです。 -frandom-seed=string このオプションは GCC が使用する種を提供し、そうでなければ、乱数を使 用します。すべてのコンパイルされたファイルで異なっていなければなら ない特定のシンボル名を生成するために使用されます。また、カバレッジ データファイルと生成されたオブジェクトファイルのユニークなスタンプ をつけるために使用されます。利用者は、再生可能な方法で同じオブジェ クトファイルを作成するために -frandom-seed オプションを使用すること ができます。 string は、コンパイルするすべてのファイルで異なっているべきです。 -fsched-verbose=n 命令スケジューリングを使用するターゲットでは、このオプションはスケ ジューラが印刷するデバッグ出力の量を制御します。-dS または -dR が指 定されないなら、この情報は標準エラーに書き込まれます、指定された場 合、普通のダンプリストファイル、それぞれ .sched または .sched2 に出 力されます。しかしながら、n が 9 より大きいなら、出力は常に標準エ ラーに印刷されます。 n が 0 より大きいなら、-fsched-verbose は、-dRS と同じ情報を出力し ます。n が 1 より大きいなら、基本ブロック確率、詳細な準備リスト (ready list) 情報と unit/insn 情報も出力します。n が 2 より大きいな ら、中断ポイント、制御フローと領域情報で RTL を含みます。そして、n が 4 を越えるなら、-fsched-verbose は依存情報も含みます。 -save-temps 通常の "一時的な" 中間ファイルを削除せずに格納します。それらをカレ ントディレクトリに置いて、ソースファイルに基づいてそれらの名前を付 けます。したがって、-c -save-temps をつけて foo.c をコンパイルする と、foo.o と同様に、ファイル foo.i と foo.s を生成します。たとえ、 現在コンパイラは通常統合プリプロセッサを使用ても、これは前処理され た foo.i 出力ファイルを作成します。 -x コマンドラインのオプションと組み合わせて使用されるとき、 -save-temps は、中間ファイルとして同じ拡張がある入力ソースファイル を上書きすることを避けるために十分賢明です。対応する中間ファイル は、-save-temps を使用する前にソースファイルを改名することによって 取得できます。 -time コンパイルのシーケンスにおいて各サブプロセスでかかった CPU 時間を報 告します。C ソースファイルについては、これは、コンパイラ自体とアセ ンブラ (と、リンクが行われるなら、リンカも) です。出力は次のような ものです: # cc1 0.12 0.01 # as 0.00 0.01 各行の最初の数値は "ユーザ時間" で、すなわち、プログラム自体の実行 に費やされた時間です。2 番目の数値は "システム時間" で、プログラム のためにオペレーティングシステムのルーチンの実行に費やされた時間で す。どちらの数値も秒です。 -fvar-tracking 変数追跡パスを実行します。それは変数がコードの各位置に格納されると ころで計算されます。(デバッグ情報形式が、この情報をサポートするな ら) より良いデバッグ情報が生成されます。 最適化 (-Os, -O, -O2, ...)、デバッグ情報 (-g) でコンパイルして、デ バッグ情報形式がそれをサポートするとき、それはデフォルトで有効にさ れます。 -print-file-name=library リンクするとき使用されるライブラリファイル library の完全な絶対名を 印刷します --- そして、他に何もしません。このオプションについて、 GCC は、コンパイルもリンクも何もしません。ただファイル名を印刷しま す。 -print-multi-directory コマンドラインに存在する任意の他のスイッチによって選択された multilib に対応するディレクトリ名を印刷します。このディレクトリは GCC_EXEC_PREFIX に存在するはずです。 -print-multi-lib multilib ディレクトリ名からそれらを有効にするコンパイラスイッチへの マッピングを印刷します。ディレクトリ名は ; によってスイッチと分離さ れ、各スイッチは複数のスイッチの間の空白なしで、@samp{- の代わりに @} で始まります。これはシェル処理で簡単に行えるはずです。 -print-prog-name=program -print-file-name に似ていますが、cpp のようなプログラムを検索しま す。 -print-libgcc-file-name -print-file-name=libgcc.a と同じです。 これは、利用者が -nostdlib または -nodefaultlibs を使用しますが、 libgcc.a とリンクしたいとき、役に立ちます。次のように行うことができ ます: gcc -nostdlib <files>... `gcc -print-libgcc-file-name` -print-search-dirs 設定されたインストールディレクトリの名前と gcc が検索するプログラム とライブラリディレクトリのリストを印刷します --- そして、他に何もし ません。 これは、gcc がエラーメッセージ installation problem, cannot exec cpp0: No such file or directory を印刷するとき、役に立ちます。これ を解決するために、利用者は、gcc が、それらを見つけると予想するとこ ろに cpp0 と他のコンパイラコンポーネントを置くか、または環境変数 GCC_EXEC_PREFIX に利用者がそれらをインストールしたディレクトリを設 定する必要があります。末尾の / を忘れないでください。 -dumpmachine コンパイラのターゲットマシン (例えば、i686-pc-linux-gnu) を印刷しま す --- そして、他に何もしません。 -dumpversion コンパイラのバージョン (例えば、3.0) を印刷します --- そして、他に 何もしません。 -dumpspecs コンパイラの組み込み仕様を印刷します --- そして、他に何もしません。 (これは、GCC 自体が構築されているとき、使用されます。) -feliminate-unused-debug-types 通常、DWARF2 出力を生成するとき、GCC は、実際にそのコンパイルユニッ トで使用されるかどうかにかかわらず、コンパイルユニットで宣言された すべてのタイプのためのデバッグ情報を出力します。デバッガにおいて、 利用者のプログラムで実際に使用されないタイプ (しかし、宣言されてい る) への値をキャストしたい場合に、しばしば役に立ちます。しかしなが ら、よりしばしば、これはかなりの量の無駄な空間をもたらします。この オプションで、GCC は、コンパイルされるソースファイル中で使用される どこにもないタイプのデバッグシンボルの出力を生成しません。 最適化を制御するオプション これらのオプションは様々な種類の最適化を制御します。 なにも最適化オプションがなければ、コンパイラのゴールは、コンパイルのコ ストを削減して、期待された結果を生成するデバッグを行うことです。(複数 の) 文は独立しています: 利用者が、文の間のブレークポイントでプログラム を停止するなら、次に、新しい値を任意の変数に代入するか、またはプログラ ムカウンタを関数中の任意の別の文に変更し、ソースコードから予想される結 果を正確に得ることができます。 最適化フラグをオンにすると、コンパイラは、コンパイル時間とプログラムを デバッグする能力を犠牲にして、性能、および/または、コードサイズを改良す る試みを行います。 コンパイラは、自体が持っているプログラムの知識に基づく最適化を実行しま す。特に、最適化レベル -O と上記は、コンパイラが、関数をコンパイルする とき、ファイル中の後の関数から得られた情報を考慮することができる、unit- at-a-time モードを有効にします。複数のファイルを unit-at-a-time モード で一度に単一の出力ファイルにコンパイルすることによって、コンパイラは、 それらをそれぞれコンパイルするとき、ファイルのすべてから得られた情報を 使用できます。 すべての最適化は、フラグによって直接制御されわけではありません。フラグ がある最適化だけリストされます。 -O -O1 最適化します。最適化をおこなうコンパイルは、大きい関数に対して、い くらか長い時間とずっと多いメモリを必要とします。 -O によって、コンパイラは、ものすごいコンパイル時間がかかる任意の最 適化を実行しないで、コードサイズと実行時間を削減することを試みま す。 -O は次の最適化フラグをオンにします: -fdefer-pop -fdelayed-branch -fguess-branch-probability -fcprop-registers -fif-conversion -fif-conversion2 -ftree-ccp -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-ter -ftree-lrs -ftree-sra -ftree-copyrename -ftree-fre -ftree-ch -funit-at-a-time -fmerge-constants また、-O は、デバッグに干渉しないマシンで -fomit-frame-pointer をオ ンにします。 -O2 さらに最適化します。GCC は、空間と速度のトレードオフに関連しない、 ほとんどすべてのサポートされた最適化を実行します。利用者が -O2 を指 定するとき、コンパイラは、ループ展開または関数のインライン化を実行 しません。-O と比べて、このオプションは、コンパイル時間と生成コード の性能の両方を向上させます。 -O2 は -O によって指定されたすべての最適化フラグをオンにします。ま た、次の最適化フラグをオンにします: -fthread-jumps -fcrossjumping -foptimize-sibling-calls -fcse-follow-jumps -fcse-skip-blocks -fgcse -fgcse-lm -fexpensive-optimizations -frerun-cse-after-loop -fcaller-saves -fpeephole2 -fschedule-insns -fschedule-insns2 -fsched-interblock -fsched-spec -fregmove -fstrict-aliasing -fstrict-overflow -fdelete-null-pointer-checks -freorder-blocks -freorder-functions -falign-functions -falign-jumps -falign-loops -falign-labels -ftree-vrp -ftree-pre 計算された goto を使用するプログラムで -O2 の呼び出しに関する -fgcse の下での警告に注意してください。 -O2 は、Ada コンパイラのための -ftree-vrp をオンに切り替えません。 このオプションは、Ada コンパイラのために有効にするためにコマンドラ インで明白に指定されなければなりません。 -O3 さらに最適化します。-O3 は、-O2 によって指定されたすべての最適化を オンにし、また、-finline-functions, -funswitch-loops と -fgcse-after-reload オプションもオンにします。 -O0 最適化しません。これはデフォルトです。 -Os サイズに対して最適化します。-Os は、通常コードサイズを増加させな い、すべての -O2 最適化を有効にします。また、コードサイズを減少する ように設計されたさらなる最適化を実行します。 -Os は次の最適化フラグを無効にします: -falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks -freorder-blocks-and-partition -fprefetch-loop-arrays -ftree-vect-loop-version 複数の -O オプションを使用するなら、レベル番号のあるなしにかかわら ず、最後のオプションが有効にされます。 -fflag 形式のオプションは、マシン独立のフラグを指定します。ほとんどのフ ラグには、肯定形式と否定形式の両方があります。-ffoo の否定形式は -fno-foo となります。下記のテーブルでは、1 つの形式だけがリストされ --- 通常利用者が使用するものです。利用者は、no- を取り除くか、または追加す るることによって、もう片方の形式を見当つけることができます。 次のオプションは特定の最適化を制御します。それらは、-O オプションまたは 関連するもののいずれかによってアクティブとなります。利用者は、実行され るべきである最適化の "微調整" が必要であるとき、まれに、次のフラグを使 用することができます。 -fno-default-inline 単にメンバ関数がクラススコープ中で定義されるので、デフォルトでそれ らをインライン化しません (C++ のみ)。そうでなければ、利用者が -O を 指定するとき、クラススコープ中で定義されたメンバ関数は、デフォルト でインラインにコンパイルされます。すなわち、利用者はメンバ関数名の 前に inline を追加する必要はありません。 -fno-defer-pop その関数が返るとすぐに、各関数呼び出しへの引数を常にポップします。 関数呼び出しの後に引数をポップしなければならないマシンについては、 コンパイラは、通常、いくつかの関数呼び出しのためにスタックに引数を 蓄積し、それらをいっせいにポップします。 レベル -O, -O2, -O3, -Os で無効です。 -fforce-mem メモリオペランドはそれらで演算する前に、強制的にレジスタにコピーさ れます。これは、すべてのメモリ参照を潜在的な共通部分式にすることに よってより良いコードを生成します。それらが共通部分式でないときに、 命令の組み合わせは、個別のレジスタロードを排除するべきです。このオ プションは、現在 nop (効果なし) であり、4.3 で取り除かれます。 -fforce-addr メモリアドレス定数はそれらで演算する前に、強制的にレジスタにコピー されます。 -fomit-frame-pointer フレームポインタを必要としない関数のためのレジスタのフレームポイン タを保存しません。これはフレームポインタを保存、設定、復旧する命令 を避けます。また、それで、多くの関数で余分なレジスタを利用可能とし ます。また、それで、いくつかのマシンでデバッグを不可能にします。 VAX などのようないくつかのマシンでは、標準の呼び出しシーケンスが自 動的にフレームポインタを取り扱い、それが存在しないふりをすることに よって何も保存しないので、このフラグは効果がありません。マシン記述 マクロ "FRAME_POINTER_REQUIRED" は、ターゲットマシンがこのフラグを サポートするかどうかを制御しています。 レベル -O, -O2, -O3, -Os で有効です。 -foptimize-sibling-calls シブリング (sibling, 兄弟) とテール再帰呼び出しを最適化します。 レベル -O2, -O3, -Os で有効です。 -fno-inline "inline" キーワードに注意を払いません。通常、このオプションは、任意 の関数のインライン展開することを避けるために使用されます。利用者が 最適化しないなら、関数をインライン展開できないことに注意してくださ い。 -finline-functions すべての単純な関数をそれらの呼び出し側に統合します。コンパイラは、 単にどの関数がこの方法で統合する価値が足りるか発見的に決定します。 与えられた関数へのすべての呼び出しが統合され、関数が "static" であ ると宣言されるなら、通常、関数は、それ自体でアセンブラコードとして 出力されません。 レベル -O3 で有効です。 -finline-functions-called-once 一度呼び出されるすべて "static" 関数は、たとえ、それらが "inline" とマークされても、それらの呼び出し側に対して、インラインと見なされ ます。与えられた関数への呼び出しが統合されているなら、関数は、それ 自体でアセンブラコードとして出力されません。 -funit-at-a-time が有効にされるなら、有効にされます。 -fearly-inlining "always_inline" によってマークされたインライン関数と -fprofile-generate 計装と実際のインラインパスを行う前に関数呼び出し のオーバヘッドより小さく思える本体がある関数。そうすることによっ て、極めて安くプロファイリングができ、通常、入れ子にされたラッパ関 数の大きなチェーンを持っているプログラムで、より速いインラインとな ります。 デフォルトで有効にされます。 -finline-limit=n デフォルトでは、GCC はインライン化することができる関数のサイズを制 限しています。このフラグによって、明らかにインラインとしてマークさ れる (すなわち、インラインキーワードでマークされるか、または c++ で クラス定義内で定義される) 関数のためのこの制限を制御できます。n は、(パラメータの取り扱いをカウントしない) 疑似命令の数のインライン 化することができる関数のサイズです。n のデフォルト値は 600 です。こ の値を増加することは、コンパイル時間とメモリ消費のコストを犠牲にし てよりインライン化されたコードをもたらすことができます。減少するこ とは、通常、コンパイルは、より速くなり、より少ないコードがインライ ン化されます (おそらくより遅いプログラムを意味します)。このオプショ ンは、特に C++ で再帰的なテンプレートに基づくものなどのように、かな りインライン化を使用するプログラムの役に立ちます。 インライン化は、--param name=value を使用することによって個別に指定 される多くのパラメータによって実際に制御されます。-finline-limit=n オプションは、次のように、これらのパラメータのいくつかを設定します: max-inline-insns-single は I<n>/2 に設定します。 max-inline-insns-auto は I<n>/2 に設定します。 min-inline-insns は 130 または I<n>/4 のどちらか小さいほう。 max-inline-insns-rtl は I<n> に設定します。 インライン化を制御する個別のパラメータの文書については下記を参照し てください。 注: 疑似命令は、この特定のコンテキストにおいて、関数のサイズの抽象 的な大きさを表します。決して、アセンブリ命令のカウントを表していな くて、そのこと自体の正確な意味は、あるリリースから別のリリースで変 更されるかもしれません。 -fkeep-inline-functions C では、たとえ、関数が、呼び出し側のすべての関数にインライン化され ていても、"inline" と宣言されている "static" 関数をオブジェクトファ イルに出力します。このスイッチは、GNU C の "extern inline" 拡張を使 用する関数に影響しません。C++ では、ありとあらゆるインライン関数を オブジェクトファイルに出力します。 -fkeep-static-consts 最適化がオンにされていないとき、たとえ変数が参照されなくても、 "static const" で宣言された変数を出力します。 GCC は、デフォルトでこのオプションを有効にします。最適化がオンにさ れいるかどうかにかかわらず、変数が参照されているかコンパイラに チェックさせたいなら、-fno-keep-static-consts オプションを使用しま す。 -fmerge-constants コンパイルユニットを越えて同じ定数 (文字列定数と浮動小数点定数) を マージすることを試みます。 このオプションは、アセンブラとリンカがサポートするなら、最適化され たコンパイルのためのデフォルトです。この振る舞いを抑制するために は、-fno-merge-constants を使用します。 レベル -O, -O2, -O3, -Os で有効です。 -fmerge-all-constants 同じ定数と同じ変数をマージすることを試みます。 このオプションは -fmerge-constants の意味を含みます。 -fmerge-constants に加えて、これは、例えば、整数または浮動小数点タ イプの初期化された定数配列または初期化された定数変数さえも考慮しま す。C または C++ のような言語は、それぞれの自動的でない変数が別個の 位置にあることを必要とするので、このオプションを使用すると、一致し ない振る舞いの結果となります。 -fmodulo-sched 最初のスケジューリングパスの直前にスイングモジュロスケジューリング (swing modulo scheduling) を実行します。このパスは、異なった繰り返 しを重ね合わせることによって、最も奥深いループと再順序付けるそれら の命令を検索します。 -fno-branch-count-reg カウントレジスタで "減少と分岐" 命令を使用しませんが、代わりにレジ スタを減少させ、それを 0 と比較して、次に結果に基づいて分岐する命令 のシーケンスを生成します。このオプションは、x86, PowerPC, IA-64 と S/390 が挙げられる、そのような命令をサポートするアーキテクチャでの み重要です。 デフォルトは、-fbranch-count-reg です。 -fno-function-cse レジスタに関数のアドレスを置きません。各命令は、明示的に関数のアド レスを含んでいる定数関数を呼び出します。 このオプションは、効率的でないコードとなりますが、アセンブラ出力を 変更するいくつかの変わったハッキングは、このオプションが使用されて いないときに実行される最適化によって混乱させられるかもしれません。 デフォルトは -ffunction-cse です。 -fno-zero-initialized-in-bss ターゲットが BSS セクションをサポートするなら、GCC はデフォルトで 0 に初期化される変数を BSS に置きます。これは結果のコードにおいて空間 を節約することができます。 このオプションは、いくつかのプログラムが、明白に変数がデータセク ションに置かれることを当てにしているので、この振る舞いをオフにしま す。例えば、結果の実行形式がそのセクションの始まりを見つけることが でき、そして/または、それに基づいてアサンプション (assumption) を行 うことができるようにです。 デフォルトは -fzero-initialized-in-bss です。 -fbounds-check それをサポートするフロントエンドのために、配列にアクセスするために 使用されるインデックスが宣言している範囲内であるかチェックする追加 コードを生成します。これは、現在、Java と Fortran フロントエンドに よってのみサポートされ、このオプションは、それぞれ真と偽をデフォル トとします。 -fmudflap -fmudflapth -fmudflapir (C と C++) をサポートするフロントエンドのために、すべての危険なポイ ンタ/配列の参照解除の操作、いくつかの標準ライブラリ文字列/ヒープ関 数、といくつかの範囲/正当性のテストを構築する他の関連を計装していま す。そのように計装されたモジュールは、バッファオーバフロー、無効の ヒープの使用、とある他のクラスの C/C++ プログラミングエラーを免除さ れるべきです。計装は、リンク時に -fmudflap が与えられるなら、プログ ラムにリンクされる、別々のランタイムライブラリ (libmudflap) に頼り ます。計装されたプログラムの実行時の振る舞いは、MUDFLAP_OPTIONS 環 境変数によって制御されます。オプションについては、"env MUDFLAP_OPTIONS=-help a.out" を参照してください。 プログラムがマルチスレッド化されるなら、コンパイルして、リンクする ために -fmudflap の代わりに -fmudflapth を使用します。計装がポイン タの読み込みを無視するべきであるなら、-fmudflap または -fmudflapth に加えて -fmudflapir を使用します。これは、より少ない計装 (と、した がって、より速い実行) を作成して、まだ、完全なメモリの誤った書き込 みに対する何らかの保護を提供していますが、間違っている読み込みデー タは、プログラム内で伝播することができます。 -fthread-jumps ジャンプが最初に包含された別の比較が見つけられる位置に分岐するかど うか確認するための部分の最適化を実行します。そうだとすれば、最初の 分岐は、条件が真か偽か分からないかどうかによって、2 番目の分岐の目 的地またはそれの直後に続くポイントのいずれかに変えられます。 レベル -O2, -O3, -Os で有効です。 -fcse-follow-jumps 共通の部分式の除去では、ジャンプのターゲットが任意の他のパスによっ ても到達しないとき、ジャンプ命令を通してスキャンします。例えば、CSE が "else" 節で "if" 文に遭遇するとき、CSE は、テストされた条件が偽 のとき、ジャンプに続きます。 レベル -O2, -O3, -Os で有効です。 -fcse-skip-blocks これは、-fcse-follow-jumps と同様ですが、CSE は、条件付きでブロック をスキップするジャンプに続きます。CSE が、else 節のない単純な "if" 文に遭遇するとき、-fcse-skip-blocks によって、CSE は、"if" の本体を 囲むジャンプに続きます。 レベル -O2, -O3, -Os で有効です。 -frerun-cse-after-loop ループの最適化が実行された後に、共通部分式の除去を再実行します。 レベル -O2, -O3, -Os で有効です。 -fgcse グローバルな共通部分式の除去のパスを実行します。また、このパスはグ ローバルな定数とコピー伝播を実行します。 注: 計算された goto、GCC 拡張使用してプログラムをコンパイルすると き、コマンドラインに -fno-gcse を追加するることによってグローバルな 共通部分式の除去パスを無効にするなら、利用者は、より良い実行時性能 を得ることができます。 レベル -O2, -O3, -Os で有効です。 -fgcse-lm -fgcse-lm が有効にされるとき、グローバルな共通部分式の除去は、それ ら自体に格納することよって kill されるだけであるロードを移動するこ とを試みます。これによって、ロード/格納シーケンスを含むループは、 ループの外でロードし、ループ内でコピー/格納するように変更することが できます。 gcse が有効にされるとき、デフォルトで有効です。 -fgcse-sm -fgcse-sm が有効にされるとき、格納モーションパス (store motion pass) は、グローバルな共通部分式の除去の後に実行されます。このパス は、格納をループの外に移動することを試みます。-fgcse-lm に関連して 使用されるとき、ロード/格納シーケンスを含むループをループの前にロー ドし、ループの後に格納するように変更することができます。 どんな最適化レベルでも有効にされません。 -fgcse-las -fgcse-las が有効にされるとき、グローバルな共通部分式の除去パスは同 じメモリ位置 (一部分および全て冗長の両方) への格納の後に来る冗長な ロードを除去します。 どんな最適化レベルでも有効にされません。 -fgcse-after-reload -fgcse-after-reload が有効にされるとき、冗長なロード除去パスが、再 ロードの後に実行されます。このパスの目的は、冗長な spilling (洩れ) をクリーンアップすることです。 -funsafe-loop-optimizations 与えられるなら、ループのオプティマイザは、ループのインデックスが オーバフローしないで、重要な終了条件があるループが無限でないと仮定 します。これは、たとえ、ループのオプティマイザ自体が、これらの仮定 が有効であると証明することができなくても、より広い範囲のループの最 適化を有効にします。-Wunsafe-loop-optimizations を使用して、コンパ イラは、この種類にループを見つけるなら、警告します。 -fcrossjumping クロスジャンプ (cross-jumping) 変換を実行します。この変換は同等な コードを一体化し、コードサイズを節約します。結果のコードは、クロス ジャンプなしよりも良く実行されるかどうかわかりません。 レベル -O2, -O3, -Os で有効です。 -fif-conversion 条件付きジャンプを分岐なし (branch-less) の同等物に変換することを試 みます。これは、条件付きの move, min, max, set フラグと abs 命令、 および標準の演算でできるいくつかのトリックの使用を含んでいます。利 用可能なチップで条件付きの実行の使用は、"if-conversion2" によって制 御されます。 レベル -O, -O2, -O3, -Os で有効です。 -fif-conversion2 条件付きのジャンプを分岐なしの同等物に変換するために (利用可能なと ころで) 条件付きの実行を使用します。 レベル -O, -O2, -O3, -Os で有効です。 -fdelete-null-pointer-checks 使用されていない null ポインタのチェックを識別して除去するためにグ ローバルなデータフロー解析を使用します。コンパイラは、null ポインタ を参照解除することは、プログラムが停止したと仮定します。ポインタが 既に参照解除された後にチェックされるなら、null にすることができませ ん。 いくつかの環境では、この仮定は真実でなく、プログラムは安全に null ポインタを参照解除することができます。その振る舞いに依存するプログ ラムのために、この最適化を無効にするためには、 -fno-delete-null-pointer-checks を使用します。 レベル -O2, -O3, -Os で有効です。 -fexpensive-optimizations 比較的高価な、いくつかの小さな最適化を実行します。 レベル -O2, -O3, -Os で有効です。 -foptimize-register-move -fregmove move 命令とレジスタ拘束の量を最大にするために他の簡単な命令のオペラ ンドとしてレジスタ番号を再割り付けすることを試みます。これは 2 オペ ランド形式の命令があるマシンで特に役立ちます。 -fregmove と -foptimize-register-move は同じ最適化であることに注意 してください。 レベル -O2, -O3, -Os で有効です。 -fdelayed-branch ターゲットマシンでサポートされるなら、遅延分岐命令の後に利用可能な 命令スロットを利用するために命令の並べ替えを試みます。 レベル -O, -O2, -O3, -Os で有効です。 -fschedule-insns ターゲットマシンでサポートされるなら、利用可能でない必要なデータの ために実行ストールを除去するために命令の並べ替えを試みます。これ は、ロードまたは浮動小数点命令の結果が必要になるまで、他の命令が発 行されるのを許可することによって遅い浮動小数点またはメモリロード命 令があるマシンを助けます。 レベル -O2, -O3, -Os で有効です。 -fschedule-insns2 -fschedule-insns と似ていますが、レジスタ割り付けが行われたの後で命 令スケジューリングの追加パスを要求します。これは、レジスタの数が比 較的少なく、メモリロード命令が 1 サイクル以上かかるマシンで特に役に 立ちます。 レベル -O2, -O3, -Os で有効です。 -fno-sched-interblock 基本ブロックを越える命令のスケジューリングを行いません。これは、通 常、レジスタ割り付けの前にスケジューリングするとき、デフォルトで有 効にされます、すなわち、-fschedule-insns または -O2 またはそれ以上 を指定した場合です。 -fno-sched-spec ロードしない命令の投機的な動作を許可しません。これは、通常、レジス タ割り付けの前にスケジューリングするとき、デフォルトで有効にされま す、すなわち、-fschedule-insns または -O2 またはそれ以上を指定した 場合です。 -fsched-spec-load いくつかのロード命令の投機的な動作を許可しません。これは、レジスタ 割り付けの前にスケジューリングするときのみ、意味があります、すなわ ち、-fschedule-insns または -O2 またはそれ以上を指定した場合です。 -fsched-spec-load-dangerous より多くのロード命令の投機的な動作を許可しません。これは、レジスタ 割り付けの前にスケジューリングするときのみ、意味があります、すなわ ち、-fschedule-insns または -O2 またはそれ以上を指定した場合です。 -fsched-stalled-insns=n 2 番目のスケジューリングパスの間に、ストールした insn のキューから 準備リストに (もしあれば) どのくらい多くの insn を早急に移動するこ とができるかを定義します。 -fsched-stalled-insns-dep=n どのくらい多くの insn グループ (サイクル) が、ストールしている insn のキューから早急に削除する候補であるストールしている insn の依存状 態を調べられるかを定義します。-fsched-stalled-insns が使用されてい て、値が 0 でない場合のみ、2 番目のスケジューリングパスの間にのみ効 果があります。 -fsched2-use-superblocks レジスタ割り付けの後にスケジューリングするとき、スーパブロックスケ ジューリングアルゴリズムを使用します。スーパブロックスケジューリン グによって、より速いスケジュールの結果となる、基本的なブロック境界 を越える動作を許可します。GCC によって使用されるすべてのマシンの記 述がアルゴリズムから信頼できない結果を避けることができるほど密接に CPU をモデル化しないので、このオプションは実験的です。 これは、レジスタ割り付けの後にスケジューリングするときのみ、意味が あります、すなわち、-fschedule-insns2 または -O2 またはそれ以上を指 定した場合です。 -fsched2-use-traces レジスタ割り付けの後にスケジューリングするとき、 -fsched2-use-superblocks アルゴリズムを使用し、トレーサのパスを使用 するスーパブロックのサイズを増加させるために追加のコード複製を実行 します。トレースの形成に関する詳細については -ftracer を参照してく ださい。 このモードは、より速いけれども、かなり長いプログラムを生成するはず です。また、-fbranch-probabilities なしで、構成されたトレースは、実 態と合わず、性能に害を与えるかもしれません。これは、レジスタ割り付 けの後にスケジューリングするときのみ、意味があります、すなわち、 -fschedule-insns2 または -O2 またはそれ以上を指定した場合です。 -fsee 冗長な拡張命令を削除し、冗長でないものを LCM を使用して最適な配置に 移動します。 -freschedule-modulo-scheduled-loops modulo (剰余) スケジューリングは、伝統的なスケジューリングに優先 し、ループがスケジュールされている modulo であったなら、我々は、そ のスケジュールの変更から後のスケジューリングパスを防いでもよく、そ れを制御するためにこのオプションを使用します。 -fcaller-saves 関数呼び出しの前後でレジスタを保存して復元するために特別な命令を発 行することによって、そのような呼び出しによって上書きされるレジスタ に値が割り付けられることを有効にします。そのような割り付けは、そう しなければ生成されるものより良いコードをもたらすように思われるとき のみ、行われます。 このオプションは、通常代わりに使用する呼び出しで保存されるレジスタ がない特定のマシンでデフォルトで常に有効にされます。 レベル -O2, -O3, -Os で有効です。 -ftree-pre ツリーで Partial Redundancy Elimination (PRE) を実行します。このフ ラグは、-O2 と -O3 で、デフォルトで有効にされます。 -ftree-fre ツリーで Full Redundancy Elimination (FRE) を実行します。FRE と PRE の違いは、FRE が冗長な計算に導くすべてのパスで計算される表現のみを 考慮することです。この解析は、PRE より速くなりますが、より少ない冗 長性をあらわにします。このフラグは、-O 以上で、デフォルトで有効にさ れます。 -ftree-copy-prop ツリーでコピー伝播を実行します。このパスは、不要なコピー操作を省き ます。このフラグは、-O 以上で、デフォルトで有効にされます。 -ftree-store-copy-prop メモリロードと格納のコピー伝播を実行します。このパスは、メモリ参照 (構造体、グローバル変数、配列など) で不要なコピー操作を除去します。 このフラグは、-O2 以上で、デフォルトで有効にされます。 -ftree-salias ツリーで構造的なエイリアス (別名) 解析を実行します。このフラグは、 -O 以上で、デフォルトで有効にされます。 -fipa-pta 内部手続き (interprocedural) ポインタ解析を実行します。 -ftree-sink ツリーで前方格納モーションを実行します。このフラグは、-O 以上で、デ フォルトで有効にされます。 -ftree-ccp ツリーでスパース (まばらな) 条件付きの定数の伝播 (CCP) を実行しま す。このパスのみ、ローカルのスカラ変数で動作し、-O 以上でデフォルト で有効にされます。 -ftree-store-ccp ツリーでスパース (まばらな) 条件付きの定数の伝播 (CCP) を実行しま す。このパスは、ローカルのスカラ変数とメモリ格納とロード (グローバ ル変数、構造体、配列など) で動作します。このフラグは、-O2 以上で、 デフォルトで有効にされます。 -ftree-dce ツリーで死んでいるコード (dead code) の除去 ((DCE) を実行します。こ のフラグは、-O 以上で、デフォルトで有効にされます。 -ftree-dominator-opts dominator ツリーの走査に基づく、さまざまな単純なスカラのクリーン アップ (定数/コピー伝播、冗長除去、範囲伝播と式の簡素化) を実行しま す。また、これは、ジャンプのスレッド化 (ジャンプからジャンプの削減) を実行します。このフラグは、-O 以上で、デフォルトで有効にされます。 -ftree-ch ツリーでループヘッダコピーを実行します。コードモーション (動作) の 最適化の有効性を増加させるので、これは有益です。また、それは 1 つの ジャンプを節約します。このフラグは、-O 以上で、デフォルトで有効にさ れます。それは、通常、コードサイズを増加させるので、-Os に対して有 効にされません。 -ftree-loop-optimize ツリーでループの最適化を実行します。このフラグは、-O 以上で、デフォ ルトで有効にされます。 -ftree-loop-linear ツリーで直線的なループの変換を実行します。このフラグ、キャッシュ性 能を向上させることができ、さらにループの最適化を行うことができま す。 -ftree-loop-im ツリーでループ不変条件のモーション (動作) を実行します。このパス は、RTL レベル (関数呼び出し、insn の重要なシーケンスに拡張する操 作)。で扱いにくい不変条件だけを動かしますまた、-funswitch-loops で、我々が、ちょうどループの切り換えなしで自明の不変条件の解析を使 用できるように、不変条件である条件のオペランドをループの外に動かし ます。また、パスは、格納モーションを含んでいます。 -ftree-loop-ivcanon 複雑な解析を必要とする、繰り返しの数を決定するためのループの繰り返 しの数のための基準のカウンタを作成します。次に、後の最適化は、容易 に数を決定します。特に unrolling (展開) に関連して役に立ちます。 -fivopts ツリーで帰納法 (induction) 変数の最適化 (強さ減少、帰納法変数のマー ジと記法法変数の除去) を実行します。 -ftree-sra 集合体のスカラの置換を実行します。このパスは、あまりに早く構造体を メモリに送ることを防ぐために構造体の参照をスカラに置き換えます。こ のフラグは、-O 以上で、デフォルトで有効にされます。 -ftree-copyrename ツリーでコピーの改名を実行します。このパスは、コンパイラの一時変数 をコピー位置の他の変数へ改名することを試みます、通常、変数により似 た変数名の結果となります。このフラグは、-O 以上で、デフォルトで有効 にされます。 -ftree-ter SSA->normal フェーズの間に、一時的な式の置換を実行します。単一使用/ 単一定義の一時変数は、それらの定義された式でそれらが使用する位置で 置き換えられます。これは、GIMPLE でないコードの結果となりますが、よ り良い RTL 生成の結果で動作するためにより複雑なツリーをエキスパンダ (expander) に与えます。これは、-O 以上で、デフォルトで有効にされま す。 -ftree-lrs SSA->normal フェーズの間に、ライブ範囲分割を実行します。変数の区別 できるライブ範囲は、後でより良い最適化を可能とするために、ユニーク な変数に分割されます。これは、-O 以上で、デフォルトで有効にされま す。 -ftree-vectorize ツリーでループのベクトル化を実行します。 -ftree-vect-loop-version ツリーでループのベクトル化を行うときに、ループバージョニング (versioning) を実行します。データ整列またはデータの依存関係がコンパ イル時に決定できないことを除いて、ループがベクトル化可能であると思 われるとき、ループのベクトル化されるか、またはベクトル化されない バージョンは、整列のランタイムチェック、またはどのバージョンが実行 されるかを制御するのとともに生成されます。このオプションは、無効に されたレベル -Os を除いて、デフォルトで有効にされます。 -ftree-vrp ツリーで Value Range Propagation を実行します。これは、定数の伝播パ スと同様ですが、値の代わりに、値の範囲が、伝播されます。これによっ て、オプティマイザは、配列の境界チェックと NULL ポインタチェックの ような不要な範囲チェックを取り除くことができます。これは、-O2 以上 で、デフォルトで有効にされます。-fdelete-null-pointer-checks が有効 にされる場合のみ、NULL ポインタチェック除去が行われます。 -ftracer スーパブロックサイズを拡大するためにテール複製を実行します。この変 換は、他の最適化が、より良い仕事ができる関数の制御フローを簡素化し ます。 -funroll-loops コンパイル時間またはループへの入口で、繰り返しの数を決定できる、 ループを unroll (展開) します。-funroll-loops は、 -frerun-cse-after-loop の意味を含みます。このオプションで、コードを より大きくして、より速く実行できるかもしれません。 -funroll-all-loops ループに入るとき、たとえ、それらの繰り返しの数が不確実であっても、 すべてのループを unroll (展開) します。これは、通常、より遅くプログ ラムを実行することになります。-funroll-all-loops は、-funroll-loops と同じオプションの意味を含みます。 -fsplit-ivs-in-unroller 最初の繰り返しで値を使用して unroll (展開) されたループの後の繰り返 しで、帰納法の変数の値を表現することを有効にします。これは、長い依 存関係チェーンを切断します、その結果、スケジューリングパスの効率を 向上します。 -fweb と CSE の組み合わせは、同じ効果を得るためにしばしば十分です。 しかしながら、ループ本体が、単一の基本ブロックよりさらに複雑である 場合には、これは信頼できません。また、CSE パスの制限のためにアーキ テクチャのいくつかで全く動作しません。 この最適化は、デフォルトで有効にされます。 -fvariable-expansion-in-unroller このオプションで、コンパイラは、優れたコードをもたらすことができる ループを展開するとき、いくつかのローカル変数の複数のコピーを作成し ます。 -fprefetch-loop-arrays ターゲットマシンによってサポートされるなら、大きな配列にアクセスす るループの性能を向上させるために、メモリをプリフェッチ (先読み) す る命令を生成します。 このオプションは、より良い、またはより悪いコードを生成するかもしれ ません。結果はソースコード中のループの構造に大きく依存しています。 レベル -Os で無効です。 -fno-peephole -fno-peephole2 あらゆるマシン特有のピープホール (のぞき穴) 最適化を無効にします。 -fno-peephole と -fno-peephole2 の違いは、それらがコンパイラでどの ように実行されているかです。いくつかのターゲットは一方を使用し、い くつかはもう他方を使用し、わずかのものは両方を使用します。 -fpeephole は、デフォルトで有効です。-fpeephole2 は、レベル -O2, -O3, -Os で有効です。 -fno-guess-branch-probability 発見的な手法を使用して、分岐の確率を推測しません。 GCC は、プロファイリングのフィードバック (-fprofile-arcs) によって 提供されないなら、分岐の確率を推測するために発見的手法を使用しま す。これらの発見的手法は、制御フローグラフに基づいています。いくつ かの分岐の確率が __builtin_expect によって指定されるなら、発見的手 法は、__builtin_expect 情報を考慮に入れて、制御フローグラフの残りの ために分岐の確率を推測するために使用されます。発見的手法と __builtin_expect の間の相互作用は、いくつかの場合、複雑となり、 __builtin_expect の効果がより理解しやすくできるように、発見的手法を 無効にすることが役に立つかもしれません。 デフォルトは、レベル -O, -O2, -O3, -Os において -fguess-branch-probability です。 -freorder-blocks 必要とする分岐の数を減らせて、コードの局所性を改良するためにコンパ イルされた関数の基本ブロックを並べ替えます。 レベル -O2, -O3 で有効です。 -freorder-blocks-and-partition コンパイルされた関数の再順序付けされた基本ブロックに加えて、取られ た分岐の数を減少させて、ページングとキャッシュ位置の性能を向上させ るために、コロコロ変わる基本ブロックをアセンブリと .o ファイルの別 々のセクションにパーティションを区切ります。 この最適化は、linkonce セクションのために、ユーザ定義のセクション属 性がある関数のために、および指定されたセクションをサポートしない任 意のアーキテクチャで、例外処理があるとき自動的にオフにされます。 -freorder-functions コードの局所性を改良するためにオブジェクトファイルの関数を再順序付 けします。これは、最も頻繁に実行される関数のための特別なサブセク ション ".text.hot" と実行されそうもない関数のための ".text.unlikely" を使用して実装されます。並べ替えは、リンカで行われ るので、オブジェクトファイル形式は、指定されたセクションをサポート しなければなりません、そして、リンカは、合理的な手段でそれらを置か なければなりません。 また、プロファイルのフィードバックは、このオプションを有効にするた めに利用可能でなければなりません。詳細については、-fprofile-arcs を 参照してください。 レベル -O2, -O3, -Os で有効です。 -fstrict-aliasing コンパイラは、コンパイルされる言語に適用できる最も厳格なエイリアシ ング規則を仮定することができます。C (と C++) に関して、これは式のタ イプに基づく最適化をアクティブにします。特に、1 つのタイプのオブ ジェクトは、タイプがほとんど同じでないなら、異なったタイプのオブ ジェクトと同じアドレスに決して存在していないと仮定されます。例え ば、"unsigned int" は、"int" にエイリアスすることができますが、 "void*" または "double" にはエイリアスすることはできません。文字タ イプは、いかなる他のタイプにもエイリアスできます。 次のようなコードに特別の注意を払ってください: union a_union { int i; double d; }; int f() { a_union t; t.d = 3.0; return t.i; } ("type-punning (タイプの語呂合わせ)" と呼ばれる) ごく最近書き込まれ たものと異なる共用体のメンバを読み込む習慣は一般的です。メモリが、 union タイプを通してアクセスされるという条件で、-fstrict-aliasing が指定されても、type-punning は許可されます。したがって、上記のコー ドは予想されるように動作します。しかしながら、次のコードはそうしま せん: int f() { a_union t; int* ip; t.d = 3.0; ip = &t.i; return *ip; } 言語特有のエイリアス解析を実行することを望むあらゆる言語は、計算さ れる関数を定義し、"tree" ノードを与え、ノードのためのエイリアスを設 定するべきです。異なったエイリアスを設定するノードは、エイリアスを 許可されていません。例については、C フロントエンド関数 "c_get_alias_set" を参照してください。 レベル -O2, -O3, -Os で有効です。 -fstrict-overflow コンパイラは、コンパイルされる言語によって、厳密な符号付きオーバフ ロー規則を仮定することができます。C (と C++) に関して、コンパイラ が、オーバフローが起こらないと仮定することを意味する、符号付きの数 で演算を行うことが未定義であるとき、オーバフローすることを意味しま す。これは、様々な最適化を可能にします。例えば、コンパイラは、"i + 10 > i" のような式が、常に符号付きの "i" で真となると仮定します。こ の仮定は、2 の補数演算を使用するとき、"i + 10" がオーバフローするな ら、式が偽のときに、符号付きのオーバフローが未定義である場合にだ け、有効です。このオプションが有効であるときに、符号付きの数の操作 がオーバフローするかどうか決定する任意の試みは、実際にオーバフロー しないように慎重に書かれなければなりません。 また、-fwrapv オプションを参照してください。-fwrapv を使用すること は、符号付きのオーバフローが完全に定義されることを意味します: それ は折り返し (wrap) ます。-fwrapv が使用されるとき、-fstrict-overflow と -fno-strict-overflow の間に違いはありません。-fwrapv で、オーバ フローの特定のタイプは、許可されます。例えば、定数で演算を行うと き、コンパイラがオーバフローを得るなら、-fwrapv でオーバフローして いる値をまだ使用できますが、そうでなければ、使用できません。 -fstrict-overflow オプションは、レベル -O2, -O3, -Os で有効にされま す。 -falign-functions -falign-functions=n n バイトをスキップして、n より大きい次の 2 の冪乗に関数の始まりを整 列します。例えば、-falign-functions=32 は関数を次の 32 バイトの境界 に整列しますが、-falign-functions=24 は、23 バイト以下をスキップす ることによってこれが行える場合にだけ、次の 32 バイトの境界に整列し ます。 -fno-align-functions と -falign-functions=1 は、同等であり、関数が 整列されないことを意味します。 いくつかのアセンブラは、n が 2 の冪乗であるときにだけ、このフラグを サポートします。その場合、それは切り上げられます。 n が指定されていないか、0 であるなら、マシン依存のデフォルトを使用 します。 レベル -O2, -O3 で有効です。 -falign-labels -falign-labels=n -falign-functions のように nバイトをスキップして、すべての分岐ター ゲットを 2 の冪乗の境界に整列します。コードの普通のフローで分岐ター ゲットに到達しているとき、ダミーの命令を挿入しなければならないの で、このオプションは、簡単にコードを遅くできます。 -fno-align-labels と -falign-labels=1 は、同等であり、ラベルが整列 されないことを意味します。 -falign-loops または -falign-jumps が適用でき、この値より大きいな ら、それらの値が代わりに使用されます。 n が指定されていないか、0 であるなら、整列しないことを意味する、た ぶん 1 となるマシン依存のデフォルトを使用します。 レベル -O2, -O3 で有効です。 -falign-loops -falign-loops=n -falign-functions のように n バイトをスキップして、ループを 2 の冪 乗の境界に整列します。望みは、ダミーの命令の任意の実行を埋め合わせ をする、ループが何回も実行されることです。 -fno-align-loops と -falign-loops=1 は、同等であり、ループが整列さ れないことを意味します。 n が指定されていないか、0 であるなら、マシン依存のデフォルトを使用 します。 レベル -O2, -O3 で有効です。 -falign-jumps -falign-jumps=n -falign-functions のように n をスキップして、ジャンプによってのみ ターゲットに到達できる分岐ターゲットのために、分岐ターゲットを 2 の 冪乗の境界に整列します。この場合、ダミーの命令を実行する必要はあり ません。 -fno-align-jumps と -falign-jumps=1 は、同等であり、ループが整列さ れないことを意味します。 n が指定されていないか、0 であるなら、マシン依存のデフォルトを使用 します。 レベル -O2, -O3 で有効です。 -funit-at-a-time コードを作成し始める前に、全体のコンパイル単位を解析します。これに よって、いくつかの特別な最適化を行うことができますが、(一般的に) よ り多くのメモリを消費します。unit-at-a-time モードにはいくつかの互換 性の問題があります: * unit-at-a-time モードを有効にすることは、関数、変数とトップレベ ルの "asm" 文が出力される順序を変更し、いくつかの特定の順序を当 てにするコードをおそらく断絶するかもしれません。しかしながら、 そのようなトップレベルの "asm" 文の大部分を "section" 属性に置 き換えることができます。fno-toplevel-reorder オプションは、いく つかの最適化のコストで、入力ファイルで使用される順序を保持する ために使用されます。 * unit-at-a-time モードは、参照されない静的変数と関数を削除しま す。これは、"asm" 文が、そのほかの点では未使用である変数または 関数を直接参照するとき、未定義の参照の結果となります。その場 合、変数/関数は、"asm" 文のオペランドのオペランドとしてリストさ れるべきか、またはトップレベルの "asm" 文の場合に、属性 "used" を、宣言のときに使用するべきです。 * 静的な関数は、現在、直接関数を呼び出す "asm" を断絶する標準でな い引き渡しの規約を使用できます。さらに、"used" 属性は、この振る 舞いを防ぎます。 一時的な回避策として、-fno-unit-at-a-time を使用できますが、このス キームは、GCC の今後のリリースでサポートされないかもしれません。 レベル -O, -O2, -O3, -Os で有効です。 -fno-toplevel-reorder トップレベルの関数、変数と "asm" 文を再順序付けしません。それらが入 力ファイルに現れる同じ順序でそれらを出力します。このオプションが使 用されているとき、参照されない静的変数は、削除されません。このオプ ションは、特定の順序を当てにする既存のコードをサポートすることを意 図しています。新しいコードでは、属性を使用するほうがよいです。 -fweb レジスタ割り付けの目的のために共通に使用されるウェブを構築し、それ ぞれのウェブを個別の擬似レジスタに割り当てます。これによって、レジ スタ割り付けパスは、pseudo で直接操作することができますが、また、 CSE、ループオプティマイザとささいな死んでいるコードの削除のような、 他のいくつかの最適化パスを強化します。訳注: pseudo の意味不明。しか しながら、変数がもはや "ホームレジスタ" に留まらないので、デバッグ を不可能にするかもしれません。 -funroll-loops でデフォルトで有効です。 -fwhole-program 現在のコンパイル単位がコンパイルされる全体のプログラムを表すと仮定 します。"main" を除いて、すべてのパブリック関数と変数とそれらは、静 的な関数となる属性 "externally_visible" によってマージします、そし てプロセジャ相互 (interprocedural) のオプティマイザによってより積極 的な最適化に影響を及ぼす。このオプションが単一ファイルからなるプロ グラムのための "static" キーワードの適切な使用に同等である間、オプ ション --combine と組み合わせて、関数と変数が、単一のソースファイル 自体に対してではなく、全体の結合したコンパイル単位に対してローカル となるので、より小さいスケールの C プログラムの大部分をコンパイルす るために、このフラグを使用することができます。 -fno-cprop-registers レジスタ割り付けとポストレジスタ割り付け命令分割の後に、私たちは、 スケジューリングの依存関係を減らすために試みるコピー伝播パスを実行 して、時々コピーを除去します。 レベル -O, -O2, -O3, -Os で無効です。 -fprofile-generate 通常、プロファイルフィードバックに基づく最適化によって後の再コンパ イルで役に立つプロファイルを生成するために、アプリケーションの計装 のために使用されるオプションを有効にします。利用者は、コンパイルす るとき、および利用者のプログラムをリンクする両方のときに -fprofile-generate を使用しなければなりません。 次のオプションが有効にされます: "-fprofile-arcs", "-fprofile-values", "-fvpt"。 -fprofile-use プロファイルのフィードバック直接の最適化、一般的に、利用可能なプロ ファイルフィードバックのみ有益となる最適化を有効にします。 次のオプションが有効にされます: "-fbranch-probabilities", "-fvpt", "-funroll-loops", "-fpeel-loops", "-ftracer"。 次のオプションは、浮動小数点演算に関するコンパイラの振る舞いを制御しま す。これらのオプションは、速度と正確さの間でトレードオフされます。明確 にすべてを有効にしなければなりません。 -ffloat-store レジスタに浮動小数点変数を格納しません、そして、浮動小数点値がレジ スタまたはメモリから取られるかどうかを変更するかもしれない他のオプ ションを抑制します。 このオプションは、(68881 の) 浮動小数点レジスタが "double" が持つと 思われるより多くの精度を保持する 68000 のようなマシンで望ましくない 過度の精度を抑制します。x86 アーキテクチャでも同様です。ほとんどの プログラムのためには、過度な精度は、ただ良いことですが、いくつかの プログラムは IEEE 動小数点の厳密な定義に依存します。すべての適切な 中間的な計算を変数に格納するためにプログラムを変更した後に、そのよ うなプログラムのために -ffloat-store を使用します。 -ffast-math -fno-math-errno, -funsafe-math-optimizations, -fno-trapping-math, -ffinite-math-only, -fno-rounding-math, -fno-signaling-nans と fcx- limited-range を設定します。 このオプションによって、プリプロセッサマクロ "__FAST_MATH__" は定義 されます。 このオプションは、数学関数のための IEEE または ISO 規則/仕様の正確 な実装に依存するプログラムで不正確な出力をもたらすかもしれないの で、なんらかの -O オプションによって決してオンにされるべきではあり ません。 -fno-math-errno 単一の命令、例えば、sqrt、で実行される数学関数を呼び出した後に、 ERRNO を設定しません。数学エラー操作のために IEEE 例外に依存するプ ログラムは、IEEE 演算互換性を維持する間に、速度のためのこのフラグを 使用したいかもしれません。 このオプションは、数学関数のための IEEE または ISO 規則/仕様の正確 な実装に依存するプログラムで不正確な出力をもたらすかもしれないの で、なんらかの -O オプションによって決してオンにされるべきではあり ません。 デフォルトは -fmath-errno です。 Darwin システムでは、数学ライブラリは、決して "errno" を設定しませ ん。したがって、コンパイラがそうするかもしれない可能性を考慮する は、ありません、-fno-math-errno は、デフォルトです。 -funsafe-math-optimizations (a) 引数と結果が有効であると仮定する、(b) IEEE または ANSI 標準に違 反してもよい、浮動小数点演算のための最適化を許可します。リンク時に 使用されるとき、デフォルトの FPU 制御ワードまたは他の同様の最適化を 変更するライブラリまたは起動時のファイルを含みます。 このオプションは、数学関数のための IEEE または ISO 規則/仕様の正確 な実装に依存するプログラムで不正確な出力をもたらすかもしれないの で、なんらかの -O オプションによって決してオンにされるべきではあり ません。 デフォルトは -fno-unsafe-math-optimizations です。 -ffinite-math-only 引数と結果が NaN (非数) でも +-Inf (無限数) でもないと仮定する浮動 小数点演算のための最適化を許可します。 このオプションは、IEEE または ISO 規則/仕様の正確な実装に依存するプ ログラムで不正確な出力をもたらすかもしれないので、なんらかの -O オ プションによって決してオンにされるべきではありません。 デフォルトは -fno-finite-math-only です。 -fno-trapping-math 浮動小数点演算がユーザの目に見えるトラップを生成することができない と仮定するコードをコンパイルします。これらのトラップには、0 除算、 オーバフロー、アンダフロー、不正確な結果、と不正な操作を含んでいま す。このオプションは -fno-signaling-nans の意味を含みます。このオプ ションを設定することは、例えば、"non-stop" IEEE 演算に依存するコー ドをより速くできます。 このオプションは、数学関数のための IEEE または ISO 規則/仕様の正確 な実装に依存するプログラムで不正確な出力をもたらすかもしれないの で、なんらかの -O オプションによって決してオンにされるべきではあり ません。 デフォルトは -ftrapping-math です。 -frounding-math デフォルトの浮動小数点の丸めの振る舞いを仮定する変換と最適化を無効 にします。これは、すべての浮動小数点を整数に変換するための切捨て (round-to-zero) と、他のすべての演算の切捨てのための丸め (round-to nearest) です。このオプションは、動的に FP 丸めモードを変更するか、 またはデフォルトでない丸めモードで実行されるプログラムで指定される べきです。このオプションは、(丸めモードによって影響されるかもしれな い) コンパイル時に浮動小数点式の定数の畳み込み、と符号依存の丸め モードの存在で安全でない演算変換を無効にします。 デフォルトは -fno-rounding-math です。 このオプションは、実験的であり、現在、丸めモードによって影響される GCC のすべての最適化を無効にする保証がありません。GCC の将来のバー ジョンは、C99 の "FENV_ACCESS" プラグマを使用してこの設定のよりよい 制御を提供するかもしれません。このコマンドラインオプションは、 "FENV_ACCESS" のためのデフォルト状態を指定するために使用されます。 -frtl-abstract-sequences それは、サイズ最適化方法です。このオプションは、疑似手続きに変える ことができる同じシーケンスのコードを見つけて、次に、すべての発生を 新たに作成されたサブルーチンへの呼び出しに置き換えます。それは、い わば、-finline-functions の正反対です。この最適化は、RTL レベルで実 行します。 -fsignaling-nans IEEE シグナル伝達 NaN (非数) が浮動小数点の操作の間にユーザの目に見 えるトラップを生成することを仮定するコードをコンパイルします。この オプションを設定することは、シグナル伝達 NaN で目に見える例外の数を 変更する最適化を無効にします。このオプションは -ftrapping-math の意 味を含みます。 このオプションによって、プリプロセッサマクロ "__SUPPORT_SNAN__" が 定義されます。 デフォルトは -fno-signaling-nans です。 このオプションは、実験的であり、現在、シグナル伝達 NaN の振る舞いに 影響する GCC のすべての最適化を無効にする保証がありません。 -fsingle-precision-constant 単精度定数を倍精度実定数に暗黙的に変換する代わりに単精度定数として 浮動小数点定数を取り扱います。 -fcx-limited-range -fno-cx-limited-range 有効にされるとき、このオプションは、複雑な除算を実行するとき、範囲 減少ステップが必要でないことを提示します。デフォルトは、 -fno-cx-limited-range ですが、-ffast-math によって有効にされます。 このオプションは、ISO C99 "CX_LIMITED_RANGE" プラグマのデフォルト設 定を制御します。それにもかかわらず、オプションは、すべての言語に適 用されます。 次のオプションは、性能を向上させる最適化を制御しますが、任意の -O オプ ションによって有効にされません。このセクションは壊れているコードを生成 する実験的なオプションを含んでいます。 -fbranch-probabilities -fprofile-arcs でコンパイルされたプログラムを実行した後に、利用者 は、各分岐が行われる回数に基づく最適化を改良するために、2 度目に -fbranch-probabilities を使用してそれをコンパイルすることができま す。-fprofile-arcs でコンパイルされたプログラムが終了するとき、アー ク (arc) 実行カウントを各ソースファイルのための sourcename.gcda と 呼ばれるファイルに保存します。このデータファイルの情報は、生成コー ドの構造に非常に依存しているので、利用者は、両方のコンパイルで同じ ソースコードと同じ最適化オプションを使用しなければなりません。 -fbranch-probabilities で、GCC は、JUMP_INSN と CALL_INSN それぞれ に REG_BR_PROB ノートを置きます。最適化を改良するためににこれらを使 用することができます。分岐がほとんど取られ、REG_BR_PROB 値が、どの パスがもっと頻繁に取られるかを正確に決定するために使用されるのは、 どのパスかを推測する代わりに、現在、それらは reorg.c の 1 つの場所 に使用されるだけです。 -fprofile-values -fprofile-arcs で結合されるなら、プログラムで式の値に関するいくつか のデータが集められるようなコードを追加します。 -fbranch-probabilities で、式の値のプロファイルから集められたデータ を読み返して、REG_VALUE_PROFILE ノートを最適化で後の使用のための命 令に追加します。 -fprofile-generate と -fprofile-use で有効にされます。 -fvpt -fprofile-arcs で結合されるなら、式の値に関する情報を集めるための コードを追加するようにコンパイラに指示します。 -fbranch-probabilities で、集められたデータを読み返して、実際にそれ らに基づく最適化を実行します。現在、最適化には、分母の値に関する知 識を使用する除算操作の特殊化を含んでいます。 -frename-registers レジスタ割り付けの後に使い残されたレジスタを利用することによってス ケジュールされているコードでの誤った依存関係を避けることを試みま す。この最適化は、多くのレジスタがあるプロセッサのために最も多くの の利益となります。しかしながら、ターゲットによって採用されたデバッ グ情報形式によって、変数がもはや "home register" に残らないので、デ バッグを不可能にするかもしれません。 -funroll-loops でデフォルトで有効です。 -ftracer スーパブロックのサイズを拡大するためにテール複製を実行します。この 変換は、他の最適化が、より良い仕事を行うことができる関数の制御フ ローを簡素化します。 -fprofile-use で有効にされます。 -funroll-loops コンパイル時またはループに入るときに繰り返しの数を決定することがで きるループを展開します。-funroll-loops は、-frerun-cse-after-loop, -fweb と -frename-registers の意味を含みます。また、完全なループの 皮はぎ (peeling) をオンにします (すなわち、繰り返しの小さな定数で ループの完全な削除)。このオプションは、コードをより大きくして、実行 をより速くするかもしれません。 -fprofile-use で有効にされます。 -funroll-all-loops ループに入るとき、それらの繰り返しの数が不確実であっても、すべての ループを展開します。これは、通常、プログラムをより遅く実行するよう にします。-funroll-all-loops は、-funroll-loops と同じオプションの 意味を含みます。 -fpeel-loops (プロファイルフィードバックから) あまり回転していないという十分な情 報があるループを皮はぎ (peel) します。また、完全なループの皮はぎ (peeling) をオンにします (すなわち、繰り返しの小さな定数でループの 完全な削除)。 -fprofile-use で有効にされます。 -fmove-loop-invariants RTL ループオプティマイザのループ不変条件のモーションパスを有効にし ます。レベル -O1 で有効です。 -funswitch-loops (条件の結果に従って変更される) 両方の分岐でループの複製によって、 ループの不変条件の分岐をループの外に移動します。 -ffunction-sections -fdata-sections ターゲットが任意のセクションをサポートするなら、各関数またはデータ 項目を出力ファイルのそれ自体のセクションに置きます。関数の名前また はデータ項目の名前は、出力ファイルのセクションの名前を決定します。 リンカは、命令スペースで参照の局所性を改良するために最適化を実行す ることができるシステムで、これらのオプションを使用します。ELF オブ ジェクト形式を使用するほとんどのシステムと Solaris 2 を実行する SPARC プロセッサには、そのような最適化を行うリンカがあります。AIX には、将来、これらの最適化があるかもしれません。 それを行うことに特筆すべき利益があるときのみ、これらのオプションを 使用します。利用者がこれらのオプションを指定するとき、アセンブラと リンカは、より大きいオブジェクトと実行形式ファイルを作成し、また、 より遅くなります。利用者がこのオプションを指定するなら、すべてのシ ステムで "gprof" を使用することができません、このオプションと -g の 両方を指定するなら、デバッグで問題があるかもしれません。 -fbranch-target-load-optimize プロローグ/エピローグのスレッドの前に分岐ターゲットレジスタのロード 最適化を実行します。ターゲットレジスタの使用は、一般的に再ロードの 間のみ顕在化することができます、したって、ループの外にロードを持ち 上げ、別個の最適化パスが必要なブロック間のスケジューリング行いま す。 -fbranch-target-load-optimize2 プロローグ/エピローグのスレッドの後に分岐ターゲットレジスタのロード 最適化を実行します。 -fbtr-bb-exclusive 分岐ターゲットレジスタロード最適化を実行するとき、任意の基本的なブ ロック内の分岐ターゲットレジスタを再利用しません。 -fstack-protector スタックスマッシイング (smashing) 攻撃のような、バッファオーバフ ローをチェックする特別のコードを出力します。攻撃を受けやすいオブ ジェクトで見張り変数を関数に加えることによって、これを行います。こ れは alloca を呼び出す関数と、8 より大きいバッファがある関数を含み ます。見張りは、関数に入るときに初期化されて、次に、関数が終了する とき、チェックされます。見張りチェックが失敗するなら、エラーメッ セージが印刷され、プログラムは、終了します。 -fstack-protector-all すべての関数が保護されることを除いて、-fstack-protector に似ていま す。 -fsection-anchors 近くのオブジェクトにアドレス付けするために、共有された "anchor" シ ンボルを使用することによって、シンボリックアドレス計算の数を減少す るように試みます。この変換は、いくつかのターゲットで GOT エントリと GOT アクセスの数を減少する効果があります。 例えば、次の関数 "foo" の実装は、次の通りです: static int a, b, c; int foo (void) { return a + b + c; } これは、通常すべての 3 つの変数のアドレスについて計算しますが、利用 者が、-fsection-anchors でそれをコンパイルするなら、代わりに共通の アンカ (anchor) ポイントから変数にアクセスします。効果は、次の擬似 コード (有効な C でない) と同様です: int foo (void) { register int *xr = &x; return xr[&a - &x] + xr[&b - &x] + xr[&c - &x]; } すべてのターゲットが、このオプションをサポートするというわけではあ りません。 --param name=value 所によっては、GCC は、行われる最適化の量を制御するための様々な定数 を使用します。例えば、GCC は、特定の数以上の命令を含む関数をインラ イン化しません。利用者は、コマンドラインで --param オプションを使用 してこれらの定数のいくつかを制御することができます。 特定のパラメータの名前と値の意味は、コンパイラの内部に関係してい て、今後のリリースで予告なしで変更することがあります。 いずれの場合にも、value は整数です。name のための許可される選択は、 次のテーブルで与えられます: salias-max-implicit-fields 構造体のエイリアシングが、各フィールドを追跡しようと見なされる 直接の構造体のアクセスがない変数のフィールドの最大数。デフォル トは、5 です。 salias-max-array-elements 配列が持つことができる要素の最大数、そしてその要素は、構造体の エイリアシングによって個別に追跡されます。デフォルトは、4 で す。 sra-max-structure-size 集合のスカラ置換 (scalar replacement of aggregates, SRA) 最適化 がブロックコピーを実行する、バイト単位の最大の構造体のサイズ。 デフォルト値、0、は、GCC がそれ自体の最も適切なサイズを選択する ことを意味します。 sra-field-structure-ratio 説明されたフィールドと完全な構造体サイズの間の閾値の (パーセン トの) 比率。いってみれば、説明されたフィールドのバイト数と完全 な構造体のバイト数の比率が、このパラメータを超えているなら、ブ ロックコピーは、使用されません。デフォルトは、75 です。 max-crossjump-edges クロスジャンプ (crossjumping) と見なされる入力エッジ (incoming edge) の最大数。-fcrossjumping によって使用されるアルゴリズム は、各ブロックに入力するエッジの数で O(N^2) です。値を増加する ことは、実行形式のサイズでたぶん小さな改善がありコンパイル時間 の増加させる、より積極的な最適化を意味します。 min-crossjump-insns ブロックで、クロスジャンプが実行される前に、2 つのブロックの終 りにマッチしなければならない命令の最小数。この値は、ブロック内 のすべての命令がマッチされた場所からクロスジャンプされる場合 は、無視されます。デフォルト値は、5 です。 max-grow-copy-bb-insns ジャンプの代わりに基本ブロックをコピーするとき、最大のコードサ イズの拡張係数。拡張は、ジャンプ命令に関連しています。デフォル ト値は、8 です。 max-goto-duplication-insns 計算された goto へジャンプするブロックに複製する命令の最大数。 パスの数で O (N^2) の振る舞いを避けるために、GCC は、コンパイル プロセスで前に計算された goto を因数分解し、できるだけ遅く、そ れらを非因数分解します。max-goto-duplication-insns のみの基本ブ ロックの終りの計算されたジャンプのみ、非因数分解されます。デ フォルト値は、8 です。 max-delay-slot-insn-search 遅延スロットを埋めるための命令を検索するとき考慮する命令の最大 数。この任意の数以上の命令が検索されるなら、遅延スロットを埋め ることによる時間の節約が最小となるので、検索を停止します。値を 増加することは、実行形式の実行時間でたぶん小さな改善がありコン パイル時間の増加させる、より積極的な最適化を意味します。 max-delay-slot-live-search 遅延スロットを埋めることを試みるとき、有効で使用中のレジスタ情 報でブロックを検索するとき、考慮される命令の最大数。この任意の 選択された値を増加させることは、コンパイル時を増加させて、より 積極的な最適化を意味します。このパラメータは、遅延スロットコー ドが制御フローグラフを保持するために書き直されるとき、削除され るべきです。 max-gcse-memory グローバルな共通部分式の除去の最適化を実行するために割り付けら れるメモリのおおよその最大量。指定されるより多くのメモリを必要 とするなら、最適化は行われません。 max-gcse-passes GCSE を実行するパスの最大数。デフォルトは、1 です。 max-pending-list-length 現在の状態をフラッシュして、もう一度やり直す前に許可される保留 中 (pending) の依存状態のスケジューリングの最大数。わずかの分岐 または呼び出しがある大きな関数は、メモリとリソースを必要以上に 消費する非常に大きなリストを作成することができます。 max-inline-insns-single いくつかのパラメータは、gcc で使用されるツリーインラインナ (tree inliner) を制御します。これの数は、ツリーインラインナがイ ンライン化を考慮する、単一の関数で (GCC の内部表現でカウントさ れる) 命令の最大数を設定します。これはインラインと宣言された関 数と (C++) のクラス宣言で実装されたメソッドのみに影響します。デ フォルト値は 450 です。 max-inline-insns-auto 利用者が (-O3 に含まれている) -finline-functions を使用すると き、そうでなければ、コンパイラによってインライン化が考慮されな い多くの関数が調査されます。それらの関数のために、インラインと 宣言された関数と比較して別の (より限定的な) 制限を適用できま す。デフォルト値は 90 です。 large-function-insns 本当に大きな関数を指定する制限。インライン化の後のこの制限より 大きな関数に関して、インライン化は、--param large-function- growth によって抑制されます。このパラメータは、バックエンドに よって使用される非線形 (non-linear) アルゴリズムによって引き起 こされる極端なコンパイル時間を避けるために主として役に立ちま す。このパラメータは、-funit-at-a-time が使用されていないとき、 無視されます。デフォルト値は 2700 です。 large-function-growth インライン化によって引き起こされる大きな関数の最大の増大率を パーセントで指定します。このパラメータは、-funit-at-a-time が使 用されていないとき、無視されます。デフォルト値は、大きい関数が 元のサイズの 2.0 倍に増大するように制限する、100 です。 large-unit-insns 大きな変換単位を指定する制限。この制限が --param inline-unit- growth によって制限されるより大きい単位のインラインに起因する増 加。小さな単位のために、これはきつ過ぎるかもしれません (関数 A からなる単位は、インラインであり、単に A を 3 回呼び出す B を考 えます)。B が A と比べて小さいなら、単位の増加は、300\% です が、まだ、そのようなインラインは、非常に健全です。しかしなが ら、小さなインライン化ができない関数から成る非常に大きな単位に 関して、全体的な単位の増加は、コードサイズの指数関数的な爆発を 避けるために必要です。したがって、より小さい単位に関して、サイ ズは、--param inline-unit-growth を適用する前に、--param large- unit-insns まで増加します。デフォルトは、10000 です。 inline-unit-growth インライン化によって引き起こされるコンパイルユニットの最大の全 体の増大率を指定します。このパラメータは、-funit-at-a-time が使 用されていないとき、無視されます。デフォルト値は、ユニットが元 のサイズの 1.5 倍に増大するように制限する、50 です。 max-inline-insns-recursive max-inline-insns-recursive-auto インライン関数が再帰的なインライン化を実行することによって増加 するようになる再帰的に自己の不適切な (out-of-line) コピーする命 令の最大数を指定します。 インラインで宣言された関数に対して、--param max-inline-insns- recursive は、考慮に入れられます。インラインで宣言されない関数 に対して、(-O3 に含まれている) -finline-functions が有効にされ て、--param max-inline-insns-recursive-auto が使用されていると きだけ、再帰的なインラインが起こります。デフォルト値は、450 で す。 max-inline-recursive-depth max-inline-recursive-depth-auto 再帰的なインラインによって使用される最大の再帰的な深さ (depth) を指定します。 インラインで宣言された関数に対して、--param max-inline- recursive-depth は、考慮に入れられます。インラインで宣言されな い関数に対して、(-O3 に含まれている) -finline-functions が有効 にされて、--param max-inline-recursive-depth-auto が使用されて いるときだけ、再帰的なインラインが起こります。デフォルト値は、 450 です。 min-inline-recursive-probability 再帰的なインラインは、平均的な深い再帰を持っている関数のだけに 有益であり、関数本体のプロローグ (prologue) サイズまたは複雑さ を他のオプティマイザまで増加させることによって、少ない再帰の深 さを持っている関数のために有害です。 プロファイルフィードバックが利用可能であるとき (-fprofile-generate を参照)、機能が与えられた呼び出し表現を通し て再帰する確率から実際の再帰の深さを推測することができます。こ のパラメータは、確率が (パーセントで) 与えられた閾値を超えてい る呼び出し表現のみのインラインを制限します。デフォルト値は、10 です。 inline-call-cost 簡単な演算操作 (1 の費用) に比べて呼び出し (call) 命令の費用を 指定します。この費用を上げることは、リーフでない関数のインライ ンを不適格とみなし、同時に、インラインにされることによって関数 のサイズを減少させると信じられているリーフの関数のサイズを増加 させます。事実上、大きい抽象化のペナルティ (ただ他の関数へ引数 を渡すだけの多くの関数) を持っているコードのためのインラインの 量を増加させ、低い抽象化ペナルティがあるコードのためのインライ ンを減少させます。デフォルト値は、16 です。 max-unrolled-insns そのループが展開されるなら、ループが持つべきである命令の最大数 であり、ループが展開されるなら、ループコードが何回展開されるか を決定します。 max-average-unrolled-insns そのループが展開されるなら、ループが持つべきであるそれらの実行 の確率によってかたよった命令の最大数であり、ループが展開される なら、ループコードが何回展開されるかを決定します。 max-unroll-times 単一のループの展開の最大数。 max-peeled-insns そのループが皮はぎされるなら、ループが持つべきである命令の最大 数であり、ループが皮はぎされるなら、ループコードが何回皮はぎさ れるかを決定します。 max-peel-times 単一のループの皮はぎの最大数。 max-completely-peeled-insns 完全に皮はぎされるループの insn の最大数。 max-completely-peel-times 完全な皮はぎに適しているループの繰り返しの最大数。 max-unswitch-insns スイッチされないループの insn の最大数。 max-unswitch-level 単一のループでスイッチされない分岐の最大数。 lim-expensive ループの不変条件のモーションで高価な表現の最低の費用。 iv-consider-all-candidates-bound すべての候補が帰納的変数の最適化における各使用のために考えられ る、下記の帰納的変数のための候補の数でバインドします。最も関連 している候補だけは、より多くの候補があるなら、二次の時間的複雑 さを避けるために、考慮されます。 iv-max-considered-uses 帰納的変数の最適化は、より多くの帰納的変数の使用を含むループで あきらめます。 iv-always-prune-cand-set-bound セットの候補の数が、この値より少ないなら、新しい iv がセットに 追加されるとき、我々は、最適化の間、セットから不要な iv を常に 削除しようと試みます。 scev-max-expr-size スカラ展開解析器で使用される式のサイズでバインドします。大きい 表現は、解析器を遅くします。 vect-max-version-checks ベクトル化でループのバージョニングを行うとき、実行できるランタ イムチェックの最大数。詳細については、オプション ftree-vect loop-version を参照してください。 max-iterations-to-track ループの繰り返しの数 (#) の解析のためのブルートフォース (brute force) アルゴリズムが評価しようと試みる、ループの繰り返しの最大 数。 hot-bb-count-fraction 基本ブロックがホットと見なされている必要がある、与えられたプロ グラムの基本ブロックの繰り返しの最大カウントの断片を選択しま す。 hot-bb-frequency-fraction 基本ブロックがホットと見なされている必要がある、与えられた関数 の基本ブロックの実行の最大の頻度の断片を選択します。 max-predicted-iterations 我々が静的に予測するループの繰り返しの最大数。これは、関数が知 られている境界と未知の他のループがある単一のループを含む場合に 役に立ちます。我々は、およそ 10 の平均した繰り返しの未知の数で すが、正しく繰り返しの知られている数を予測します。これは、境界 のないループが人工的にはもう片方と比べて cold (完ぺき) であるよ うに見えることを意味します。 tracer-dynamic-coverage tracer-dynamic-coverage-feedback この値は、いったん実行された命令の与えられたパーセンテージがカ バーされると、スーパブロックの構成を制限するために使用されま す。これは不要なコードサイズ拡張を制限します。 tracer-dynamic-coverage-feedback は、プロファイルのフィードバッ クが利用可能であるときにのみ使用されます。(静的に見積もられたも のと対照的に) 実際のプロファイルは、閾値がより大きい値を許可す ることから、よりバランスのとれないものとなります。 tracer-max-code-growth いったんコードの増大が与えられたパーセンテージ到達すると、テー ル複製を停止します。複製の大部分がクロスジャンプの後に除去され るように、これはかなりわざとらしい引数 (訳注: 議論かもしれない) であるので、必要なコードの増大よりはるかに大きな値に設定するこ とができます。 tracer-min-branch-ratio ベストエッジの逆の確率がこの敷居 (パーセント) より少ないとき に、逆の増大を停止します。 tracer-min-branch-ratio tracer-min-branch-ratio-feedback ベストエッジがこの閾値より小さくなる確率があるなら、前方増大を 停止します。 tracer-dynamic-coverage と同様に、2 つの値が存在し、1 つは、プ ロファイルフィードバックのためのコンパイルのためで、1 つは、コ ンパイルなしのためです。プロファイルフィードバックがあるコンパ イルのための値は、トレーサを有効にするために、より控えめ (より 大きい) である必要があります。 max-cse-path-length cse (共通部分式の除去) で考慮されるパスの基本ブロックの最大数。 デフォルトは、10 です。 max-cse-insns フラッシュする前に CSE 処理する最大命令。デフォルトは、1000 で す。 global-var-threshold 関数呼び出しの数 (n) と call-clobbered 変数の数 (v) をカウント します。nxv がこの制限より大きいなら、単一の人工的な変数は、関 数呼び出しサイトで、すべての call-clobbered 変数を表すために作 成されます。そして、この人工的な変数は、あらゆる call-clobbered 変数にエイリアスされます。(ホストマシンで "int * size_t" として 行います; オーバフローに注意)。 max-aliased-vops エイリアスのグループ分けの発見的な引き金となる前に、エイリアス を表すことができる仮想のオペランドの最大数。エイリアスのグルー プ分けは、コンパイル時間、とエイリアス情報で精度の損失を犠牲に してエイリアシングに必要とするメモリの消費を減少させます。 ggc-min-expand GCC は、それ自体のメモリ割り付けを管理するためにガーベージコレ クタ (ごみ収集人) を使用します。このパラメータはガーベージコレ クタのヒープがコレクションの間に拡張することが許可されるべきで ある最小のパーセンテージを指定します。これを調整すると、コンパ イル速度が改良されるかもしれません。コード生成に影響はありませ ん。 RAM >= 1GB であるとき、デフォルトは 100% の上限がある 30% + 70% * (RAM/1GB) です。"getrlimit" が利用可能であるなら、"RAM" の概 念は、実際の RAM と "RLIMIT_DATA" または "RLIMIT_AS" の最も小さ いものです。GCC が特定のプラットフォームで RAM を計算することが できないなら、30% の下限が使用されます。このパラメータと ggc- min-heapsize を 0 に設定することによって、完全なコレクション は、すべての機会に起こります。これは、極めて遅くなりますが、デ バッグに役に立ちます。 ggc-min-heapsize ごみを収集する手数を掛ける前の、ガーベージコレクタのヒープの最 小サイズ。ヒープが ggc-min-heapsize を越える ggc-min-expand% に よって拡張された後に最初のコレクション (収集) は起こります。さ らに、これを調整することは、コンパイルの速度を改良します、コー ド生成には影響はありません。 デフォルトは、RAM/8, RLIMIT_RSS、または RLIMIT_DATA か RLIMIT_AS が制限を超えないことを保証しようと試みる制限のより小 さいものですが、下限が 4096 (4 メガバイト) で上限が 131072 (128 メガバイト) です。GCC が特定のプラットフォームで RAM を計算する ことができないなら、下限が使用されます。このパラメータを極めて 大きくを設定すると、ガーベージコレクションを事実上無効にしま す。このパラメータと ggc-min-expand を 0 に設定することによっ て、全体のコレクションはあらゆる機会に起こります。 max-reload-search-insns 同等なレジスタを後方に検索するべき、再ロードされた命令の最大 数。値を増加することは、より積極的な最適化を意味し、たぶん少し 良い性能があり、コンパイル時間を増加させます。デフォルト値は 100 です。 max-cselib-memory-locations 考慮するべきメモリ位置 cselib の最大数。値を増加することは、よ り積極的な最適化を意味し、たぶん少し良い性能があり、コンパイル 時間を増加させます。デフォルト値は 500 です。 max-flow-memory-locations max-cselib-memory-locations に似ていますが、データフロー活性で す。デフォルト値は 100 です。 reorder-blocks-duplicate reorder-blocks-duplicate-feedback 無条件分岐またはその目的地でコードを複製を使用するかどうかを決 定する基本ブロックの並べ替えパスによって使用されます。見積りサ イズが、プログラムのホットスポットで無条件ジャンプの見積りサイ ズを掛けた値より小さいときに、コードは複製されます。 reorder-block-duplicate-feedback はプロファイルフィードバックが 利用可能であるときにだけ使用され、ホットスポットに関する情報が より正確なので、reorder-block-duplicate より大きな値に設定され ます。 max-sched-ready-insns 最初のスケジューリングパスの間に任意の与えられた時間で考えるべ きスケジューラを発行される準備ができている命令の最大数。増加す る値は、たぶん少ない利益でコンパイル時間の増加する、より徹底的 な検索を意味します。デフォルト値は、100 です。 max-sched-region-blocks ブロック間のスケジューリングのために考えられる領域のブロックの 最大数。デフォルト値は、10 です。 max-sched-region-insns ブロック間のスケジューリングのために考えられる領域の insn の最 大数。デフォルト値は、100 です。 min-spec-prob ブロック間の推論的なスケジューリングのためのソースブロックに達 する (パーセントでの) 最小の確率。デフォルト値は、40 です。 max-sched-extend-regions-iters CFG を通して拡張領域までの繰り返しの最大数。0 - 領域拡張を無効 にする、N - 多くても N 回繰り返しを行う。デフォルト値は、0 で す。 max-sched-insn-conflict-delay 推論的なモーションのために考えられる insn のための最大の競合遅 延。デフォルト値は、3 です。 sched-spec-prob-cutoff 推論的な insn をスケジュールできるように、推測の成功 (パーセン トで) の最小量の確率。デフォルト値は、40 です。 max-last-value-rtl そのレジスタの最後に知られている値として擬似レジスタのために combiner (結合器) で表現に記録することができる、RTL の数として 測定された最大サイズ。デフォルトは、10000 です。 integer-share-limit 小さな整数定数は、コンパイラのメモリ使用量を減少させて速度を増 加させる、共有されるデータ構造を使用することができます。これ は、共有された整数定数の最大値を設定します。デフォルト値は、256 です。 min-virtual-mappings virtual-mappings-ratio よって定義された発見的な仮想のマッピング の引き金となるように登録されるべきである増加する SSA updater の 仮想のマッピングの最小の数を指定します。デフォルト値は、100 で す。 virtual-mappings-ratio 仮想のマッピングの数が更新される仮想のシンボルの数より大きい virtual-mappings-ratio であるなら、増加する SSA updater は、そ れらのシンボルのための完全な更新に切り替えます。デフォルトの比 率は、3 です。 ssp-buffer-size -fstack-protection が使用されるとき、スタック smashing 保護を受 信するバッファ (すなわち、配列) の最小サイズ。 max-jump-thread-duplication-stmts スレッド化されたジャンプのとき、複製される必要があるブロックで 許可された文の最大数。 max-fields-for-field-sensitive 我々が、ポインタ解析の間にフィールドに影響される方法を取り扱 う、構造体のフィールドの最大数。 プリプロセッサを制御するオプション これらのオプションは、実際のコンパイルの前に、それぞれの C ソースファイ ルで実行される、C プリプロセッサを制御します 利用者が -E オプションを使用するなら、前処理を除いて何も行いません。こ れらのオプションのいくつかは、それらのオプションよって、プリプロセッサ 出力が実際のコンパイルには不適当であるので、-E と同時に指定されるときの み意味があります。 利用者は、コンパイラのドライバをバイパスして、option を直接プリプロ セッサに渡すために -Wp,option を使用することができます。option がコ ンマを含んでいるなら、コンマで複数のオプションに分割されます。しか しながら、多くのオプションは、プリプロセッサに渡される前に、コンパ イラドライバによって変更されるか、変換されるか、または解釈され、そ して、-Wp は強制的にこのフェーズをバイパスします。プリプロセッサの ダイレクトインタフェースは、文書化されていなくて、変更の影響を受け やすいので、可能ならいつでも、利用者は、-Wp を使用するのを避けて、 代わりにドライバにオプションを操作させるべきです。 -Xpreprocessor option option をオプションとしてプリプロセッサに渡します。利用者は、GCC が、どのように認識するかを知らないシステム特有のプリプロセッサオプ ションを供給するために、これを使用することができます。 引数を取るオプションを渡したいなら、利用者は、オプションのために一 度、引数のために一度の、-Xpreprocessor を二度使用しなければなりませ ん。 -D name name を 1 と定義されたマクロとしてあらかじめ定義します。 -D name=definition definition の内容は、トークン化され、#define 指示の変換フェーズツ リーの間に現れたかのように処理されます。特に、定義は埋め込まれた改 行文字によって先端が切り詰められます。 利用者がシェルまたはシェルに似たプログラムからプリプロセッサを呼び 出しているなら、シェルの構文で意味がある空白のような文字を保護する ためにシェルの引用 (クォート) 構文を使用する必要があるかもしれませ ん。 コマンドラインで関数のようなマクロを定義したいなら、(もしあるなら) 等号記号の前の引数リストを丸括弧で囲みます。丸括弧は、ほとんどの シェルで意味があるので、オプションを引用する必要があります。sh と csh では、-D'name(args...)=definition' は動作します。 -D と -U オプションは、それらがコマンドラインに与えられる順序で処理 されます。すべての -imacros file と -include file オプションは、す べての -D と -U オプションの後に処理されます。 -U name 組み込みまたは -D オプションで提供された、name の以前の定義を取り消 します。 -undef すべてのシステム特有、または GCC 特有のマクロをまえもって定義しませ ん。標準のまえもって定義されたマクロは、定義されたままです。 -I dir ディレクトリ dir をヘッダファイルを検索するためのディレクトリのリス トに追加します。-I によって指定されたディレクトリは、標準のシステム インクルードディレクトリの前に検索されます。ディレクトリ dir が標準 のシステムインクルードディレクトリであるなら、システムディレクトリ のデフォルト検索順序とシステムヘッダの特別な処理が無効化されないこ とを保証するために、このオプションは、無視されます。 -o file 出力を file に書き込みます。これは cpp への 2 番目のオプションでな い引数として file を指定することと同じです。gcc には 2 番目のオプ ションでない引数に対して異なった解釈があるので、利用者は出力ファイ ルを指定するために -o を使用しなければなりません。 -Wall 通常のコードに望ましいすべてのオプションの警告をオンに切り替えま す。現在のところ、これは、-Wcomment, -Wtrigraphs, -Wmultichar と "#if" 式の符号の変化を生じる整数拡張に関する警告です。プリプロセッ サの警告の多くは、デフォルトでオンであり、それらを制御するオプショ ンがないことに注意してください。 -Wcomment -Wcomments コメント開始シーケンス /* が /* コメントの中に現れるときはいつも、 またはバックスラッシュ改行が // コメントの中に現れるときはいつも警 告します。(両方の形式には、同じ効果があります。) -Wtrigraphs コメント中のほとんどのトライグラフ (trigraph) は、プログラムの意味 に影響することはあり得ません。しかしながら、エスケープされた改行 (行末の ??/) を形成するトライグラフは、コメントが始まるかまたは終る 場所を変更することによって影響するかもしれません。そのために、エス ケープされた改行を形成するトライグラフは、コメント内で警告を生成し ます。 このオプションは -Wall の意味を含んでいます。-Wall が与えられないな ら、このオプションは、トライグラフが有効でなくても有効になります。 警告なしでトライグラフ変換を得ますが、他の -Wall 警告を得るには、 -trigraphs -Wall -Wno-trigraphs を使用します。 -Wtraditional 伝統的な C と ISO C で異なる振る舞いがある特定の構文に関して警告し ます。また、伝統的な C と同等でない、避けられるべきである問題となる 構文がある ISO C 構文に警告します。 -Wimport 最初に #import が使われたとき、警告します。 -Wundef マクロでない識別子が defined の外側で #if 指示に遭遇するときはいつ も警告します。そのような識別子は 0 に置き換えられます。 -Wunused-macros 使用されていないメインファイルで定義されたマクロに警告します。少な くとも拡張されるか、または存在がテストされるなら、マクロは、使用さ れます。また、プリプロセッサは、マクロが再定義されるか、または未定 義とする時点で使用されていないなら、警告します。 組み込みマクロ、コマンドラインで定義されたマクロ、とインクルード ファイルで定義されたマクロは、警告されません。 注: マクロが実際に使用されますが、スキップされた条件ブロック内で使 用されるだけであるなら、CPP は未使用としてそれを報告します。このよ うな場合に警告を避けるためには、利用者は、例えば、最初にスキップさ れたブロックにそれを移動することによって、マクロの定義の範囲を改良 した方がよいでしょう。代わりに、利用者は次のようなダミーを使用する こともあり得ます。 #if defined the_macro_causing_the_warning #endif -Wendif-labels #else または #endif の後にテキストが続くときはいつも、警告します。 通常、これは次の形式のコードで起こります。 #if FOO ... #else FOO ... #endif FOO 2 番目と 3 番目の "FOO" は、コメントに入れるべきですが、しましば古 いプログラムはそうなってません。この警告はデフォルトでオンです。 -Werror すべての警告を困難なエラーとします。警告の引き金となるソースコード は拒絶されます。 -Wsystem-headers システムヘッダのコードのための警告を発行します。これらは、通常、利 用者自身のコードのバグを見つけるのに役に立たないので、抑制されま す。システムライブラリに責任があるなら、利用者はそれらを見たいるか もしれません。 -w GNU CPP がデフォルトで発行するものを含めてすべての警告を抑制しま す。 -pedantic C 標準にリストされたすべての強制的な診断を発行します。頻繁に無害な コードの引き金となるので、それらのいくつかは、デフォルトで省略され ます。 -pedantic-errors すべての強制的な診断を発行し、すべての強制的な診断をエラーとしま す。これは、GCC が -pedantic なしで発行する強制的な診断を含みます が、警告として取り扱います。 -M 前処理の結果を出力する代わりに、メインソースファイルの依存関係を記 述する make のための適切な規則を出力します。プリプロセッサは、その ソースファイルのためのオブジェクトファイル名、コロン、-include また は -imacros コマンドラインオプションから来るものをインクルードして いる、すべてのインクルードファイルの名前を含む 1 つの make 規則を出 力します。 明示的に (-MT または -MQ で) 指定されていないなら、オブジェクトファ イル名は、ソースファイルの basename とソースファイルのサフィックス をオブジェクトファイルのサフィックスに置き換えたものから成ります。 多くのインクルードされているファイルがあるなら、規則は \-newline を 使用していくつかの行に分割されます。規則には、コマンドがありませ ん。 このオプションは、-dM のようなプリプロセッサのデバッグ出力を抑制し ません。そのようなデバッグ出力と依存関係の規則が混在することを避け るために、利用者は、-MF で依存関係の出力ファイルを明らかに指定する べきであるか、または DEPENDENCIES_OUTPUT のように環境変数を使用する べきです。それでもデバッグ出力は、いつものように通常の出力ストリー ムに送られます。 ドライバへ -M を渡すことは、-E の意味を含み、暗黙の -w での警告を抑 制します。 -MM -M に似ていますが、システムヘッダのディレクトリで見つけられるヘッダ ファイルも、そのようなヘッダから直接的または間接的にインクルードさ れているヘッダファイルについて言及しません。 #include 指示で山括弧または二重引用符の選択は、そのヘッダが -MM 依 存関係出力に現れるかどうかをそれ自体が決定しないことを意味します。 これは、GCC バージョン 3.0 とそれ以前のものから意味的にわずかに変更 されています。 -MF file -M または -MM と共に使用するとき、依存関係を書き込むファイルを指定 します。-MF スイッチが与えないなら、プリプロセッサは、前処理された 出力を送った同じ場所に規則を送ります。 ドライバオプション -MD または -MMD と共に使用されるとき、-MF はデ フォルトの依存関係出力ファイルを上書きします。 -MG 依存関係の生成を要求する -M のようなオプションに関連して、-MG は不 足しているヘッダファイルが生成されるファイルであると仮定し、エラー を引き起こさずに、それらを依存関係のリストに追加します。依存関係の ファイル名は、任意のパスを先頭に追加しないで、"#include" 指示から直 接取り出されます。また、-MG は、不足しているヘッダファイルを無用の ものとして、前処理された出力を抑制します。 この機能は、makefiles の自動更新に使用されます。 -MP このオプションは、それぞれが何も依存しない、メインファイル以外の各 依存関係のための偽のターゲットを追加するように CPP に指示します。利 用者が、適合する Makefile を更新しないでヘッダファイルを削除するな ら、これらのダミーの規則は、make が与えるエラーに対処します。 次は典型的な出力です: test.o: test.c test.h test.h: -MT target 依存関係の生成によって発行された規則のターゲットを変更します。デ フォルトでは、CPP は任意のパスを含むメイン入力ファイルの名前を取 り、.c のような任意のファイルサフィックスを削除して、プラットフォー ムでの通常のオブジェクトのサフィックスを追加します。結果はターゲッ トです。 -MT オプションは、利用者が指定する文字列をそのままターゲットに設定 します。複数のターゲットを必要とするなら、利用者は、-MT への単一の 引数として指定するか、または複数の -MT オプションを使用することがで きます。 例えば、-MT '$(objpfx)foo.o' は次のようになります。 $(objpfx)foo.o: foo.c -MQ target -MT と同じですが、Make のための特別なすべての文字をクォート (引用) します。-MQ '$(objpfx)foo.o' は次のようになります。 $$(objpfx)foo.o: foo.c デフォルトのターゲットは、まるで -MQ と共に与えられるかのように自動 的にクォートされます。 -MD -MD は、-E が意味されないことを除いて、-M -MF file と同等です。ドラ イバは -o オプションが与えられているかどうかに基づいて file を決定 します。それがそうなら、ドライバは、その引数を使用しますが、.d のサ フィックスを付けて使用し、そうでなければ、入力ファイルの basename を取って、.d サフィックスを適用します。 -MD が -E とともに使用されるなら、任意の -o スイッチは、依存関係出 力ファイルを指定するために解釈されますが、-E なしで使用されるなら、 各 -o は、ターゲットオブジェクトファイルを指定するために解釈されま す。 -E が意味されないので、コンパイル処理の副作用として依存関係出力ファ イルを生成するために -MD を使用することができます。 -MMD ユーザヘッダファイルだけを言及して、システムヘッダファイルが言及さ れないことを除いて、-MD に似ています。 -fpch-deps プリコンパイルされたヘッダを使用するとき、このフラグによって、依存 関係の出力フラグは、プリコンパイルされたヘッダの依存関係からもファ イルをリストします。指定されないなら、プリコンパイルされたヘッダの みがリストされ、プリコンパイルされたヘッダが使用されるとき、それら のファイルは調べられないので、それを作成するために使用されたファイ ルはリストされません。 -fpch-preprocess このオプションによって、-E と共に前もってコンパイルされたヘッダを使 用することができます。それは、前もってコンパイルされたヘッダが見つ けられた場所、とそのファイル名をマークするために、特別な "#pragma", "#pragma GCC pch_preprocess "<filename>"" を出力に挿入します。 -fpreprocessed が使用中であるときに、GCC は、この "#pragma" を認識 して、PCH をロードします。 結果の前処理された出力がのみが実際に GCC への入力として適切であるの で、このオプションは、デフォルトでオフです。それは -save-temps に よって切り替えされます。 利用者は、利用者自身のコードでこの "#pragma" を書くべきではありませ んが、PCH ファイルが、別の場所で利用可能であるなら、ファイル名を編 集することは安全です。ファイル名は、絶対パスであるか、または GCC の カレントディレクトリと相対的です。 -x c -x c++ -x assembler-with-cpp ソース言語を指定します: C, C++ またはアセンブリ。これは標準の適合性 または拡張とは無関係です。単に予想する基本の構文を選択します。これ らのオプションが何も与えられないなら、cpp は次のソースファイルの拡 張子から言語を推論します: .c, .cc, .m または .S。また、C++ とアセン ブリのための他の一般的な拡張子も認識されます。cpp が拡張子を認識し ないなら、C としてそのファイルを取り扱います。これは最も一般的な モードです。 注: cpp の以前のバージョンは、言語と標準適合性のレベルの両方を選択 する -lang オプションを受け付けます。このオプションは、-l オプショ ンと衝突するので、削除されました。 -std=standard -ansi コードが適合するべきである標準を指定します。現在の CPP は C と C++ 標準に関して知っています。他のものは将来追加されるかもしれません。 standard は、次のうちの 1 つです: "iso9899:1990" "c89" 1990 年からの ISO C 標準。c89 は、このバージョンの標準のための 習慣的な省略形です。 -ansi オプションは -std=c89 と同等です。 "iso9899:199409" 1994 年に改正された、1990 年の C 標準。 "iso9899:1999" "c99" "iso9899:199x" "c9x" 1999 年 12 月に発行された、改訂された ISO C 標準。発行される前 は、C9X として知られていました。 "gnu89" 1990 年の C 標準に GNU 拡張を追加したもの。これはデフォルトで す。 "gnu99" "gnu9x" 1999 年の C 標準に GNU 拡張を追加したもの。 "c++98" 1998 年の ISO C++ 標準に改正を追加したもの。 "gnu++98" -std=c++98 に GNU 拡張を追加したものと同じです。これは、C++ コードのデフォルトです。 -I- インクルードパスを分割します。-I- の前に -I オプションで指定された 任意のディレクトリは、"#include "file"" で要求されたヘッダのみ検索 されます。"#include <file>" のものは、検索されません。追加ディレク トリが -I- の後で -I オプションで指定されるなら、それらのディレクト リは、すべての #include 指示で検索されます。 さらに、-I- は、"#include "file"" のための最初の検索ディレクトリと してカレントファイルディレクトリの使用を抑制します。このオプション は、古くて推奨されません。 -nostdinc ヘッダファイルのための標準のシステムディレクトリを検索しません。利 用者が -I オプションで指定したディレクトリ (と、適切であるなら、カ レントディレクトリ) のみ検索されます。 -nostdinc++ C++ 特有の標準ディレクトリのヘッダファイルを検索しませんが、それで も、他の標準ディレクトリは検索します。(このオプションは、C++ ライブ ラリを構築するとき使用されます。) -include file あたかも "#include "file"" が、プライマリソースファイルの最初の行に 現れたかのように file を処理します。しかしながら、file を検索する最 初のディレクトリは、メインソースファイルを含むディレクトリの代わり のプリプロセッサの作業ディレクトリです。そこで見つけられないなら、 いつものように "#include "..."" 検索チェーンの残りで検索されます。 複数の -include オプションを与えられるなら、ファイルはそれらがコマ ンドラインに現れる順序でインクルードされます。 -imacros file file をスキャンすることによって生成された任意の出力が捨てられること を除いて、-include によく似ています。それが定義するマクロは、定義さ れたまま残ります。これによって、利用者は、また、その宣言を処理しな いで、ヘッダからすべてのマクロを取得することができます。 -imacros によって指定されたすべてのファイルは、-include によって指 定されたすべてのファイルの前に処理されます。 -idirafter dir ヘッダファイルのために dir を検索しますが、-I と共に指定されたすべ てのディレクトリと標準のシステムディレクトリが検索しつくされた後に 検索します。dir はシステムインクルードディレクトリとして取り扱われ ます。 -iprefix prefix 後に続く -iwithprefix オプションのためのプレフィックスとして prefix を指定します。プレフィックスがディレクトリを表すなら、利用者は、最 後に / を付けるべきです。 -iwithprefix dir -iwithprefixbefore dir -iprefix で以前に指定されたプレフィックスに dir を追加し、結果の ディレクトリをインクルード検索パスに追加します。-iwithprefixbefore は -I が置かれる同じ場所にそれを置きます。-iwithprefix は -idirafter が置かれる場所に置きます。 -isysroot dir このオプションは、--sysroot オプションに似ていますが、ヘッダファイ ルだけに適用されます。詳細については、--sysroot オプションを参照し てください。 -imultilib dir ターゲット特有の C++ ヘッダを含むディレクトリのサブディレクトリとし て dir を使用します。 -isystem dir -I によって指定されたすべてのディレクトリの後で、標準のシステムディ レクトリの前に、ヘッダファイルのための dir を検索します。標準のシス テムディレクトリに適用されるのと同じ特別な扱いを受けるために、シス テムディレクトリとしてそれをマークします、 -iquote dir "#include "file"" で要求されたヘッダファイルのために dir のみを検索 します。すべてのディレクトリが -I で指定される前で、標準のシステム ディレクトリの前に、それらは、"#include <file>" を検索しません。 -fdollars-in-identifiers 識別子として $ を受け付けます。 -fextended-identifiers 識別子で universal な文字の名前を受け付けます。このオプションは、実 験的です。GCC の将来のバージョンでは、それは C99 と C++ のためにデ フォルトで有効にされるでしょう。 -fpreprocessed 入力ファイルが既に前処理されていることをプリプロセッサに指示しま す。これは、マクロ展開、トライグラフ変換、エスケープされた改行の継 続 (newline splicing) とほとんどの指示の処理のようなものを抑制しま す。利用者が、-C を付けて前処理されたファイルを問題なしでコンパイラ に渡すことができるように、プリプロセッサは、それでもまだコメントを 認識して削除します。このモードでは、統合化されたプリプロセッサは、 フロントエンドのためのトークン化ツール (tokenizer) と大差ありませ ん。 -fpreprocessed は、入力ファイルに拡張子 .i, .ii または .mi の 1 つ があるなら、暗黙に処理します。これらは GCC が -save-temps によって 作成された前処理されたファイルに使用する拡張子です。 -ftabstop=width タブストップの間隔を設定します。これは、たとえタブが行に現れても、 プリプロセッサが警告またはエラーで正しいカラム位置を報告することを 助けます。値が、1 未満または 100 より大きいなら、オプションは無視さ れます。デフォルトは 8 です。 -fexec-charset=charset 文字列と文字定数に使用される実行文字集合を設定します。デフォルトは UTF-8 です。charset はシステムの "iconv" ライブラリルーチンによって サポートされた任意のエンコードを指定できます。 -fwide-exec-charset=charset ワイド文字列と文字定数に使用されるワイド実行文字集合を設定します。 デフォルトは、UTF-32 または UTF-16 いずれかの "wchar_t" の幅に対応 しているものです。-fexec-charset と同様に、charset は、"iconv" ライ ブラリルーチンによってサポートされた任意のエンコードを指定できま す。しかしながら、利用者には、"wchar_t" で正確に適合しないエンコー ドに関する問題があります。 -finput-charset=charset 入力ファイルの文字集合から GCC によって使用されるソース文字集合への 変換に使用される、入力文字集合を設定します。ロケールが指定されてい ないか、または GCC がロケールからこの情報を得ることができないなら、 デフォルトは UTF-8 です。これは、ロケールまたはコマンドラインオプ ションのいずれかで、上書きすることができます。競合があるなら、現 在、コマンドラインオプションが優先されます。charset はシステムの "iconv" ライブラリルーチンによってサポートされた任意のエンコードを 指定できます。 -fworking-directory 前処理の時点でカレント作業ディレクトリをコンパイラに知らせるプリプ ロセッサ出力のラインマーカ (linemarker) の生成を有効にします。この オプションが有効にされるとき、プリプロセッサは最初のラインマーカの 後にカレント作業ディレクトリの後に 2 つのスラッシュが続く 2 番目の ラインマーカを出力します。前処理された入力にそれが存在していると き、いくつかのデバッグ情報形式でカレント作業ディレクトリとして出力 されたディレクトリのように、GCC はこのディレクトリを使用します。こ のオプションは、デバッグ情報が有効にされるなら、暗黙的に有効にされ ますが、否定形式の -fno-working-directory でこれを抑制することがで きます。-P フラグがコマンドラインに存在しているなら、"#line" 指示は どんなものであれ出力されないので、このオプションは効果がありませ ん。 -fno-show-column 診断でカラム位置を印刷 (表示) しません。これは、診断が dejagnu のよ うな、カラム位置を理解していないプログラムによってスキャンされるな ら、必要です。 -A predicate=answer 述語 predicate と答え answer でアサーションを行います。この形式は、 シェルの特殊文字を使用しないので、いまだにサポートされている古い形 式 -A predicate(answer) より好まれています。 -A -predicate=answer 述語 predicate と答え answer でのアサーションをキャンセルします。 -dCHARS CHARS は、1 つ以上の文字が続くシーケンスで、空白が先行してはいけま せん。他の文字は、適切なコンパイラによって解釈されるか、または GCC の将来のバージョンのために予約されているので黙って無視されます。振 る舞いが競合する文字を指定するなら、結果は未定義です。 M 通常の出力の代わりに、事前に定義されたマクロを含んで、プリプロ セッサの実行の間に定義されたすべてのマクロのための #define 指示 のリストを生成します。これは、プリプロセッサのバージョンに事前 に定義されるものを見つける方法を利用者に与えます。利用者のファ イル foo.h がないと仮定すると、次のコマンド touch foo.h; cpp -dM foo.h は、事前に定義されたすべてのマクロを表示します。 D 次の 2 つの観点を除いて M に似ています: 事前に定義されたマクロ を含んでいません、そして、#define 指示と前処理の結果の両方を出 力します。両方の出力は標準出力ファイルに行きます。 N D に似ていますが、マクロ名のみを出力し、それらを展開しません。 I 前処理の結果に追加されれる #include 指示を出力します。 -P プリプロセッサからの出力のラインマーカの生成を抑制します。これは、C コードでない何かでプリプロセッサを実行するとき、役に立ち、ライン マーカによって混乱するかもしれないプログラムに送られます。 -C コメントを削除しません。すべてのコメントは、指示と共に削除される、 処理された指示のコメントを除いて、出力ファイルにそのまま渡されま す。 利用者は、-C を使用するとき、副作用に備えるべきです。それによって、 プリプロセッサは、それら自体でトークンとしてコメントを取り扱いま す。例えば、指示行となるものの始めに現れるコメントは、その行の最初 のトークンがもはや # でないので、その行を普通のソース行に変える効果 があります。 -CC マクロ展開の間を含めてコメントを削除しません。マクロ中に含まれたコ メントがマクロが展開されているところで出力ファイルにそのまま渡され ることを除いて、これは -C に似ています。 -C オプションの副作用に加えて、-CC オプションによって、マクロ内のす べての C++ スタイルコメントは、C スタイルのコメントに変換されます。 これは、ソース行の残りを不用意にコメントアウトすることからの後のマ クロの使用を防ぐためのものです。 -CC オプションは、一般的に lint コメントをサポートするために使用さ れます。 -traditional-cpp ISO C プリプロセッサと対照的に、旧式な C プリプロセッサの振る舞いを 模倣するように試みます。 -trigraphs トライグラフシーケンスを処理します。これらは、3 文字のシーケンス で、すべて ?? で始まり、それは、単一文字を表す ISO C で定義されてい ます。例えば、??/ は \ を表すので、'??/n' は改行の文字定数です。デ フォルトでは、GCC はトライグラフを無視しますが、標準適合モードで は、それらを変換します。-std と -ansi オプションを参照してくださ い。 9 つのトライグラフとそれらの置換は次の通りです: トライグラフ: ??( ??) ??< ??> ??= ??/ ??' ??! ??- 置換: [ ] { } # \ ^ | ~ -remap MS-DOS のような非常に短いファイル名のみを許可するファイルシステムに 対処する特別なコードを有効にします。 --help --target-help 何らかを前処理することの代わりにすべてのコマンドラインオプションを 説明するテキストを印刷 (表示) します。 -v 冗長モード。実行の始めに GNU CPP のバージョン番号を印刷し、インク ルードパスの最終形式を報告します。 -H 他の通常の動作に加えて、使用される各ヘッダファイルの名前を印刷しま す。各名前は、それが #include スタックでどれくらい深いかを示すため にインデント (字下がり) されます。また、プリコンパイルされたヘッダ ファイルは、それらが無効であることがわかっても、印刷されます。無効 のプリコンパイルされたヘッダファイルは、...x で印刷され、有効なもの は、...! で印刷されます。 -version --version GNU CPP のバージョン番号を印刷します。1 つのダッシュで、いつものよ うに、前処理を行います。2 つのダッシュで、直ちに終了します。 アセンブラにオプションを渡す 利用者はオプションをアセンブラに渡すことができます。 -Wa,option オプションとして option をアセンブラに渡します。option がコンマを含 んでいるなら、コンマで複数のオプションに分割されます。 -Xassembler option オプションとして option をアセンブラに渡します。利用者は、GCC が、 どのように認識するかを知らないシステム特有のアセンブラオプションを 供給するために、これを使用することができます。 引数を取るオプションを渡したいなら、利用者は、オプションのために一 度、引数のために一度の、-Xassembler を二度使用しなければなりませ ん。 リンクためのオプション これらのオプションは、コンパイラがオブジェクトファイルを実行形式の出力 ファイルにリンクするとき、作用します。それらは、コンパイラがリンクス テップを行わないなら、無意味です。 object-file-name 特別に認識されるサフィックスで終わらないファイル名は、オブジェクト ファイルまたはライブラリを指定されたものと見なされます。(オブジェク トファイルは、ファイルの内容に従って、リンカによってライブラリと区 別されます。) リンクが行われるなら、これらのオブジェクトファイル は、リンカへの入力として使用されます。 -c -S -E これらのオプションのいずれかが使用されるなら、リンカを実行されず、 オブジェクトファイル名は、引数として使用されるべきではありません。 -llibrary -l library リンクするとき指定された library というライブラリを検索します。(別 々の引数としてのライブラリを指定する 2 番目の代替手段は、POSIX 準拠 のためだけであり、推薦されません。) 利用者がコマンドで、このオプションを書くところで違いを生じます。リ ンカは、ライブラリとオブジェクトファイルが指定される順序でそれらを 検索して処理します。したがって、foo.o -lz bar.o は、ライブラリ z を ファイル foo.o の後で、bar.o の前に、検索します。bar.o が z 中の関 数を参照しているなら、それらの関数はロードされません。 リンカは、実際には liblibrary.a と名前が付けられたファイルである library (ライブラリ) に対して標準のディレクトリのリストを検索しま す。そして、リンカは、まるで明確に名前で指定されたかのように、この ファイルを使用します。 検索されるディレクトリは、いくつかの標準システムディレクトリと利用 者が -L で指定するすべてのディレクトリを含みます。 通常、この方法で見つけられるファイルは、ライブラリファイルです --- オブジェクトファイルがメンバとなっているアーカイブファイルです。リ ンカは、これまで参照されているが、定義されていないシンボルを定義す る (オブジェクトファイルの) メンバをスキャンすることによって、アー カイブファイルを操作します。しかし、見つけられたファイルが通常のオ ブジェクトファイルであるなら、いつもの方法でリンクされます。-l オプ ションを使用することと、ファイル名を指定することの唯一の違いは、-l が lib と .a で library を囲んで、いくつかのディレクトリを検索する ことです。 -nostartfiles リンクするとき、標準のシステム起動ファイルを使用しません。-nostdlib または -nodefaultlibs が使用されていないなら、標準のシステムライブ ラリが通常使用されます。 -nodefaultlibs リンクするとき、標準のシステムライブラリを使用しません。利用者が指 定するライブラリのみ、リンカに渡されます。-nostartfiles が使用され ていないなら、標準の始動ファイルが通常使用されます。コンパイラは、 "memcmp", "memset", "memcpy" と "memmove" への呼び出しを生成しま す。これらのエントリは通常、libc のエントリで解決されます。このオプ ションが指定されるとき、これらのエントリポイントは、ある他のメカニ ズムを通して、供給されるべきです。 -nostdlib リンクするとき、標準のシステム起動ファイルまたはライブラリを使用し ません。始動ファイルなしで、利用者が指定するライブラリだけがリンカ に渡されます。コンパイラは、"memcmp", "memset", "memcpy" と "memmove" への呼び出しを生成します。これらのエントリは通常、libc の エントリで解決されます。このオプションが指定されるとき、これらのエ ントリポイントは、ある他のメカニズムを通して、供給されるべきです。 -nostdlib と -nodefaultlibs によってバイパスされる標準のライブラリ の 1 つは、GCC が特定のマシンの短所の克服のために使用するか、または いくつかの言語に特別に必要な、内部サブルーチンのライブラリである、 libgcc.a です。 ほとんどの場合、利用者は、他の標準のライブラリを避けたいときでも、 libgcc.a を必要とします。言い換えれば、-nostdlib または -nodefaultlibs を指定するとき、利用者は、通常 -lgcc も同様に指定す べきです。これは、内部の GCC ライブラリサブルーチンの未解決の参照が ないことを保証します。(例えば、__main は、C++ コンストラクタが呼び 出されることを保証するために使用されます。) -pie 位置に依存しない実行形式をサポートするターゲットでそれを生成しま す。予測できる結果のために、利用者は、このオプションを指定すると き、(-fpie, -fPIE またはモデルのサブオプションの) コードを生成する ために使用される同じセットのオプションも指定しなければなりません。 -rdynamic それをサポートしているターゲットで、フラグ -export-dynamic を ELF リンカに渡します。これは、動的なシンボルテーブルに、それだけに使用 されていない、すべてのシンボルを加えるようにリンカに指示します。こ のオプションは、"dlopen" のいくつかの使用か、またはプログラム内から バックトレースを得ることができるために必要です。 -s 実行形式ファイルからすべてのシンボルテーブルと再配置情報を削除しま す。 -static ダイナミックリンクをサポートするシステムでは、これは、共有ライブラ リとリンクすることを抑制します。他のシステムでは、このオプションは 効果はありません。 -shared 実行形式を形成する他のオブジェクトにリンクすることができる共有オブ ジェクトを生成します。すべてのシステムがこのオプションをサポートす るとは限りません。予測できる結果のために、利用者は、このオプション を指定するとき、(-fpic, -fPIC またはモデルのサブオプションの) コー ドを生成するために使用される同じセットのオプションも指定しなければ なりません。[1] -shared-libgcc -static-libgcc 共有ライブラリとして libgcc を提供するシステムでは、これらのオプ ションはそれぞれ、共有ライブラリまたは静的ライブラリのいずれかの バージョンの使用を強制します。コンパイラが設定されたとき、libgcc の 共有されないバージョンが構築されるなら、これらのオプションは効果が ありません。 アプリケーションが静的なバージョンの代わりに共有された libgcc を使 用するべきであるいくつかの状況があります。これらのなかで最も一般的 であるのは、アプリケーションが異なる共有ライブラリを横断する例外を スロー (throw) してチャッチ (catch) したいときです。その場合には、 アプリケーション自体と同様にそれぞれのライブラリは、共有された libgcc を使用するべきです。 したがって、G++ と GCJ ドライバは、C++ と Java プログラムが例外を通 常使用するので、利用者が共有ライブラリまたはメインの実行形式を構築 するときはいつも、自動的に -shared-libgcc を追加します、それで、こ うすることは正しいことです。 代わりに、共有ライブラリを作成するために GCC ドライバを使用するな ら、利用者は、それらが常に共有された libgcc とリンクされるわけでは ないことがわかります。設定時に、利用者には GNU でないリンカまたはオ プション --eh-frame-hdr をサポートしない GNU リンカしかないことを、 GCC がわかると、デフォルトで libgcc の共有されたバージョンを共有ラ イブラリにリンクします。そうでなければ、リンカをうまく利用して、デ フォルトで libgcc の静的なバージョンとリンクする、libgcc の共有され たバージョンとリンクして最適化します。これによって、例外は、ライブ ラリのロード時に再配置コストを負担しないで、そのような共有ライブラ リを通して伝播することができます。 しかしながら、ライブラリまたはメイン実行形式が例外をスローするか キャッチすることになっているなら、利用者は、プログラムで使用される 言語に適切であるか、または共有された libgcc とリンクされるように、 オプション -shared-libgcc を使用するように、G++ または GCJ ドライバ を使用してそれをリンクしなければなりません。 -symbolic 共有オブジェクトを構築するとき、グローバルシンボルへの参照をバイン ドします。(リンクエディタオプション -Xlinker -z -Xlinker defs に よって上書きされないなら) あらゆる未解決の参照に警告します。ほんの わずかのシステムのみがこのオプションをサポートしています。 -Xlinker option オプションとして option をリンカに渡します。利用者は、GCC が、どの ようにが認識するかを知らないシステム特有のリンカオプションを供給す るために、これを使用することができます。 引数を取るオプションを渡したいなら、利用者は、オプションのために一 度、引数のために一度の、-Xlinker を二度使用しなければなりません。例 えば、-assert definitions を渡すためには、利用者は、-Xlinker -assert -Xlinker definitions と書かなければなりません。-Xlinker "-assert definitions" と書くと動作しません、それは、リンカが予想し ない、ただ一つの引数として全体の文字列が渡されるからです。 -Wl,option オプションとして option をリンカに渡します。option がコンマを含んで いるなら、コンマで複数のオプションに分割されます。 -u symbol シンボルを定義しているライブラリモジュールのリンクを強制するため に、シンボル symbol が未定義であるふりをします。利用者は、強制的に 追加のライブラリモジュールをロードするために異なったシンボルと共に -u を複数回使用することができます。 ディレクトリ検索のためのオプション これらのオプションはヘッダファイル、ライブラリとコンパイラの一部を検索 するためのディレクトリを指定します: -Idir ディレクトリ dir をヘッダファイルを検索するためのディレクトリのリス トの先頭に追加します。これらのディレクトリがシステムヘッダファイル ディレクトリの前に検索されるので、利用者自身のバージョンを置換す る、システムヘッダファイルを上書きするためにこれを使用することがで きます、しかしながら、利用者は、ベンダによって供給されたシステム ヘッダファイルを含むディレクトリを (そのために -isystem を使用して) 追加するためにこのオプションを使用するべきではありません。利用者が 複数の -I オプションを使用するなら、ディレクトリは左から右の順序で スキャンされます。標準のシステムディレクトリは、その後でスキャンし ます。 標準システムインクルードディレクトリまたは -isystem で指定された ディレクトリが、-I でも指定されるなら、-I オプションは無視されま す。そのディレクトリは、まだ検索されますが、システムインクルード チェーンの通常に位置のシステムディレクトリとして検索されます。これ は、バグの多いシステムヘッダを修理するための GCC の手続きと include_next 指示のための順序付けが不注意に変更されないことを保証す るためのものです。本当にシステムディレクトリの検索順序を変更する必 要があるなら、-nostdinc および/または -isystem オプションを使用しま す。 -iquotedir #include "file" の場合のためだけにヘッダファイルが検索される、ディ レクトリのリストのヘッドをディレクトリ dir に追加します。それらは、 #include <file> で検索されません、そうでなければ、単に -I に似てい ます。 -Ldir ディレクトリ dir を -l で検索されるディレクトリのリストに追加しま す。 -Bprefix このオプションは、コンパイラ自体の実行形式、ライブラリ、インクルー ドファイルとデータファイルを見つけるための場所を指定します。 コンパイラドライバプログラムはサブプログラム cpp, cc1, as と ld の 1 つ以上を実行します。machine/version/ の有り無しの両方で、実行しよ うと試みる各プログラムのためにプレフィックスとして prefix を試みま す。 各サブプログラムを実行するために、コンパイラドライバは、もしあれ ば、最初に、-B プレフィックスを試みます。その名前が見つけられない か、または -B が指定されなかったなら、ドライバは、/usr/lib/gcc/ と /usr/local/lib/gcc/ の 2 つの標準プレフィックスを試みます。ファイル 名のそれらの結果のどちらも見つけられないなら、変更されていないプロ グラム名は、利用者の PATH 環境変数で指定されたディレクトリを使用し て検索されます。 コンパイラは -B によって提供されたパスがディレクトリを参照するかど うかを確かめるためにチェックし、必要なら、パスの終りにディレクトリ の区切り文字を追加します。 コンパイラがこれらのオプションをリンカのための -L オプションに変換 するので、ディレクトリ名を効果的に指定する -B プレフィックスは、リ ンカのライブラリにも適用されます。コンパイラがこれらのオプションを プリプロセッサのための -isystem オプションに変換するので、それら は、プリプロセッサでインクルードファイルにも適用されます。この場 合、コンパイラは include をプレフィックスに付け加えます。 また、必要であるなら、-B プレフィックスを使用して、ランタイムサポー トファイル libgcc.a を検索することができます。そこで見つけられない なら、上記の 2 つの標準プレフィックスが試みられ、それだけです。それ らの手段によって見つけられないなら、ファイルはリンクから除外されま す。 -B プレフィックスとそっくりのプレフィックスを指定する別の方法は環境 変数 GCC_EXEC_PREFIX を使用することです。 特別なクラッジとして、-B によって提供されたパスが [dir/]stageN/ で あるなら (ここで、N は 0 から 9 までの範囲の数です)、それは、 [dir/]include で置換されます。(訳注) クラッジ: 便宜的にトリックを 使って問題を一時的に解決すること。これはコンパイラをブートストラッ プを助けることになります。 -specs=file gcc ドライバプログラムが、どのスイッチを cc1, cc1plus, as, ld その 他へ渡すかを決定するとき、使用するデフォルトを上書きするために、コ ンパイラが、標準の specs ファイルを読み込んだ後に file を処理しま す。コマンドラインで複数の -specs=file を指定することができ、それら は左から右の順に処理されます。 --sysroot=dir ヘッダとライブラリのための論理的なルートディレクトリとして dir を使 用します。例えば、コンパイラが通常の /usr/include のヘッダと /usr/lib のライブラリを検索するなら、それは代わりに dir/usr/include と dir/usr/lib を検索します。 このオプションと -isysroot オプションの両方を使用するなら、 --sysroot オプションは、ライブラリに適用されますが、-isysroot オプ ションは、ヘッダファイルに適用されます。 GNU リンカ (バージョン 2.16 で始まる) には、このオプションに必要な サポートがあります。利用者のリンカがこのオプションをサポートしない なら、--sysroot のヘッダファイルの解釈は、まだ、動作しますが、ライ ブラリの解釈は、動作しません。 -I- このオプションは、非推奨です。-I- の前の -I ディレクトリに代わりに -iquote を使用し、-I- を削除してください。-I- オプションの前の -I オプションで指定する任意のディレクトリは、#include "file" の場合の ためだけ検索されます。それらは、#include <file> を検索しません。 追加のディレクトリが -I- の後の -I オプションで指定されるなら、これ らのディレクトリは、すべての #include 指示を検索します。(通常、すべ ての -I ディレクトリは、このように使用されます。) さらに、-I- オプションは、#include "file" のための最初の検索ディレ クトリとして (現在の入力ファイルが来るところで) カレントディレクト リの使用を抑制します。この -I- の効果を上書きする方法はありません。 -I. で、利用者は、コンパイラが呼び出されたとき、カレントを検索ディ レクトリとして指定することができます。それはまさにプリプロセッサが デフォルトで行うことと同じではありませんが、それはしばしば満足でき ます。 -I- は、ヘッダファイルのための標準のシステムディレクトリの使用を抑 制しません。したがって、-I- と -nostdinc は、独立しています。 ターゲットマシンとコンパイラバージョンの指定 GCC を実行する普通の方法は、実行形式を gcc を呼び出して実行するか、また はクロスコンパイルするとき、<machine>-gcc を実行するか、または、最後に インストールされたもの以外のバージョンを実行するためには、 <machine>-gcc-<version> を実行します。時々、これは不便であるので、GCC は別のクロスコンパイラまたはバージョンに切り替わるオプションを提供して います。 -b machine 引数 machine は、コンパイルのためのターゲットマシンを指定します。 machine のために使用する値は、クロスコンパイラとして GCC を設定する ときにマシンタイプとして指定されたものと同じです。例えば、クロスコ ンパイラが elf バイナリで arm プロセッサのためにコンパイルすること を意味する configure arm-elf でで設定されたなら、利用者は、そのクロ スコンパイラを実行するために -b arm-elf を指定するでしょう。-b で始 まる別のオプションがあるので、設定は、ハイフンを含まなければなりま せん。 -V version 引数 version は、GCC のどのバージョンを実行するかを指定します。複数 のバージョンがインストールされているとき、これは役に立ちます。例え ば、version が 4.0 であるなら、GCC バージョン 4.0 を実行することを 意味します。 -V と -b オプションは、<machine>-gcc-<version> 実行形式を実行することに よって動作するので、利用者が単にそれを直接実行することができるなら、そ れらを使用する本当の理由はありません。 ハードウェアモデルと設定 以前に、我々は、VAX 対 68000 対 80386 のような完全に異なったターゲット マシン対してインストール済みの異なったコンパイラの中から選択する標準の オプション -b について議論しました。 さらに、これらのターゲットマシンタイプそれぞれは、様々なハードウェアモ デルまたは設定の中から選択するために -m で始まるそれ自体の特別なオプ ションを持つことができます --- 例えば、68010 対 68020、浮動小数点コプロ セッサがあるかないかです。単一のインストール済みのコンパイラのバージョ ンは、指定されたオプションに従って、任意のモデルまたは設定に対してコン パイルすることができます。 また、コンパイラのいくつかの設定は、通常同じプラットフォームで他のコン パイラとの互換性のために、追加の特別なオプションをサポートしています。 ARC オプション これらのオプションは ARC 実装のために定義されます: -EL リトルエンディアンモードのためにコードをコンパイルします。これはデ フォルトです。 -EB ビッグエンディアンモードのためにコードをコンパイルします。 -mmangle-cpu すべてのパブリックシンボル名の先頭に cpu の名前を追加します。マルチ プロセッサシステムでは、異なった命令とレジスタセットの特性がある多 くの ARC バリアント (改良型) があります。このフラグは、1 つの cpu のためにコンパイルされたコードが別の cpu のためにコンパイルされた コードにリンクされることを防止します。"ほとんど同じ" であるバリアン ト (改良型) を扱う機能は存在しません。これは、すべてか無しかのオプ ションです。 -mcpu=cpu ARC バリアント (改良型) cpu のためにコードをコンパイルします。どの バリアントがサポートされるかは設定に依存します。すべてのバリアント は、-mcpu=base をサポートし、これはデフォルトです。 -mtext=text-section -mdata=data-section -mrodata=readonly-data-section デフォルトで、関数、データ、読み込み専用データをそれぞれ、text- section, data-section と readonly-data-section に置きます。これは、 "section" 属性で上書きすることができます。 ARM オプション これらの -m オプションは、Advanced RISC Machines (ARM) アーキテクチャの ために定義されています: -mabi=name 指定された ABI のためのコードを生成します。許容できる値は、次の通り です: apcs-gnu, atpcs, aapcs, aapcs-linux と iwmmxt。 -mapcs-frame 厳密には、コードの正確な実行のために必要がなくても、すべての関数の ための ARM Procedure Call Standard に準拠しているスタックフレームを 生成します。このオプションで -fomit-frame-pointer を指定することに よって、スタックフレームは、リーフ関数のために生成されません。デ フォルトは -mno-apcs-frame です。 -mapcs これは -mapcs-frame と同義語です。 -mthumb-interwork ARM と Thumb 命令セットの間の呼び出しをサポートするコードを生成しま す。このオプションがなければ、1 つのプログラム内で 2 つの命令セット を確実に使用することはできません。-mthumb-interwork が指定されたと き、わずかに大きなコードが生成されるので、デフォルトは、 -mno-thumb-interwork です。 -mno-sched-prolog 関数プロローグの命令の並べ換え、またはそれらの命令を関数の本体の命 令にマージすることを抑制します。これは、すべての関数が認識可能な命 令のセットから始まり (または、実際には、異なった関数プロローグの小 さなセットから選択する 1 つ)、関数が実行形式のコードの一部にあるな ら、開始の位置としてこの情報を使用することができることを意味しま す。デフォルトは -msched-prolog です。 -mhard-float 浮動小数点命令を含む出力を生成します。これはデフォルトです。 -msoft-float 浮動小数点のためのライブラリ呼び出しを含む出力を生成します。警告: 必要なライブラリは、すべての ARM ターゲットで利用可能ではありませ ん。通常、マシンの普通の C コンパイラの機能は使用されますが、クロス コンパイルで直接行うことはできません。利用者は、利用者自身でクロス コンパイルのための適切なライブラリ関数を準備しなければなりません。 -msoft-float は、出力ファイルにおける呼び出し規約を変更します。した がって、利用者がこのオプションですべてのプログラムをコンパイルする 場合にだけ、役に立ちます。特に、利用者は、これが動作するためには、 GCC に備えられているライブラリ libgcc.a を -msoft-float をつけてコ ンパイルする必要があります。 -mfloat-abi=name 浮動小数点値のために使用する ABI を指定します。許容できる値は、次の 通りです: soft, softfp と hard。 soft と hard は、それぞれ -msoft-float と -mhard-float と同等です。 softfp によって、浮動小数点命令を生成することができますが、まだソフ ト浮動小数点呼び出し規則を使用します。 -mlittle-endian リトルエンディアンモードで実行するプロセッサのためのコードを生成し ます。これは、すべての標準の設定ののデフォルトです。 -mbig-endian ビッグエンディアンモードで実行するプロセッサのためのコードを生成し ます。デフォルトでは、リトルエンディアンプロセッサのためのコードを コンパイルすることです。 -mwords-little-endian このオプションは、ビッグエンディアンプロセッサのためのコードを生成 するときのみ適用されます。リトルエンディアンのワードの順序ですが、 ビッグエンディアンのバイト順のコードを生成します。すなわち、 32107654 の形式のバイト順です。注: このオプションは、2.8 以前のコン パイラバージョンによって生成されたビッグエンディアン ARM プロセッサ のためのコードとの互換性が必要である場合のみ使用されるべきです。 -mcpu=name これはターゲットの ARM プロセッサの名前を指定します。GCC は、アセン ブリコードを生成するとき、どのような種類の命令を出力できるかを決定 するためにこの名前を使用します。許容される名前は次の通りです: arm2, arm250, arm3, arm6, arm60, arm600, arm610, arm620, arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi, arm70, arm700, arm700i, arm710, arm710c, arm7100, arm7500, arm7500fe, arm7tdmi, arm7tdmi-s, arm8, strongarm, strongarm110, strongarm1100, arm8, arm810, arm9, arm9e, arm920, arm920t, arm922t, arm946e-s, arm966e-s, arm968e-s, arm926ej-s, arm940t, arm9tdmi, arm10tdmi, arm1020t, arm1026ej-s, arm10e, arm1020e, arm1022e, arm1136j-s, arm1136jf-s, mpcore, mpcorenovfp, arm1176jz-s, arm1176jzf-s, xscale, iwmmxt, ep9312。 -mtune=name 実際のターゲットプロセッサタイプを代わりに指定し、したがって、どの 命令を使用することができるかを制限し、GCC が、まるでターゲットがこ のオプションで指定されたタイプであるかのようにコードの性能を調整す るべきですが、いまだに -mcpu= オプションによって指定された CPU に基 づいて生成する命令を選択するように指定することを除いて、このオプ ションは -mcpu= オプションと良く似ています。いくつかの ARM の実装の ために、このオプションを使用することによって、より良い性能を得るこ とができます。 -march=name これはターゲットの ARM アーキテクチャの名前を指定します。GCC は、ア センブリコードを生成するとき、どのような種類の命令を出力できるかを 決定するためにこの名前を使用します。このオプションを、組み合わせる か、または、-mcpu= オプションの代わりに使用することができます。許容 される名前は次の通りです: armv2, armv2a, armv3, armv3m, armv4, armv4t, armv5, armv5t, armv5te, armv6, armv6j, iwmmxt, ep9312。 -mfpu=name -mfpe=number -mfp=number これは、どのような浮動小数点ハードウェア (または、ハードウェアエ ミュレーション) がターゲットで利用可能であるかを指定します。指定で きる名前は、次の通りです: fpa, fpe2, fpe3, maverick, vfp。-mfp と -mfpe は、古い GCC のバージョンとの互換性のための -mfpu=fpenumber と同義語です。 -msoft-float 指定されるなら、これは浮動小数点値の形式を指定します。 -mstructure-size-boundary=n すべての構造体と共用体のサイズは、このオプションによって設定された ビット数の倍数に切り上げられます。許容される値は、8, 32 と 64 で す。デフォルト値は、ツールチェイン (toolchain) の違いによって変わり ます。COFF をターゲットとするツールチェインでは、デフォルト値は 8 です。基本的な ABI がそれをサポートする場合にだけ、64 の値が可能で す。 より大きい数値を指定することは、より速くて、より効率的なコードを生 成することができますが、プログラムのサイズを増加させることにもなり ます。異なった値は、潜在的に互換性がありません。1 つの値でコンパイ ルされたコードは、構造体または共用体を使用する情報を交換するなら、 もう一方の値でコンパイルされたコードまたはライブラリで必ずしも動作 すると期待することはできません。 -mabort-on-noreturn "noreturn" 関数の終わりで、関数 "abort" への呼び出しを生成します。 関数がリターンを試みるなら、実行されます。 -mlong-calls -mno-long-calls 最初に関数のアドレスをレジスタにロードすることによって呼び出される 関数を実行し、次に、このレジスタでサブルーチン呼び出しを実行するこ とをコンパイラに伝えます。ターゲット関数がサブルーチン呼び出し命令 のバージョンに基づくオフセットの 64 メガバイトのアドレス範囲の外に あるなら、このスイッチは、必要です。 たとえこのスイッチが有効にされても、すべての関数呼び出しが、ロング コール (long call) に変更されるわけではありません。ヒューリスティッ ク (発見的) なものは、静的な関数、ショートコール (short-call) 属性 が #pragma no_long_calls 指示のスコープ内にある関数、と現在のコンパ イル単位内で既にコンパイルされている定義がある関数が、ロングコール に変更されないということです。この規則の例外は、弱い関数定義、ロン グコール (long-call) 属性またはセクション (section) 属性がある関 数、と #pragma long_calls 指示のスコープ内にある関数が、常にロング コールに変更されることです。 この機能は、デフォルトで有効にされません。-mno-long-calls を指定す ることは、#pragma long_calls_off 指示のスコープ内にある関数呼び出し の状態のような、デフォルトの振る舞いに戻されます。これらのスイッチ は、コンパイラが関数ポインタを経由する関数呼び出しを操作するコード をどのように生成するかには影響がないことに注意してください。 -mnop-fun-dllimport "dllimport" 属性のサポートを無効にします。 -msingle-pic-base PIC アドレッシングに使用されるレジスタを、各関数のプロローグで、そ れをロードするよりむしろ読み込み専用として取り扱います。ランタイム システムは、実行が始まる前に適切な値でこのレジスタを初期化すること に対して責任があります。 -mpic-register=reg PIC アドレッシングに使用されるレジスタを指定します。R9 が使用されて いるとき、スタックチェックが有効にされないなら、デフォルトは R10 で す。 -mcirrus-fix-invalid-insns 不正な Maverick 命令の組み合わせに関する問題を回避するために命令ス トリームに NOP を挿入します。このオプションは、-mcpu=ep9312 オプ ションが Cirrus Maverick 浮動小数点コプロセッサのための命令の生成を 有効にするために使用されている場合のみ有効です。このオプションは、 問題が、古い Maverick 実装にのみ存在しているので、デフォルトで有効 にされていません。-mno-cirrus-fix-invalid-insns スイッチの使用に よってデフォルトを再び有効にすることができます。 -mpoke-function-name 関数プロローグの直前に、各関数の名前をテキストセクションに書き込み ます。生成されたコードは、次と同様です: t0 .ascii "arm_poke_function_name", 0 .align t1 .word 0xff000000 + (t1 - t0) arm_poke_function_name mov ip, sp stmfd sp!, {fp, ip, lr, pc} sub fp, ip, #4 スタックのバックトレースを実行するとき、コードは、"fp + 0" に格納さ れた "pc" の値を検査することができます。トレース関数が位置 "pc - 12" を調べ、上位 8 ビットが設定されているなら、私たちは、この位置 の直前に埋め込まれた関数名があり、"((pc[-3]) & 0xff000000)" という 長さがあることを知ります。 -mthumb 16 ビット Thumb 命令セットのためにコードを生成します。デフォルト は、32 ビット ARM 命令セットを使用することです。 -mtpcs-frame すべてのリーフでない関数のために Thumb Procedure Call Standard に適 合したスタックフレームを生成します。(リーフ関数は、その他の関数を呼 び出さないものです。) デフォルトは -mno-tpcs-frame です。 -mtpcs-leaf-frame すべてのリーフ関数のために Thumb Procedure Call Standard に適合した スタックフレームを生成します。(リーフ関数は、その他の関数を呼び出さ ないものです。) デフォルトは -mno-apcs-leaf-frame です。 -mcallee-super-interworking コンパイルされるファイルのすべての外部可視関数を、関数の残りを実行 する前に Thumb モードに切り替わる ARM 命令セットヘッダに与えます。 これによって、これらの関数を、non-interworking (非相互作用) コード から呼び出すことができます。 -mcaller-super-interworking (仮想関数を含む) 関数ポインタを経由する呼び出しは、ターゲットコード が interworking (相互作用) で、またはなしで、コンパイルされたかどう かにかかわらず正しく実行することができます。このオプションが有効に されているなら、関数ポインタを実行するコストに関してわずかなオーバ ヘッドがあります。 -mtp=name スレッドのローカル記憶域のポインタのためのアクセスモデルを指定しま す。有効なモデルは、"__aeabi_read_tp" への呼び出しを生成する、 soft、(arm6k アーキテクチャでサポートされる) 直接 "cp15" からスレッ ドのポインタをフェッチする、cp15、選択されたプロセッサのために最も 良い利用可能なメソッドを使用する、auto です。デフォルトの設定は、 auto です。 AVR オプション これらのオプションは AVR 実装のために定義されます: -mmcu=mcu ATMEL AVR 命令セットまたは MCU タイプを指定します。 命令セット avr1 は、C コンパイラによってサポートされるのではなく、 アセンブラプログラムだけでサポートされる、最小限の AVR コアです (MCU タイプ: at90s1200, attiny10, attiny11, attiny12, attiny15, attiny28)。 命令セット avr2 (デフォルト) は、最大 8K のプログラムメモリス空間が あるクラシック AVR コアです (MCU タイプ: at90s2313, at90s2323, attiny22, at90s2333, at90s2343, at90s4414, at90s4433, at90s4434, at90s8515, at90c8534, at90s8535)。 命令セット avr3 は、最大 128K のプログラムメモリ空間があるクラシッ ク AVR コアです (MCU タイプ: atmega103, atmega603, at43usb320, at76c711)。 命令セット avr4 は、最大 8K のプログラムメモリス空間がある機能強化 された AVR です (MCU タイプ: atmega8, atmega83, atmega85)。 命令セット avr5 は、最大 128K のプログラムメモリ空間がある機能強化 された AVR です (MCU タイプ: atmega16, atmega161, atmega163, atmega32, atmega323, atmega64, atmega128, at43usb355, at94k)。 -msize asm ファイルに命令サイズを出力します。 -minit-stack=N シンボルまたは数値で、初期スタックアドレスを指定します。__stack が デフォルトです。 -mno-interrupts 生成されるコードは、ハードウェア割り込みと互換性がありません。コー ドサイズは、より小さくなるでしょう。 -mcall-prologues 適切なサブルーチンの呼び出しとして拡張された関数プロローグ/エピロー グです。コードサイズは、より小さくなるでしょう。 -mno-tablejump 時々コードサイズを増大する tablejump insn を生成しません。 -mtiny-stack スタックポインタの低位 8 ビットのみを変更します。 -mint8 int が、8 ビットの整数であると仮定します。これは、すべてのタイプの サイズに影響します: char は、1 バイト、int は、1 バイト、long は、2 バイト、および long long は、4 バイトになります。このオプションは、 C 標準に従いませんが、より小さいコードサイズを利用者に提供すること に注意してください。 Blackfin オプション -momit-leaf-frame-pointer リーフ関数のためのレジスタのフレームポインタを保持しません。これ で、フレームポインタを保存し、セットアップして、復元する命令を避け て、特別のレジスタをリーフ関数で利用可能とします。オプション -fomit-frame-pointer は、デバッグをより困難にするかもしれないすべて の関数のためのフレームポインタを削除します。 -mspecld-anomaly 有効にされるとき、コンパイラは、生成コードがジャンプ命令の後に推論 的なロードを含まないことを確実にします。このオプションは、デフォル トで有効にされます。 -mno-specld-anomaly 推論的なロードが起こることを防ぐために特別のコードを生成しません。 -mcsync-anomaly 有効にされるとき、コンパイラは、生成コードが条件付き分岐のすぐ後に CSYNC または SSYNC 命令を含まないことを確実にします。このオプション は、デフォルトで有効にされます。 -mno-csync-anomaly 条件付き分岐のすぐ後に起こることから CSYNC または SSYNC 命令を防ぐ ための特別のコードを生成しません。 -mlow-64k 有効にされるとき、コンパイラは、全体のプログラムがメモリの下位 64k に収まるという知識をうまく利用するために解放されます。 -mno-low-64k プログラムが任意に大きいと仮定します。これは、デフォルトです。 -mid-shared-library ライブラリ ID メソッドを通して共有ライブラリをサポートするコードを 生成します。これによって、仮想メモリ管理のない環境で共有ライブラリ を決まった位置で実行することができます。このオプションは、-fPIC の 意味を含みます。 -mno-id-shared-library ID ベースの共有ライブラリが使用されることを仮定しないコードを生成し ます。これは、デフォルトです。 -mshared-library-id=n コンパイルされる ID ベースの共有ライブラリの識別番号を指定します。0 の値を指定すると、よりコンパクトなコードを生成し、他の値を指定する と、現在のライブラリのためにその数の割り付けを強制しますが、空間が ないか、またはこのオプションを省略するより効率的な時間です。訳注: 意味不明。 -mlong-calls -mno-long-calls 関数のアドレスを最初にレジスタにロードすることによって呼び出される 関数を実行するようにコンパイラに伝えます、次に、このレジスタでサブ ルーチン呼び出しを実行します。このスイッチは、ターゲット関数がサブ ルーチン呼び出し命令のオフセットベースのバージョンの 24 ビットのア ドレッシング範囲の外側にあるなら、必要です。 この機能は、デフォルトで有効にされません。-mno-long-calls を指定す ると、デフォルトの振る舞いが復元されます。これらのスイッチは、コン パイラが関数ポインタを通して関数呼び出しを扱うためにどのようなコー ドを生成するかに影響しないことに注意してください。 CRIS オプション これらのオプションは、特に CRIS ポートのために定義されています。 -march=architecture-type -mcpu=architecture-type 指定されたアーキテクチャのためのコードを生成します。architecture- type ための選択は、それぞれ ETRAX 4, ETRAX 100 と ETRAX 100 LX のた めの v3, v8 と v10 です。cris-axis-linux-gnu ではデフォルトが v10 であることを除いて、デフォルトは、v0 です。 -mtune=architecture-type ABI と利用可能な命令セットを除いて、生成されたコードに関して適用で きるすべての architecture-type を調整します。architecture-type ため の選択は、-march=architecture-type に対するものと同じです。 -mmax-stack-frame=n 関数のスタックフレームが n バイトを超えるとき、警告します。 -melinux-stacksize=n cris-axis-aout ターゲットでのみ利用可能です。プログラムのスタックが n バイトに設定されるべきであるカーネルローダへのプログラムの表示の 準備をします。 -metrax4 -metrax100 オプション -metrax4 と -metrax100 は、それぞれ -march=v3 と -march=v8 と同義語です。 -mmul-bug-workaround -mno-mul-bug-workaround 適用される CPU モデルのための "muls" と "mulu" 命令のバグを回避しま す。このオプションは、デフォルトでアクティブです。 -mpdebug アセンブリコードの CRIS 特有の冗長なデバッグ関連の情報を有効にしま す。また、このオプションは、アセンブリファイルの始めでアセンブラの ための #NO_APP フォーマットされたコードインディケータをオフにする効 果があります。 -mcc-init 前の命令の条件コードの結果を使用しません。常に、条件コードの使用の 前に比較とテストの命令を出力します。 -mno-side-effects ポストインクリメント以外のアドレッシングモードで副作用がある命令を 出力しません。 -mstack-align -mno-stack-align -mdata-align -mno-data-align -mconst-align -mno-const-align これらのオプション (no-オプション) は、スタックフレーム、個々のデー タ、と選択された CPU モデルのための最大の単一データアクセスサイズに 整列される定数の準備をします (準備を排除します)。デフォルトは 32 ビットの整列 (alignment) で整えることです。構造体のレイアウトのよう な ABI の詳細は、これらのオプションに影響されません。 -m32-bit -m16-bit -m8-bit 上記の stack- data- と const-align オプションと同様に、これらのオプ ションは、スタックフレーム、書き込み可能なデータと定数を、すべて 32 ビット、16 ビットまたは 8 ビットに整列するように準備します。デフォ ルトは 32-ビットの整列 (alignment) です。 -mno-prologue-epilogue -mprologue-epilogue -mno-prologue-epilogue をつけると、スタックフレームに設定する通報の 関数プロローグとエピローグは省略され、リターン命令またはリターン シーケンスのコードは、生成されません。コンパイルされたコードの目視 検査とともにそしてそれだけにこのオプションを使用します: 呼び出しで 保存されたレジスタを保存しなければならないとき、またはローカル変数 のための記憶域が割り付けられる必要があるとき、警告やエラーは発生し ません。 -mno-gotplt -mgotplt -fpic と -fPIC をつけると、(他のアーキテクチャでは伝統的な) PLT へ の呼び出しよりはむしろ GOT の PLT 部分から関数のためのアドレスを ロードする命令シーケンスを生成しません (生成します)。デフォルトは -mgotplt です。 -maout cris-axis-aout ターゲットでのみ認識される古い no-op オプション。 -melf cris-axis-elf と cris-axis-linux-gnu ターゲットでのみ認識される古い no-op オプション。 -melinux cris-axis-aout ターゲットでのみ認識され、-march=v8 のためのファイル と命令セットを含む、GNU/linux のような multilib を選択します。 -mlinux cris-axis-linux-gnu ターゲットでのみ認識される古い no-op オプショ ン。 -sim cris-axis-aout と cris-axis-elf で認識されるオプションは、シミュ レータライブラリの入出力関数とリンクするように準備します。コード、 初期化されたデータ、と 0 で初期化されたデータは、連続して割り付けら れます。 -sim2 -sim と似ていますが、初期化されたデータを 0x40000000 に、0 で初期化 されたデータを 0x80000000 に位置付けるオプションをリンカに渡しま す。 CRX オプション これらのオプションは、特に CRX ポートのために定義されています。 -mmac 乗累算命令の使用を有効にします。デフォルトで無効にされます。 -mpush-args プッシュ命令は、関数が呼び出されるとき、外向きの引数を渡すために使 用されます。デフォルトで有効にされます。 Darwin オプション これらのオプションは、Darwin オペレーティングシステムを実行するすべての アーキテクチャのために定義されます。 Darwin の FSF GCC は、"fat" オブジェクトファイルを作成しません。それは ターゲットに組み込まれる単一のアーキテクチャのためのオブジェクトファイ ルを作成します。Darwin の Apple の GCC は、複数の -arch オプションが使 用されるなら、"fat" ファイルを作成します。それは、複数回コンパイラまた はリンカを実行し、lipo と共に結果を接合することによって、行われます。 (ppc7400、ppc970 または i686 のような) 作成されたファイルのサブタイプ は、-mcpu または -march のように、GCC がターゲットとする ISA を指定する フラグによって決定されます。これを上書きするために、 -force_cpusubtype_ALL オプションを使用することができます。 Darwin ツールは、ISA ミスマッチを示されるとき、それらの振る舞いは異なり ます。アセンブラ、as は、それが生成されるファイルのサブタイプのために有 効に使用される命令のみ許可するので、ppc750 オブジェクトファイルの 64 ビット命令を出力することができません。共有ライブラリのためのリンカ、 /usr/bin/libtool は、その入力ファイルよりサブタイプを制限していない共有 ライブラリを作成するように求められるなら (例えば、ppc7400 ライブラリに ppc970 オブジェクトファイルを出力しようと試みます)、失敗して、エラーを 印刷します。実行形式のためのリンカ、ld は、入力ファイルの任意の最も制限 しているサブタイプを実行形式に静かに与えます。 -Fdir ヘッダファイルを検索するために、ディレクトリのリストの先頭にフレー ムワークディレクトリ dir を追加します。これらのディレクトリは、-I オプションよって指定されているそれらでインタリーブ (挟まれ) され、 左から右の順序でスキャンされます。 フレームワークディレクトリは、それにフレームワークがあるディレクト リです。フレームワークは、".framework" で終わるディレクトリが含まれ ている、"Headers" および/または "PrivateHeaders" ディレクトリがある ディレクトリです。フレームワークの名前は、".framework" を除いたこの ディレクトリの名前です。フレームワークに関連しているヘッダは、最初 に検索される "Headers" がある、それらの 2 つのディレクトリの 1 つで 見つけられます。サブフレームワークは、フレームワークの "Frameworks" ディレクトリにあるフレームワークディレクトリです。サブフレームワー クのヘッダのインクルードは、サブフレームワークを含むフレームワーク のヘッダ、またはシブリング (sibling) サブフレームワークのヘッダのみ に現れることができます。2 つのサブフレームワークは、それらが同じフ レームワークで起こるなら、シブリング (sibling) です。サブフレーム ワークは、フレームワークと同じ名前を持つべきではありません、これに 違反するなら、警告が表示されます。現在のサブフレームワークは、サブ フレームワークを持つことができないので、将来、これをサポートするた めに、メカニズムが拡張されるかもしれません。 "/System/Library/Frameworks" と "/Library/Frameworks" で標準のフ レームワークを見つけることができます。使用例は、フレームワークと header.h の名前を示す Framework が "PrivateHeaders" または "Headers" でディレクトリで見つけられるところで、"#include <Framework/header.h>" のようにインクルードします。 -gused 使用されたシンボルのためのデバッグ情報を出力します。STABS デバッグ 形式のために、これは -feliminate-unused-debug-symbols を有効にしま す。これは、デフォルトで ON です。 -gfull すべてのシンボルとタイプのためのデバッグ情報を出力します。 -mmacosx-version-min=version この実行形式が実行する、MacOS X の最も初期のバージョンは、version です。version の典型的な値は、10.1、10.2 と 10.3.9 です。 このオプションのデフォルトは、最も役に立つように思える選択をするこ とです。 -mkernel カーネル開発モードを有効にします。-mkernel オプションは、適用できる ところで、-static, -fno-common, -fno-cxa-atexit, -fno-exceptions, -fno-non-call-exceptions, -fapple-kext, -fno-weak と -fno-rtti を設 定します。また、このモードは、PowerPC ターゲットのために -mno-altivec, -msoft-float, -fno-builtin と -mlong-branch を設定し ます。 -mone-byte-bool sizeof(bool)==1 となるように、bool のためのデフォルトを上書きしま す。デフォルトで、sizeof(bool) は、Darwin/PowerPC でコンパイルする とき、4 で、Darwin/x86 でコンパイルするとき、1 です、そのため、この オプションは、x86 で効果がありません。 警告: -mone-byte-bool スイッチによって、GCC は、そのスイッチなしで 生成されるコードとバイナリ互換性のないコードを生成します。このス イッチを使用することは、システムライブラリを含むプログラムの他のす べてのモジュールを再コンパイルすることを必要とします。デフォルトで ないデータモデルに適合するためにこのスイッチを使用します。 -mfix-and-continue -ffix-and-continue -findirect-data 開発時の速いターンアラウンド (転回) に適したコードを生成します。gdb が、既に実行しているプログラムに ".o" ファイルを動的にロードするこ とを有効にする必要があります。-findirect-data と -ffix-and-continue は、後方互換性のために提供されています。 -all_load 静的なアーカイブライブラリのすべてのメンバをロードします。詳細につ いては、マニュアル ld(1) を参照してください。 -arch_errors_fatal 間違ったアーキテクチャを持つファイルでエラーとなることを致命的エ ラーとします。 -bind_at_load ファイルがロードされるか、または開始されるとき、動的なリンカが、す べての未定義の参照をバインドするように、出力ファイルをマークしま す。 -bundle Mach-o バンドル形式のファイルを作成します。詳細については、マニュア ル ld(1) を参照してください。 -bundle_loader executable このオプションは、リンクされる構築出力ファイルをロードする executable (実行形式) を指定します。詳細については、マニュアル ld(1) を参照してください。 -dynamiclib このオプションが渡されるとき、GCC は、Darwin libtool コマンドを使用 して、リンク時に、実行形式の代わりに動的なライブラリを作成します。 -force_cpusubtype_ALL これによって、GCC の出力ファイルは、-mcpu または -march オプション によって制御されるものの代わりに ALL サブタイプを持ちます。 -allowable_client client_name -client_name -compatibility_version -current_version -dead_strip -dependency-file -dylib_file -dylinker_install_name -dynamic -exported_symbols_list -filelist -flat_namespace -force_flat_namespace -headerpad_max_install_names -image_base -init -install_name -keep_private_externs -multi_module -multiply_defined -multiply_defined_unused -noall_load -no_dead_strip_inits_and_terms -nofixprebinding -nomultidefs -noprebind -noseglinkedit -pagezero_size -prebind -prebind_all_twolevel_modules -private_bundle -read_only_relocs -sectalign -sectobjectsymbols -whyload -seg1addr -sectcreate -sectobjectsymbols -sectorder -segaddr -segs_read_only_addr -segs_read_write_addr -seg_addr_table -seg_addr_table_filename -seglinkedit -segprot -segs_read_only_addr -segs_read_write_addr -single_module -static -sub_library -sub_umbrella -twolevel_namespace -umbrella -undefined -unexported_symbols_list -weak_reference_mismatches -whatsloaded これらのオプションは Darwin リンカで利用可能です。Darwin リンカのマ ニュアルページは、詳細にそれらについて説明しています。 DEC Alpha オプション これらの -m オプションは、DEC Alpha 実装のために定義されています: -mno-soft-float -msoft-float 浮動小数点演算に対してハードウェア浮動小数点命令を使用します (使用 しません)。-msoft-float が指定されるとき、libgcc.a の関数は、浮動小 数点演算を実行するために使用されます。それらが、浮動小数点演算をエ ミュレートするルーチンによって置き換えられないか、またはそのような エミュレーションルーチンを呼び出すようにコンパイルされていないな ら、これらのルーチンは、浮動小数点演算を発行します。浮動小数点演算 なしで Alpha のためにコンパイルしているなら、利用者は、ライブラリが それらを呼び出さないように構築されていることを保証しなければなりま せん。 浮動小数点演算のない Alpha の実装は、浮動小数点レジスタを持つ必要が あることに注意してください。 -mfp-reg -mno-fp-regs 浮動小数点レジスタセットを使用する (使用しない) コードを生成しま す。-mno-fp-regs は -msoft-float の意味を含みます。浮動小数点レジ スタセットが使用されていないなら、浮動小数点オペランドはまるでそれ らが整数であるかのように整数レジスタで渡され、浮動小数点の結果は $f0 の代わりに $0 で渡されます。これは標準でない呼び出しシーケンス であるので、-mno-fp-regs をつけてコンパイルされたコードによって呼び 出さる浮動小数点の引数または返り値がある任意の関数も、またそのオプ ションでコンパイルされなければなりません。 このオプションの典型的な使用法は、それが使用しないで、したがって、 浮動小数点レジスタを保存して復元する必要はないカーネルを構築するこ とです。 -mieee Alpha アーキテクチャは最大性能のために最適化された浮動小数点ハード ウェアを実装しています。それは IEEE 浮動小数点標準にほぼ適合してい ます。しかしながら、完全に適合するためには、ソフトウェアの支援が必 要です。このオプションは、inexact-flag が維持されていない (下記参 照) ことを除いて、完全に IEEE 適合コードを生成します。このオプショ ンがオンにされるなら、プリプロセッサマクロ "_IEEE_FP" がコンパイル の間、定義されています。結果のコードは、効率が悪くなりますが、非正 規化された数、と非数と正/負の無限のような例外的な IEEE 値を正しくサ ポートすることができます。他の Alpha コンパイラは、このオプションを -ieee_with_no_inexact と呼んでいます。 -mieee-with-inexact これは、また、生成コードが IEEE inexact-flag を維持することを除い て、-mieee に似ています。このオプションをオンにすることによって、生 成コードは、IEEE 数学ライブラリ (math) に完全に適合するように実装し ます。"_IEEE_FP" に加えて、"_IEEE_FP_EXACT" はプリプロセッサマクロ として定義されます。いくつかの Alpha 実装において、結果のコードは、 デフォルトで生成されたコードよりかなり遅く実行します。inexact-flag に依存するコードがほとんどないので、通常、利用者はこのオプションを 指定するはずがありません。他の Alpha コンパイラは、このオプションを -ieee_with_inexact と呼んでいます。 -mfp-trap-mode=trap-mode このオプションは、どのような浮動小数点関連のトラップが有効にされる かを制御します。他の Alpha コンパイラは、これのオプションを -fptm trap-mode と呼んでいます。次の 4 つの値の 1 つにトラップモードを設 定することができます: n これはデフォルト (通常) の設定です。有効にされるトラップは、ソ フトウェアで無効にすることができないトラップのみです (例えば、0 除算トラップ) u n によって有効にされたトラップに加えて、アンダフロートラップも 同様に有効にされます。 su u に似ていますが、命令は、ソフトウェア完了 (コンパイル?) のため に安全であるとマークされます (詳細については、Alpha アーキテク チャマニュアルを参照してください)。訳注: 原文の software completion は、software compilation の誤りか? sui su に似ていますが、不正確なトラップも同様に有効にされます。 -mfp-rounding-mode=rounding-mode IEEE 丸めモードをを選択します。他の Alpha コンパイラは、これのオプ ションを -fprm rounding-mode と呼んでいます。rounding-mode には次の 1 つを指定できます: n 通常の IEEE 丸めモード。浮動小数点数は、最も近い機械数の方向 へ、または、もし同値 (tie) の場合には均等な機械数の方向に丸めら れます。 m 負の無限の方向に丸めます。 c 切捨て (chopped) 丸めモード。浮動小数点数は、0 の方向に丸められ ます。 d 動的 (dynamic) 丸めモード。浮動小数点制御レジスタ (fpcr、Alpha アーキテクチャリファレンスマニュアルを参照) のフィールドは、有 効な丸めモードを制御します。C ライブラリは、正の無限の方向に丸 めるためにこのレジスタを初期化します。したがって、利用者のプロ グラムが fpcr を変更しないなら、d は、正の無限の方向の丸めに対 応しています。 -mtrap-precision=trap-precision Alpha アーキテクチャでは、浮動小数点トラップは不正確です。これは、 ソフトウェア支援なしで、浮動小数点トラップから復旧することが不可能 であること、そして、通常、プログラム実行は終了する必要があることを 意味します。GCC は浮動小数点トラップを引き起こした正確な位置を決定 するためにオペレーティングシステムのトラップハンドラを支援すること ができるコードを生成することができます。アプリケーションの要件に よって、異なったレベルの精度を選択することができます: p プログラム精度。このオプションは、デフォルトであり、トラップハ ンドラが、どのプログラムが浮動小数点例外を引き起こしたかのみを 特定できることを意味します。 f 関数精度。トラップハンドラは、浮動小数点例外を引き起こした関数 を決定することができます。 i 命令精度。トラップハンドラは、浮動小数点例外を引き起こした正確 な命令を決定することができます。 他の Alpha コンパイラは、-scope_safe と -resumption_safe と呼ばれる 同等なオプションを提供しています。 -mieee-conformant このオプションは生成されたコードを IEEE 適合としてマークします。ま た、-mtrap-precision=i と -mfp-trap-mode=su または -mfp-trap-mode=sui のいずれかを指定していないなら、利用者は、このオ プションを使用してはいけません。唯一の効果は、生成されたアセンブリ ファイルの関数プロローグに行 .eflag 48 を出力することです。DEC Unix の下では、これは IEEE 適合数学 (math) ライブラリルーチンがリンクさ れる効果があります。 -mbuild-constants 通常、GCC は、2 つか 3 つの命令でより小さな定数から構築できるかどう か確かめるために 32 または 64 ビットの整数定数を調べます。そうする ことができないなら、リテラルとして定数を出力し、実行時に data セグ メントからそれをロードするコードを生成します。 たとえより多くの命令を取っても (最大は 6)、コードを使用してすべての 整数定数を構築するように、GCC に要求するためにこのオプションを使用 ます。 利用者は、通常、共有ライブラリの動的ローダを構築するためにこのオプ ションを使用するでしょう。共有ライブラリ自体、それ自体のデータセグ メントで変数と定数を見つけることができる前に、メモリ内のそれ自体を 再配置しなければなりません。 -malpha-as -mgas ベンダによって供給されたアセンブラ (-malpha-as) によってか、または GNU アセンブラ -mgas によって生成されたコードかどうかを選択します。 -mbwx -mno-bwx -mcix -mno-cix -mfix -mno-fix -mmax -mno-max GCC がオプションの BWX, CIX, FIX と MAX 命令セットを使用するコード を生成するべきかどうかを指示します。デフォルトは、-mcpu= オプション によって指定された CPU タイプか、または、なにも指定されなかったな ら、GCC が構築されたときの CPU タイプによってサポートされた命令セッ トを使用することです。 -mfloat-vax -mfloat-ieee IEEE 単精度と倍精度の代わりに VAX F と G 浮動小数点演算を使用する (使用しない) コードを生成します。 -mexplicit-relocs -mno-explicit-relocs 古い Alpha アセンブラは、アセンブラマクロを除いて、シンボル再配置を 生成する方法を提供しませんでした。これらのマクロの使用は、最適の命 令スケジューリングを許していません。バージョン 2.12 の GNU binutil as は、再配置がどの命令に適用するべきであるかをコンパイラが、明白に マークすることができる、新しい構文をサポートしています。このオプ ションは、GCC がそれを構築して、それに応じたデフォルトを設定すると き、アセンブラの能力を検出するので、主にデバッグの役に立ちます。 -msmall-data -mlarge-data -mexplicit-relocs が有効であるとき、静的なデータは、gp-relative 再 配置を通してアクセスされます。-msmall-data が使用されるとき、8 バイ ト以下のオブジェクトは、small data 領域 (".sdata" と ".sbss" セク ション) に置かれ、$gp レジスタから 16 ビット再配置を通してアクセス されます。これは、small data 領域のサイズを 64KB に制限しますが、変 数は、単一の命令によって直接アクセスできます。 デフォルトは -mlarge-data です。このオプションで、data 領域はちょう ど 2GB 未満に制限されます。2GB 以上のデータを必要とするプログラム は、プログラムのデータセグメントの代わりにヒープ (heap) 中にデータ を割り付けるために "malloc" または "mmap" を使用しなければなりませ ん。 共有ライブラリのためのコードを生成するとき、-fpic は、-msmall-data の意味を含み、-fPIC は、-mlarge-data の意味を含みます。 -msmall-text -mlarge-text -msmall-text 使用されるとき、コンパイラは、プログラム (または、共有 ライブラリ) 全体のコードが 4MB に適合し、したがって、分岐命令で到達 可能であると仮定します。-msmall-data 使用されるとき、コンパイラは、 すべてのローカルシンボルが同じ $gp 値を共有し、したがって関数呼び出 しに必要な命令の数を 4 から 1 に減少させると仮定することができま す。 デフォルトは -mlarge-text です。 -mcpu=cpu_type マシンタイプ cpu_typee のための命令セットと命令スケジューリングパラ メータを設定します。利用者は EV スタイル名、または対応するチップ番 号のいずれかを指定することができます。GCC は、EV4, EV5 と EV6 ファ ミリのプロセッサのためのスケジューリングパラメータをサポートし、利 用者が指定するプロセッサから命令セットのためのデフォルト値を選択し ます。利用者がプロセッサタイプを指定しないなら、GCC はコンパイラが 構築されたときのプロセッサをデフォルトとします。 cpu_type に対してサポートされている値は次の通りです。 ev4 ev45 21064 EV4 としてスケジュールし、命令セット拡張がありません。 ev5 21164 EV5 としてスケジュールし、命令セット拡張がありません。 ev56 21164a EV5 としてスケジュールし、BWX 拡張をサポートします。 pca56 21164pc 21164PC EV5 としてスケジュールし、BWX と MAX 拡張をサポートします。 ev6 21264 EV6 としてスケジュールし、BWX, FIX と MAX 拡張をサポートしま す。 ev67 21264a EV6 としてスケジュールし、BWX, CIX, FIX と MAX 拡張をサポートし ます。 -mtune=cpu_type マシンタイプ cpu_typee のための命令スケジューリングパラメータのみを 設定します。命令セットは、変更されません。 -mmemory-latency=time アプリケーションで見られるような典型的なメモリ参照のためにスケ ジューラが仮定するべきであるレイテンシ (待ち時間) を設定します。こ の数は、アプリケーションによって使用されるメモリアクセスパターンと マシンの外部キャッシュのサイズに大きく依存しています。 time のための有効なオプションは、次の通りです。 number クロックサイクルを表す 10 進数。 L1 L2 L3 main コンパイラは、メインメモリと同様に、レベル 1、2 と 3 キャッシュ (また、Dcache、Scache と Bcache と呼ばれる) のための "典型的な" EV4 と EV5 ハードウェアのためのクロックサイクルの数の見積りを含 んでいます。L3 は、EV5 のためだけに有効であることに注意してくだ さい。 DEC Alpha/VMS オプション これらの -m オプションは、DEC Alpha/VMS 実装のために定義されています: -mvms-return-codes main から VMS 条件コードを返します。デフォルトは、POSIX スタイルの 条件 (例えば、エラー) コードを返すことです。 FRV オプション -mgpr-32 最初の 32 個の汎用レジスタのみ使用します。 -mgpr-64 すべての 64 個の汎用レジスタを使用します。 -mfpr-32 最初の 32 個の浮動小数点レジスタのみを使用します。 -mfpr-64 すべての 64 個の浮動小数点レジスタを使用します。 -mhard-float 浮動小数点演算にハードウェア命令を使用します。 -msoft-float 浮動小数点演算にライブラリルーチンを使用します。 -malloc-cc 条件コードレジスタを動的に割り付けます。 -mfixed-cc 条件コードレジスタを動的に割り付けません、"icc0" と "fcc0" のみ使用 します。 -mdword double ワード insn を使用するように ABI を変更します。 -mno-dword double ワード命令を使用しません。 -mdouble 浮動小数点 double 命令を使用します。 -mno-double 浮動小数点 double 命令を使用しません。 -mmedia media 命令を使用します。 -mno-media media 命令を使用しません。 -mmuladd 乗算と加算/減算命令を使用します。 -mno-muladd 乗算と加算/減算命令を使用しません。 -mfdpic 関数へのポインタを表すために関数記述子を使用する、FDPIC ABI を選択 します。任意の PIC/PIE 関連のオプションがなければ、-fPIE の意味を含 みます。-fpic または -fpie で、GOT エントリと小さなデータが GOT ベースアドレスから 12 ビットの範囲内であると仮定します。-fPIC また は -fPIE で、GOT オフセットは、32 ビットで計算されます。 -minline-plt 局所的にバインドすることを知られない関数への関数呼び出しで、PLT エ ントリのインライン化を有効にします。-mfdpic なしは、効果はありませ ん。速度の最適化を行い、共有ライブラリをコンパイルするなら (すなわ ち、-fPIC または -fpic)、または -O3 または上記のような最適化オプ ションがコマンドラインに存在しているとき、デフォルトで有効にされま す。 -mTLS スレッドローカルのコードを生成するとき、大きな TLS セグメントを仮定 します。 -mtls スレッドローカルのコードを生成するとき、大きな TLS セグメントを仮定 しません。 -mgprel-ro 読み込み専用セクションにあることが知られているデータの FDPIC ABI で "GPREL" リロケーション (再配置) の使用を有効にします。-fpic または -fpie を除いて、デフォルトで有効にされます: たとえ、グローバルなオ フセットテーブルをより小さくすることを助けるかもしれませんが、4 の ための 1 つの命令を交換します。-fPIC または -fPIE で、複数のシンボ ルによって共有されるものの 1 つ、4 のための 3 つの命令を交換し、参 照されたシンボルのための GOT エントリの必要性を避けるので、それはよ り勝利となるようです。訳注: 意味不明。そうでないなら、それを向こう にするために -mno-gprel-ro を使用することができます。 -multilib-library-pic pic ライブラリ (FD ではないライブラリ) とリンクします。-mfdpic がな い -fPIC と -fpic によるのと同様に、-mlibrary-pic によって意味が含 まれます。利用者は、それを決して明白に使用する必要はないはずです。 -mlinked-fp スタックフレームを割り付けるときはいつも、常にフレームポインタを作 成する EABI 要件に従います。このオプションは、-mno-linked-fp で無効 にすることができますが、デフォルトで有効にされます。 -mlong-calls 現在のコンパイル単位の外の関数を呼び出すために、間接アドレスを使用 します。これによって、32 ビットのアドレス空間内のどこでも関数を置く ことができます。 -malign-labels 前のパケットに nop を挿入することによって、8 バイトの境界にラベルを 整列するようにします。このオプションは、VLIW パッキングが有効にされ ているときのみ、効果があります。それは新しいパケットを作成しませ ん。それは単に既存のものに nop を加えます。 -mlibrary-pic 位置独立の EABI コードを生成します。 -macc-4 最初の 4 個の media アキュムレータレジスタのみを使用します。 -macc-8 すべての 8 個の media アキュムレータレジスタを使用します。 -mpack VLIW 命令をパックします。 -mno-pack VLIW 命令をパックしません。 -mno-eflags e_flags の ABI スイッチをマークしません。 -mcond-move 条件付き move 命令の使用を有効にします (デフォルト)。 このスイッチは、主にコンパイラをデバッグするためであり、おそらく将 来のバージョンで削除されるでしょう。 -mno-cond-move 条件付き move 命令の使用を無効にします。 このスイッチは、主にコンパイラをデバッグするためであり、おそらく将 来のバージョンで削除されるでしょう。 -mscc 条件付き set 命令の使用を有効にします (デフォルト)。 このスイッチは、主にコンパイラをデバッグするためであり、おそらく将 来のバージョンで削除されるでしょう。 -mno-scc 条件付き set 命令の使用を無効にします。 このスイッチは、主にコンパイラをデバッグするためであり、おそらく将 来のバージョンで削除されるでしょう。 -mcond-exec 条件付き実行の使用を有効にします (デフォルト)。 このスイッチは、主にコンパイラをデバッグするためであり、おそらく将 来のバージョンで削除されるでしょう。 -mno-cond-exec 条件付き実行の使用を無効にします。 このスイッチは、主にコンパイラをデバッグするためであり、おそらく将 来のバージョンで削除されるでしょう。 -mvliw-branch 分岐を VLIW 命令にパックするパスを実行します (デフォルト)。 このスイッチは、主にコンパイラをデバッグするためであり、おそらく将 来のバージョンで削除されるでしょう。 -mno-vliw-branch 分岐を VLIW 命令にパックするパスを実行しません。 このスイッチは、主にコンパイラをデバッグするためであり、おそらく将 来のバージョンで削除されるでしょう。 -mmulti-cond-exec 条件付き実行で "&&" と "||" の最適化を有効にします (デフォルト)。 このスイッチは、主にコンパイラをデバッグするためであり、おそらく将 来のバージョンで削除されるでしょう。 -mno-multi-cond-exec 条件付き実行で "&&" と "||" の最適化を無効にします。 このスイッチは、主にコンパイラをデバッグするためであり、おそらく将 来のバージョンで削除されるでしょう。 -mnested-cond-exec 入れ子に (ネスト) された条件付き実行の最適化を有効にします (デフォ ルト)。 このスイッチは、主にコンパイラをデバッグするためであり、おそらく将 来のバージョンで削除されるでしょう。 -mno-nested-cond-exec 入れ子に (ネスト) された条件付き実行の最適化を無効にします。 このスイッチは、主にコンパイラをデバッグするためであり、おそらく将 来のバージョンで削除されるでしょう。 -moptimize-membar このスイッチは、コンパイラが生成したコードから冗長な "membar" 命令 を取り除きます。それはデフォルトで有効にされます。 -mno-optimize-membar このスイッチは、生成されたコードから冗長な "membar" 命令を自動的に 削除することを無効にします。 -mtomcat-stats gas は tomcat 統計値を印刷します。 -mcpu=cpu コードを生成するプロセッサタイプを選択します。可能な値は、frv, fr550, tomcat, fr500, fr450, fr405, fr400, fr300 and simple です。 GNU/Linux オプション これらの -m オプションは、GNU/Linux ターゲットのために定義されています: -mglibc uClibc の代わりに GNU C ライブラリを使用します。これは、 *-*-linux-*uclibc* ターゲットを除いて、デフォルトです。 -muclibc GNU C ライブラリの代わりに uClibc を使用します。これは、 *-*-linux-*uclibc* ターゲットでデフォルトです。 H8/300 オプション これらの -m オプションは、H8/300 実装のために定義されています: -mrelax 可能であるなら、リンク時に、いくつかのアドレス参照を短くします。リ ンカオプション -relax を使用します。 -mh H8/300H のためのコードを生成します。 -ms H8S のためのコードを生成します。 -mn ノーマルモードの H8S と H8/300H のためのコードを生成します。このス イッチは、-mh または -ms のいずれかで使用されるべきです。 -ms2600 H8S/2600 のためのコードを生成します。このスイッチは、-ms で使用され なければなりません。 -mint32 デフォルトで "int" データを 32 ビットにします。 -malign-300 H8/300H と H8S では、H8/300 と同じ整列規則を使用します。H8/300H と H8S のためのデフォルトは、long と float を 4 バイト境界に整列するこ とです。-malign-300 によってそれらは、2 バイト境界で整列されます。 このオプションは H8/300 では効果がありません。 HPPA オプション これらの -m オプションは、HPPA ファミリコンピュータのために定義されてい ます: -march=architecture-type 指定されたアーキテクチャのためのコードを生成します。architecture- type に対する選択は、PA 1.0 プロセッサのためには 1.0、PA 1.1 プロ セッサのためには 1.1 と PA 2.0 プロセッサのためには 2.0 です。利用 者のマシンのために適切なアーキテクチャオプションを決定するために は、HP-UX システムの /usr/lib/sched.models を参照してください。下位 の番号が付けられたアーキテクチャのためにコンパイルされたコードは、 上位の番号が付けられたアーキテクチャで実行できますが、逆は実行でき ません。 -mpa-risc-1-0 -mpa-risc-1-1 -mpa-risc-2-0 それぞれ、-march=1.0, -march=1.1 および -march=2.0 と同義語です。 -mbig-switch 大きなスイッチテーブルに適切なコードを生成します。アセンブラ/リンカ がスイッチテーブル内の分岐の範囲外のエラーを出す場合のみ、このオプ ションを使用します。 -mjump-in-delay 関数呼び出しの返りポインタを条件ジャンプのターゲットに変更すること によって無条件ジャンプ命令で関数呼び出しの遅延スロットを埋めます。 -mdisable-fpregs どんな方法でも浮動小数点レジスタが使用されないようにします。これは 浮動小数点レジスタの遅延 (lazy) コンテキストスイッチを実行するカー ネルをコンパイルするために必要です。利用者がこのオプションを使用し て、浮動小数点演算の実行を試みるなら、コンパイラはアボートします。 -mdisable-indexing コンパイラがインデックスアドレスモードを使用しないようにします。 MACHの下で MIG 生成コードをコンパイルするとき、これは、いくつかのか なり不明りょうな問題を回避します。 -mno-space-regs ターゲットには空間レジスタがないと仮定するコードを生成します。これ によって、GCC は、より速い間接的な呼び出しを生成することができ、ス ケーリングしない (unscaled) インデックスアドレスモードを使用するこ とがでいます。 そのようなコードは、レベル 0 PA システムとカーネルに適しています。 -mfast-indirect-calls 呼び出しが空間境界に決して交差しないと仮定するコードを生成します。 これによって、GCC は、より速い間接的な呼び出しを実行するコードを出 力できます。 このオプションは、共有ライブラリまたは入れ子にされた関数の存在の下 では動作しません。 -mfixed-range=register-range 与えられたレジスタ範囲を固定レジスタとして扱うコードを生成します。 固定レジスタは、レジスタ割り付けが使用できないものです。カーネル コードをコンパイルするとき、これは役に立ちます。レジスタ範囲は、 ダッシュによって分離された 2 つのレジスタとして指定されます。コンマ によって分離して、複数のレジスタ範囲を指定することができます。 -mlong-load-store HP-UX 10 リンカによって時々必要となる、3 命令のロードと格納シーケン スを生成します。これは HP コンパイラへの +k オプションと同等です。 -mportable-runtime ELF システムのために HP によって提案された移植性のある呼び出し規約 を使用します。 -mgas GAS だけが理解しているアセンブラ命令文の使用を有効にします。 -mschedule=cpu-type マシンタイプ cpu-type の制約に従ってコードをスケジューリングしま す。cpu-type のための選択は、700 7100, 7100LC, 7200, 7300 と 8000 です。利用者のマシンのために適切なスケジューリングオプションを決定 するためには、HP-UX システム上の /usr/lib/sched.models を参照してく ださい。デフォルトのスケジューリングは 8000 です。 -mlinker-opt HP-UX リンカで最適化パスを有効にします。これによってシンボリックデ バッグが不可能となることに注意してください。また、いくつかのプログ ラムをリンクするとき、それらが偽のエラーメッセージを与える HP-UX 8 と HP-UX 9 のリンカでバグの引き金となります。 -msoft-float 浮動小数点のためのライブラリ呼び出しを含む出力を生成します。警告: 必要なライブラリは、すべての HPPA ターゲットで利用可能ではありませ ん。通常、マシンの普通の C コンパイラの機能は使用されますが、クロス コンパイルで直接行うことはできません。利用者は、利用者自身でクロス コンパイルのための適切なライブラリ関数を準備しなければなりません。 組み込みターゲット hppa1.1-*-pro は、ソフトウェア浮動小数点のサポー トを提供しています。 -msoft-float は、出力ファイルにおける呼び出し規約を変更します。した がって、利用者がこのオプションですべてのプログラムをコンパイルする 場合のみ、役に立ちます。特に、利用者は、これが動作するために、 -msoft-float をつけて GCC に装備されているライブラリ、libgcc.a をコ ンパイルする必要があります。 -msio サーバ IO のために事前に定義される "_SIO" を生成します。デフォルト は -mwsio です。これは、ワークステーション IO のために事前に定義さ れる "__hp9000s700", "__hp9000s700__" と "_WSIO" を生成します。これ らのオプションは HP-UX と HI-UX の下で利用可能です。 -mgnu-ld GNU ld 特有のオプションを使用します。これは、共有ライブラリを構築す るとき、ld に -shared を渡します。GCC が GNU リンカで明示的または暗 黙的に設定されるときのデフォルトです。このオプションは、どの ld が 呼び出されるかに影響はなく、どんなパラメータがその ld に渡されるか を変更するだけです。呼び出される ld は、--with-ld 設定オプション、 GCC のプログラム検索パス、と最後にユーザの PATH によって決定されま す。GCC によって使用されるリンカは、which `gcc -print-prog-name=ld` を使用して印刷することができます。このオプションは、64 ビット HP-UX GCC でのみ利用可能です、すなわち、hppa*64*-*-hpux* をつけて設定され ています。 -mhp-ld HP ld 特有のオプションを使用します。これは、共有ライブラリをを構築 するとき、ld に -b を渡し、すべてのリンクでは、ld に +Accept TypeMismatch を渡します。GCC が HP リンカで明示的または暗黙的に設定 されるときのデフォルトです。このオプションは、どの ld が呼び出され るかに影響はなく、どんなパラメータがその ld に渡されるかを変更する だけです。呼び出される ld は、--with-ld 設定オプション、GCC のプロ グラム検索パス、と最後にユーザの PATH によって決定されます。GCC に よって使用されるリンカは、which `gcc -print-prog-name=ld` を使用し て印刷することができます。このオプションは、64 ビット HP-UX GCC で のみ利用可能です、すなわち、hppa*64*-*-hpux* をつけて設定されていま す。 -mlong-calls ロング呼び出しシーケンスを使用するコードを生成します。これは、呼び 出しがリンカが生成するスタブに常に到達できることを保証します。デ フォルトは、呼び出しサイトから関数または変換ユニットの始まりまでの 距離が、場合によって、使用されている分岐タイプによって設定される事 前に定義された制限を超えるときにのみ、ロング呼び出しを生成すること です。通常の呼び出しの制限は、それぞれ PA 2.0 と PA 1.X アーキテク チャのための 7,600,000 と 240,000 バイトです。sibcall は常に 240,000 バイトに制限されています。 距離は、-ffunction-sections オプションを使用するとき、または SOM リ ンカで HP-UX の下で -mgas と -mno-portable-runtime オプションを使用 するとき、関数の始まりから測定されます。 性能が落ちるので、通常、このオプションを使用することは望ましくあり ません。しかしながら、特に部分リンクがアプリケーションを構築するた めに使用されているとき、大きなアプリケーションで役に立ちます。 使用されるロング呼び出しのタイプは、アセンブラとリンカの能力、と生 成されるコードのタイプに依存します。ロング絶対呼び出しと、ロング pic シンボル差分 (symbol-difference) または PC 相対呼び出しをサポー トするシステムでの影響は、比較的小さいはずです。しかしながら、間接 呼び出しは、pic コードで 32 ビットの ELF システムで使用され、かなり 長いものです。 -munix=unix-std 指定された UNIX 標準のためのコンパイラの事前の定義と開始ファイルの 選択を生成します。unix-std のための選択は、93, 95 と 98 です。93 は、すべての HP-UX バージョンでサポートされます。95 は、HP-UX 10.10 以降で利用可能です。98 は、HP-UX 11.11 以降で利用可能です。デフォル ト値は、HP-UX 10.00 のための 93、HP-UX 10.10 から 11.00 のための 95、と HP-UX 11.11 以降のための 98 です。 -munix=93 は、GCC 3.3 と 3.4 と同じ事前の定義を提供します。 -munix=95 は、"XOPEN_UNIX" と "_XOPEN_SOURCE_EXTENDED" のための追加 の事前の定義と開始ファイル unix95.o を提供します。-munix=98 は、 "_XOPEN_UNIX", "_XOPEN_SOURCE_EXTENDED", "_INCLUDE__STDC_A1_SOURCE" と "_INCLUDE_XOPEN_SOURCE_500" のための追加の事前の定義と開始ファイ ル unix98.o を提供します。 このオプションが様々なライブラリルーチンのためにインタフェースを変 更することに注意することは重要です。また、それは、C ライブラリの操 作上の振る舞いに影響します。したがって、このオプションを使用で、極 度の注意が必要です。 1 つ以上の UNIX 標準で動作する目的があるライブラリコードは、必要に 応じて変数 __xpg4_extended_mask をテスト、設定と復元しなければなり ません。ほとんどの GNU ソフトウェアは、この能力を提供しません。 -nolibdld -static オプションが HP-UX 10 以降で指定されるとき、libdld.sl を検 索するためにリンクオプションの生成を抑制します。 -static libc 中の setlocale の HP-UX 実装は libdld.sl に依存しています。 libdld.sl のアーカイブバージョンがありません。したがって、-static オプションが指定されるとき、特別なリンクオプションが、この依存関係 を解決するために必要です。 HP-UX 10 以降では、GCC ドライバは、-static オプションが指定されると き、libdld.sl とリンクするために必要なオプションを追加します。これ によって、結果のバイナリを動的にできます。64 ビットのポートでは、リ ンカは、どのような場合でも、デフォルトで動的なバイナリを生成しま す。GCC ドライバが、これらのリンクオプションを追加することを防ぐた めに -nolibdld オプションを使用することができます。 -threads HP-UX の下で dce thread ライブラリを使用するマルチスレッド化のサ ポートを追加します。このオプションはプリプロセッサとリンカの両方の ためのフラグを設定します。 Intel 386 と AMD x86-64 オプション これらの -m オプションは、i386 と x86-64 ファミリコンピュータのために定 義されています: -mtune=cpu-type ABI と利用可能な命令セットを除いて、生成するコードに関して適用でき るすべてのものを cpu-type に調整します。cpu-type のための選択は次の 通りです: generic 最も一般的な IA32/AMD64/EM64T プロセッサのために最適化された コードを作成します。利用者のコードが実行される CPU を知っている なら、利用者は、-mtune=generic の代わりに対応する -mtune オプ ションを使用するべきです。しかし、利用者のアプリケーションの ユーザが、何の CPU があるかを知らないなら、このオプションを使用 するべきです。 新しいプロセッサが、市場で配備されるように、このオプションの振 る舞いは、変化します。したがって、利用者が、GCC のより新しい バージョンにアップグレードするなら、コード生成オプションは、GCC のそのバージョンがリリースされたとき、最も一般的であったプロ セッサを反映するために変更されます。 -march は、コンパイラが使用できる命令セットを示し、すべてのプロ セッサに適切な一般的な命令セットがないので、-march=generic オプ ションは、ありません。対照的に、-mtune は、コードが最適化されて いるプロセッサ (または、この場合プロセッサの収集) を示します。 native これは、コンパイルするマシンのプロセッサタイプを決定することに よって、コンパイル時間の調整するために CPU を選択します。 -mtune=native を使用すると、選択された命令セットの制約の下で ローカルマシンのために最適化されたコードを作成します。 -march=native を使用すると、ローカルマシンによってサポートされ たすべての命令のサブセットを有効にします (したがって、結果は異 なったマシンで実行できないかもしれません)。 i386 オリジナルの Intel の i386 CPU。 i486 Intel の i486 CPU。(このチップのために実装する計画はありませ ん。) i586, pentium MMX サポートのない Intel Pentium CPU。 pentium-mmx MMX 命令セットのサポート付きの Pentium コアをベースとした Intel PentiumMMX CPU。 pentiumpro Intel PentiumPro CPU。 i686 "generic" と同様ですが、"march" オプションとして使用されると き、PentiumPro 命令セットが使用されるので、コードはすべての i686 ファミリチップで動作します。 pentium2 MMX 命令セットのサポート付きの PentiumPro コアをベースとした Intel Pentium2 CPU。 pentium3, pentium3m MMX と SSE 命令セットのサポート付きの PentiumPro コアをベースと した Intel Pentium3 CPU。 pentium-m MMX、SSE と SSE2 命令セットのサポート付きの Intel Pentium3 CPU の省電力バージョン。Centrino ノートブックで使用されています。 pentium4, pentium4m MMX、SSE と SSE2 命令セットのサポート付きの Intel Pentium4 CPU。 prescott MMX、SSE、SSE2 と SSE3 命令セットのサポート付きの Intel Pentium4 CPU の改良版。 nocona 64 ビット拡張、MMX、SSE、SSE2 と SSE3 命令セットのサポート付き の Intel Pentium4 CPU の改良版。 core2 64 ビットの拡張、MMX、SSE、SSE2、SSE3 と SSSE3 命令セットのサ ポート付きの Intel Core2 CPU。 k6 MMX 命令セットのサポート付きの AMD K6 CPU。 k6-2, k6-3 MMX and 3dNOW! 命令セットのサポート付きの AMD K6 CPU の改良版。 athlon, athlon-tbird MMX、3dNOW!、強化版 3dNOW! と SSE プリフェッチ命令サポート付き の AMD Athlon CPU。 athlon-4, athlon-xp, athlon-mp MMX、3dNOW!、強化版 3dNOW! と完全 SSE 命令セットのサポート付き の改良版 AMD Athlon CPU。 k8, opteron, athlon64, athlon-fx x86-64 命令セットのサポート付きの AMD K8 コアをベースとした CPU。(これは、MMX、SSE、SSE2、3dNOW!、強化版 3dNOW! と 64 ビッ ト命令セット拡張のスーパセットです。) k8-sse3, opteron-sse3, athlon64-sse3 SSE3 命令セットのサポートがある k8、opteron と athlon64 の改良 されたバージョン。 winchip-c6 追加 MMX 命令セットのサポート付きの i486 と同じ方法で取扱われる IDT Winchip C6 CPU。 winchip2 追加 MMX と 3dNOW! 命令セットのサポート付きの i486 と同じ方法で 取扱われる IDT Winchip2 CPU。 c3 MMX と 3dNOW! 命令セットのサポート付きの Via C3 CPU。(このチッ プのために実装する計画はありません。) c3-2 MMX and SSE 命令セットのサポート付きの Via C3-2 CPU。(このチッ プのために実装する計画はありません。) geode MMX と 3dNOW! 命令セットのサポート付きの組み込み AMD CPU。 特定の cpu-type を選ぶことは、その特定のチップのために適切なものを スケジュールしたとはいえ、コンパイラは、使用されている -march=cpu- type オプションなしでも i386 で実行しないコードは生成しません。 -march=cpu-type マシンタイプ cpu-type のための命令を生成します。cpu-type のための選 択は、-mtune のためと同じです。そのうえに、-march=cpu-type を指定す ることは、-mtune=cpu-type の意味を含みます。 -mcpu=cpu-type -mtune のための古くて推奨されない同義語です。 -m386 -m486 -mpentium -mpentiumpro これらのオプションは、それぞれ -mtune=i386, -mtune=i486, -mtune=pentium および -mtune=pentiumpro と同義語です。これらの同義 語は、古くて推奨されません。 -mfpmath=unit 選択されたユニット unit のための浮動小数点演算を生成します。unit た めの選択は次の通りです: 387 チップの大多数に存在する標準の 387 浮動小数点コプロセッサを使用 し、そのほかは、エミュレートされます。このオプションつきでコン パイルされたコードは、ほとんどすべての点で動作します。一時的な 結果は、他のチップの大部分と比べて、わずかに異なった結果をもた らすタイプによって指定された精度の代わりに 80 ビットの精度で計 算されます。より詳細な記述については -ffloat-store を参照してく ださい。 これは i386 コンパイラのためのデフォルトの選択です。 sse SSE 命令セットに存在するスカラ浮動小数点命令を使用します。この 命令セットは Pentium3 以降、Athlon-4, Athlon-xp と Athlon-mp チップによる AMD 系列でサポートされます。SSE 命令セットの初期の バージョンは、単精度演算のみをサポートし、そのため、倍精度と拡 張精度演算は、まだ 387 を使用して行われます。後のバージョン、 Pentium4 でのみ存在し、将来の AMD x86-64 チップは、倍精度演算も サポートしています。 i386 コンパイラに関して、利用者は、SSE 拡張を有効にして、このオ プションが効果があるようにするために、-march=cpu-type, -msse ま たは -msse2 スイッチを使用する必要があります。x86-64 コンパイラ について、これらの拡張はデフォルトで有効にされています。 結果のコードは、大多数の場合にかなり速くなり、387 コードの数値 不安定性問題を避けるべきですが、一時的なものを 80 ビットと期待 するいくつかの既存のコードを壊すかもしれません。 これは x86-64 コンパイラのためのデフォルトの選択です。 sse,387 すぐに両方の命令セットを利用することを試みます。事実上、これ は、387 のために分離された実行ユニットがあるチップで利用可能な レジスタの量を倍にして、SSE 実行リソースもそうです。GCC レジス タアロケータは、不安定性能をもたらす分離された機能ユニットをモ デル化しないので、まだ実験的であり、このオプションは、注意して 使用してください。 -masm=dialect 選択された方言 (dialect) を使用して asm 命令を出力します。サポート されている選択は、intel または att (デフォルト) です。Darwin は、 intel をサポートしていません。 -mieee-fp -mno-ieee-fp コンパイラが IEEE 浮動小数点比較を使用するかどうかを制御します。こ れらは、比較の結果が順序付けられていない場合に正しく扱います。 -msoft-float 浮動小数点のためのライブラリ呼び出しを含む出力を生成します。警告: 必要なライブラリは GCC の一部ではありません。通常、マシンの普通の C コンパイラの機能は使用されますが、クロスコンパイルで直接行うことは できません。利用者は、利用者自身でクロスコンパイルのための適切なラ イブラリ関数を準備しなければなりません。 関数が 80387 レジスタスタックに浮動小数点の結果を返すマシンでは、い くつかの浮動小数点オペコードは、たとえ -msoft-float が使用されてい ても、出力されます。 -mno-fp-ret-in-387 関数の返り値に FPU レジスタを使用しません。 通常の呼び出し規則は、たとえ FPU がなくても、FPU レジスタにタイプ "float" と "double" の値を返す関数があります。このアイデアは、オペ レーティングシステムが FPU をエミュレートするべきであるということで す。 オプション -mno-fp-ret-in-387 によって、そのような値は、代わりに通 常の CPU レジスタで返されます。 -mno-fancy-math-387 いくつかの 387 エミュレータは 387 の "sin", "cos" と "sqrt" 命令を サポートしません。それらの命令の生成を回避するために、このオプショ ンを指定します。このオプションは FreeBSD、OpenBSD と NetBSD でのデ フォルトです。-march が、ターゲット cpu には FPU が常にあるので、命 令がエミュレーションを必要としないことを示すとき、このオプションは 上書きされます。リビジョン 2.6.1 現在で、これらの命令は、利用者が -funsafe-math-optimizations スイッチを使用しないなら、生成されませ ん。 -malign-double -mno-align-double GCC が 2 ワード境界または 1 ワード境界で "double", "long double" と "long long" 変数を整列するかどうか制御します。2 ワード境界で "double" 変数を整列することは、より多くのメモリを犠牲にして Pentium で、いくらか速く実行するコードを生成します。 x86-64 では、-malign-double は、デフォルトで有効にされます。 警告: 利用者が -malign-double スイッチを使用するなら、上記のタイプ を含む構造体が、386 のために公開されているアプリケーションバイナリ インタフェース仕様と異なって整列され、そのスイッチなしでコンパイル されたコードの構造体とバイナリ互換となりません。 -m96bit-long-double -m128bit-long-double これらのスイッチは "long double" タイプのサイズを制御します。i386 アプリケーションバイナリインタフェースは、96 ビットとなるようにサイ ズを指定するので、-m96bit-long-double は、32 ビットのモードのデフォ ルトです。 現代のアーキテクチャ (Pentium 以降) は、"long double" が 8 または 16 バイト境界に整列されることを好みます。ABI に適合している配列また は構造体では、これは可能ではありません。したがって、 -m128bit-long-double を指定することは、追加の 32 ビットの 0 で "long double" をパディングすることによって "long double" を 16 バイ ト境界に整列します。 x86-64 コンパイラでは、その ABI は、"long double" が 16 バイト境界 で整列されることを指定するので、-m128bit-long-double はデフォルトの 選択です。 これらのオプションのどちらも "long double" のための 80 ビットの x87 標準を越える任意の特別な精度も有効でないことに注意してください。 警告: 利用者のターゲット ABI のためにデフォルト値を上書きするなら、 "long double" を取る関数のための関数呼び出し規約が変更されるのと同 様に "long double" 変数を含む構造体と配列は、それらのサイズを変更し ます。したがって、それらはそのスイッチなしでコンパイルされたコード の配列または構造体とバイナリ互換となりません。 -mmlarge-data-threshold=number -mcmodel=medium が指定されるとき、threshold より大きなデータは、 large data セクションに置かれます。この値は、バイナリにリンクされた すべてのオブジェクトに渡って同じでなければなりません、デフォルト は、65535 です。 -msvr3-shlib -mno-svr3-shlib GCC が、初期化されていないローカル変数を "bss" または "data" セグメ ントに置くかどうかを制御します。-msvr3-shlib は、それらを "bss" に 置きます。これらのオプションは、System V Release 3 でのみ意味があり ます。 -mrtd 返り時にそれらの引数をポップする、"ret" num 命令で返る固定数の引数 を取る関数である、異なった関数呼び出し規約を使用します。そこで引数 をポップする必要がないので、これは呼び出し側で 1 つの命令を節約しま す。 利用者は、個々の関数が関数属性 stdcall をつけて、この呼び出しシーケ ンスで呼び出されることを指定することができます。また、利用者は、関 数属性 cdecl を使用することによって、-mrtd オプションを上書きするこ とができます。 警告: この呼び出し規約は、通常、Unix で使用されるものと非互換である ので、Unix コンパイラでコンパイルされたライブラリを呼び出す必要が あっても、利用者は、それを使用することができません。 また、利用者は、("printf" を含んで) 可変数の引数を取る、すべての関 数のために関数プロトタイプを提供しなければなりませんそうでなけれ ば、それらの関数への呼び出しのために不正なコードが生成されます。 さらに、利用者があまりに多くの引数で関数を呼び出すなら、著しく不正 なコードの結果となります。(通常、余分な引数は害を及ぼさない形で無視 されます。) -mregparm=num どのくらい多くのレジスタが整数引数を渡すために使用されるかを制御し ます。デフォルトでは、レジスタは引数を渡すために使用されません、多 くても 3 つのレジスタを使用することができます。利用者は、関数属性 regparm を使用することによって、指定された関数のためのこの振る舞い を制御することができます。 警告: 利用者がこのスイッチを使用して、num が 0 でないなら、任意のラ イブラリを含めて、同じ値ですべてのモジュールを構築しなければなりま せん。これは、システムライブラリとスタートアップモジュールを含んで います。 -msseregparm float と double の引数、と返り値のために SSE レジスタ引き渡し規約を 使用します。利用者は、関数属性 sseregparm を使用することによって、 この特有の関数のための振る舞いを制御できます。 警告: このスイッチを使用するなら、利用者は、任意のライブラリを含ん で、同じ値ですべてのモジュールを構築しななければなりません。これ は、システムライブラリと開始モジュールを含んでいます。 -mstackrealign エントリでスタックを再整列します。Intel x86 では、-mstackrealign オ プションは、ランタイムスタックを再整列する交互のプロローグとエピ ローグを生成します。これは、SSE 互換性のために 16 バイトのスタック を保持する最新のコードで 4 バイトで整列されたスタックを保持する古い コードの混合をサポートします。交互のプロローグとエピローグは、通常 のものよりさらに遅くて大きく、交互のプロローグは、特別のスクラッチ レジスタを必要とします。これは、"regparm" 属性に関連して使用される なら、利用可能なレジスタの数を下げます。-mstackrealign オプション は、入れ子にされた関数プロローグで互換性がありません。これは困難な エラーと見なされます。また、個々の関数に適用できる属性 "force_align_arg_pointer" を参照してください。 -mpreferred-stack-boundary=num 整列されたスタック境界を 2 から num バイト境界に上げて、保持するこ とを試みます。-mpreferred-stack-boundary が指定されないなら、デフォ ルトは、4 (16 バイトまたは 128 ビット) です。 Pentium と PentiumPro では、"double" と "long double" 値は、8 バイ ト境界 (-malign-double 参照) に整列されるべきです、または重要なラン タイム性能に不利益を被るはずです。Pentium III では、Streaming SIMD Extension (SSE) (ストリーミング SIMD 拡張) データタイプ "__m128" は、それが 16 バイトに整列されていないなら、たぶん動作しません。 スタックでこの値の適切な整列を保証するするために、スタック境界は、 スタック上に保存された任意の値によって要求されるのと同じように整列 されなければなりません。さらに、あらゆる関数は、整列されたスタック を保持するように生成されなければなりません。したがって、より低い優 先スタック境界でコンパイルされた関数からより高い優先スタック境界で コンパイルされた関数を呼び出すことは、たぶんスタックを誤って整列し ます。コールバックを使用するライブラリは、常にデフォルトの設定を使 用することをお勧めします。 この余分な整列は、余分なスタック空間を消費して、一般的に、コードサ イズを増大します。組み込みシステムとオペレーティングシステムカーネ ルのような、スタック空間の使用に敏感なコードは、優先の整列を -mpreferred-stack-boundary=2 まで減らしたいかもしれません。 -mmmx -mno-mmx -msse -mno-sse -msse2 -mno-sse2 -msse3 -mno-sse3 -mssse3 -mno-ssse3 -m3dnow -mno-3dnow これらのスイッチは、MMX, SSE, SSE2, SSE3, SSSE3 または 3DNow! 拡張 命令セットの命令の使用を有効にするか、または無効にします。また、こ れらの拡張は、次の組み込み関数で利用可能です: これらのスイッチに よって有効にされ、無効にされる関数の詳細については、X86 組み込み関 数を参照してください。 (387 命令とは対照的に) 浮動小数点のコードから自動的に生成された SSE/SSE2 命令を得るためには、-mfpmath=sse を参照してください。 これらのオプションは、GCC が -mfpmath=sse がなくても生成されたコー ドにこれらの拡張命令を使用することを有効にします。ランタイム CPU 検 出を実行するアプリケーションは、適切なフラグを使用して、各サポート されたアーキテクチャのための個別のファイルをコンパイルしなければな りません。特に、CPU 検出コードを含むファイルは、これらのオプション なしでコンパイルされるべきです。 -mpush-args -mno-push-args 出力パラメータを格納するために PUSH 操作を使用します。このメソッド は、SUB/MOV 操作を使用するメソッドとしてより短くて、通常同様に速 く、デフォルトで有効にされます。ある場合には、無効にすることは、改 良されたスケジューリングと減少する依存関係のために性能を向上するか もしれません。 -maccumulate-outgoing-args 有効にされるなら、出力引数に必要な空間の最大の量は、関数プロローグ で計算されます。これは、優先スタック境界が 2 と等しくないときに、減 少された依存関係、改良されたスケジューリングと減少されたスタックの 使用量のために、ごく最近の CPU では、より速くなります。欠点はコード サイズの顕著な増加です。このスイッチは -mno-push-args の意味を含み ます。 -mthreads Mingw32 でスレッドセーフ例外操作をサポートします。スレッドセーフ例 外操作に依存するコードは、-mthreads オプションですべてのコードをコ ンパイルして、リンクしなければなりません。コンパイルするとき、 -mthreads は -D_MT を定義します。リンクするとき、スレッド例外操作 データ毎にクリーンにする特別なスレッドヘルパライブラリ -lmingwthrd をリンクします。 -mno-align-stringops インライン化された文字列操作の宛先を整列しません。このスイッチは、 宛先が既に整列されている場合には、コードサイズを減少させて、性能を 向上させますが、GCC は、それに関して知りません。 -minline-all-stringops デフォルトでは、宛先が少なくとも 4 バイト境界に整列されていることが わかっている場合にだけ、GCC は、文字列操作をインライン化します。こ れは、より多くのインライン化を有効にし、コードサイズを増大します が、短い長さのために速い memcpy、strlen と memset に依存するコード の性能を向上させます。 -momit-leaf-frame-pointer リーフ関数のためのレジスタのフレームポインタを保持しません。これ は、フレームポインタを保存し、セットアップし、復元するための命令を 避けて、リーフ関数の特別なレジスタを利用可能とします。オプション -fomit-frame-pointer は、デバッグをより困難にするかもしれないすべて の関数のためのフレームポインタを削除します。 -mtls-direct-seg-refs -mno-tls-direct-seg-refs TLS 変数が TLS セグメントレジスタ (32 ビットでは %gs、64 ビットでは %fs) からのオフセットでアクセスされるかどうか、またはスレッドベース ポインタを追加しなければならないかどうかを制御します。これが正当で あるかどうかは、オペレーティングシステムに依存し、全体の TLS 領域を カバーするためにセグメントをマップするかどうかに依存します。 GNU libc を使用するシステムにおいて、デフォルトはオンです。 これらの -m スイッチは、上記に加えて 64 ビットの環境の AMD x86-64 プロ セッサでサポートされます。 -m32 -m64 32 ビットまたは 64 ビットの環境のためにコードを生成します。32 ビッ トの環境では、int、long とポインタを 32 ビットに設定し、任意の i386 システムで実行するコードを生成します。64 ビットの環境では、int を 32 ビットに、long とポインタを 64 ビットに設定し、AMD の x86-64 アーキテクチャのためのコードを生成します。darwin のみに関して、-m64 オプションは、-fno-pic と -mdynamic-no-pic オプションをオフにしま す。 -mno-red-zone x86-64 コードのためにいわゆるレッドゾーンを使用しません。レッドゾー ンは x86-64 ABI によって強制され、シグナルまたは割り込みハンドラに よって変更されないスタックポインタの位置を超えた 128 バイトの領域で す、そのために、スタックポインタを調整しないで一時的なデータに使用 することができます。フラグ -mno-red-zone は、このレッドゾーンを無効 にします。 -mcmodel=small スモール (small) コードモデルのためのコードを生成します: プログラム とそのシンボルは、アドレス空間の下位 2 GB にリンクされなければなり ません。ポインタは 64 ビットです。静的または動的にプログラムをリン クすることができます。これはデフォルトのコードモデルです。 -mcmodel=kernel カーネル (kernel) コードモデルのためのコードを生成します。カーネル は、アドレス空間の負の 2 GB で実行します。このモデルは Linux カーネ ルコードで使用されなければなりません。 -mcmodel=medium ミディアム (medium) モデルのためのコードを生成しません: プログラム は、アドレス空間の下位 2 GB でリンクされますが、アドレス空間のどこ にでもシンボルを位置付けすることができます。静的または動的にプログ ラムをリンクすることができますが、共有ライブラリの構築はミディアム モデルでサポートされません。 -mcmodel=large ラージ (large) モデルのためのコードを生成します: このモデルは、セク ションのアドレスとサイズに関する仮定を行いません。現在のところ、GCC は、このモデルを実装していません。 IA-64 オプション これらは Intel IA-64 アーキテクチャのために定義された -m オプションで す。 -mbig-endian ビッグエンディアンのターゲットのためのコードを生成します。これは、 HP-UX のデフォルトです。 -mlittle-endian リトルエンディアンのターゲットのためのコードを生成します。これは、 AIX5 と GNU/Linux のデフォルトです。 -mgnu-as -mno-gnu-as GNU アセンブラのためのコードを生成します (または生成しません)。これ はデフォルトです。 -mgnu-ld -mno-gnu-ld GNU リンカのためのコードを生成します (または生成しません)。これはデ フォルトです。 -mno-pic グローバルなポインタレジスタを使用しないコードを生成します。結果 は、位置独立のコードではなく、IA-64 ABI に違反します。 -mvolatile-asm-stop -mno-volatile-asm-stop 揮発性 (volatile) の asm 文の直前と直後にストップビットを生成します (または生成しません)。 -mregister-names -mno-register-names スタックされたレジスタのための in, loc と out レジスタ名を生成しま す (または生成しません)。これは、アセンブラ出力をより読みやすくしま す。 -mno-sdata -msdata スモールデータセクションを使用する最適化を無効にします (有効にしま す)。これはオプティマイザのバグを回避することに役に立つかもしれませ ん。 -mconstant-gp 単一の定数グローバルポインタ値を使用するコードを生成します。これ は、カーネルコードをコンパイルするとき、役に立ちます。 -mauto-pic 自己リロケータブル (再配置可能) なコードを生成しします。これは -mconstant-gp の意味を含みます。これは、ファームウェアコードをコン パイルするとき、役に立ちます。 -minline-float-divide-min-latency 最小のレイテンシ (待ち時間) アルゴリズムを使用して、浮動小数点値の インライン除算のためのコードを生成します。 -minline-float-divide-max-throughput 最大のスループットアルゴリズムを使用して、浮動小数点値のインライン 除算のためのコードを生成します。 -minline-int-divide-min-latency 最小のレイテンシ (待ち時間) アルゴリズムを使用して、整数値のインラ イン除算のためのコードを生成します。 -minline-int-divide-max-throughput 最大のスループットアルゴリズムを使用して、整数値のインライン除算の ためのコードを生成します。 -minline-sqrt-min-latency 最小のレイテンシ (待ち時間) アルゴリズムを使用して、インライン平方 根のためのコードを生成します。 -minline-sqrt-max-throughput 最大のスループットアルゴリズムを使用して、インライン平方根のための コードを生成します。 -mno-dwarf2-asm -mdwarf2-asm DWARF2 行番号デバッグ情報のためのアセンブラコードを生成しません (生 成します)。これは、GNU アセンブラを使用しないとき、役に立ちます。 -mearly-stop-bits -mno-early-stop-bits ストップビットは、ストップビットの引き金となった命令の直前より前に 位置付けることができます。これは、命令スケジューリングを改良するこ とができますが、常にそうするというわけではありません。 -mfixed-range=register-range 固定レジスタとして与えられたレジスタ範囲を扱うコードを生成します。 固定レジスタはレジスタアロケータが使用することができないものです。 これは、カーネルコードをコンパイルするとき、役に立ちます。レジスタ 範囲は、ダッシュで区切られた 2 つのレジスタとして指定されます。コン マで区切って複数のレジスタ範囲を指定することができます。 -mtls-size=tls-size 即値の TLS オフセットのビットサイズを指定します。有効な値は、14、22 と 64 です。 -mtune=cpu-type 特定の CPU のための命令スケジューリングを調整します。有効な値は、 itanium, itanium1, merced, itanium2 と mckinley です。 -mt -pthread POSIX スレッドライブラリを使用するマルチスレッド化のサポートを追加 します。このオプションはプリプロセッサとリンカの両方のためのフラグ を設定します。コンパイラによって生成されたオブジェクトコード、また はコンパイラと共に供給されたライブラリのスレッドセーフに影響しませ ん。これらは HP-UX 特有のフラグです。 -milp32 -mlp64 32 ビットまたは、64 ビット環境のためにコードを生成します。32 ビット 環境では、int、long とポインタを 32 ビットに設定します。64 ビット環 境では、int を 32 ビットに設定し、long とポインタを 64 ビットに設定 します。これらは HP-UX 特有のフラグです。 -mno-sched-br-data-spec -msched-br-data-spec 再ロードの前にデータの推論的なスケジューリングを (無効/有効) にしま す。これは、ld.a 命令と対応するチェック命令 (ld.c / chk.a) を生成す る結果となります。デフォルトは、'無効にする' です。 -msched-ar-data-spec -mno-sched-ar-data-spec 再ロードの後にデータの推論的なスケジューリングを (有効/無効) にしま す。これは、ld.a 命令と対応するチェック命令 (ld.c / chk.a) を生成す る結果となります。デフォルトは、'有効にする' です。 -mno-sched-control-spec -msched-control-spec 推論的なスケジューリングの制御を (無効/有効) にします。この特徴は、 リージョン (領域) スケジューリング (すなわち、再ロードの前) の間の み利用可能です。これは、ld.s 命令と対応するチェック命令 chk.s の生 成の結果となります。デフォルトは、'無効にする' です。 -msched-br-in-data-spec -mno-sched-br-in-data-spec 再ロードの前にデータの推論的なロードに依存する命令の推論的なスケ ジューリングを (有効/無効) にします。これは、-msched-br-data-spec が有効にされているときのみ有効です。デフォルトは、'有効にする' で す。 -msched-ar-in-data-spec -mno-sched-ar-in-data-spec 再ロードの後にデータの推論的なロードに依存する命令の推論的なスケ ジューリングを (有効/無効) にします。これは、-msched-ar-data-spec が有効にされているときのみ有効です。デフォルトは、'有効にする' で す。 -msched-in-control-spec -mno-sched-in-control-spec 推論的なロードの制御に依存する命令の推論的なスケジューリングを (有 効/無効) にします。これは、-msched-control-spec が有効にされている ときのみ有効です。デフォルトは、'有効にする' です。 -msched-ldc -mno-sched-ldc ld.c の単純なデータの推論的なチェックの使用を (有効/無効) にしま す。無効にされるなら、chk.a 命令だけが、データの推論的なロードを チェックするために出力されます。デフォルトは、'有効にする' です。 -mno-sched-control-ldc -msched-control-ldc 推論的なロードの制御をチェックするために ld.c 命令の使用を (無効/有 効) にします。有効にされるなら、推論的にスケジュールされた依存する 命令のない推論的なロードを制御する場合に、このロードは、ld.sa と ld.c がそれをチェックするために使用されるように出力されます。デフォ ルトは、'無効にする' です。 -mno-sched-spec-verbose -msched-spec-verbose 推論的なモーションに関する情報の印刷を (無効/有効) にします。 -mno-sched-prefer-non-data-spec-insns -msched-prefer-non-data-spec-insns 有効にされるなら、現在のところ他の選択がない場合にだけ、データの推 論的な命令は、スケジュールのために選択されます。これで、データの推 論的な使用をさらに保守的なものにします。デフォルトは、'無効にする' です。 -mno-sched-prefer-non-control-spec-insns -msched-prefer-non-control-spec-insns 有効にされるなら、現在のところ他の選択がない場合にだけ、データの推 論的な命令は、スケジュールのために選択されます。これで、データの推 論的な使用をさらに保守的なものにします。デフォルトは、'無効にする' です。 -mno-sched-count-spec-in-critical-path -msched-count-spec-in-critical-path 有効にされるなら、推論的な依存は、命令プライオリティの計算の間に見 なされます。これで、推論的な使用をやや保守的なものにします。デフォ ルトは、'無効にする' です。 M32C オプション -mcpu=name コードが生成される CPU を選択します。name は、R8C/Tiny シリーズのた めの r8c、M16C (/60 まで) シリーズのための m16c、M16C/80 シリーズの ための m32cm または M32C/80 シリーズのための m32c の 1 つです。 -msim プログラムがシミュレータで実行されることを指定します。これによっ て、交互のランタイムライブラリは、例えば、ファイル I/O、のサポート でリンクされます。実際のハードウェアで実行されるプログラムを生成す るとき、利用者は、このオプションを使用してはいけません。利用者は、 I/O 関数が必要とするものは何でも、利用者自身のランタイムライブラリ を提供しなければなりません。 -memregs=number GCC がコード生成の間に使用するメモリベースの擬似レジスタの数を指定 します。これらの擬似レジスタは、実際のレジスタのように使用されるの で、利用可能なレジスタにコードを適合する GCC の能力と、レジスタの代 わりにメモリを使用する性能のペナルティの間には、トレードオフがあり ます。プログラムのすべてのモジュールは、このオプションと同じ値でコ ンパイルしなければならないことに注意してください。そのために、利用 者は、gcc で構築したデフォルトランタイムライブラリで、このオプショ ンを使用してはいけません。 M32R/D オプション これらの -m オプションは、Renesas M32R/D アーキテクチャのために定義され ています: -m32r2 M32R/2 のためのコードを生成します。 -m32rx M32R/X のためのコードを生成します。 -m32r M32R のためのコードを生成します。これはデフォルトです。 -mmodel=small すべてのオブジェクトが下位 16MB のメモリに存在すると仮定します (そ のため、"ld24" 命令で、それらのアドレスをロードすることができ、すべ てのサブルーチンは "bl" 命令で到達可能であると仮定します)。これはデ フォルトです。 "model" 属性で特定のオブジェクトのアドレス指定能力を設定することが できます。 -mmodel=medium オブジェクトが 32 ビットのアドレス空間のどこかにあると仮定し (コン パイラは、それらのアドレスをロードするために "seth/add3" 命令を生成 します)、すべてのサブルーチンは "bl" 命令で到達可能であると仮定しま す。 -mmodel=large オブジェクトが 32 ビットのアドレス空間のどこかにあると仮定し (コン パイラは、それらのアドレスをロードするために "seth/add3" 命令を生成 します)、サブルーチンは "bl" 命令で到達可能でないと仮定します (コン パイラは、より遅い "seth/add3/jl" 命令シーケンスを生成します)。 -msdata=none スモール (small) データ領域の使用を無効にします。("section" 属性が 指定されていななら) 変数は、.data, bss または .rodata の 1 つに置か れます。これはデフォルトです。 スモール (data) データ領域は、セクション .sdata と .sbss で構成され ます。オブジェクトは、これらのセクションの 1 つを使用して "section" 属性があるスモール (data) データ領域に明示的に置かれます。 -msdata=sdata スモール (data) データ領域にスモールグローバルデータとスモール静的 データを置きますが、それらを参照するための特別なコードを生成しませ ん。 -msdata=use スモール (data) データ領域にスモールグローバルデータとスモール静的 データを置き、それらを参照するための特別な命令を生成します。 -G num num バイト以下のグローバルとオブジェクトを通常の data または bss セ クションの代わりにスモール data または bss セクションに置きます。 num のデフォルト値は 8 です。-msdata オプションは、このオプションの 効果があるように sdata または use の 1 つに設定されなければなりませ ん。 すべてのモジュールは、同じ -G num 値でコンパイルされるべきです。異 なった num の値でコンパイルすることは、動作するかもしれませんし、動 作しないかもしれません。動作しないなら、リンカはエラーメッセージを 出し --- 不正なコードは生成されません。 -mdebug コンパイラの M32R 特有のコードは、プログラムをデバッグするのに役に たつかもしれないいくつかの統計値を表示するようにします。 -malign-loops すべてのループを 32 バイトの境界に整列します。 -mno-align-loops ループのための 32 バイトの整列を強制しません。これはデフォルトで す。 -missue-rate=number サイクルごとに number 命令を出力します。number は、1 または 2 のみ を指定できます。 -mbranch-cost=number number は、1 または 2 のみを指定できます。1 であるなら、分岐は条件 付きのコードより優先されます、2 であるなら、この反対となります。 -mflush-trap=number キャッシュをフラッシュするために使用されるトラップ番号を指定しま す。デフォルトは 12 です。有効な数は、両端を含んで 0 と 15 の間で す。 -mno-flush-trap トラップを使用することによってフラッシュできないキャッシュを指定し ます。 -mflush-func=name キャッシュをフラッシュするために呼び出されるオペレーティングシステ ムの関数の名前を指定します。デフォルトは _flush_cache ですが、関数 呼び出しは、トラップが利用可能でない場合にのみ使用されます。 -mno-flush-func キャッシュをフラッシュするための OS 関数がないことをを示します。 M680x0 オプション これらは 68000 シリーズのために定義された -m オプションです。これらのオ プションのデフォルト値は、コンパイラが設定されたとき、68000 のどの形式 が選択されたかに依存します。最も一般的な選択のためのデフォルトは、次に 与えられます。 -m68000 -mc68000 68000 のための出力を生成します。これは、コンパイラが 68000 ベースの システムのために設定されるときのデフォルトです。 このオプションは、68008, 68302, 68306, 68307, 68322, 68328 と 68356 を含む、68000 または EC000 コアのマイクロコントローラで使用します。 -m68020 -mc68020 68020 のための出力を生成します。これは、コンパイラが 68020 ベースの システムのために設定されるときのデフォルトです。 -m68881 浮動小数点のための 68881 命令を含む出力を生成します。これは、コンパ イラが設定されたとき、--nfp が指定されなかった場合の、ほとんどの 68020 システムのためのデフォルトです。 -m68030 68030 のための出力を生成します。これは、コンパイラが 68030 ベースの システムのために設定されるときのデフォルトです。 -m68040 68040 のための出力を生成します。これは、コンパイラが 68040 ベースの システムのために設定されるときのデフォルトです。 このオプションは 68040 のソフトウェアによってエミュレートされなけれ ばならない 68881/68882 命令の使用を抑制します。利用者の 68040 に は、それらの命令をエミュレートするためのコードがないなら、このオプ ションを使用します。 -m68060 68060 のための出力を生成します。これは、コンパイラが 68060 ベースの システムのために設定されるときのデフォルトです。 このオプションは 68060 のソフトウェアによってエミュレートされなけれ ばならない 68881/68882 命令の使用を抑制します。利用者の 68060 に は、それらの命令をエミュレートするためのコードがないなら、このオプ ションを使用します。 -mcpu32 CPU32 のための出力を生成します。これは、コンパイラが CPU32 ベースの システムのために設定されるときのデフォルトです。 このオプションは、68330, 68331, 68332, 68333, 68334, 68336, 68340, 68341, 68349 と 68360 を含む、CPU32 または CPU32+ コアのマイクロコ ントローラで使用します。 -m5200 520X "coldfire" ファミリ cpu のために出力を生成します。これは、コン パイラが 520X ベースのシステムのために設定されるときのデフォルトで す。 このオプションは、MCF5202, MCF5203, MCF5204 と MCF5202 を含む、5200 コアのマイクロコントローラで使用します。 -mcfv4e ColdFire V4e ファミリ CPU (例えば、547x/548x) のための出力を生成し ます。これは、ハードウェア浮動小数点命令の使用を含んでいます。 -m68020-40 新しい命令をなにも使用しないで、68040 のための出力を生成します。こ れは 68020/68881 または 68030 または 68040 のいずれかを比較的効率的 に実行できるコードをもたらします。生成されたコードは、68040 でエ ミュレートされる 68881 命令を使用します。 -m68020-60 新しい命令をなにも使用しないで、68060 のための出力を生成します。こ れは 68020/68881 または 68030 または 68040 のいずれかを比較的効率的 に実行できるコードをもたらします。生成されたコードは、68060 でエ ミュレートされる 68881 命令を使用します。 -msoft-float 浮動小数点のためのライブラリ呼び出しを含む出力を生成します。警告: 必要なライブラリは、すべての m68k ターゲットで利用可能ではありませ ん。通常、マシンの普通の C コンパイラの機能は使用されますが、クロス コンパイルで直接行うことはできません。利用者は、利用者自身でクロス コンパイルのための適切なライブラリ関数を準備しなければなりません。 組み込みターゲットの m68k-*-aout と m68k-*-coff は、ソフトウェア浮 動小数点サポートを提供します。 -mshort タイプ "int" を "short int" のような 16 ビット幅とみなします。ま た、さらに、スタックで渡されたパラメータは、API が 32 ビットへの促 進を強制するターゲットで 16 ビットの偶数の境界に整列されます。 -mnobitfield ビットフィールド命令を使用しません。-m68000, -mcpu32 と -m5200 オプ ションは -mnobitfield の意味を含みます。 -mbitfield ビットフィールド命令を使用しません。-m68020 オプションは -mbitfield の意味を含みます。これは、利用者が 68020 のために設計された設定を使 用する場合のデフォルトです。 -mrtd 返り時にそれらの引数をポップする "rtd" 命令で返る引数の固定の数を取 る関数で異なった関数呼び出し規約 (コンベンション) を使用します。こ れは、そこで引数をポップする必要がないので、呼び出し側で 1 つの命令 を節約します。 この呼び出し規約は通常、Unix で使用されるものと互換性がないので、 Unix コンパイラでコンパイルされたライブラリを呼び出す必要があるな ら、利用者は、それを使用することはできません。 また、利用者は、("printf") を含んで) 可変数の引数を取るすべての関数 のための関数プロトタイプを提供しなければなりません。そうでなけれ ば、それらの関数呼び出しのための不正確なコードが生成されます。 さらに、利用者があまりに多くの引数がある関数を呼び出すなら、著しく 不正確なコードをもたらします。(通常、余分な引数は害を及ぼさない形で 無視されます。) "rtd" 命令は、68010, 68020, 68030, 68040, 68060 と CPU32 プロセッサ によってサポートされていますが、68000 または 5200 ではサポートされ ていません。 -malign-int -mno-align-int GCC が "int", "long", "long long", "float", "double" と "long double" 変数を 32 ビット境界 (-malign-int) または 16 ビット境界 (-mno-align-int) に整列するかどうかを制御します。32 ビット境界に変 数を整列することは、より多くのメモリを犠牲にして 32 ビットバスがあ るプロセッサでいくらか速く実行するコードを生成します。 警告: -malign-int スイッチを使用するなら、GCC は、ほとんどの m68k の公開されたアプリケーションのバイナリインタフェース仕様と異なって いる上記のタイプを含む構造体を整列します。 -mpcrel グローバルオフセットテーブルを使用する代わりに、直接 68000 の PC 相 対アドレッシングモードを使用します。現在のところ、このオプション は、多くても PC 相対アドレッシングのための 16 ビットオフセットを認 める、-fpic の意味を含みます。-fPIC は、現在 -mpcrel でサポートされ ていませんが、これは、68020 以上のプロセッサでサポートされていま す。 -mno-strict-align -mstrict-align 整列されていないメモリの参照をシステムによって扱われると仮定しませ ん (仮定します)。 -msep-data データセグメントがテキストセグメントと異なるメモリ領域に位置するこ とができるコードを生成します。これは、仮想メモリ管理がない環境で、 適切に実行できます。このオプションは -fPIC の意味を含みます。 -mno-sep-data データセグメントがテキストセグメントに続くと仮定するコードを生成し ます。これはデフォルトです。 -mid-shared-library ライブラリ ID メソッドによって共有ライブラリをサポートするコードを 生成します。これは、仮想メモリ管理がない環境で、共有ライブラリと適 切に実行できます。このオプションは -fPIC の意味を含みます。 -mno-id-shared-library ID ベースの共有ライブラリが使用されていると仮定しないコードを生成し ます。これはデフォルトです。 -mshared-library-id=n コンパイルされる ID ベースの共有ライブラリの識別番号を指定します。0 の値を指定することは、よりコンパクトなコードを生成し、他の値を指定 することは、その数を現在のライブラリに強制的に割り付けますが、空間 と時間が効率的でないのは、このオプションを省略することと同じです。 M68hc1x オプション これらは 68hc11 と 68hc12 マイクロコントローラのために定義された -m オ プションです。これらのオプションのためのデフォルト値は、コンパイラが設 定されたとき、どの形式のマイクロコントローラが選択されたかに依存しま す。最も一般的な選択のためのデフォルトは、次に与えられます。 -m6811 -m68hc11 68HC11 のために出力を生成します。これは、コンパイラが 68HC11 ベース のシステムのために設定されるときのデフォルトです。 -m6812 -m68hc12 68HC12 のために出力を生成します。これは、コンパイラが 68HC12 ベース のシステムのために設定されるときのデフォルトです。 -m68S12 -m68hcs12 68HCS12 のために出力を生成します。 -mauto-incdec 68HC12 のプレとポスト (前と後ろ) 自動インクリメントと自動デクリメン トのアドレッシングモードの使用を有効にします。 -minmax -nominmax 68HC12 の min と max 命令使用を有効にします。 -mlong-calls -mno-long-calls すべての呼び出しを far away (near) と取り扱います。呼び出しが far away であると仮定されるなら、コンパイラは、関数の呼び出しに "call" 命令を使用し、関数の返りには、"rtc" 命令を使用します。 -mshort タイプ "int" を "short int" のような 16 ビット幅とみなします。 -msoft-reg-count=count コード生成に使用される疑似ソフトレジスタの数を指定します。最大の数 は 32 です。より多くの疑似ソフトレジスタを使用すると、プログラムに 依存するより良いコードとなるかどうかわかりません。デフォルトは、 68HC11 では 4、68HC12 では 2 です。 MCore オプション これらは Motorola M*Core プロセッサのために定義された -m オプションで す。 -mhardlit -mno-hardlit 2 つ以下の命令で行うことができるなら、定数をコードストリームにイン ライン化します。 -mdiv -mno-div 除算命令を使用します。(デフォルトで有効です)。 -mrelax-immediate -mno-relax-immediate ビット演算で任意のサイズの即値 (immediate) を許可します。 -mwide-bitfields -mno-wide-bitfields 常にビットフィールド int サイズとして取り扱います。 -m4byte-functions -mno-4byte-functions すべての関数を 4 バイト境界に整列することを強制します。 -mcallgraph-data -mno-callgraph-data コールグラフ (callgraph) 情報を出力します。 -mslow-bytes -mno-slow-bytes バイト量を読み込むとき、ワードアクセスを使用します。 -mlittle-endian -mbig-endian リトルエンディアンのターゲットのためのコードを生成します。 -m210 -m340 210 プロセッサのためのコードを生成します。 MIPS オプション -EB ビッグエンディアンのコードを生成します。 -EL リトルエンディアンのコードを生成します。これは、mips*el-*-* 設定の デフォルトです。 -march=arch 一般的な MIPS ISA の名前、または特定のプロセッサの名前を指定できる arch で実行するコードを生成します。ISA の名は次の通りです: mips1, mips2, mips3, mips4, mips32, mips32r2 と mips64。プロセッサ名は次の 通りです: 4kc, 4km, 4kp, 5kc, 5kf, 20kc, 24k, 24kc, 24kf, 24kx, m4k, orion, r2000, r3000, r3900, r4000, r4400, r4600, r4650, r6000, r8000, rm7000, rm9000, sb1, sr71000, vr4100, vr4111, vr4120, vr4130, vr4300, vr5000, vr5400 and vr5500。特別の値 from-abi は、選 択された ABI のために最も互換性のあるアーキテクチャを選択します (す なわち、32 ビットの ABI のためには mips1 と 64 ビットの ABI のため には mips3 です)。 プロセッサ名では、最後の 000 を k と簡略化することができます (例え ば、-march=r2k)。プレフィックスはオプションで、vr は r と書くことが できます。 GCC は、このオプションの値に基づく 2 つのマクロを定義します。1 番目 は、文字列としてターゲットアーキテクチャの名前を与える _MIPS_ARCH です。2 番目は、foo が _MIPS_ARCH の値を大文字とした形式 _MIPS_ARCH_foo があります。例えば、-march=r2000 は _MIPS_ARCH を "r2000" に設定し、マクロ _MIPS_ARCH_R2000 を定義します。 _MIPS_ARCH マクロは、上記に与えられたプロセッサ名を使用することに注 意してください。言い換えれば、完全なプレフィックスがあり、000 を k と簡略化しません。from-abi の場合では、マクロは、決定されたアーキテ クチャ ("mips1" または "mips3" のいずれか) を指定します。-march オ プションが与えられないとき、デフォルトのアーキテクチャを指定しま す。 -mtune=arch arch に対して最適化します。特に、このオプションは、命令がスケジュー ルされる方法と算術演算の認識されているコストを制御します。arch 値の リストは、-march に対するものと同じです。 このオプションが使用されていないとき、GCC は -march によって指定さ れたプロセッサに対して最適化します。-march と -mtune を一緒に使用す ることによって、プロセッサファミリで実行するコードを生成することが 可能ですが、そのファミリの 1 つの特定のメンバのためにコードを最適化 します。 -mtune は、前述の -march と同様に動作する、マクロ _MIPS_TUNE と _MIPS_TUNE_foo を定義します。 -mips1 -march=mips1 と同等です。 -mips2 -march=mips2 と同等です。 -mips3 -march=mips3 と同等です。 -mips4 -march=mips4 と同等です。 -mips32 -march=mips32 と同等です。 -mips32r2 -march=mips32r2 と同等です。 -mips64 -march=mips64 と同等です。 -mips16 -mno-mips16 MIPS16 コードを生成します (生成しません)。GCC が MIPS32 または MIPS64 アーキテクチャをターゲットするなら、MIPS16e ASE を使用しま す。 -mabi=32 -mabi=o64 -mabi=n32 -mabi=64 -mabi=eabi 与えられた ABI のためのコードを生成します。 EABI には 32 ビットと 64 ビットのバリアント (改良型) があることに注 意してください。GCC は通常、利用者が 64 ビットアーキテクチャを選択 するとき、64 ビットのコードを生成しますが、代わりに 32 ビットのコー ドを得るために -mgp32 を使用することができます。 O64 ABI に関する情報については、 <http://gcc.gnu.org/projects/mipso64-abi.html> を参照してください。 -mabicalls -mno-abicalls SVR4 スタイルのダイナミックオブジェクトに適切なコードを生成します (生成しません)。-mabicalls は SVR4 ベースのシステムのデフォルトで す。 -mshared -mno-shared 完全に位置独立 (position-independent) であるコードを生成します (生 成しません)、したがって共有ライブラリにリンクできます。このオプショ ンは、-mabicalls のみに影響します。 すべての -mabicalls コードには、-fPIC と -fpic のようなオプションに かかわらず、伝統的に位置独立 (position-independent) になっていま す。しかしながら、拡張として、GNU toolchain によって、実行形式は、 局所的にバインドされたシンボルに絶対的なアクセスを使用することがで きます。また、より短い GP 初期化シーケンスを使用して、局所的に定義 された関数への直接呼び出しを生成することができます。このモードは、 -mno-shared よって選択されます。 -mno-shared は、binutils 2.16 以上に依存し、GNU リンカだけが、リン クすることができる、オブジェクトを生成します。しかしながら、オプ ションは、最後の実行形式の ABI に影響しません。それは、リロケータブ ルオブジェクトの ABI のみに影響します。一般的に、-mno-shared を使用 することは、実行形式を、より小さくてより速くします。 -mshared が、フォルトです。 -mxgot -mno-xgot グローバルオフセットテーブル (GOT) のサイズで普通の制限を取り除きま す (取り除きません)。 GCC は通常、GOT から値をロードするために単一の命令を使用します。こ れは比較的効率的ですが、GOT が約 64k より小さい場合にだけ、動作しま す。より大きいものによって、リンカは次のようなエラーを報告します: relocation truncated to fit: R_MIPS_GOT16 foobar これが起こるなら、利用者は -mxgot をつけてコードを再コンパイルする べきです。次に、非常に大きな GOT と共に動作するべきですが、グローバ ルシンボルの値をフェッチ (取得) するために 3 つの命令を要するので、 効率的が悪くなります。 いくつかのリンカは複数の GOT を作成することができることに注意してく ださい。そのようなリンカがあるなら、利用者は、単一のオブジェクト ファイルが 64k の値以上の GOT エントリをアクセスするときのみ、 -mxgot を使用する必要があるはずです。ほとんどない行いません。 これらのオプションは、GCC が位置独立コードを生成していないなら、効 果はありません。 -mgp32 汎用レジスタが 32 ビット幅であると仮定します。 -mgp64 汎用レジスタが 64 ビット幅であると仮定します。 -mfp32 浮動小数点レジスタが 32 ビット幅であると仮定します。 -mfp64 浮動小数点レジスタが 64 ビット幅であると仮定します。 -mhard-float 浮動小数点コプロセッサ命令を使用します。 -msoft-float 浮動小数点コプロセッサ命令を使用しません。代わりにライブラリ呼び出 しを使用する浮動小数点演算を実装します。 -msingle-float 浮動小数点コプロセッサが単精度演算のみをサポートすると仮定します。 -mdouble-float 浮動小数点コプロセッサが倍精度演算をサポートすると仮定します。これ はデフォルトです。 -mdsp -mno-dsp MIPS DSP ASE を使用します (使用しません)。 -mpaired-single -mno-paired-single 対にされた単一の浮動小数点命令を使用します (使用しません)。このオプ ションは、64 ビットのコードを生成し、ハードウェアの浮動小数点のサ ポートが有効にされるときのみ使用することができます。 -mips3d -mno-mips3d MIPS-3D ASE を使用します (使用しません)。オプション -mips3d は、 -mpaired-single の意味を含みます。 -mlong64 "long" タイプが 64 ビット幅であることを強制します。デフォルトとポイ ンタサイズが決定される方法の説明については -mlong32 を参照してくだ さい。 -mlong32 "long", "int" とポインタタイプが 32 ビット幅であることを強制しま す。 "int", "long" とポインタのデフォルトサイズは、ABI に依存します。す べてのサポートされた ABI は 32 ビット "int" を使用します。n64 ABI は、64 ビット EABI で行うように、64 ビット "long" を使用します。他 のものは 32 ビット "long" を使用します。ポインタは、"long" と同じサ イズまたは整数レジスタと同じサイズのいずれか小さいサイズです。 -msym32 -mno-sym32 すべてのシンボルには、選択された ABI にかかわらず 32 ビットの値があ ることを仮定します (仮定しません)。このオプションは、GCC が、シンボ ルアドレスへのより短くて、より速い参照を生成することができるので、 -mabi=64 を -mno-abicalls と組み合わせて役に立ちます。 -G num num バイト以下のグローバルで静的な項目を通常の data または bss セク ションの代わりにスモール (small) data または bss セクションに置きま す。これによって、単一の命令を使用してデータをアクセスすることがで きます。 すべてのモジュールは、同じ -G num 値をつけてコンパイルされるべきで す。 -membedded-data -mno-embedded-data 可能であれば、最初に読み込み専用の data セクションに変数を割り付 け、次に、可能であれば、スモール data セクションに割り付け、そうで なければ、data セクションに割り付けます。これはデフォルトよりわずか に遅いコードを与えますが、実行するときに必要な RAM の量を減少させま す、したがって、いくつかの組み込みシステムに望ましいでしょう。 -muninit-const-in-rodata -mno-uninit-const-in-rodata 初期化されていない "const" 変数を読み込み専用 data セクションに置き ます。このオプションは -membedded-data と関連するときのみ意味があり ます。 -msplit-addresses -mno-split-addresses "%hi()" と "%lo()" アセンブラ再配置演算子の使用を有効にします (無効 にします)。このオプションは、-mexplicit-relocs に取って代わりました が、後方互換性のために保持されています。 -mexplicit-relocs -mno-explicit-relocs シンボリックアドレスを処理するとき、アセンブラ再配置演算子を使用し ます (使用しません)。-mno-explicit-relocs によって選択された代替手 段は、代わりにアセンブラマクロを使用することです。 -mexplicit-relocs は、GCC が、再配置オペレータをサポートするアセン ブラを使用するように設定されたなら、デフォルトです。 -mcheck-zero-division -mno-check-zero-division 整数 0 除算でトラップします (トラップしません)。デフォルトは -mcheck-zero-division です。 -mdivide-traps -mdivide-breaks MIPS システムは、条件付きのトラップか、または break 命令のいずれか を生成することによって、0 除算がないかどうかチェックします。トラッ プを使用することは、より小さいコードをもたらしますが、MIPS II 以降 でのみサポートされています。また、Linux カーネルのいくつかのバー ジョンには、罠が、適切なシグナル ("SIGFPE") を生成することからト ラップ防ぐバグがあります。-mdivide-traps を使用して、break の使用を 強制するために、それらと -mdivide-breaks をサポートするアーキテク チャで条件付きのトラップを行うことができます。 デフォルトは、通常 -mdivide-traps ですが、--with-divide=breaks を使 用して時間の設定で、これを上書きすることができます。 -mno-check-zero-division を使用して 0 除算チェックを完全に無効にす ることができます。 -mmemcpy -mno-memcpy 重要なブロック転送 (move) のために "memcpy()" の使用を強制します (強制しません)。デフォルトは、GCC がほとんどの一定のサイズのコピー をインライン化できる、-mno-memcpy です。 -mlong-calls -mno-long-calls "jal" 命令の使用を無効にします (無効にしません)。"jal" を使用する関 数を呼び出すことは、より効率的ですが、呼び出し側と呼び出され側が同 じ 256 メガバイトのセグメントにある必要があります。 このオプションは abicall コードで効果がありません。デフォルトは -mno-long-calls です。 -mmad -mno-mad R4650 ISA によって提供されている、"mad", "madu" と "mul" 命令の使用 を有効にします (無効にします)。 -mfused-madd -mno-fused-madd 利用可能であるとき、浮動小数点の乗算アキュムレイト命令の使用を有効 にします (無効にします)。デフォルトは -mfused-madd です。 乗算アキュムレイト命令が使用されるとき、中間プロダクトは、無限の精 度で計算され、FCSR Flush to Zero ビットに制約されません。これはいく つかの状況で望ましくないかもしれません。 -nocpp ユーザアセンブラファイル (.s サフィックスがある) をアセンブルすると き、プリプロセッサを実行しないように MIPS アセンブラに伝えます。 -mfix-r4000 -mno-fix-r4000 特定の R4000 CPU のエラッタ (ハードの不具合) に対処します: - 倍の語 (double-word) または可変シフトは、整数除算を開始する直後 に実行されるなら、不正確な結果を与えます。 - 倍の語 (double-word) または可変シフトは、整数乗法が進行している 間に実行されるなら、不正確な結果を与えます。 - 整数除算は、取られたブランチ (branch) またはジャンプ (jump) の 遅延スロットで開始されるなら、不正確な結果を与えます。 -mfix-r4400 -mno-fix-r4400 特定の R4400 CPU のエラッタ (ハードの不具合) に対処します: - 倍の語 (double-word) または可変シフトは、整数除算を開始する直後 に実行されるなら、不正確な結果を与えます。 -mfix-vr4120 -mno-fix-vr4120 特定の VR4120 のエラッタ (ハードの不具合) に対処します: - "dmultu" は、常に正しい結果を生むというわけではありません。 - "div" と "ddiv" は、オペランドの 1 つが負であるなら、常に正しい 結果を生むというわけではありません。 乗除エラッタの回避方法は、libgcc.a の特別な関数を当てにします。現在 のところ、これらの関数は、"mips64vr*-elf" 設定によってのみ提供され ます。 他の VR4120 エラッタは、nop が命令の特定の組の間に挿入されることを 必要とします。これらのエラッタは、GCC 自体によって処理されるのでは なく、アセンブラによって処理されます。 -mfix-vr4130 VR4130 "mflo"/"mfhi" のエラッタ (ハードの不具合) に対処します: 回避 方法は、GCC によってではなくアセンブラによって実装されますが、GCC は、"mflo" と "mfhi" の使用を避け、VR4130 の "macc", "macchi", "dmacc" と "dmacchi" 命令が利用可能であるなら、代わりに使用します。 -mfix-sb1 -mno-fix-sb1 特定の SB-1 CPU コアのエラッタ (不具合) を回避します。(このフラグ は、現在 SB-1 リビジョン 2 "F1" と "F2" 浮動小数点エラッタを回避し ます。) -mflush-func=func -mno-flush-func I と D キャッシュをフラッシュするために呼び出す関数を指定するか、ま たはそのような関数を何も呼び出しません。呼び出されるなら、関数は一 般的な "_flush_func()" と同じ引数を取らなければなりません。すなわ ち、キャッシュがフラッシュされているメモリ範囲のアドレス、メモリ範 囲のサイズ、と数値 3 (両方のキャッシュをフラッシュ) です。デフォル トは、GCC が設定されたターゲットに依存しますが、一般的に _flush_func または __cpu_flush のいずれかです。 -mbranch-likely -mno-branch-likely 選択されたアーキテクチャのためのデフォルトにかかわらず、Branch Likely 命令のの使用を有効にするか、または無効にします。デフォルトで は、それらが選択されたアーキテクチャによってサポートされているな ら、Branch Likely 命令を生成します。例外は MIPS32 と MIPS64 アーキ テクチャおよびそれらのアーキテクチャを実装するプロセッサです。それ らに関しては、MIPS32 と MIPS64 アーキテクチャが、それらの使用ははっ きりと推奨されないので、Branch Likely 命令はデフォルトで生成されま せん。 -mfp-exceptions -mno-fp-exceptions FP 例外が有効にされるかどうか指定します。これは、我々がいくつかのプ ロセッサのために FP 命令をどのようにスケジュールするかに影響しま す。デフォルトは、FP 例外が有効にされることです。 例えば、SB-1 では、FP 例外が無効であり、我々が、64 ビットコードを出 力するなら、我々は、両方の FP パイプを使用することができます。そう でなければ、我々は、1 つの FP パイプしか使用することができません。 -mvr4130-align -mno-vr4130-align VR4130 パイプラインは、双方向のスーパスケーラですが、最初のものが 8 バイトで整列されるなら、2 つの命令しか一緒に出力できません。このオ プションが有効にされるとき、GCC は、それが平行で実行するべきである と考えられる命令の組を整列します。 このオプションには、VR4130 の最適化を行うときだけ、効果があります。 最適化レベル -O3 でデフォルトで有効にされます。 MMIX オプション これらのオプションは MMIX のために定義されます: -mlibfuncs -mno-libfuncs 本来備わっているライブラリ関数がサイズを問わず、レジスタのすべての 値を渡してコンパイルされることを指定します。 -mepsilon -mno-epsilon "rE" イプシロンレジスタに対して比較する浮動小数点の比較命令を生成し ます。 -mabi=mmixware -mabi=gnu グローバルレジスタ $231 以降を使用する GNU ABI と対照的に、レジスタ $0 以降として見られる (呼び出された関数で) 関数パラメータと返り値を 渡すコードを生成します。 -mzero-extend -mno-zero-extend 64 ビットより短いサイズでメモリからデータを読み込むとき、サイン拡張 するより、デフォルトの 0 拡張する load 命令を使用します (使用しませ ん)。 -mknuthdiv -mno-knuthdiv 除算の剰余が除数と同じ符号を持つようにします。デフォルトの、 -mno-knuthdiv では、剰余の符号は被除数の符号に従います。どちらの方 法も算術的には正当で、後者がほぼ例外なく使用されています。 -mtoplevel-symbols -mno-toplevel-symbols "PREFIX" アセンブリ命令文とともにアセンブリコードを使用することがで きるように、すべてのグローバルシンボルの先頭に : を追加します (追加 しません)。 -melf mmix シミュレータによって使用されるデフォルトの mmo 形式でなく、ELF 形式の実行正式を生成します。 -mbranch-predict -mno-branch-predict 静的な分岐予測が予想される分岐を示すとき、予想分岐 (probable branch) 命令を使用します (使用しません)。 -mbase-addresses -mno-base-addresses ベースアドレス (base addresses) を使用するコードを生成します (生成 しません)。ベースアドレスを使用することは、グローバルジスタに設定さ れる定数のための (アセンブラとリンカによって操作される) 要求を自動 的に生成します。レジスタは、レジスタに保持された値から 0 から 255 までの範囲中で、1 つ以上のベースアドレス要求のために使用されます。 一般的に短くて速いコードをロードしますが、アドレス指定することがで きる異なったデータ項目の数は、制限されます。これは、多くの静的な データを使用するプログラムが -mno-base-addresses を必要とすることを 意味します。 -msingle-exit -mno-single-exit 各関数で単一の終了ポイントを持つコードを生成することを強制します (強制しません)。 MN10300 オプション これらの -m オプションは、Matsushita MN10300 アーキテクチャのために定義 されています: -mmult-bug MN10300 プロセッサのための乗算命令のバグを回避するコードを生成しま す。これはデフォルトです。 -mno-mult-bug MN10300 プロセッサの乗算命令のバグを回避するコードを生成しません。 -mam33 AM33 プロセッサに特有の機能を使用するコードを生成します。 -mno-am33 AM33 プロセッサに特有の機能を使用するコードを生成しません。これはデ フォルトです。 -mreturn-pointer-on-d0 ポインタを返す関すを生成するとき、"a0" と "d0" の両方のポインタを返 します。そうでなければ、ポインタは、a0 だけが返され、プロトタイプの ない関数を呼び出す試みは、エラーをもたらすでしょう。このオプション は、デフォルトでオンであることに注意してください。それを無効にしる ためには、-mno-return-pointer-on-d0 を使用します。 -mno-crt0 C ランタイム初期化オブジェクトファイルをリンクしません。 -mrelax 短い (shorten) 分岐、呼び出しと絶対メモリアドレスへの緩和最適化パス を実行するべきであることをリンカに指示します。このオプションは、最 終的なリンクステップのためにコマンドラインで使用されるときのみ効果 があります。 このオプションで、シンボリックデバッグを不可能にします。 MT オプション これらの -m オプションは Morpho MT アーキテクチャのために定義されます: -march=cpu-type 特定のプロセッサタイプを洗わすシステムの名前である、cpu-type で実行 するコードを生成します。cpu-type で指定できる値は、ms1-64-001, ms1-16-002, ms1-16-003 と ms2 です。 このオプションが使用されていないとき、デフォルトは、 -march=ms1-16-002 です。 -mbacc コードを生成するとき、バイトのロードと格納を使用します。 -mno-bacc コードを生成するとき、バイトのロードと格納を使用しません。 -msim シミュレータランタイムを使用します。 -mno-crt0 C ランタイム初期化オブジェクトファイル crti.o をリンクしません。 startup.o と exit.o のような、他のランタイム初期化と終了ファイル は、リンカコマンドラインにまだ含まれています。 PDP-11 オプション これらのオプションは PDP-11 のために定義されます: -mfpu ハードウェア FPP 浮動小数点を使用します。これはデフォルトです。 (PDP-11/40 で FIS 浮動小数点は、サポートされていません。) -msoft-float ハードウェア浮動小数点を使用しません。 -mac0 ac0 (Unix アセンブラ構文では fr0) に浮動小数点の結果を返します。 -mno-ac0 メモリに浮動小数点の結果を返します。これはデフォルトです。 -m40 PDP-11/40 のためのコードを生成します。 -m45 PDP-11/45 のためのコードを生成します。これはデフォルトです。 -m10 PDP-11/10 のためのコードを生成します。 -mbcopy-builtin メモリをコピーするためにインライン "movmemhi" パターンを使用しま す。これはデフォルトです。 -mbcopy メモリをコピーするためにインライン "movmemhi" パターンを使用しませ ん。 -mint16 -mno-int32 16 ビット "int" を使用します。これはデフォルトです。 -mint32 -mno-int16 32 ビット "int" を使用します。 -mfloat64 -mno-float32 64 ビット "float" を使用します。これはデフォルトです。 -mfloat32 -mno-float64 32 ビット "float" を使用します。 -mabshi "abshi2" パターンを使用します。これはデフォルトです。 -mno-abshi "abshi2" パターンを使用しません。 -mbranch-expensive 分岐が高価であることにします。これは、コード生成のみを実験するもの です。 -mbranch-cheap 分岐が高価であることにしません。これはデフォルトです。 -msplit 命令とデータ分割 (split I&D) されたシステムのためのコードを生成しま す。 -mno-split 命令とデータ分割 (split I&D) されないシステムのためのコードを生成し ます。これはデフォルトです。 -munix-asm Unix アセンブラ構文を使用します。これは、pdp11-*-bsd の設定時のデ フォルトです。 -mdec-asm DEC アセンブラ構文を使用します。これは、pdp11-*-bsd 以外の任意の PDP-11 ターゲットのために設定されるときのデフォルトです。 PowerPC オプション これらは、下にリストされています。 IBM RS/6000 と PowerPC オプション これらの -m オプションは、IBM RS/6000 と PowerPC のために定義されていま す: -mpower -mno-power -mpower2 -mno-power2 -mpowerpc -mno-powerpc -mpowerpc-gpopt -mno-powerpc-gpopt -mpowerpc-gfxopt -mno-powerpc-gfxopt -mpowerpc64 -mno-powerpc64 -mmfcrf -mno-mfcrf -mpopcntb -mno-popcntb -mfprnd -mno-fprnd GCC は、RS/6000 と PowerPC のための 2 の関連する命令セットアーキテ クチャをサポートしています。POWER 命令セットは、オリジナルの RS/6000 システムで使用されている rios チップセットによってサポート されている命令で、PowerPC 命令セットは、Freescale MPC5xx、MPC6xx、 MPC8xx マイクロプロセッサと IBM 4xx, 6xx と後続のマイクロプロセッサ のアーキテクチャです。 どちらのアーキテクチャも、もう一方のサブセットではありません。しか しながら、両方でサポートされている命令の大きな共通サブセットがあり ます。MQ レジスタは、POWER アーキテクチャをサポートしているプロセッ サに含まれています。 利用者は、どの命令が利用者が使用しているプロセッサで利用可能である かを指定するためにこれらのオプションを使用します。これらのオプショ ンのデフォルト値は、GCC を設定するとき決定されます。-mcpu=cpu_type を指定することは、これらのオプションの指定を上書きします。我々は、 利用者が上にリストされたオプションよりむしろ -mcpu=cpu_type オプ ションを使用することを勧めます。 -mpower オプションによって、GCC は、POWER アーキテクチャだけに備え られた命令を生成でき、MQ レジスタを使用できます。-mpower2 を指定す ることは、-power の意味を含み、また、GCC は、オリジナルの POWER アーキテクチャに存在している命令ではなく、POWER2 アーキテクチャに存 在している命令を生成できます。 -mpowerpc オプションによって、GCC は PowerPC アーキテクチャの 32 ビットのサブセットだけに備えられた命令を生成できます。 -mpowerpc-gpopt を指定することは、-mpowerpc の意味を含み、また、GCC は、浮動小数点の平方根を含んで、汎用 (General Purpose) グループでオ プションの PowerPC アーキテクチャ命令を使用できます。 -mpowerpc-gfxopt を指定することは、-mpowerpc の意味を含み、また、 GCC は、浮動小数点の選択を含み、グラフィック (Graphics) グループで オプションの PowerPC アーキテクチャ命令を使用できます。 -mmfcrf オプションによって、GCC は、PowerPC V2.01 アーキテクチャを サポートする POWER4 プロセッサと他のプロセッサで実装された条件レジ スタフィールド命令から move を生成することができます。-mpopcntb オ プションによって、GCC は、PowerPC V2.02 アーキテクチャをサポートす る POWER5 プロセッサと他のプロセッサで実装された popcount と倍精度 の FP 逆数評価命令を生成することができます。-mfprnd オプションに よって、GCC は、PowerPC V2.03 アーキテクチャをサポートする POWER5+ プロセッサと他のプロセッサで実装された FP を整数に丸める命令を生成 することができます。 -mpowerpc64 オプションによって、GCC は完全な PowerPC64 アーキテク チャに備えられた追加 64 ビット命令を生成することができ、ダブルワー ド量の 64 ビットとして GPR を扱うことができます。GCC は -mno-powerpc64 をデフォルトとします。 利用者が -mno-power と -mno-powerpc の両方を指定するなら、GCC は、 両方のアーキテクチャの共通サブセットといくつかの特別な AIX 共通モー ド呼び出しのみを使用し、MQ レジスタを使用しません。-mpower と -mpowerpc の両方を指定することは、GCC がいずれかのアーキテクチャの 任意の命令を使用することを許可し、MQ レジスタの使用を許可します。こ れは、Motorola MPC601 に対して指定します。 -mnew-mnemonics -mold-mnemonics 生成するアセンブラコードにどのニーモニックを使用するかを選択しま す。-mnew-mnemonics をつけると、GCC は、PowerPC アーキテクチャのた めに定義されたアセンブラニーモニックを使用します。-mold-mnemonics をつけると、POWER アーキテクチャのために定義されたアセンブラニーモ ニックを使用します。1 つのアーキテクチャのみで定義された命令は、1 つのニーモニックのみとなります。これらのオプションのどれが指定され るかにかかわりなく GCC はそのニーモニックを使用します。 GCC は使用中のアーキテクチャに適切なニーモニックをデフォルトとしま す。-mcpu=cpu_type を指定すると、これらのオプションの値を時々上書き します。クロスコンパイラを構築していないなら、通常、利用者は、 -mnew-mnemonics または -mold-mnemonics のいずれかを指定すべきではあ りませんが、代わりにデフォルトを受け付けるべきです。 -mcpu=cpu_type マシンタイプ cpu_type のためのアーキテクチャタイプ、レジスタ使用 法、ニーモニックの選択と命令スケジューリングパラメータを設定しま す。ポートされている cpu_type の値は 401, 403, 405, 405fp, 440, 440fp, 505, 601, 602, 603, 603e, 604, 604e, 620, 630, 740, 7400, 7450, 750, 801, 821, 823, 860, 970, 8540, ec603e, G3, G4, G5, power, power2, power3, power4, power5, power5+, power6, common, powerpc, powerpc64, rios, rios1, rios2, rsc と rs64 です。 -mcpu=common は、完全に一般的なプロセッサを選択します。このオプショ ンの下で生成されるコードは、あらゆる POWER または PowerPC プロセッ サでも動作します。GCC は、両方のアーキテクチャの共通のサブセットの 命令のみを使用して、MQ レジスタを使用しません。GCC はスケジューリン グ目的のための一般的なプロセッサモデルを仮定します。 -mcpu=power, -mcpu=power2, -mcpu=powerpc と -mcpu=powerpc64 は、適 切にスケジューリング目的のために仮定される汎用モデルである、一般的 な POWER, POWER2, 純粋な 32 ビット PowerPC (すなわち、MPC601 でな い)、と 64 ビット PowerPC アーキテクチャマシンタイプを指定します。 他のオプションは、特定のプロセッサを指定します。それらのオプション で生成されたコードは、そのプロセッサで最適に動作し、他のプロセッサ でまったく動作しないかもしれません。 -mcpu オプションは、自動的に次のオプションを有効にするか、または無 効にします: -maltivec, -mfprnd, -mhard-float, -mmfcrf, -mmultiple, -mnew-mnemonics, -mpopcntb, -mpower, -mpower2, -mpowerpc64, -mpowerpc-gpopt, -mpowerpc-gfxopt, -mstring, -mmulhw, -mdlmzb。特定 の CPU に設定する特定のオプションは、どんな設定がその CPU に最適な コードを作成するように思えるかによって、コンパイラバージョンの間で 異なります。必ずしも、実際のハードウェアの能力を反映するというわけ ではありません。個々のオプションを特定の値に設定したいなら、利用者 は、-mcpu=970 -mno-altivec のように -mcpu オプションの後にそれを指 定することができます。 AIX では、-maltivec と -mpowerpc64 オプションは、AIX にはこれらのオ プションの完全なサポートがないので、現在のところ -mcpu オプションに よって有効にも無効にもされません。利用者の環境で動作することを確信 しているなら、個別にそれらを有効にするか、または無効にすることがで きます。 -mtune=cpu_type マシンタイプ cpu_type のための命令スケジューリングパラメータを設定 しますが、-mcpu=cpu_type が行うような、アーキテクチャタイプ、レジス タの使用法、またはニーモニックの選択を設定しません。-mcpu に間し て、cpu_type に対する同じ値は、-mtune に使用されます。両方が指定さ れるなら、生成されるコードは、-mcpu によって設定されたアーキテク チャ、レジスタ、とニーモニックを使用しますが、スケジューリングパラ メータは -mtune によって設定します。 -mswdiv -mno-swdiv 増加されたスループットのための機会を作成して、相互的な評価と繰り返 しの改良点として、除算を計算するコードを生成します。この機能は、次 を必要とします: 単精度のためのオプションの PowerPC Graphics 命令 セットと倍精度のための FRE 命令、除算を仮定することは、ユーザの目に 見えるトラップを生成することができません、ドメイン値は、無限、非正 規化、または 0 の非正規化子を含みません。 -maltivec -mno-altivec AltiVec 命令を使用する (使用しない) コードを生成します、また、 AltiVec 命令セットへのより多くの直接アクセスを許す組み込み関数の使 用を有効にします。また、利用者は、AltiVec ABI エンハンスメント (強 化) で現在の ABI を調整するために -mabi=altivec を設定する必要もあ ります。 -mvrsave -mno-vrsave AltiVec コードを生成するとき、VRSAVE 命令を生成します。 -msecure-plt ld と ld.so が、実行形式と non-exec .plt と .got セクションがある共 有ライブラリを構築することができるコードを生成します。これは、 PowerPC 32-bit SYSV ABI オプションです。 -mbss-plt ld.so に書き込まれる、BSS .plt セクションを使用し、書き込み可能で、 かつ実行可能な .plt と .got セクションを必要とするコードを生成しま す。これは、PowerPC 32-bit SYSV ABI オプションです。 -misel -mno-isel このスイッチは、ISEL 命令の生成を有効にするか、または無効にします。 -misel=yes/no このスイッチは、非推奨です。代わりに -misel と -mno-isel を使用しま す。 -mspe -mno-spe このスイッチは、SPE simd 命令の生成を有効にするか、または無効にしま す。 -mspe=yes/no このオプションは、非推奨です。代わりに -mspe と -mno-spe を使用しま す。 -mfloat-gprs=yes/single/double/no -mfloat-gprs このスイッチは、浮動小数点演算をサポートするアーキテクチャのための 汎用レジスタでの浮動小数点演算の生成を有効にするか、または無効にし ます。 引数 yes または single は、単精度浮動小数点操作の使用を有効にしま す。 引数 double は、単精度と倍精度浮動小数点操作の使用を有効にします。 引数 no は、汎用レジスタでの浮動小数点操作を無効にします。 このオプションは現在、MPC854x でのみ利用可能です。 -m32 -m64 (GNU/Linux を含んで) Darwinと SVR4 ターゲットの 32 ビットまたは、64 ビット環境のためのコードを生成します。32 ビットの環境は、int、long とポインタを 32 ビットに設定し、PowerPC 変異型で実行するコードを生 成します。64 ビットの環境は、int 32 ビット、long とポインタを 64 ビットに設定し、-mpowerpc64 のような、PowerPC64 のためのコードを生 成します。 -mfull-toc -mno-fp-in-toc -mno-sum-in-toc -mminimal-toc あらゆる実行形式ファイルのために作成される、TOC (Table Of Contents) の生成を変更します。-mfull-toc オプションがデフォルトで選択されま す。その場合には、GCC は、利用者のプログラム内のそれぞれのユニーク な非自動変数の参照のために少なくとも 1 つの TOC のエントリを割り付 けます。また、GCC は、浮動小数点定数を TOC に置きます。しかしなが ら、16,384 エントリだけが TOC で利用可能です。 利用可能な TOC 空間がオーバフローしたと示すリンカエラーメッセージを 受け取るなら、利用者は、-mno-fp-in-toc と -mno-sum-in-toc オプショ ンで使用される TOC 空間の総量を減少させることができます。 -mno-fp-in-toc は、GCC が TOC に浮動小数点定数を置くことを防ぎ、 -mno-sum-in-toc によって、GCC は TOC にその合計を置くことの代わりに 実行時にアドレスと定数の合計を計算するためのコードを強制的に生成し ます。利用者は、これらのオプションの 1 つまたは両方を指定することが できます。それぞれ、GCC は、TOC 空間を節約することを犠牲にしてわず かに遅くて大きなコードを生成します。 これらのオプションの両方を指定するときでさえ、それでも TOC の空間を 使い果たすなら、代わりに -mminimal-toc を指定します。このオプション によって、GCC は、各ファイルごとに 1 つの TOC エントリのみとしま す。このオプションを指定するとき、GCC は、より遅くてより大きいコー ドですが、極めて少ない TOC 空間を使用するコードを生成します。利用者 は、より少ない頻繁で実行されるコードを含むファイルだけで、このオプ ションを使用したいかもしれません。 -maix64 -maix32 64 ビットの AIX ABI と呼び出し規約を有効にします: 64 ビットポイン タ、64 ビット "long" タイプとインフラストラクチャ (基盤) は、それら をのサポートする必要とします。-maix64 を指定することは、-mpowerpc64 と -mpowerpc の意味を含み、一方 -maix32 は、64 ビットの ABI を無効 にし、-mno-powerpc64 の意味を含みます。GCC は -maix32 をデフォルト とします。 -mxl-compat -mno-xl-compat AIX 互換の ABI を使用するとき、IBM XL コンパイラセマンティクスによ り厳密に適合するコードを生成します。浮動小数点の引数を引数 FPR に追 加されたスタック上でレジスタ保存領域 (RSA) を超えでプロトタイプされ た関数に渡します。128 ビット long double 値の最上位の double は、値 を比較するとき、適切に丸められることを仮定しません、double に変換さ れます。long double をサポートするルーチンのために XL シンボル名を 使用します。 AIX 呼び出し規約は、拡張されましたが、宣言されるより少な引数でその 引数のアドレスを取る関数を呼び出すあいまいな K&R C の場合の扱いは最 初に文書化されませんでした。IBM XL コンパイラは、サブルーチンが最適 化なしでコンパイルされるとき、スタックから RSA に適合しない浮動小数 点引数をアクセスします。浮動小数点の引数を常にスタックに格納するこ とは、効率が悪くめったに必要でないので、このオプションは、デフォル トで有効にされず、最適化なしで IBM XL コンパイラによってコンパイル されたサブルーチンを呼び出すときだけ必要です。 -mpe IBM RS/6000 SP Parallel Environment (PE) をサポートします。メッセー ジの引き渡しを使用するように書かれたアプリケーションをアプリケー ションが実行することを有効にする特別なスタートアップコードとリンク します。システムは、標準の位置 (/usr/lpp/ppe.poe/) にインストールさ れた PE がなければならないか、または specs ファイルを、適切なディレ クトリ位置を指定するために -specs= オプションで上書きしなければなり ません。Parallel Environment は、スレッドをサポートしないので、-mpe オプションと -pthread オプションは両立しません。 -malign-natural -malign-power AIX、32 ビット Darwin と 64 ビットの PowerPC GNU/Linux では、オプ ション -malign-natural は、浮動小数点 double のような、ABI で定義さ れた大きいなタイプの整列を、それらの自然なサイズに基づいた境界に上 書きします。オプション -malign-power は、ABI で指定された整列規則に 従うように GCC に指示します。GCC は ABI で定義された標準の整列をデ フォルトとします。 64 ビットの Darwin では、自然な整列は、デフォルトで、-malign-power は、サポートされていません。 -msoft-float -mhard-float 浮動小数点レジスタセットを使用しない (使用する) コードを生成しま す。-msoft-float オプションを使用するなら、ソフトウェア浮動小数点エ ミュレーションが提供され、リンクするとき、そのオプションを GCC に渡 します。 -mmultiple -mno-multiple 複数ワード命令のロードと複数ワード命令の格納を使用する (使用しない) コードを生成します。これらの命令は、デフォルトで POWER システムで生 成されて、PowerPC システムでは生成されません。プロセッサがリトルエ ンディアンモードであるとき、それらの命令が動作しないので、リトルエ ンディアンの PowerPC システムで -mmultiple を使用しないでください。 例外は、リトルエンディアンモードでこの命令の使用を可能とする PPC740 と PPC750 です。 -mstring -mno-string 複数のレジスタに保存するために、および小さいブロックを転送 (move) するために load string 命令と store string word 命令を使用する (使 用しない) コードを生成します。これらの命令は、デフォルトで POWER シ ステムで生成されて、PowerPC システムでは生成されません。プロセッサ がリトルエンディアンモードであるとき、それらの命令が動作しないの で、リトルエンディアンの PowerPC システムで -mstring を使用しないで ください。例外は、リトルエンディアンモードでこの命令の使用を可能と する PPC740 と PPC750 です。 -mupdate -mno-update ベースレジスタを計算されたメモリ位置のアドレスに更新する、load また は store 命令を使用する (使用しない) コードを生成します。これらの命 令はデフォルトで生成されます。-mno-update を使用するなら、スタック ポインタが更新される時間と前のフレームのアドレスが格納される時間の 間には小さい窓があります。これは、割り込みまたはシグナルを横断して スタックフレームを歩くコードが、壊れたデータを得るかもしれないこと を意味します。 -mfused-madd -mno-fused-madd 浮動小数点の乗算とアキュムレイト (accumulate) 命令を使用する (使用 しない) コードを生成します。これらの命令は、ハードウェア浮動小数点 が使用されているなら、デフォルトで生成されます。 -mmulhw -mno-mulhw IBM 405 と 440 プロセッサでハーフワード乗算と乗算累積命令を使用する (使用ない) コードを生成します。それらのプロセッサをターゲットとする とき、これらの命令は、デフォルトで生成されます。 -mdlmzb -mno-dlmzb IBM 405 と 440 プロセッサで文字列検索 dlmzb 命令を使用する (使用な い) コードを生成します。それらのプロセッサをターゲットとするとき、 この命令は、デフォルトで生成されます。 -mno-bit-align -mbit-align System V.4 と組み込みの PowerPC システムでは、ビットフィールドを含 む構造体と共用体がビットフィールドのベースタイプに整列されることを 強制しません (強制します)。 例えば、長さ 1 の 8 つの "unsigned" ビットフィールドを含み、ほかは 何もない構造体は、デフォルトで、4 バイト境界に整列され、4 バイトの サイズとなります。-mno-bit-align を使用することによって、構造体は、 1 バイト境界に整列され、1 バイトのサイズとなります。 -mno-strict-align -mstrict-align System V.4 と組み込みの PowerPC システムでは、整列されていないメモ リの参照は、システムによって扱われると仮定しません (仮定します)。 -mrelocatable -mno-relocatable 組み込みの PowerPC システムでは、プログラムが実行時に異なったアドレ スに再配置できる (できない) コードを生成します。任意のモジュールで -mrelocatable を使用するなら、一緒にリンクされるすべてのオブジェク トは、-mrelocatable または -mrelocatable-lib をつけてコンパイルされ なければなりません。 -mrelocatable-lib -mno-relocatable-lib 組み込みの PowerPC システムでは、プログラムが実行時に異なったアドレ スに再配置できる (できない) コードを生成します。-mrelocatable-lib をつけてコンパイルされたモジュールは、-mrelocatable と -mrelocatable-lib なしでコンパイルされたモジュール、または -mrelocatable オプションをつけてコンパイルされたモジュールのいずれ かとリンクすることができます。 -mno-toc -mtoc System V.4 と組み込みの PowerPC システムでは、レジスタ 2 がプログラ ムで使用されるアドレスを指すグローバル領域へのポインタを含むと仮定 しません (仮定します)。 -mlittle -mlittle-endian System V.4 と組み込みの PowerPC システムでは、リトルエンディアン モードのプロセッサのためのコードをコンパイルします。-mlittle-endian オプションは -mlittle と同じです。 -mbig -mbig-endian System V.4 と組み込みの PowerPC システムでは、ビッグエンディアン モードのプロセッサのためのコードをコンパイルします。-mbig-endian オ プションは -mbig と同じです。 -mdynamic-no-pic Darwin と Mac OS X システムでは、再配置可能でないが、外部参照が再配 置可能であるようにコードをコンパイルします。結果のコードは、アプリ ケーションに適していますが、共有ライブラリには適していません。 -mprioritize-restricted-insns=priority このオプションは 2 番目のスケジューリングパスの間にディスパッチス ロットの制限された命令に割り当てられる優先順位を制御します。引数 priority は、ディスパッチスロット制限命令に no/highest/second-highest (なし/最高/2番目に最高) 優先順位を割り当 てるための値 0/1/2 を取ります。 -msched-costly-dep=dependence_type このオプションは、指示スケジューリングの間、どの依存関係がターゲッ トによってコストがかかると考えられるかを制御します。引数 dependence_type は次の値の 1 つを取ります: no: 依存状態はコストがか かりません。all: すべての依存状態はコストがかかります。 true_store_to_load: 格納 (store) からロード (load) の真の依存状態は コストがかかります。store_to_load: 格納 (store) からロード (load) の任意の依存状態はコストがかかります。number: レイテンシ (latency) >= number である任意の依存状態はコストがかかります。 -minsert-sched-nops=scheme このオプションは、どの nop 挿入スキームが 2 番目のスケジューリング パスの間に使用されるかを制御します。引数 scheme は次の値の 1 つを取 ります: no: nop を挿入しません。pad: スケジューラのグループ分けにし たがって、空の発行スロット (vacant issue slot) がある、任意のディス パッチグループの nop を埋めます。regroup_exact: コストがかかる依存 関係 insns を別々のグループに強制的に nop を挿入します。予測される プロセッサのグループ分けにしたがって、新しいグループに insn を強制 するために必要である、ちょうど同じくらい多くの nop を挿入します。 number: コストがかかる依存関係の insn を強制的に別々のグループに nop を挿入します。新しいグループに insn を強制的に number 個の nop を挿入します。 -mcall-sysv System V.4 と組み込みの PowerPC システムでは、the March 1995 draft of the System V Application Binary Interface, PowerPC processor supplement (1995 年 3 月の草稿 System V アプリケーションバイナリイ ンタフェース、PowerPC プロセッサ補足) を順守するする呼び出し規約を 使用するコードをコンパイルします。両者が powerpc-*-eabiaix を使用し て GCC を設定しなかったなら、これがデフォルトです。 -mcall-sysv-eabi -mcall-sysv と -meabi オプションの両方を指定します。 -mcall-sysv-noeabi -mcall-sysv と -mno-eabi オプションの両方を指定します。 -mcall-solaris System V.4 と組み込みの PowerPC システムでは、Solaris オペレーティ ングシステムのためのコードをコンパイルします。 -mcall-linux System V.4 と組み込みの PowerPC システムでは、Linux ベースの GNU シ ステムのためのコードをコンパイルします。 -mcall-gnu System V.4 と組み込みの PowerPC システムでは、Hurd ベースの GNU シ ステムのためのコードをコンパイルします。 -mcall-netbsd System V.4 と組み込みの PowerPC システムでは、NetBSD オペレーティン グシステムのためのコードをコンパイルします。 -maix-struct-return (AIX ABI によって指定されるように) メモリですべての構造体を返しま す。 -msvr4-struct-return (SVR4 ABI によって指定されるように) レジスタで 8 バイトより小さい構 造体を返します。 -mabi=abi-type 特定の拡張子で現在の ABI を拡張するか、またはそのような拡張子を削除 します。有効な値は、altivec, no-altivec, spe, no-spe, ibmlongdouble, ieeelongdouble です。 -mabi=spe SPE ABI 拡張子で現在の ABI を拡張します。これは、デフォルトの ABI を変更しないで、代わりに、現在の ABI に SPE ABI 拡張子を追加しま す。 -mabi=no-spe 現在の ABI のための Booke SPE ABI 拡張子を無効にします。 -mabi=ibmlongdouble 現在の ABI を変更して、IBM 拡張精度 long double を使用します。これ は、PowerPC 32 ビット SYSV ABI オプションです。 -mabi=ieeelongdouble 現在の ABI を変更して、IEEE 拡張精度 long double を使用します。これ は、PowerPC 32 ビット Linux ABI オプションです。 -mprototype -mno-prototype System V.4 と組み込みの PowerPC システムでは、可変引数関数へのすべ ての呼び出しが適切にプロトタイプ宣言されていると仮定します。そうで なければ、コンパイラは、浮動小数点値が、可変引数を取る関数の場合に 浮動小数点レジスタで渡されるかどうかを示すために、条件コードレジス タ (CR) のビット 6 をセットするかクリアするためにすべてのプロトタイ プ宣言されていない呼び出しの前に、命令を挿入しなければなりません。 -mprototype をつけると、プロトタイプ宣言された可変引数関数への呼び 出しのみが、このビットをセットするか、またはクリアします。 -msim 組み込みの PowerPC システムでは、スタートアップモジュールが sim-crt0.o と呼ばれ、標準の C ライブラリが libsim.a と libc.a であ ることを仮定します。これは、powerpc-*-eabisim 設定のデフォルトで す。 -mmvme 組み込みの PowerPC システムでは、スタートアップモジュールが crt0.o と呼ばれ、標準の C ライブラリが libmvme.a と libc.a であることを仮 定します。 -mads 組み込みの PowerPC システムでは、スタートアップモジュールが crt0.o と呼ばれ、標準の C ライブラリが libads.a と libc.a であることを仮定 します。 -myellowknife 組み込みの PowerPC システムでは、スタートアップモジュールが crt0.o と呼ばれ、標準の C ライブラリが libyk.a と libc.a であることを仮定 します。 -mvxworks System V.4 と組み込みの PowerPC システムでは、利用者が VxWorks シス テムのためにコンパイルすることを指定します。 -mwindiss 利用者が WindISS シミュレーション環境のためにコンパイルしていると指 定します。 -memb 組み込みの PowerPC システムでは、eabi 拡張再配置が使用されているこ とを示すために ELF フラグヘッダの PPC_EMB ビットを設定します。 -meabi -mno-eabi System V.4 と組み込みの PowerPC システムでは、System V.4 仕様の 1 組の変更である the Embedded Applications Binary Interface (eabi) (組み込みアプリケーションバイナリインタフェース) を順守します (順守 しません)。-meabi を選択することは、スタックが 8 バイト境界に整列さ れ、関数 "__eabi" が、eabi 環境をセットアップするために "main" から 呼び出され、-msdata オプションが 2 つの別々のスモール data 領域を指 すために "r2" と "r13" の両方を使用できることを意味します。 -mno-eabi を選択することは、スタックが 16 バイト境界に整列され、 "main" から初期化関数を呼び出さず、-msdata オプションが単一のスモー ル data 領域を指すために "r13" のみを使用することを意味します。 -meabi オプションは、利用者が powerpc*-*-eabi* オプションの 1 つを 使用して GCC を設定するなら、デフォルトでオンです。 -msdata=eabi System V.4 と組み込みの PowerPC システムでは、小さな初期化された "const" グローバルと静的データをレジスタ "r2" よって指される .sdata2 セクションに置きます。小さな初期化された非-"const" グローバ ルと静的データをレジスタ "r13" よって指される .sdata セクションに置 きます。小さな初期化されていないグローバルと静的データを .sdata セ クションに隣接した .sbss セクションに置きます。-msdata=eabi オプ ションは -mrelocatable オプションと両立しません。また、-msdata=eabi オプションは -memb オプションも設定します。 -msdata=sysv System V.4 と組み込みの PowerPC システムでは、小さなグローバルと静 的なデータをレジスタ "r13" よって指される .sdata セクションに置きま す。小さな初期化されていないグローバルと静的データを .sdata セク ションに隣接した .sbss セクションに置きます。-msdata=sysv オプショ ンは -mrelocatable オプションと両立しません。 -msdata=default -msdata System V.4 と組み込みの PowerPC システムでは、-meabi が使用されてい るなら、-msdata=eabi と同じコードをコンパイルし、そうでなければ、 -msdata=sysv と同じコードをコンパイルます。 -msdata-data System V.4 と組み込みの PowerPC システムでは、小さなグローバルデー タを .sdata セクションに置きます。小さな初期化されていないグローバ ルデータを .sbss セクションに置きます。しかしながら、小さいデータを アドレス付けするレジスタ "r13" を使用しません。他の -msdata オプ ションが使用されていないなら、これはデフォルトの振る舞いです。 -msdata=none -mno-sdata 組み込みの PowerPC システムでは、すべての初期化されているグローバル と静的データを .data セクションに置き、すべての初期化されていない データを .bss セクションに置きます。 -G num 組み込みの PowerPC システムでは、num バイト以下のグローバルと静的項 目を、通常の data または bss セクションの代わりに、スモール data ま たは bss セクションに置きます。デフォルトでは、num は 8 です。ま た、-G num スイッチもリンカに渡されます。すべてのモジュールは、同じ -G num 値でコンパイルされるべきです。 -mregnames -mno-regnames System V.4 と組み込みの PowerPC システムでは、シンボル形式を使用し てアセンブリ言語出力にレジスタ名を出力します (出力しません)。 -mlongcall -mno-longcall すべての呼び出しは、より長いより高価な呼び出しシーケンスが必要であ るように、far away (より遠い) であると、デフォルトで仮定します。こ れは、現在の位置から 32 メガバイト (33,554,432 ) より遠い呼び出しに 必要です。コンパイラが、呼び出しがそんなに遠い (far away) はずがな いことを知っているなら、ショートコール (short call) が生成されま す。"shortcall" 関数属性、または "#pragma longcall(0)" によって、こ の設定を上書きすることができます。 いくつかのリンカは、範囲外の呼び出しを検出して、オンザフライで (複 数の処理をまとめて) グルー (glue) コードを生成することができます。 これらのシステムでは、ロング呼び出しは不要で、より遅いコードを生成 します。これを書いている時点で、AIX リンカは、PowerPC/64 のための GNU リンカのように、これを行うことができます。なお、この特徴を、32 ビットの PowerPC システムのための GNU リンカに追加することが計画さ れています。 Darwin/PPC システムで、"#pragma longcall" は、"jbsr callee, L42" と "branch island" (glue code) を生成します。2 つのターゲットアドレス は、呼び出し先と "branch island" を表します。Darwin/PPC リンカは、 最初のアドレスの方を好みますが、PPC "bl" 命令が直接呼び出し先に到達 するなら、"bl callee" を生成します。そうでなければ、リンカは、 "branch island" を呼び出すために "bl L42" を生成します。"branch island" は、呼び出し関数の本体に付け加えられます。それは、呼び出し 先の完全な 32 ビットのアドレスを計算して、そこへジャンプします。 Mach-O (Darwin) システムでは、このオプションは、コンパイラに、すべ ての直接呼び出しのためのグルー (glue) を出力するするように指示し、 Darwin リンカは、それを使用するか破棄するかどうかを決定します。 将来は、リンカがグルーを生成させることが知られているとき、私たち は、GCC がすべてのロング呼び出し (longcallO 仕様を無視するようにす るかもしれません。 -pthread pthreads ライブラリによるマルチスレッド化のサポートを追加します。こ のオプションはプリプロセッサとリンカの両方のためのフラグを設定しま す。 S/390 と zSeries オプション これらは S/390 と zSeries アーキテクチャのために定義された -m オプショ ンです。 -mhard-float -msoft-float 浮動小数点演算のためのハードウェア浮動小数点命令とレジスタを使用し ます (使用しません)。-msoft-float が指定されるとき、libgcc.a の関数 は、浮動小数点演算を実行するために使用されます。-mhard-float が指定 されるとき、コンパイラは IEEE 浮動小数点命令を生成します。これはデ フォルトです。 -mlong-double-64 -mlong-double-128 これらのスイッチは、"long double" タイプのサイズを制御します。64 ビットのサイズでは、"long double" タイプは、"double" タイプと同等に なります。これは、デフォルトです。 -mbackchain -mno-backchain 呼び出し先のスタックフレームに、逆方向のチェーン (backchain) のポイ ンタとして呼び出し側のフレームのアドレスを格納します (格納しませ ん)。逆方向のチェーンは、DWARF-2 呼び出しフレーム情報を理解していな いツールを使用してデバッグを許可する必要があります。 -mno-packed-stack が採用されるときに、逆方向のチェーンのポインタ は、スタックフレームの下端に格納されます。-mpacked-stack が採用され るときに、逆方向のチェーンは、96/160 バイトのレジスタ退避領域の最上 部のワードに置かれます。 一般的に、-mbackchain でコンパイルされたコードは、-mmo-backchain で コンパイルされたコードと呼び出し互換性があります。しかしながら、通 常、デバッグ目的のための逆方向のチェーンの使用は、すべてのバイナリ が、-mbackchain で構築される必要があります。-mbackchain, -mpacked-stack と -mhard-float の組み合わせは、サポートされないこと に注意してください。linux カーネルを構築するためには、-msoft-float を使用します。 デフォルトは、逆方向のチェーンを維持しないことです。 -mpacked-stack -mno-packed-stack パックされたスタックレイアウトを使用します (使用しません)。 -mno-packed-stack が指定されるとき、コンパイラは、デフォルト目的の ためだけに 96/160 バイトのレジスタ退避領域のすべてのフィールドを使 用します。未使用のフィールドは、まだスタック空間を取っています。 -mpacked-stack が指定されるとき、レジスタ保存スロットは、レジスタ退 避領域の先頭で高密度にパックされます。未使用の空間は、利用可能なス タック空間のより効率的な使用を考慮して、他の目的のために再利用され ます。しかしながら、また、-mbackchain が採用されるときに、退避領域 の最上のワードは、逆方向のチェーン (backchain) を格納するために常に 使用され、返りアドレスのレジスタは、逆方向のチェーンの下の 2 つの ワードに常に保存されます。 スタックフレーム逆方向のチェーン (backchain) が使用されないならば、 -mpacked-stack で生成されたコードは、-mno-packed-stack で生成された コードと呼び出し互換性があります。S/390 または zSeries のための GCC 2.95 のいくつかの非 FSF リリースは、デバッグ目的だけではなく、ラン タイム時にスタックフレーム逆方向のチェーンを使用するコードを生成す ることに注意してください。そのようなコードは、-mpacked-stack でコン パイルされたコードと呼び出し互換性がありません。また、-mbackchain, -mpacked-stack と -mhard-float の組み合わせは、サポートされないこと に注意してください。linux カーネルを構築するためには、-msoft-float を使用します。 デフォルトは、パックされたスタックレイアウトを使用しないことです。 -msmall-exec -mno-small-exec サブルーチン呼び出しを行うために "bras" 命令を使用するコードを生成 します (または生成しません)。これは、実行形式の合計のサイズが 64k を超えない場合にのみ、確実に動作します。デフォルトは、この制限がな い、"basr" 命令を代わりに使用することです。 -m64 -m31 -m31 が指定されるとき、S/390 ABI のための GNU/Linux に適合するコー ドを生成します。-m64 が指定されるとき、zSeries ABI のための GNU/Linux に適合するコードを生成します。これによって、特に GCC は 64 ビット命令を生成することができます。s390 ターゲットのためのデ フォルトは -m31 ですが、一方 s390x ターゲットのデフォルトは -m64 で す。 -mzarch -mesa -mzarch が指定されるとき、z/Architecture で利用可能な命令を使用する コードを生成します。-mesa が指定されるとき、ESA/390 で利用可能な命 令を使用するコードを生成します。-mesa は -m64 で利用可能でないこと に注意してください。S/390 ABI のための GNU/Linux に適合するコードを 生成するとき、デフォルトは -mesa です。zSeries ABI のための GNU/Linux に適合するコードを生成するとき、デフォルトは -mzarch で す。 -mmvcle -mno-mvcle ブロック転送 (move) を実行するために "mvcle" 命令を使用するコードを 生成します (または生成しません)。-mno-mvcle が指定されるとき、代わ りに "mvc" ループを使用します。サイズに対する最適化をしないなら、こ れはデフォルトです。 -mdebug -mno-debug コンパイルするとき、追加デバッグ情報を印刷します (または印刷しませ ん)。デフォルトは、デバッグ情報を印刷しないことです。 -march=cpu-type 特定のプロセッサタイプを代表するシステムの名前である、cpu-type で実 行するコードを生成します。cpu-type のための利用可能な値は、g5, g6, z900 と z990 です。z/Architecture 利用可能な命令を使用するコードを 生成するとき、デフォルトは -march=z900 です。そうでなければ、デフォ ルトは -march=g5 です。 -mtune=cpu-type ABI と利用可能な命令のセットを除いて、生成するコードに関して適用可 能なすべての cpu-type を調整します。cpu-type 値のリストは、-march に対するもと同じです。デフォルトは -march のために使用する値です。 -mtpf-trace -mno-tpf-trace オペレーティングシステムでルーチンをトレースするために TPF OS 特有 のブランチを追加する (追加しない) コードを生成します。このオプショ ンは、TPF OS のためにコンパイルするときさえ、デフォルトでオフです。 -mfused-madd -mno-fused-madd 浮動小数点の乗算とアキュムレイト (accumulate) 命令を使用する (使用 しない) コードを生成します。これらの命令は、ハードウェア浮動小数点 が使用されているなら、デフォルトで生成されます。 -mwarn-framesize=framesize 現在の関数が与えられたフレームサイズを超えているなら、警告を出力し ます。これは、コンパイル時にチェックされるので、プログラムが実行す るとき、実際の問題となることはありません。最も可能性があるスタック オーバフローを引き起こす関数を識別することを目的としています。制限 されたスタックサイズのある環境での使用で役に立つちます、例えば、 linux カーネル。 -mwarn-dynamicstack 関数が alloca を呼び出すか、または動的なサイズの配列を使用するな ら、警告を出力します。一般的に、これは制限されたスタックサイズがあ る悪い考えです。 -mstack-guard=stack-guard -mstack-size=stack-size これらの引数は、常に同時に使用されなければなりません。それらが存在 しているなら、s390 バックエンドは、スタックサイズが、stack-size よ り上の stack-guard バイトであるなら (s390 のスタックが下の方に増え ることを覚えていてください)、トラップをトリガする関数プロローグで追 加命令を出力します。これらのオプションは、スタックオーバフロー問題 をデバッグすることを助けるのに使用されることを目的としています。さ らに、出力されたコードによって、ほとんどオーバヘッドがなく、した がって、より大きい性能低下のないシステムのような生産に使用すること ができます。与えられた値は、正確な 2 の冪乗でなければならず、stack- size は、64k を超えない stack-guard より大きくなければなりません。 効率的になるように、特別のコードは、スタックが stack-size よって与 えられた値に整列されたアドレスで始動するという仮定を行います。 Score オプション これらのオプションは、Score 実装のために定義されています: -meb ビッグエンディアンモードのためのコードをコンパイルします。これは、 デフォルトです。 -mel リトルエンディアンモードのためのコードをコンパイルします。 -mnhwloop bcnz 命令の生成を無効にします。 -muls 整列されていないロードと格納命令の生成を有効にします。 -mmac 乗累算命令の使用を有効にします。デフォルトで無効にされます。 -mscore5 ターゲットアーキテクチャとして SCORE5 を指定します。 -mscore5u ターゲットアーキテクチャの SCORE5U を指定します。 -mscore7 ターゲットアーキテクチャとして SCORE7 を指定します。これは、デフォ ルトです。 -mscore7d ターゲットアーキテクチャとして SCORE7D を指定します。 SH オプション これらの -m オプションは、SH 実装のために定義されています: -m1 SH1 のためのコードを生成します。 -m2 SH2 のためのコードを生成します。 -m2e SH2e のためのコードを生成します。 -m3 SH3 のためのコードを生成します。 -m3e SH3e のためのコードを生成します。 -m4-nofpu 浮動小数点ユニットなしの SH4 のためのコードを生成します。 -m4-single-only 単精度演算のみをサポートする浮動小数点ユニットがある SH4 のための コードを生成します。 -m4-single デフォルトで単精度モードの浮動小数点ユニットを仮定する SH4 のための コードを生成します。 -m4 SH4 のためのコードを生成します。 -m4a-nofpu 浮動小数点ユニットが使用されていないような方法で、SH4al-dsp または SH4a のためのコードを生成します。 -m4a-single-only 倍精度浮動小数点操作が使用されていないような方法で、SH4a のための コードを生成します。 -m4a-single 浮動小数点ユニットがデフォルトで単精度モードであると仮定する SH4a のためのコードを生成します。 -m4a SH4a のためのコードを生成します。 -m4al 暗黙的に -dsp をアセンブラに渡すことを除いて、-m4a-nofpu と同じで す。GCC は、現在のところ、少しもも DSP 命令を生成しません。 -mb ビッグエンディアンモードでプロセッサのためにコードをコンパイルしま す。 -ml リトルエンディアンモードでプロセッサのためにコードをコンパイルしま す。 -mdalign double を 64 ビット境界に整列します。これが呼び出し規約を変更し、そ の結果、利用者が最初に、-mdalign でそれを再コンパイルしないなら、標 準 C ライブラリのいくつかの関数は動作しないことに注意してください。 -mrelax 可能であるなら、リンク時に、いくつかのアドレス参照を短くします。リ ンカオプション -relax を使用します。 -mbigtable "switch" テーブルに 32 ビットのオフセットを使用します。デフォルト は、16 ビットのオフセットを使用します。 -mfmovd 命令 "fmovd" の使用を有効にします。 -mhitachi Renesas によって定義された呼び出し規約に従います。 -mrenesas Renesas によって定義される呼び出し規約に従います。 -mno-renesas Renesas 規約が利用可能になる前に GCC のために定義される呼び出し規約 に従います。このオプションは、sh-symbianelf 以外の SH toolchain の すべてのターゲットのためのデフォルトです。 -mnomacsave たとえ -mhitachi が与えられても、"MAC" レジスタを call-clobbered と マークします。 -mieee 浮動小数点コードの IEEE コンプライアンス (順守) を強めます。現在の ところ、これは -fno-finite-math-only と同等です。16 ビットの SH opcodes を生成するとき、IEEE-適合を取得することは、あらゆる浮動小数 点比較で余分なオーバヘッドを被る NAN / 無限の比較のための結果となり ます、したがって、デフォルトは、-ffinite-math-only に設定されます。 -misize アセンブリコードの命令サイズと位置をダンプします。 -mpadstruct このオプションは古くて推奨されません。SH ABI と互換性がありません が、構造体を 4 バイトの倍数にパディング (詰め物) します。 -mspace 速度の代わりにサイズを最適化します。-Os を暗黙に定義します。 -mprefergot 位置に依存しないコードを生成するとき、Procedure Linkage Table の代 わりに Global Offset Table を使用して関数呼び出しを出力します。 -musermode トランポリン (trampoline) を修理した後に、命令キャッシュエントリを 無効にするためにライブラリ関数呼び出しを生成します。このライブラリ 関数呼び出しは、メモリアドレス空間全体に書き込むことができると仮定 しません。これは、ターゲットが "sh-*-linux*" であるとき、デフォルト です。 -multcost=number 乗算の insn を仮定する費用を設定します。 -mdiv=strategy SHmedia コードの使用に除算戦略を設定します。strategy (戦略) は、次 の 1 つでなければなりません: call, call2, fp, inv, inv:minlat, inv20u, inv20l, inv:call, inv:call2, inv:fp。"fp" は、浮動小数点の 操作を実行します。これは、非常に高い待ち時間 (latency) があります が、ほんのいくつかの命令を必要とするので、利用者のコードに、コンパ イラが他の命令と共に浮動小数点命令をスケジュールすることができる十 分簡単にセキュリティホールとなる ILP があるなら、それは良い選択であ るかもしれません。0 除算は、浮動小数点例外を引き起こします。"inv" は、除数の逆を計算するために整数操作を使用して、次に、逆がある被除 数を掛けます。この戦略によって、逆の計算の cse と hoisting ができま す。0 除算は、不特定の結果を計算しますが、トラップしません。 "inv:minlat" は、cse / hoisting の機会が見つからないところで、"inv" の変異型であるか、または全体の操作が同じ場所で hoist されているな ら、逆の計算の最後のステージが、もう少しの命令を使用することを犠牲 にして、総合的な待ち時間 (latency) を減少させるために最後の乗算で結 び付けられ、その結果、他のコードで、より少ないスケジューリングの機 会を提供します。"call" は、通常、inv:minlat 戦略を実装するライブラ リ関数を呼び出します。これは、m5-*media-nofpu コンパイルのための高 いコード密度を与えます。"call2" は、cse / コード hoisting 最適化へ のロードされたポインタを公開する、検索テーブルへのポインタが既に セットアップされたと仮定する同じライブラリ関数の異なったエントリポ イントを使用します。"inv:call", "inv:call2" と "inv:fp" は、すべて 初期のコードを生成する "inv" アルゴリズムを使用しますが、コードが最 適化されないままで残っているなら、それぞれ "call", "call2" または "fp" 戦略に戻ります。0 除算の潜在的なトラップの副作用は、別々の命令 で扱われるので、すべての整数命令が hoisted out されますが、副作用の ためのマーカは、それがあるところに留まることが可能であることに注意 してください。fp 操作または call との再結合の場合は、可能ではありま せん。"inv20u" と "inv20l" は、"inv:minlat" 戦略の変異型です。逆さ の計算が、乗算から切り離される場合には、この場合の操作の数をスキッ プするテストを挿入することによって、それらは、被除数が 20 ビット (適切なところでのプラス記号) に収まる除算をスピードアップします。こ のテストは、より大きな被除数の場合にスピードを落します。inv20u は、 そのような小さい被除数の場合がありそうもないと仮定し、inv20l は、そ れがありそうであると仮定します。 -mdivsi3_libfunc=name 32 ビット符号付き除算のために使用されるライブラリ関数の名前を name に設定します。これは、call と inv:call 除算戦略で使用される名前だけ に影響し、コンパイラは、いまだに、まるでこのオプションが存在してい ないかのように、入力/出力/上書き (input/output/clobbered) レジスタ の同じセットを予期します。 -madjust-unroll ターゲットレジスタを thrash することを避けるために、unrolling を抑 制します。このオプションは、gcc コードベースが、 TARGET_ADJUST_UNROLL_MAX ターゲットフックをサポートする場合にだけ、 効果があります。 -mindexed-addressing SHmedia32/SHcompact のためのインデックス付けされたアドレッシング モードの使用を有効にします。ハードウェア、および/または、OS が、イ ンデックス付けされたアドレッシングモードのために 32 ビットラップア ラウンド (wrap-around) セマンティクスを実装する場合にだけ、これは安 全です。アーキテクチャによって、OS が、32 ビットアドレッシングを得 ることを必要としているなら、64 ビット MMU があるプロセッサを実装す ることができますが、現在のハードウェア実装は、これをサポートしない し、32 ビット ABI を使用するために、インデックス付けされたアドレッ シングモードを安全にするいかなる他の方法もないので、デフォルトは、 -mno-indexed-addressing です。 -mgettrcost=number gettr 命令のために仮定された費用を number に設定します。-mpt-fixed が採用されるなら、デフォルトは、2 で、そうでなければ、100 です。 -mpt-fixed pt* 命令がトラップしないと仮定します。これは、一般的によりよくスケ ジュールされているコードを生成しますが、現在のハードウェアで危険で す。現在のアーキテクチャ定義は、3 で論理和 (and) されたターゲットが 3 であるとき、ptabs と ptrel トラップられると書いてあります。これに は、ブランチの前で ptabs / ptrel をスケジュールするか、またはループ の外でそれを hoist することを危険にするという意図的でない効果があり ます。例えば、プログラムのスタートアップでコンストラクタを実行する libgcc の一部、__do_global_ctors は、-1 のよって区切られるリストで 関数を呼び出します。-mpt-fixed オプションで、ptabs は、-1 に対して テストする前に行われます。それは、すべてのコンストラクタが、少し迅 速に実行されることを意味しますが、ループがリストの終わりに来ると き、ptabs がターゲットレジスタに -1 をロードするので、プログラム は、クラッシュします。現在の構造仕様を実装する任意のハードウェアに 対して、このオプションが危険であるので、デフォルトは、-mno-pt-fixed です。ユーザが、-mgettrcost で特別のコストを指定しないなら、 -mno-pt-fixed は、また -mgettrcost=100 の意味を含みます。これは、普 通の整数を格納するためにターゲットレジスタを使用するレジスタ割り付 けを阻止します。 -minvalid-symbols シンボルが、無効であるかもしれないと仮定します。コンパイラによって 生成される普通の関数のシンボルは、movi/shori/ptabs または movi/shori/ptrel でロードするために常に有効になりますが、アセンブ ラ、および/または、リンカのトリックで、ptabs / ptrel がトラップする シンボルを生成することは可能です。このオプションは、-mno-pt-fixed が採用されるときのみ、重要です。そして、それは、クロスベーシックブ ロック (cross-basic-block) cse、hoisting とシンボルロードのほとんど のスケジューリングを防ぎます。デフォルトは、-mno-invalid-symbols で す。 SPARC オプション これらの -m オプションは SPARC でサポートされています: -mno-app-regs -mapp-regs SPARC SVR4 ABI がアプリケーションのために予約されているグローバルレ ジスタ 2 から 4 を使用する出力を生成するために、-mapp-regs を指定し ます。これは、デフォルトです。 いくらかの性能の損失を犠牲にして、完全な SVR4 ABI に準拠するため に、-mno-app-regs を指定します。利用者は、このオプションをつけてラ イブラリとシステムソフトウェアをコンパイルするべきです。 -mfpu -mhard-float 浮動小数点命令を含む出力を生成します。これはデフォルトです。 -mno-fpu -msoft-float 浮動小数点のためのライブラリ呼び出しを含む出力を生成します。警告: 必要なライブラリは、すべての SPARC ターゲットで利用可能ではありませ ん。通常、マシンの普通の C コンパイラの機能は使用されますが、クロス コンパイルで直接行うことはできません。利用者は、利用者自身でクロス コンパイルのための適切なライブラリ関数を準備しなければなりません。 組み込みターゲット sparc-*-aout と sparclite-*-* は、ソフトウェア浮 動小数点サポートを提供します。 -msoft-float は、出力ファイルにおける呼び出し規約を変更します。した がって、利用者がこのオプションですべてのプログラムをコンパイルする 場合にだけ、役に立ちます。特に、利用者は、これを動作するために GCC とともに備えられているライブラリ libgcc.a を -msoft-float をつけて コンパイルする必要があります、 -mhard-quad-float クワッドワード (long double) 浮動小数点命令を含む出力を生成します。 -msoft-quad-float クワッドワード (long double) 浮動小数点命令のライブラリ呼び出しを含 む出力を生成します。呼び出される関数は、SPARC ABI で指定されたもの です。これはデフォルトです。 これが書かれている時点で、クワッドワード浮動小数点命令のハードウェ アサポートがある SPARC の実装はありません。それらは、すべて、これら の命令の 1 つのためのトラップハンドラを呼び出し、次に、トラップハン ドラは、命令の効果をエミュレートします。トラップハンドラのオーバ ヘッドのために、これは ABI ライブラリルーチンを呼び出すより、はるか に遅くなります。したがって、-msoft-quad-float オプションがデフォル トです。 -mno-unaligned-doubles -munaligned-doubles double には 8 バイトの整列があると仮定します。これはデフォルトで す。 -munaligned-doubles をつけると、GCC は、double が別のタイプに含まれ ているか、または絶対アドレスがある場合のみ、double が 8 バイトで整 列されると仮定します。そうでなければ、それらは 4 バイトで整列される と仮定します。このオプションを指定することで、他のコンパイラによっ て生成されるコードのいくつかのまれな互換性の問題を避けられます。特 に浮動小数点コードの性能の損失をもたらすので、デフォルトではありま せん。 -mno-faster-structs -mfaster-structs -mfaster-structs をつけると、コンパイラは、構造体が 8 バイトで整列 されると仮定します。これは構造体の代入で、2 倍の "ld" と "st" ペア の代わりに、コピーのために "ldd" と "std" 命令の組を使用することを 有効にします。しかしながら、この変更された整列の使用は、直接 SPARC ABI に違反します。したがって、開発者が、それらの結果のコードが ABI の規則と直接一致しないことを認めるターゲットでの使用のみを対象とし ています。 -mimpure-text -shared に追加して使用される -mimpure-text は、共有オブジェクトをリ ンクするとき、-z text をリンカに渡さないようにコンパイラに伝えま す。このオプションを使用して、利用者は位置依存コードを共有オブジェ クトにリンクすることができます。 -mimpure-text は "relocations remain against allocatable but non writable sections" (再配置は割り付け可能だが、書き込み不可能なセク ションに対して残っている) リンカエラーメッセージを抑制します。しか しながら、必要な再配置はトリガ (引き金) となる、コピーオンライト (copy-on-write) で、共有オブジェクトは実際にプロセス間で共有されま せん。-mimpure-text を使用することの代わりに、利用者は -fpic または -fPIC をつけてすべてのソースコードをコンパイルするべきです。 このオプションは SunOS と Solaris でのみ利用可能です。 -mcpu=cpu_type マシンタイプ cpu_type のための命令セット、レジスタセットと命令スケ ジューリングパラメータを設定します。cpu_type のためにサポートされて いる値は、v7, cypress, v8, supersparc, sparclite, f930, f934, hypersparc, sparclite86x, sparclet, tsc701, v9, ultrasparc, ultrasparc3, and niagara です。 デフォルトの命令スケジューリングパラメータは、実装ではなく、アーキ テクチャを選択する値に使用されます。これらは、v7, v8, sparclite, sparclet, v9 です。 ここに、それぞれのサポートされたアーキテクチャとそれらのサポートさ れた実装のリストを示します。 v7: cypress v8: supersparc, hypersparc sparclite: f930, f934, sparclite86x sparclet: tsc701 v9: ultrasparc, ultrasparc3, niagara デフォルトで (別の方法で設定されないなら)、GCC は SPARC アーキテク チャの V7 バリアント (改良型) のためのコードを生成します。 -mcpu=cypress をつけると、コンパイラは、SPARCStation/SPARCServer 3xx シリーズで使用されるように、Cypress CY7C602 チップのためにさら にそれを最適化します。また、より古い SPARCStation 1, 2, IPX などの ためにも適切です。 -mcpu=v8 をつけると、GCC は、SPARC アーキテクチャの V8 バリアント (改良型) のためのコードを生成します。V7 コードとの唯一の違いは、 SPARC-V8 には存在するが SPARC-V7 には存在しない、整数の乗算と整数の 除算命令を出力することです。-mcpu=supersparc をつけると、コンパイラ は、SPARCStation 10, 1000 と 2000 シリーズで使用されるように、 SuperSPARC チップのためにさらにそれを最適化します。 -mcpu=sparclite をつけると、GCC は、SPARC アーキテクチャの SPARClite バリアント (改良型) のためのコードを生成します。これは、 SPARClite には存在するが SPARC-V7 には存在しない、整数の乗算、整数 の除算ステップとスキャン ("ffs") 命令を追加します。訳注: 原文は命令 の並びがおかしく正確に訳せません。-mcpu=f930 をつけると、コンパイラ は、FPU がない、オリジナルの SPARClite である、Fujitsu MB86930 チッ プのためにさらにそれを最適化します。-mcpu=f934 をつけると、コンパイ ラは、FPU がある最近の SPARClite である、Fujitsu MB86934 チップのた めにさらにそれを最適化します。 -mcpu=sparclet をつけると、GCC は、SPARC アーキテクチャの SPARClet バリアント (改良型) のためのコードを生成します。これは、SPARClite には存在するが SPARC-V7 には存在しない、整数の乗算、乗算/アキュムレ イト、整数の除算ステップとスキャン ("ffs") 命令を追加します。訳注: 原文は命令の並びがおかしく正確に訳せません。-mcpu=tsc701 をつける と、コンパイラは、TEMIC SPARClet チップのためにさらにそれを最適化し ます。 -mcpu=v9 をつけると、GCC は、SPARC アーキテクチャの V9 バリアント (改良型) のためのコードを生成します。これは、64 ビットの整数、浮動 小数点の move 命令、3 つの追加の浮動小数点の条件コードレジスタと条 件付き move 命令を追加します。-mcpu=ultrasparc をつけると、コンパイ ラは、Sun UltraSPARC I/II/IIi チップのためにさらにそれを最適化しま す。-mcpu=ultrasparc3 をつけると、コンパイラは、Sun UltraSPARC III/III+/IIIi/IIIi+/IV/IV+ チップのためにさらにそれを最適化します。 -mcpu=niagara で、コンパイラは、Sun UltraSPARC T1 チップのためにそ れをさらに最適化します。 -mtune=cpu_type cpu_type のための命令スケジューリングパラメータを設定しますが、オプ ション -mcpu=cpu_type で設定するような、命令セットまたはレジスタ セットは設定しません。 -mcpu=cpu_type の同じ値を、-mtune=cpu_type のために使用できますが、 唯一役に立つ値は、特定の cpu 実装を選択する値です。それらは、 cypress, supersparc, hypersparc, f930, f934, sparclite86x, tsc701, ultrasparc, ultrasparc3 と niagara です。 -mv8plus -mno-v8plus -mv8plus をつけると、GCC は、SPARC-V8+ ABI のためのコードを生成しま す。V8 ABI との違いは、global と out レジスタが 64 ビット幅と見なさ れることです。これは、すべての SPARC-V9 プロセッサのために 32 ビッ トモードの Solaris でデフォルトで有効にされます。 -mvis -mno-vis -mvis をつけると、GCC は、UltraSPARC 仮想命令セット拡張をうまく利用 するコードを生成します。デフォルトは -mno-vis です。 これらの -m オプションは、上記に加えて、64-ビット環境の SPARC-V9 プロ セッサでサポートされます: -mlittle-endian リトルエンディアンモードで実行するプロセッサのためのコードを生成し ます。少しの設定での利用可能であり、Solaris と Linux では、特に利用 可能ではありません。 -m32 -m64 32 ビットまたは 64 ビット環境のためのコードを生成します。32 ビット 環境では、int、long とポインタを 32 ビットに設定します。64 ビット環 境では、int を 32 ビットに、long とポインタを 64 ビットに設定しま す。 -mcmodel=medlow Medium/Low コードモデルのためのコードを生成します: 64 ビットアドレ スであり、プログラムは、低位の 32 ビットメモリにリンクされなければ なりません。静的または動的にプログラムをリンクすることができます。 -mcmodel=medmid Medium/Middle コードモデルのためのコードを生成します: 64 ビットアド レスであり、プログラムは、低位の 44 ビットメモリにリンクされなけれ ばなりません、テキストとデータセグメントは、2GB 未満のサイズでなけ ればなりません、そして、データセグメントは、テキストセグメントの 2GB 以内に位置していなければなりません。 -mcmodel=medany Medium/Anywhere コードモデルのためのコードを生成します: 64 ビットア ドレスであり、プログラムは、メモリのどこにでもリンクできます、テキ ストとデータセグメントは、2GB 未満のサイズでなければなりません、 データセグメントは、テキストセグメントの 2GB 以内に位置していなけれ ばなりません。 -mcmodel=embmedany 組み込みシステムのための Medium/Anywhere コードモデルのためのコード を生成します: 64 ビットアドレスであり、テキストとデータセグメント は、2GB 未満のサイズでなければなりません、両セグメントの (リンク時 に決定される) メモリのどこからでも開始します。グローバルレジスタ %g4 は、データセグメントのベースを指しています。プログラムは静的に リンクされ、PIC ではサポートされていません。 -mstack-bias -mno-stack-bias -mstack-bias をつけると、GCC は、スタックポインタとフレームポインタ が存在しているなら、スタックフレーム参照を行うとき、逆に追加しなけ ればならない -2047 のオフセットであると仮定します。これは 64-ビット モードのデフォルトです。そうでなければ、そのようなオフセットが存在 していないと仮定します。 これらのスイッチは、上記に加えて Solaris でサポートされています: -threads Solaris スレッドライブラリを使用するマルチスレッド化のサポートを追 加します。このオプションはプリプロセッサとリンカの両方のためのフラ グを設定します。このオプションは、コンパイラによって生成されたオブ ジェクトコードまたはコンパイラとともに供給されたライブラリのオブ ジェクトコードのスレッドの安全性に影響しません。 -pthreads POSIX スレッドライブラリを使用するマルチスレッド化のサポートを追加 します。このオプションはプリプロセッサとリンカの両方のためのフラグ を設定します。このオプションは、コンパイラによって生成されたオブ ジェクトコードまたはコンパイラとともに供給されたライブラリのオブ ジェクトコードのスレッドの安全性に影響しません。 -pthread これは、-pthreads と同義語です。 System V のためのオプション これらの追加オプションは、System V Release 4 で、それらのシステムで他の コンパイラとの互換性のために利用可能です: -G 共有オブジェクトを作成します。-symbolic または -shared が代わりに使 用されることはお勧めです。 -Qy 出力において ".ident" アセンブラ命令文で、コンパイラによって使用さ れるそれぞれのツールのバージョンを識別します。 -Qn ".ident" 命令文を出力ファイルに追加するのをやめます (これはデフォル トです)。 -YP,dirs -l で指定されたライブラリのために、ディレクトリ dirs を検索し、他は 検索しません。 -Ym,dir M4 プリプロセッサを見つけるためにディレクトリ dir を検索します。ア センブラは、このオプションを使用します。 TMS320C3x/C4x オプション これらの -m オプションは、TMS320C3x/C4x 実装のために定義されています: -mcpu=cpu_type マシンタイプ cpu_type のための命令セット、レジスタセット、と命令ス ケジューリングパラメータを設定します。cpu_type のためにサポートされ ている値は、c30, c31, c32, c40 と c44 です。デフォルトは TMS320C40 のためのコードを生成する c40 です。 -mbig-memory -mbig -msmall-memory -msmall ビッグ (big) またはスモール (small) メモリモデルのためのコードを生 成します。スモールメモリモデルは、すべてのデータが 1 つ 64K ワード ページに適合すると仮定します。実行時に、データページ ((DP) レジスタ は、.bss と .data プログラムセクションを含む 64K ページを指すように 設定されなければなりません。ビッグメモリモデルは、デフォルトであ り、すべての直接メモリアクセスのための DP レジスタの再ロードを必要 とします。 -mbk -mno-bk ブロックカウントレジスタ BK に一般的な整数オペランドの割り付けを許 可します (許可しません)。 -mdb -mno-db デクリメントアンドブランチ (減少して分岐) DBcond(D) 命令を使用し て、コードの生成を有効にします (無効にします)。これは C4x に対して デフォルトで有効にされています。用心のために、これは、C3x の最大の 繰り返しカウントが 2^{23 + 1} (しかし、誰が C3x で 2^{23} 回以上 ループを繰り返しますか?) であるので、C3x に対して無効にされていま す。GCC は、ループを逆にしようとするので、デクリメントアンドブラン チ (減少して分岐) 命令を利用することができますが、ループ内に 1 つ以 上のメモリ参照があるなら、あきらめることに注意してください。した がって、ループカウンタが減少されるループは、RPTB 命令を利用すること ができない場合に、わずかに効率的なコードを生成することができます。 -mdp-isr-reload -mparanoid DP レジスタが割り込みサービスルーチン (ISR) の入口で保存され、デー タセクションを指すように再ロードされ、ISR からの出口で復旧されるこ とを強制します。たとえば、オブジェクトライブラリ中で、だれかが DP レジスタを変更することによってスモールメモリモデルに違反していない なら、これを必要とするべきではありません。 -mmpyi -mno-mpyi C3x ために、32 ビットの結果を保証するためのライブラリ呼び出しの代わ りに整数乗算のための 24 ビット MPYI 命令を使用します。オペランドの 1 つが定数であるなら、乗算はシフトと加算を使用して実行されることに 注意してください。C3x のために -mmpyi オプションが指定されないな ら、二乗操作は、ライブラリ呼び出しの代わりにインラインで実行されま す。 -mfast-fix -mno-fast-fix 浮動小数点値を整数値に変換する C3x/C4x FIX 命令は、最も近い整数より むしろ浮動小数点以下で最も近い整数を選択します。したがって、浮動小 数点が負であるなら、不正に先端を切り詰められる結果となり、このよう な場合、追加コードが検出して修正するために必要です。結果を修正する ために必要な追加コードの生成を無効にするために、このオプションを使 用することができます。 -mrptb -mno-rptb オーバヘッドが 0 のループのために RPTB 命令を使用して、反復ブロック シーケンスの生成を有効にします (無効にします)。RPTB 構造は、ループ の限界を横断する関数またはジャンプを呼び出さない最も深いループのた めだけに使用されます。RC, RS と RE レジスタを保存して、復旧するため に必要なオーバヘッドのためにネストされた RPTB ループがある利点があ りません。これは、-O2 とともにデフォルトで有効にされます。 -mrpts=count -mno-rpts 単一命令反復命令 RPTS の使用を有効にします (無効にします)。反復ブ ロックが単一の命令を含んでいて、ループカウントが値 count 未満である ことを保証することができるなら、GCC は RPTB の代わりに RPTS 命令を 出力します。値が指定されないなら、ループのカウントをコンパイル時に 決定することができなくでも、RPTS は出力されます。RPTS に続く反復さ れる命令は、繰り返しごとにメモリから再ロードする必要はありません、 したがって、オペランドのために CPU バスを解放することに注意してくだ さい。しかしながら、割り込みは、この命令によってブロックされるの で、それはデフォルトで無効にされます。 -mloop-unsigned -mno-loop-unsigned RPTS と RPTB (と、C40 では DB) を使用するときの最大の繰り返しカウン トは、繰り返しカウントがループを終了するために負であるなら、これら の命令がテストするので、2^{31 + 1} です。繰り返しカウントが符号無し であるなら、最大の繰り返しカウントが 2^{31 + 1} を超える可能性があ ります。このスイッチは符号無しの繰り返しカウントを許可します。 -mti TI アセンブラ (asm30) が満足しているアセンブラ構文を出力することを 試みます。また、これは TI C3x C コンパイラによって採用されている API との互換性を強制します。例えば、long double は浮動小数点レジス タというよりむしろ構造体として渡されます。 -mregparm -mmemparm 関数に引数を渡すためにレジスタ (スタック) を使用するコードを生成し ます。デフォルトで、引数は、スタックに引数をプッシュするよりもむし ろ可能であれば、レジスタで渡されます。 -mparallel-insns -mno-parallel-insns 並列命令の生成を許可します。これは、-O2 とともにデフォルトで有効に されます。 -mparallel-mpy -mno-parallel-mpy -mparallel-insns も指定されるという条件で、MPY||ADD と MPY||SUB 並 列命令の生成を許可します。これらの命令には、大きな関数のコード生成 をペシマシズ (pessimize) することができる厳しいレジスタ規制がありま す。訳注: pessimize の意味不明。 V850 オプション これらの -m オプションは、V850 実装のために定義されています: -mlong-calls -mno-long-calls すべての呼び出しを far away (near) として扱います。呼び出しが far away であると想定されるなら、コンパイラは常に関数アドレスをレジスタ にロードし、ポインタを通して間接的に呼び出します。 -mno-ep -mep "ep" レジスタにポインタをコピーし、より短い "sld" と "sst" 命令を使 用するために同じインデックスポインタを 4 回以上使用する基本ブロック を最適化しません (最適化します)。最適化するなら、-mep オプションは デフォルトでオンです。 -mno-prolog-function -mprolog-function 関数のプロローグとエピローグでレジスタを保存して復旧するために外部 機能を使用しません (使用します)。外部関数は、より遅いですが、1 つ以 上の関数が同じ数のレジスタを保存するなら、より少ないコード空間を使 用します。最適化するなら、-mprolog-function オプションはデフォルト でオンです。 -mspace コードをできるだけ小さくするように試みます。現在のところ、これは単 に -mep と -mprolog-function オプションをオンにします。 -mtda=n サイズが n バイト以下である静的変数またはグローバル変数をレジスタ "ep" が指すとても小さい (tiny) データ領域に置きます。とても小さい データ領域は、合計で最大 256 バイト (バイト参照のためには 128 バイ ト) まで保持することができます。 -msda=n サイズが n バイト以下である静的変数またはグローバル変数をレジスタ "gp" が指す小さい (small) データ領域に置きます。小さいデータ領域 は、最大 64 キロバイトまで保持することができます。 -mzda=n サイズが n バイト以下である静的変数またはグローバル変数をメモリの最 初の 32 キロバイトに置きます。 -mv850 ターゲットのプロセッサが V850 であると指定します。 -mbig-switch 大きなスイッチテーブルに適切なコードを生成します。このオプション は、スイッチテーブル内の範囲外の分岐に関してアセンブラ/リンカがエ ラーを出す場合のみ使用します。 -mapp-regs このオプションによって、r2 と r5 は、コンパイラによって生成された コードで使用されます。この設定がデフォルトです。 -mno-app-regs このオプションによって、r2 と r5 は、固定レジスタとして扱われます。 -mv850e1 ターゲットのプロセッサが V850E1 であると指定します。このオプション が使用されているなら、プリプロセッサ定数の __v850e1__ と __v850e__ が定義されます。 -mv850e ターゲットのプロセッサが V850E であると指定します。このオプションが 使用されているなら、プリプロセッサ定数の __v850e__ が定義されます。 -mv850 または -mv850e または -mv850e1 のいずれも定義されないなら、 デフォルトターゲットプロセッサが選択され、関連する __v850*__ プリプ ロセッサ定数が定義されます。 どのプロセッサバリアント (改良型) がターゲットであるかにかかわら ず、プリプロセッサ定数の __v850 and __v851__ が常に定義されます。 -mdisable-callt このオプションは v850 アーキテクチャの v850e と v850e1 種のための CALLT 命令の生成を抑制します。デフォルトは、CALLT 命令を使用するこ とができる -mno-disable-callt です。 VAX オプション これらの -m オプションは VAX のために定義されています: -munix VAX の Unix アセンブラが長い範囲を越えて操作できない、特定のジャン プ命令 ("aobleq" など) を出力しません。 -mgnu 利用者が GNU アセンブラでアセンブルするという前提で、それらのジャン プ命令を出力しません。 -mg d-形式の代わりに g-形式の浮動小数点数のコードを出力します。 x86-64 オプション これらは、下にリストされています。 Xstormy16 オプション これらのオプションは Xstormy16 のために定義されます: -msim シミュレータに適切なスタートアップファイルとリンカスクリプトを選択 します。 Xtensa オプション これらのオプションは、Xtensa ターゲットのためにサポートされています: -mconst16 -mno-const16 定数値をロードするための "CONST16" 命令の使用を有効にするか、または 無効にします。"CONST16" 命令は現在のところ、Tensilica の標準オプ ションではありません。有効にされるとき、"CONST16" 命令は、常に、標 準の "L32R" 命令の代わりに使用されます。"L32R" 命令が利用可能でない 場合にだけ、"CONST16" の使用は、デフォルトで有効にされます。 -mfused-madd -mno-fused-madd 浮動小数点オプションで fused multiply/add (乗算/加算) と multiply/subtract (乗算/減算) 命令の使用を有効にするか、または無効 にします。これは、浮動小数点オプションもまた有効でないなら、効果が ありません。fused multiply/add (乗算/加算) と multiply/subtract (乗 算/減算) 命令を無効にすることは、加算/減算操作のために別々のの命令 を使用するようにコンパイラに強制します。これは厳密な IEEE 754 準拠 の結果が要求されるいくつかの場合に価値があります: fused multiply add/subtract (乗算/加算と乗算/減算) 命令は、中間結果を丸めません、 それによって、IEEE 標準で指定されるよりより多いビットの精度で結果を 生成します。また、fused multiply add/subtract (乗算/加算と乗算/減 算) 命令は、プログラム出力が乗算と加算/減算操作を組み合わせるコンパ イラの能力に敏感でないことを確実にします。 -mtext-section-literals -mno-text-section-literals リテラルプールの処理を制御します。デフォルトは、出力ファイルの別々 のセクションにリテラルが置かれる -mno-text-section-literals です。 これによって、リテラルプールは、データ RAM/ROM に置くことができ、ま た、リンカは、冗長なリテラルを削除し、コードサイズを改良するために 別々のオブジェクトファイルのリテラルプールを結合することができま す。-mtext-section-literals をつけると、リテラルは、それらを参照す るため、できるだけ近くにそれらを保持するためにテキストセクションに まき散らされます。これは、大きなアセンブリファイルのために必要であ るかもしれません。 -mtarget-align -mno-target-align このオプションが有効にされるとき、GCC は、いくらかのコードの密度を 犠牲にして分岐の不利益を削減するために、命令を自動的に整列するよう にアセンブラに指示します。アセンブラは、分岐ターゲットと呼び出し (call) 命令に続く命令を整列するために密度命令を広くすることを試みま す。ターゲットを整列するために先行する安全な密度命令が十分でないな ら、広げることは実行されません。デフォルトは -mtarget-align です。 これらのオプションは、アセンブラが密度命令を広くするか、または no op 命令を挿入するかのいずれかによって、常に整列される、"LOOP" のよ うな自動整列命令の処理に影響しません。 -mlongcalls -mno-longcalls このオプションが有効にされるとき、GCC は、直接呼び出しのターゲット が呼び出し命令によって許容された範囲にあることを決定することができ ないなら、直接呼び出しを間接呼び出しに変換するようにアセンブラに指 示します。この変換は、他のソースファイル中の関数を呼び出しのために 一般的に起こります。特に、アセンブラは、直接 "CALL" 命令を "L32R" に続く "CALLX" 命令に変換します。デフォルトは -mno-longcalls です。 このオプションは、呼び出しターゲットが潜在的に範囲外になるかもしれ ないプログラムで使用されるべきです。このオプションは、コンパイラで はなく、アセンブラに実装されるので、GCC によって生成されたアセンブ リコードは、まだ直接呼び出し命令を示します --- 実際の命令を調べるた めには、オブジェクトコード逆アセンブルして見ます。アセンブラは、あ らゆるファイルを交差する呼び出しのために間接呼び出しを使用し、前述 の実際に範囲外となる呼び出しでないことに注意してください。 zSeries オプション これらは、下にリストされています。 コード生成規則のためのオプション これらのマシン独立オプションは、コード生成に使用されるインタフェース規 約を制御します。 それらのほとんどには、肯定形式と否定形式があります。-ffoo の否定形式 は、-fno-foo となります。下記のテーブルでは、形式の 1 つだけがリストさ れています --- デフォルトでないものです。利用者は、no- を取り除くか、ま たは追加するることによって、もう片方の形式を見当つけることができます。 -fbounds-check それをサポートするフロントエンドのために、配列にアクセスするために 使用されるインデックスが宣言されている範囲内であるかチェックする追 加コードを生成します。これは現在 Java と Fortran のフロントエンドに よってのみサポートされ、このオプションは、それぞれ true と false を デフォルトとしています。 -ftrapv このオプションは、加算、減算、乗算操作で符号付きオーバフローのため のトラップを生成します。 -fwrapv このオプションは、2 補数の表現を使用して包み込む、加算、減算、乗算 の符号付き算術オーバフローを仮定するようにコンパイラに指示します。 このフラグは、いくつかの最適化を有効にして、その他を無効にします。 このオプションは、Java 言語仕様で要求される、Java フロントエンドの ためにデフォルトで有効にされます。 -fexceptions 例外操作を有効にします。例外を伝播するために必要な特別のコードを生 成します。いくつかのターゲットのために、これは、実行に影響しません が、意味のあるデータサイズのオーバヘッドを生成することができる、す べての関数のためのフレームアンワインド (frame unwind) 情報を GCC が 生成するという意味を含みます。利用者がこのオプションを指定しないな ら、GCC は、通常例外操作を必要とする C++ のような言語のためにデフォ ルトでそれを有効にして、通常それを必要としない C のような言語のため にそれを無効にします。しかしながら、利用者は、C++ で書かれている例 外ハンドラで適切に同時使用する必要がある C コードをコンパイルすると き、このオプションを有効にする必要があります。また、利用者は、例外 操作を使用しない古い C++ プログラムをコンパイルしているなら、このオ プションを無効にしたいかもれません。 -fnon-call-exceptions トラップ命令が例外をスロー (throw) することができるコードを生成しま す。どこにも存在しないプラットフォーム特有のランタイムサポートを必 要とすることに注意してください。さらに、トラッピング命令が例外をス ローすることができるだけです、すなわち、メモリ参照、または浮動小数 点命令です。"SIGALRM" のような任意のシグナルハンドラから例外をス ローすることはできません。 -funwind-tables 必要な静的なデータを生成するだけですが、いかなる他の方法で生成され たコードに影響しないことを除いて、-fexceptions と同様です。通常、利 用者はこのオプションを有効にしません。代わりに、この取り扱いを必要 とする言語プロセッサは、利用者代わってそれを有効にするでしょう。 -fasynchronous-unwind-tables ターゲットマシンによってサポートされるなら、dwarf2 形式でアンワイン ドテーブル (unwind table) を生成します。テーブルは、それぞれの命令 境界で正確であるので、非同期イベント (デバッガまたはガーベージコレ クタのような) からアンワインドされたスタックに使用することができま す。 -fpcc-struct-return レジスタでというよりむしろメモリのようなより長いもので "短い" "struct" と "union" 値を返します。この規約は、あまり効率的ではあり ませんが、GCC でコンパイルされたファイルと特に Portable C コンパイ ラ (pcc) のような他のコンパイラ、でコンパイルされたファイル間の相互 呼び出し可能とする利点があります。 メモリの構造体を返すための正確な規約は、ターゲットの設定マクロに依 存します。 短い構造体と共用体は、サイズと整列がいくつかの整数タイプに適合する ものです。 警告: -fpcc-struct-return スイッチをつけてコンパイルされたコード は、-freg-struct-return スイッチをつけてコンパイルされたコードとバ イナリ互換ではありません。デフォルトでないアプリケーションバイナリ インタフェースに適合するためにそれを使用します。 -freg-struct-return 可能であれば、レジスタに "struct" と "union" 値を返します。これは、 小さい構造体のためには、-fpcc-struct-return より効率的です。 利用者が -fpcc-struct-return も -freg-struct-return も指定しないな ら、GCC は、ターゲットのための標準のいずれかの規約をデフォルトにし ます。標準の規約がないなら、GCC は、GCC が主要なコンパイラである ターゲットを除いて、-fpcc-struct-return をデフォルトとします。その ような場合、我々は標準を選ぶことができ、より効率的なレジスタリター ン代替手段を選びました。 警告: -freg-struct-return スイッチをつけてコンパイルされたコード は、-fpcc-struct-return スイッチをつけてコンパイルされたコードとバ イナリ互換ではありません。デフォルトでないアプリケーションバイナリ インタフェースに適合するためにそれを使用します。 -fshort-enums あり得る値の宣言された範囲で必要とするのと同じくらい多くのバイトを "enum" タイプにだけに割り付けます。明確に、"enum" タイプは、十分に 格納できる最小の整数型と同等になります。 警告: -fshort-enums スイッチによって、GCC は、そのスイッチなしで生 成されるコードとバイナリ互換でないコードを生成します。デフォルトで ないアプリケーションバイナリインタフェースに適合するためにそれを使 用します。 -fshort-double "double" のために "float" と同じサイズを使用します。 警告: -fshort-double スイッチによって、GCC は、そのスイッチなしで生 成されるコードとバイナリ互換でないコードを生成します。デフォルトで ないアプリケーションバイナリインタフェースに適合するためにそれを使 用します。 -fshort-wchar wchar_t の基礎タイプを、ターゲットのためのデフォルトの代わりに short unsigned int に上書きします。このオプションは、WINE の元で実 行されるプログラムを構築するために役に立ちます。 警告: -fshort-wchar スイッチによって、GCC は、そのスイッチなしで生 成されるコードとバイナリ互換でないコードを生成します。デフォルトで ないアプリケーションバイナリインタフェースに適合するためにそれを使 用します。 -fno-common C では、共通ブロックとしてそれらを生成するよりむしろオブジェクト ファイルのデータセクションの初期化されていないグローバル変数でも割 り付けます。これは、同じ変数が 2 つの異なったコンパイルで ("extern" なしで) 宣言されるなら、それらをリンクするとき、エラーとなる効果が あります。これが役に立つかもしれない唯一の理由は、プログラムがこの ように常に動作する他のシステムで動作するか検証したい場合です。 -fno-ident #ident 指示を無視します。 -finhibit-size-directive ".size" アセンブラ指示、または関数が中央で分離され、2 つの部分がメ モリ内の遠く離れた位置に置かれる場合に、問題を起こしそうなものを出 力しません。このオプションは、crtstuff.c をコンパイルするとき使用さ れます。利用者は、他の何かのためにそれを使用する必要はないはずで す。 -fverbose-asm 生成されたアセンブリコードに特別のコメント情報を入れて、それをより 読みやすくします。このオプションは一般的に、(おそらくコンパイラ自体 をデバッグしている間に) 実際に生成されたアセンブリコードを読む必要 がある人々のみに役に立ちます。 デフォルトである、-fno-verbose-asm によって、特別の情報を省略するこ とができ、2 つのアセンブラファイルを比較するとき、役に立ちます。 -fpic ターゲットマシンでサポートされているなら、共有ライブラリでの使用に 適した位置独立のコード (PIC) を生成します。そのようなコードはグロー バルオフセットテーブル (GOT) を通してすべての定数アドレスにアクセス します。ダイナミックローダはプログラムが開始するとき GOT エントリを 解決します (ダイナミックローダは GCC の一部ではありません。それはオ ペレーティングシステムの一部です)。リンクされた実行形式の GOT サイ ズがマシン特有の最大サイズを超えるなら、利用者は -fpic が動作しない ことを示すリンカからのエラーメッセージを得ます。その場合には、代わ りに -fPIC をつけて再コンパイルします。(これらの最大は、SPARC では 8k および m68k と RS/6000 では 32k です。386 には、そのような制限は ありません。) 位置独立コードは、特別なサポートを必要とし、したがって、特定のマシ ンだけで動作します。386 について、GCC は、Sun 386i に対してではな く、System V に対して PIC をサポートします。IBM RS/6000 のために生 成されたコードは、常に位置独立です。 このフラグが設定されるとき、マクロ "__pic__" と "__PIC__" は、1 と 定義されます。 -fPIC ターゲットマシンでサポートされているなら、ダイナミックリンクに適切 でグローバルオフセットテーブルのサイズでの制限をさける、位置独立 コードを出力します。このオプションは m68k, PowerPC と SPARC で効果 があります。 位置独立コードは、特別なサポートを必要とし、したがって、特定のマシ ンだけで動作します。 このフラグが設定されるとき、マクロ "__pic__" と "__PIC__" は、2 と 定義されます。 -fpie -fPIE これらのオプションは -fpic と -fPIC と同様ですが、生成される位置独 立コードを、実行形式にだけリンクすることができます。通常、これらの オプションは、-pie GCC オプションがリンクの間に使用されるとき、使用 されます。 -fno-jump-tables 他のコードの生成戦略より効率的であるところでさえ、スイッチ文にジャ ンプテーブルを使用しません。このオプションは、ジャンプテーブルのア ドレスを参照することができない、動的なリンカの一部を形成するコード を構築するために -fpic または -fPIC と関連して使用されます。いくつ かのターゲットでは、ジャンプテーブルは、GOT を必要とせず、このオプ ションは、必要ではありません。 -ffixed-reg 固定レジスタとして reg と名前が付けられたレジスタを取り扱います。生 成されたコードは、(おそらくスタックポインタ、フレームポインタまたは ある他の固定ロール (役割) を除いて) それを決して参照するべきではあ りません。 reg はレジスタの名前でなければなりません。受け付けられるレジスタ名 は、マシン特有であり、マシン記述マクロファイル中の "REGISTER_NAMES" マクロで定義されます。 3 通りの選択を指定するので、このフラグには、否定形式がありません。 -fcall-used-reg 関数呼び出しによって上書きされる割り付けられたレジスタとして reg と 名前が付けられたレジスタを取り扱います。呼び出しを越えて生きていな いテンポラリまたは変数のために割り付けることができます。このように してコンパイルされた関数は、レジスタ reg を保存して復旧しません。 フレームポインタまたはスタックポインタでこのフラグを使用するとエ ラーとなります。マシンの実行モデルにおいて固定された広範囲なロール (役割) がある他のレジスタのためにこのフラグを使用することは、破滅的 な結果を生みます。 3 通りの選択を指定するので、このフラグには、否定形式がありません。 -fcall-saved-reg 関数によって保存された割り付けされたレジスタとして reg と名前が付け られたレジスタを取り扱います。呼び出しを越えて生きていないテンポラ リまたは変数のために割り付けることができます。このようにコンパイル された関数は、レジスタ reg を使用するなら、保存して復元します。 フレームポインタまたはスタックポインタでこのフラグを使用するとエ ラーとなります。マシンの実行モデルにおいて固定された広範囲なロール (役割) がある他のレジスタのためにこのフラグを使用することは、破滅的 な結果を生みます。 それぞれ違った災難は、関数の値が返されるレジスタに対してこのフラグ の使用することから生じます。 3 通りの選択を指定するので、このフラグには、否定形式がありません。 -fpack-struct[=n] 指定された値がないなら、ホールなしで一緒に、すべての構造体のメンバ をパックします。値が指定されるとき (ちいさな 2 の冪乗でなければなり ません)、最大の整列を表す、この値に従って構造体のメンバをパックしま す (すなわち、これより大きいデフォルトの整列要求があるオブジェクト は、潜在的に次の適合する位置で整列されないで出力されます)。 警告: -fpack-struct スイッチによって、GCC は、そのスイッチなしで生 成されるコードとバイナリ互換でないコードを生成します。さらに、コー ドの準最適化を行います。デフォルトでないアプリケーションバイナリイ ンタフェースに適合するためにそれを使用します。 -finstrument-functions 関数の入口と出口のために計装呼び出しを生成します。関数入口の直後と 関数出口の直前に、次のプロファイル関数は、現在の関数のアドレスとそ の呼び出しサイトで呼び出されます。(いくつかのプラットフォームでは、 "__builtin_return_address" は、現在の関数を超えて動作しないので、呼 び出しサイト情報は、プロファイル関数その他で利用可能でないかもしれ ません。) void __cyg_profile_func_enter (void *this_fn, void *call_site); void __cyg_profile_func_exit (void *this_fn, void *call_site); 最初の引数は、シンボルテーブルで正確に検索される、現在の関数の開始 アドレスです。 また、この計装は、他の関数で拡張された関数のインラインで行われま す。プロファイルを行う呼び出しは、概念的に、インライン関数に入って 出る場所を示します。これは、そのような関数のアドレス可能なバージョ ンが、利用可能でなければならないことを意味します。利用者が使用する すべての関数が拡張インラインであるなら、これはコードサイズがさらに 増大することを意味します。利用者が C コードで extern inline を使用 するなら、そのような関数のアドレス可能なバージョンが、提供されなけ ればなりません。(これは、とにかく通常の場合ですが、利用者が幸運であ り、オプティマイザが、常にインラインで関数を拡張するなら、静的なコ ピーを提供しないで、逃げたかもしれません。) 属性 "no_instrument_function" が関数に与えられる場合、計装は、行わ れません。これは、例えば、上記にリストされたプロファイル関数におい て、高い優先度の割り込みルーチン、プロファイル関数を安全に呼び出す ことができない、任意の関数 (プロファイルルーチンが出力を生成する か、またはメモリを割り付けるなら、おそらくシグナルハンドラ) を使用 することができます。 -fstack-check スタックの境界を越えないことを検証するコードを生成します。複数のス レッドの環境で実行しているなら、このフラグを指定するべきですが、ス タックオーバフローが、1 つのスタックしかないほとんどすべてのシステ ムで自動的に検出されるので、単一のスレッド環境でそれをまれに指定す る必要があります。 このスイッチによって実際にチェックが行われないことに注意してくださ い。オペレーティングシステムが、それを行わなければなりません。ス イッチによって、コードの生成は、オペレーティングシステムが、スタッ クが拡張されるのを調べることを保証します。 -fstack-limit-register=reg -fstack-limit-symbol=sym -fno-stack-limit スタックが、レジスタの値またはシンボルのアドレスのいずれかの特定の 値を超えて成長しないことを保証するコードを生成します。スタックが値 を超えて成長するなら、シグナルが起こされます。ほとんどのターゲット のために、スタックが境界をオーバラン (超過) する前にシグナルが起こ されるので、特別な予防措置をしなくてもシグナルをキャッチすることは 可能です。 例えば、スタックが絶対アドレス 0x80000000 で始まり、下向きに成長す るなら、利用者は、スタックの制限である 128KB を強制するために、フラ グ -fstack-limit-symbol=__stack_limit と -Wl,--defsym,__stack_limit=0x7ffe0000 をを使用することができますこ れは GNU リンカでのみ動作することに注意してください。 -fargument-alias -fargument-noalias -fargument-noalias-global -fargument-noalias-anything パラメータ間とパラメータとグローバルデータの間の可能な関係を指定し ます。 -fargument-alias は、引数 (パラメータ) は、お互いにエイリアスし、グ ローバルな記憶域をエイリアスすることを指定します。 -fargument-noalias は、引数は、お互いにエイリアスしませんが、グロー バルな記憶域をエイリアスすることを指定します。 -fargument-noalias-global は、引数は、お互いにエイリアスせず、グ ローバルな記憶域もエイリアスしないことを指定します。 -fargument-noalias-anything は、引数が、その他の記憶域をエイリアス しないことを指定します。 各言語は、オプションが言語標準によって必要とされるものは何でも自動 的に使用します。利用者は、自身でこれらのオプションを使用する必要は ないはずです。 -fleading-underscore このオプションとその否定形式の対応物 -fno-leading-underscore は、C シンボルがオブジェクトファイルで表現される方法を強制的に変更しま す。この使用は、古いアセンブリコードでリンクするのを助けることで す。 警告: -fleading-underscore スイッチによって、GCC は、そのスイッチな しで生成されるコードとバイナリ互換でないコードを生成します。デフォ ルトでないアプリケーションバイナリインタフェースに適合するためにそ れを使用します。すべてのターゲットがこのスイッチのための完全なサ ポートを提供するというわけではありません。 -ftls-model=model スレッドローカル記憶域 (thread-local storage model) モデルを使用す るように変更します。model 引数は、"global-dynamic", "local-dynamic", "initial-exec" または "local-exec" の 1 つであるべ きです。 -fpic なしのデフォルトは、"initial-exec" です。-fpic ありのデフォル トは、"global-dynamic" です。 -fvisibility=default|internal|hidden|protected デフォルトの ELF イメージシンボルの可視性を指定されたオプションに設 定します --- すべてのシンボルは、コードで上書きされないなら、これで マークされます。この特徴を使用することは、共有オブジェクトライブラ リのリンクとロード時間を大幅に改良し、より最適化されたコードを作成 し、完ぺきに近い API エクスポートを提供し、シンボルの衝突を防ぐこと ができます。利用者が配布する任意の共有オブジェクトでこれを使用する ことを強くお勧めします。 用語にもかかわらず、"default" は、常にパブリック ie を意味します。 共有オブジェクトの外側からリンクされるために、利用可能です。 "protected" と "internal" は、実際の世界の使用法で全く役に立たない ので、他の唯一の一般的に使用されるオプションは、"hidden" (隠) され ます。-fvisibility が指定されないなら、デフォルトは、"default" で す、すなわち、すべてのシンボルをパブリックにします --- これは GCC の旧バージョンと同じ振る舞いをもたらします。 正しい可視性がある確実な ELF シンボルによって提供される、ためになる 良い説明は、Ulrich Drepper による "How To Write Shared Libraries" (それは、<http://people.redhat.com/~drepper/> にあります) によって 与えられます --- しかしながら、デフォルトがパブリックであるときに隠 されたものをマークするために、このオプションによって可能にされた優 れた解決策は、デフォルトを隠して、これをパブリックとマークすること です。これは、利用者が、同じ構文があるほとんど同じセマンティクスを 得る "__declspec(dllexport)" の代わりに Windows の DLL および -fvisibility=hidden と "__attribute__ ((visibility("default")))" を つける標準です。これは、クロスプラットフォームプロジェクトと共に動 作しているものへのすばらしい恩恵です。 可視性のサポートを既存のコードに追加するものに関して、利用者は、役 に立つ #pragma GCC visibility を見つけます。これは、(例えば) #pragma GCC visibility push(hidden) と #pragma GCC visibility pop のための可視性を設定したい宣言を囲むことによって動作します。シンボ ルの可視性が API インタフェース規約の一部として見なされるべきであ り、その結果、それがデフォルト ie でないときに、すべての新しいコー ドが常に可視性を指定するべきであることを覚えておいてください。局所 的な DSO 内の使用のためだけの宣言は、PLT 間接指定のオーバヘッドを避 けるために隠されるように常に明白にマークされるべきです --- また、こ れを極めて明白にすることは、コードの読み易さと自己文書化を支援しま す。ISO C++ の仕様書要求事項のために、オペレータ new とオペレータ delete は、常に可視性をデフォルトとしなければならないことに注意して ください。 利用者のプロジェクトの外側からのヘッダ、特に、利用者が使用する任意 の他のライブラリからのシステムヘッダとヘッダ、は、デフォルト以外の 可視性でコンパイルされると予想されないかもしれないことを留意してく ださい。利用者は、何かそのようなヘッダを含む前に、明白に #pragma GCC visibility push(default) と記述する必要があります。 extern 宣言は、-fvisibility によって影響されないので、変更なしで -fvisibility=hidden を付けて多くのコードを再コンパイルすることがで きます。しかしながら、明白な可視性なしで extern 関数を呼び出すこと は、PLT を使用するので、どの extern 宣言が隠されるように扱われるべ きであるかをコンパイラに伝えるために、__attribute ((visibility)) お よび/または #pragma GCC visibility を使用することは、より効果的で す。 -fvisibility は、C++ のあいまいなリンケージ実体に影響することに注意 してください。これは、例えば、DSO の間で thrown される例外クラス が、DSO の間で type_info ノードを統一できるように、デフォルトの可視 性で明白にマークしなければならない、ことを意味します。 これらの技術の概観、それらの利点、とそれらをどのように使用するか は、<http://gcc.gnu.org/wiki/Visibility> にあります。 環境変数 このセクションは、GCC がどのように動作するかに影響するいくつかの環境変 数について説明しています。これらのいくつかは、様々な種類のファイルを検 索するとき使用するディレクトリまたはプレフィックスを指定することによっ て働きます。いくつかは、コンパイル環境の他の局面を指定するために使用さ れます。 また、-B, -I と -L のようなオプションを使用して検索する場所を指定するこ とができることに注意してください。これらは、GCC の設定によって指定され るものに優先する環境変数を使用することで指定される場所に優先します。 LANG LC_CTYPE LC_MESSAGES LC_ALL これらの環境変数は、GCC が異なった国別の規約で動作することができる 地域化情報を GCC が使用する方法を制御します。GCC は、LC_CTYPE と LC_MESSAGES がそうするために設定されていたなら、ロケールカテゴリを 検査します。利用者のインストールによってサポートされる任意の値をこ れらのロケールカテゴリを設定することができます。典型的な値は、UTF-8 でエンコードされた英国 (the United Kingdom) の英語のための en_GB.UTF-8 です。 LC_CTYPE 環境変数は文字の分類を指定します。GCC は文字列の文字境界を 決定するためにそれを使用します。これは、マルチバイトでなければ文字 列の終りまたはエスケープとして解釈される、クォート (引用) とエス ケープ文字を含むいくつかのマルチバイトのエンコードのために必要で す。 LC_MESSAGES 環境変数は診断メッセージに使用する言語を指定します。 LC_ALL 環境変数が設定されているなら、LC_CTYPE と LC_MESSAGES の値を 上書きします。そうでなければ、LC_CTYPE と LC_MESSAGES は、LANG 環境 変数の値をデフォルトとします。これらの変数がなにも設定されていな ら、GCC は、伝統的な C 英語の振る舞いをデフォルトとします。 TMPDIR TMPDIR が設定されているなら、それは一時ファイルのために使用するディ レクトリを指定します。GCC は次のステージの入力として使用される、コ ンパイルの 1 つのステージの出力を保存するために一時ファイルを使用し ます: 例えば、コンパイラ自体への入力である、プリプロセッサの出力で す。 GCC_EXEC_PREFIX GCC_EXEC_PREFIX が設定されているなら、それはコンパイラによって実行 されるサブプログラムの名前に使用されるプレフィックスを指定します。 このプレフィックスがサブプログラムの名前と組み合わされるとき、ス ラッシュは追加されませんが、利用者が望むなら、スラッシュで終わるプ レフィックスを指定することができます。 GCC_EXEC_PREFIX が設定されていないなら、GCC は、それが呼び出された パス名に基づいて使用される適切なプレフィックスを見つけ出すことを試 みます。 GCC が指定されたプレフィックスを使用するサブプログラムを見つけるこ とができないなら、サブプログラムのための通常の場所で検索を試みま す。 GCC_EXEC_PREFIX のデフォルト値は、prefix/lib/gcc/ であり、ここで prefix は、利用者が configure スクリプトを実行したときの "prefix" の値です。 -B で指定された他のプレフィックスは、このプレフィックスに優先しま す。 また、このプレフィックスは、リンクするために使用される crt0.o のよ うなファイルを見つけるためにも使用されます。 さらに、プレフィックスはヘッダファイルを検索するためにディレクトリ を見つける通常でない方法で使用されます。通常、名前が /usr/local/lib/gcc (もっと正確に言えば GCC_INCLUDE_DIR の値) で始ま る各標準ディレクトリのために、GCC は、代替のディレクトリ名を生成す るために指定されたプレフィックスの始まりを置き換えることを試みま す。したがって、-Bfoo/ をつけると、GCC は、通常 /usr/local/lib/bar を検索するところで、foo/bar を検索します。これらの代替ディレクトリ が最初に検索されます。標準のディレクトリは次に行われます。 COMPILER_PATH COMPILER_PATH の値は、PATH にそっくりのコロンで区切られたディレクト リのリストです。GCC は、GCC_EXEC_PREFIX を使用してサブプログラムを 見つけることができないなら、サブプログラムを検索するとき、このよう に指定されたディレクトリを試みます。 LIBRARY_PATH LIBRARY_PATH の値は、PATH にそっくりのコロンで区切られたディレクト リのリストです。ネイティブコンパイラとして設定されるとき、GCC は、 GCC_EXEC_PREFIX を使用してそれらを見つけることができないなら、特別 なリンカファイルを検索するときこのように指定されたディレクトリを試 みます。また、GCC を使用してリンクすることは、-l オプションのための 通常のライブラリを検索するとき、これらのディレクトリも使用します (が、-L で指定されたディレクトリが最初に検索されます)。 LANG この変数は、ロケール情報をコンパイラに渡すために使用されます。この 情報が使用される 1 つの方法は、文字リテラル、文字列リテラルとコメン トが C と C++ で解析されるとき、使用される文字セットを決定するため です。コンパイラがマルチバイト文字を許可するために設定されるとき、 次の LANG のための値が認識されます: C-JIS JIS 文字を認識します。 C-SJIS SJIS 文字を認識します。 C-EUCJP EUCJP 文字を認識します。 LANG 定義されていないか、またはある他の値があるなら、コンパイラは、 マルチバイト文字を認識して、変換するためにデフォルトのロケールに よって定義されているように mblen と mbtowc を使用します。 いくつかの追加の環境変数は、プリプロセッサの振る舞いに影響します。 CPATH C_INCLUDE_PATH CPLUS_INCLUDE_PATH 各変数の値は、ヘッダファイルを検索する PATH にそっくりの特殊文字に よって区切られたディレクトリのリストです。特殊文字 "PATH_SEPARATOR" は、ターゲットに依存していて、GCC の構築時に決定されます。Microsoft Windows ベースのターゲットでは、セミコロンで、他のほとんどすべての ターゲットではコロンです。 CPATH は、まるで -I で指定されているように、ディレクトリのリストを 指定しますが、コマンドラインの -I オプションで与えられたパスの後で す。この環境変数は、どの言語が前処理されているかにかかわらず使用さ れます。 残りの環境変数は、示された特定の言語を前処理するときだけ適用されま す。それぞれ、まるで -isystem で指定されているように検索されるディ レクトリのリストを指定しますが、コマンドラインの -isystem オプショ ンで与えられたパスの後です。 これらのすべての変数において、空の要素は、カレント作業ディレクトリ を検索するようにコンパイラに指示します。空の要素は、パスの始めか終 りに現れることができます。例えば、CPATH の値が ":/special/include" であるなら、-I. -I/special/include と同じ効果があります。 DEPENDENCIES_OUTPUT この変数が設定されるなら、その値はコンパイラによって処理された非シ ステムヘッダファイルに基づく Make に依存を出力する方法を指定しま す。システムヘッダファイルは依存出力で無視されます。 DEPENDENCIES_OUTPUT の値は、単にファイル名を指定するかもしれませ ん、その場合に、Make 規則は、ソースファイル名からターゲット名を推測 して、そのファイルに書き込まれます。または、値は形式 file target で あるかもしれません、その場合に、規則は、ターゲット名として target を使用してファイル file に書き込まれます。 言い換えれば、この環境変数は、任意の -MT スイッチもつけて、オプショ ンの -MM と -MF の組み合わせと同等です。 SUNPRO_DEPENDENCIES この変数は、システムヘッダファイルが無視されないので、-MM よりむし ろ -M の意味を含むことを除いて、DEPENDENCIES_OUTPUT (上記参照) と同 じです、しかしながら、メイン入力ファイルでの依存関係は、省略されま す。 バグ バグを報告する指示書に関しては、<http://gcc.gnu.org/bugs.html> を参照し てください。 脚注 1. いくつかのシステムでは、gcc -shared はコンストラクタが動作するため の補助的なスタブ (stub) コードを構築するために必要です。複数のライ ブラリがある (multi-libbed) システムでは、gcc -shared はリンクに対 して正しくサポートされたライブラリを選択しなければなりません。正し いフラグを供給しないことは、微妙な欠陥を導くかもしれません。それら が必要でない場合にそれらを供給しても無害です。 関連項目 gpl(7), gfdl(7), fsf-funding(7), cpp(1), gcov(1), as(1), ld(1), gdb(1), adb(1), dbx(1), sdb(1) と gcc, cpp, as, ld, binutils と gdb の Info エ ントリ。 作者 gcc の Info エントリ、または GCC への貢献者については、 <http://gcc.gnu.org/onlinedocs/gcc/Contributors.html> を参照してくださ い。 COPYRIGHT Copyright (c) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with the Invariant Sections being "GNU General Public License" and "Funding Free Software", the Front-Cover texts being (a) (see below), and with the Back-Cover Texts being (b) (see below). A copy of the license is included in the gfdl(7) man page. (a) The FSF's Front-Cover Text is: A GNU Manual (b) The FSF's Back-Cover Text is: You have freedom to copy and modify this GNU Manual, like GNU software. Copies published by the Free Software Foundation raise funds for GNU development. gcc-4.2.1 2011-03-07 GCC(1)