| GCC(1) | GNU | GCC(1) |
نام (NAME)
gcc - کامپایلر C و ++C پروژه گنو
خلاصه دستور (SYNOPSIS)
gcc [-c|-S|-E] [-std=standard]
[-g] [-pg] [-Olevel]
[-Wwarn...] [-Wpedantic]
[-Idir...] [-Ldir...]
[-Dmacro[=defn]...] [-Umacro]
[-foption...] [-mmachine-option...]
[-o outfile] [@file] infile...
تنها کاربردیترین گزینهها در اینجا فهرست شدهاند؛ برای سایر گزینهها به بخشهای بعد مراجعه کنید. g++ اکثراً گزینههای یکسانی با gcc را میپذیرد.
توضیحات (DESCRIPTION)
هنگامی که GCC را فراخوانی میکنید، معمولاً پیشپردازش، کامپایل، اسمبلی و پیونددهی را انجام میدهد. «گزینههای کلی» به شما این امکان را میدهند که این فرایند را در یک مرحلهٔ میانی متوقف کنید. برای نمونه، گزینهٔ -c میگوید که پیونددهنده اجرا نشود. در این حالت خروجی شامل فایلهای شیء خواهد بود که توسط اسمبلر تولید شدهاند.
گزینههای دیگر به یک یا چند مرحله از پردازش فرستاده میشوند. برخی از گزینهها پیشپردازنده و برخی دیگر خود کامپایلر را کنترل میکنند. گزینههای دیگری نیز وجود دارند که اسمبلر و پیونددهنده را کنترل میکنند؛ بیشتر این موارد در اینجا مستند نشدهاند، چرا که بهندرت به استفاده از آنها نیاز خواهید داشت.
بیشتر گزینههای خط فرمانی که میتوانید با GCC استفاده کنید، برای برنامههای C مفید هستند؛ هنگامی که گزینهای تنها برای یک زبان دیگر (معمولاً ++C) مفید باشد، در توضیحات صراحتاً به آن اشاره میشود. اگر در توضیحات یک گزینهٔ خاص اشارهای به زبان مبدأ نشده باشد، میتوانید از آن گزینه برای تمام زبانهای پشتیبانیشده استفاده کنید.
روش معمول برای اجرای GCC، اجرای فایل اجرایی با نام gcc، یا هنگام کامپایل متقاطع بهصورت machine-gcc، یا machine-gcc-version برای اجرای نسخهٔ مشخصی از GCC است. هنگامی که برنامههای ++C را کامپایل میکنید، باید در عوض GCC را با عنوان g++ فراخوانی کنید.
برنامهٔ gcc گزینهها و نامهای فایل را بهعنوان عملوند میپذیرد. بسیاری از گزینهها نامهای چندحرفی دارند؛ بنابراین چندین گزینهٔ تکحرفی نمیتوانند با یکدیگر گروهبندی شوند: -dv با -d -v بسیار متفاوت است.
میتوانید گزینهها و سایر آرگومانها را ترکیب کنید. در بیشتر موارد، ترتیبی که استفاده میکنید اهمیتی ندارد. ترتیب زمانی اهمیت پیدا میکند که از چند گزینه از یک نوع استفاده کنید؛ برای نمونه، اگر -L را بیش از یک بار مشخص کنید، دایرکتوریها به همان ترتیبِ مشخصشده جستجو میشوند. همچنین، جایگاه گزینهٔ -l نیز مهم است.
بسیاری از گزینهها نامهای بلندی دارند که با -f یا -W آغاز میشوند---برای نمونه، -fmove-loop-invariants، -Wformat و موارد مشابه. بیشتر این گزینهها هر دو شکل مثبت و منفی را دارند؛ شکل منفی -ffoo بهصورت -fno-foo است. این راهنما تنها یکی از این دو شکل را، هرکدام که حالت پیشفرض نباشد، مستند میکند.
برخی از گزینهها یک یا چند آرگومان میگیرند که معمولاً با یک فاصله یا با علامت مساوی (=) از نام گزینه جدا میشوند. مگر آنکه خلاف آن مستند شده باشد، یک آرگومان میتواند عددی یا یک رشته باشد. آرگومانهای عددی معمولاً باید اعداد صحیح بدون علامت کوچک در مبنای ده یا شانزده باشند. آرگومانهای مبنای شانزده باید با پیشوند 0x آغاز شوند. آرگومانهای گزینههایی که نوعی آستانهٔ اندازه را مشخص میکنند، میتوانند اعداد صحیح دهدهی یا شانزدهشانزدهی با اندازه دلخواه باشند که در ادامه آنها یک پسوند اندازهٔ بایت میآید که مضربی از بایتها را نشان میدهد؛ مانند "kB" و "KiB" به ترتیب برای کیلوبایت و کیبیبایت، "MB" و "MiB" برای مگابایت و مبیبایت، "GB" و "GiB" برای گیگابایت و گیبیبایت، و مواردی از این دست. چنین آرگومانهایی در ادامهٔ متن با byte-size مشخص شدهاند. برای مشاهدهٔ فهرست کامل و توضیحات پیشوندهای باینری و اعشاری اندازهٔ بایت، به استانداردهای NIST، IEC و سایر استانداردهای ملی و بینالمللی مرتبط مراجعه کنید..SH "گزینهها (OPTIONS)"
خلاصه گزینهها
در اینجا خلاصهای از همهٔ گزینهها، گروهبندیشده بر پایه نوع، آمده است. توضیحات مربوطه در بخشهای بعدی ارائه شده است.
- گزینههای کلی
- -c -S -E -o file -dumpbase dumpbase -dumpbase-ext auxdropsuf -dumpdir dumppfx -x language -v -### --help[=class[,...]] --target-help --version -pass-exit-codes -pipe -specs=file -wrapper @file -ffile-prefix-map=old=new -fcanon-prefix-map -fplugin=file -fplugin-arg-name=arg -fdump-ada-spec[-slim] -fada-spec-parent=unit -fdump-go-spec=file
- گزینههای زبان C
- -ansi -std=standard -aux-info filename -fno-asm -fno-builtin -fno-builtin-function -fcond-mismatch -ffreestanding -fgimple -fgnu-tm -fgnu89-inline -fhosted -flax-vector-conversions -fms-extensions -fpermitted-flt-eval-methods=standard -fplan9-extensions -fsigned-bitfields -funsigned-bitfields -fsigned-char -funsigned-char -fstrict-flex-arrays[=n] -fsso-struct=endianness
- گزینههای زبان C++
- -fabi-version=n -fno-access-control -faligned-new=n -fno-assume-sane-operators-new-delete -fchar8_t -fcheck-new -fconcepts -fconstexpr-depth=n -fconstexpr-cache-depth=n -fconstexpr-loop-limit=n -fconstexpr-ops-limit=n -fno-elide-constructors -fno-enforce-eh-specs -fno-gnu-keywords -fno-immediate-escalation -fno-implicit-templates -fno-implicit-inline-templates -fno-implement-inlines -fmodule-header[=kind] -fmodule-only -fmodules -fmodule-implicit-inline -fno-module-lazy -fmodule-mapper=specification -fmodule-version-ignore -fms-extensions -fnew-inheriting-ctors -fnew-ttp-matching -fno-nonansi-builtins -fnothrow-opt -fno-operator-names -fno-optional-diags -fno-pretty-templates -frange-for-ext-temps -fno-rtti -fsized-deallocation -fstrong-eval-order[=kind] -ftemplate-backtrace-limit=n -ftemplate-depth=n -fno-threadsafe-statics -fuse-cxa-atexit -fno-weak -nostdinc++ -fvisibility-inlines-hidden -fvisibility-ms-compat -fext-numeric-literals -flang-info-include-translate[=header] -flang-info-include-translate-not -flang-info-module-cmi[=module] -stdlib=libstdc++,libc++ -Wabi-tag -Wcatch-value -Wcatch-value=n -Wno-class-conversion -Wclass-memaccess -Wcomma-subscript -Wconditionally-supported -Wno-conversion-null -Wctad-maybe-unsupported -Wctor-dtor-privacy -Wdangling-reference -Wno-defaulted-function-deleted -Wno-delete-incomplete -Wdelete-non-virtual-dtor -Wno-deprecated-array-compare -Wdeprecated-copy -Wdeprecated-copy-dtor -Wno-deprecated-enum-enum-conversion -Wno-deprecated-enum-float-conversion -Weffc++ -Wno-elaborated-enum-base -Wno-exceptions -Wextra-semi -Wno-global-module -Wno-inaccessible-base -Wno-inherited-variadic-ctor -Wno-init-list-lifetime -Winvalid-constexpr -Winvalid-imported-macros -Wno-invalid-offsetof -Wno-literal-suffix -Wmismatched-new-delete -Wmismatched-tags -Wmultiple-inheritance -Wnamespaces -Wnarrowing -Wnoexcept -Wnoexcept-type -Wnon-virtual-dtor -Wpessimizing-move -Wno-placement-new -Wplacement-new=n -Wrange-loop-construct -Wredundant-move -Wredundant-tags -Wreorder -Wregister -Wstrict-null-sentinel -Wno-subobject-linkage -Wtemplates -Wno-non-template-friend -Wold-style-cast -Woverloaded-virtual -Wno-pmf-conversions -Wself-move -Wsign-promo -Wsized-deallocation -Wsuggest-final-methods -Wsuggest-final-types -Wsuggest-override -Wno-template-body -Wno-template-id-cdtor -Wtemplate-names-tu-local -Wno-terminate -Wno-vexing-parse -Wvirtual-inheritance -Wno-virtual-move-assign -Wvolatile
- گزینههای زبانهای Objective-C و Objective-C++
- -fconstant-string-class=class-name -fgnu-runtime -fnext-runtime -fno-nil-receivers -fobjc-abi-version=n -fobjc-call-cxx-cdtors -fobjc-direct-dispatch -fobjc-exceptions -fobjc-gc -fobjc-nilcheck -fobjc-std=objc1 -fno-local-ivars -fivar-visibility=[public|protected|private|package] -freplace-objc-classes -fzero-link -gen-decls -Wassign-intercept -Wno-property-assign-default -Wno-protocol -Wobjc-root-class -Wselector -Wstrict-selector-match -Wundeclared-selector
- گزینههای OpenMP و OpenACC
- -foffload=arg -foffload-options=arg -fopenacc -fopenacc-dim=geom -fopenmp -fopenmp-simd -fopenmp-target-simd-clone[=device-type]
- گزینههای قالببندی پیامهای عیبیابی
- -fmessage-length=n -fdiagnostics-plain-output -fdiagnostics-show-location=[once|every-line] -fdiagnostics-color=[auto|never|always] -fdiagnostics-urls=[auto|never|always] -fdiagnostics-format=[text|sarif-stderr|sarif-file|json|json-stderr|json-file] -fdiagnostics-add-output=DIAGNOSTICS-OUTPUT-SPEC -fdiagnostics-set-output=DIAGNOSTICS-OUTPUT-SPEC -fno-diagnostics-json-formatting -fno-diagnostics-show-option -fno-diagnostics-show-caret -fno-diagnostics-show-event-links -fno-diagnostics-show-labels -fno-diagnostics-show-line-numbers -fno-diagnostics-show-cwe -fno-diagnostics-show-rules -fno-diagnostics-show-highlight-colors -fdiagnostics-minimum-margin-width=width -fdiagnostics-parseable-fixits -fdiagnostics-generate-patch -fdiagnostics-show-template-tree -fno-elide-type -fdiagnostics-path-format=[none|separate-events|inline-events] -fdiagnostics-show-path-depths -fno-show-column -fdiagnostics-column-unit=[display|byte] -fdiagnostics-column-origin=origin -fdiagnostics-escape-format=[unicode|bytes] -fdiagnostics-text-art-charset=[none|ascii|unicode|emoji]
- گزینههای هشدار
- -fsyntax-only -fmax-errors=n -Wpedantic -pedantic-errors -fpermissive -w -Wextra -Wall -Wabi=n -Waddress -Wno-address-of-packed-member -Waggregate-return -Walloc-size -Walloc-size-larger-than=byte-size -Walloc-zero -Walloca -Walloca-larger-than=byte-size -Wno-aggressive-loop-optimizations -Warith-conversion -Warray-bounds -Warray-bounds=n -Warray-compare -Warray-parameter -Warray-parameter=n -Wno-attributes -Wattribute-alias=n -Wno-attribute-alias -Wno-attribute-warning -Wbidi-chars=[none|unpaired|any|ucn] -Wbool-compare -Wbool-operation -Wno-builtin-declaration-mismatch -Wno-builtin-macro-redefined -Wc90-c99-compat -Wc99-c11-compat -Wc11-c23-compat -Wc23-c2y-compat -Wc++-compat -Wc++11-compat -Wc++14-compat -Wc++17-compat -Wc++20-compat -Wno-c++11-extensions -Wno-c++14-extensions -Wno-c++17-extensions -Wno-c++20-extensions -Wno-c++23-extensions -Wcalloc-transposed-args -Wcast-align -Wcast-align=strict -Wcast-function-type -Wcast-qual -Wchar-subscripts -Wclobbered -Wcomment -Wcompare-distinct-pointer-types -Wno-complain-wrong-lang -Wconversion -Wno-coverage-mismatch -Wno-cpp -Wdangling-else -Wdangling-pointer -Wdangling-pointer=n -Wdate-time -Wno-deprecated -Wno-deprecated-declarations -Wno-designated-init -Wdisabled-optimization -Wno-discarded-array-qualifiers -Wno-discarded-qualifiers -Wno-div-by-zero -Wdouble-promotion -Wduplicated-branches -Wduplicated-cond -Wempty-body -Wno-endif-labels -Wenum-compare -Wenum-conversion -Wenum-int-mismatch -Werror -Werror=* -Wexpansion-to-defined -Wfatal-errors -Wflex-array-member-not-at-end -Wfloat-conversion -Wfloat-equal -Wformat -Wformat=2 -Wno-format-contains-nul -Wno-format-extra-args -Wformat-nonliteral -Wformat-overflow=n -Wformat-security -Wformat-signedness -Wformat-truncation=n -Wformat-y2k -Wframe-address -Wframe-larger-than=byte-size -Wno-free-nonheap-object -Wheader-guard -Wno-if-not-aligned -Wno-ignored-attributes -Wignored-qualifiers -Wno-incompatible-pointer-types -Whardened -Wimplicit -Wimplicit-fallthrough -Wimplicit-fallthrough=n -Wno-implicit-function-declaration -Wno-implicit-int -Winfinite-recursion -Winit-self -Winline -Wno-int-conversion -Wint-in-bool-context -Wno-int-to-pointer-cast -Wno-invalid-memory-model -Winvalid-pch -Winvalid-utf8 -Wno-unicode -Wjump-misses-init -Wlarger-than=byte-size -Wleading-whitespace=kind -Wlogical-not-parentheses -Wlogical-op -Wlong-long -Wno-lto-type-mismatch -Wmain -Wmaybe-uninitialized -Wmemset-elt-size -Wmemset-transposed-args -Wmisleading-indentation -Wmissing-attributes -Wmissing-braces -Wmissing-field-initializers -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-noreturn -Wmusttail-local-addr -Wmaybe-musttail-local-addr -Wno-missing-profile -Wno-multichar -Wmultistatement-macros -Wnonnull -Wnonnull-compare -Wnormalized=[none|id|nfc|nfkc] -Wnull-dereference -Wno-odr -Wopenacc-parallelism -Wopenmp -Wopenmp-simd -Wno-overflow -Woverlength-strings -Wno-override-init-side-effects -Wpacked -Wno-packed-bitfield-compat -Wpacked-not-aligned -Wpadded -Wparentheses -Wno-pedantic-ms-format -Wpointer-arith -Wno-pointer-compare -Wno-pointer-to-int-cast -Wno-pragmas -Wno-pragma-once-outside-header -Wno-prio-ctor-dtor -Wno-psabi -Wredundant-decls -Wrestrict -Wno-return-local-addr -Wreturn-type -Wno-scalar-storage-order -Wsequence-point -Wshadow -Wshadow=global -Wshadow=local -Wshadow=compatible-local -Wno-shadow-ivar -Wno-shift-count-negative -Wno-shift-count-overflow -Wshift-negative-value -Wno-shift-overflow -Wshift-overflow=n -Wsign-compare -Wsign-conversion -Wno-sizeof-array-argument -Wsizeof-array-div -Wsizeof-pointer-div -Wsizeof-pointer-memaccess -Wstack-protector -Wstack-usage=byte-size -Wstrict-aliasing -Wstrict-aliasing=n -Wstrict-overflow -Wstrict-overflow=n -Wstring-compare -Wno-stringop-overflow -Wno-stringop-overread -Wno-stringop-truncation -Wstrict-flex-arrays -Wsuggest-attribute=attribute-name -Wswitch -Wno-switch-bool -Wswitch-default -Wswitch-enum -Wno-switch-outside-range -Wno-switch-unreachable -Wsync-nand -Wsystem-headers -Wtautological-compare -Wtrailing-whitespace -Wtrailing-whitespace=kind -Wtrampolines -Wtrigraphs -Wtrivial-auto-var-init -Wno-tsan -Wtype-limits -Wundef -Wuninitialized -Wunknown-pragmas -Wunsuffixed-float-constants -Wunterminated-string-initialization -Wunused -Wunused-but-set-parameter -Wunused-but-set-variable -Wunused-const-variable -Wunused-const-variable=n -Wunused-function -Wunused-label -Wunused-local-typedefs -Wunused-macros -Wunused-parameter -Wno-unused-result -Wunused-value -Wunused-variable -Wuse-after-free -Wuse-after-free=n -Wuseless-cast -Wno-varargs -Wvariadic-macros -Wvector-operation-performance -Wvla -Wvla-larger-than=byte-size -Wno-vla-larger-than -Wvolatile-register-var -Wwrite-strings -Wno-xor-used-as-pow -Wzero-as-null-pointer-constant -Wzero-length-bounds.IP "گزینههای تحلیلگر ایستا" 4 -fanalyzer -fanalyzer-call-summaries -fanalyzer-checker=name -fno-analyzer-feasibility -fanalyzer-fine-grained -fanalyzer-show-events-in-system-headers -fno-analyzer-state-merge -fno-analyzer-state-purge -fno-analyzer-suppress-followups -fanalyzer-transitivity -fno-analyzer-undo-inlining -fanalyzer-verbose-edges -fanalyzer-verbose-state-changes -fanalyzer-verbosity=level -fdump-analyzer -fdump-analyzer-callgraph -fdump-analyzer-exploded-graph -fdump-analyzer-exploded-nodes -fdump-analyzer-exploded-nodes-2 -fdump-analyzer-exploded-nodes-3 -fdump-analyzer-exploded-paths -fdump-analyzer-feasibility -fdump-analyzer-infinite-loop -fdump-analyzer-json -fdump-analyzer-state-purge -fdump-analyzer-stderr -fdump-analyzer-supergraph -fdump-analyzer-untracked -Wno-analyzer-double-fclose -Wno-analyzer-double-free -Wno-analyzer-exposure-through-output-file -Wno-analyzer-exposure-through-uninit-copy -Wno-analyzer-fd-access-mode-mismatch -Wno-analyzer-fd-double-close -Wno-analyzer-fd-leak -Wno-analyzer-fd-phase-mismatch -Wno-analyzer-fd-type-mismatch -Wno-analyzer-fd-use-after-close -Wno-analyzer-fd-use-without-check -Wno-analyzer-file-leak -Wno-analyzer-free-of-non-heap -Wno-analyzer-imprecise-fp-arithmetic -Wno-analyzer-infinite-loop -Wno-analyzer-infinite-recursion -Wno-analyzer-jump-through-null -Wno-analyzer-malloc-leak -Wno-analyzer-mismatching-deallocation -Wno-analyzer-null-argument -Wno-analyzer-null-dereference -Wno-analyzer-out-of-bounds -Wno-analyzer-overlapping-buffers -Wno-analyzer-possible-null-argument -Wno-analyzer-possible-null-dereference -Wno-analyzer-putenv-of-auto-var -Wno-analyzer-shift-count-negative -Wno-analyzer-shift-count-overflow -Wno-analyzer-stale-setjmp-buffer -Wno-analyzer-tainted-allocation-size -Wno-analyzer-tainted-assertion -Wno-analyzer-tainted-array-index -Wno-analyzer-tainted-divisor -Wno-analyzer-tainted-offset -Wno-analyzer-tainted-size -Wanalyzer-symbol-too-complex -Wanalyzer-too-complex -Wno-analyzer-undefined-behavior-ptrdiff -Wno-analyzer-undefined-behavior-strtok -Wno-analyzer-unsafe-call-within-signal-handler -Wno-analyzer-use-after-free -Wno-analyzer-use-of-pointer-in-stale-stack-frame -Wno-analyzer-use-of-uninitialized-value -Wno-analyzer-va-arg-type-mismatch -Wno-analyzer-va-list-exhausted -Wno-analyzer-va-list-leak -Wno-analyzer-va-list-use-after-va-end -Wno-analyzer-write-to-const -Wno-analyzer-write-to-string-literal
- گزینههای هشدار مختص C و Objective-C
- -Wbad-function-cast -Wdeprecated-non-prototype -Wfree-labels -Wmissing-declarations -Wmissing-parameter-name -Wmissing-parameter-type -Wdeclaration-missing-parameter-type -Wmissing-prototypes -Wmissing-variable-declarations -Wnested-externs -Wold-style-declaration -Wold-style-definition -Wstrict-prototypes -Wtraditional -Wtraditional-conversion -Wdeclaration-after-statement -Wpointer-sign
- گزینههای اشکالزدایی
- -g -glevel -gdwarf -gdwarf-version -gbtf -gctf -gctflevel -gprune-btf -gno-prune-btf -ggdb -grecord-gcc-switches -gno-record-gcc-switches -gstrict-dwarf -gno-strict-dwarf -gas-loc-support -gno-as-loc-support -gas-locview-support -gno-as-locview-support -gcodeview -gcolumn-info -gno-column-info -gdwarf32 -gdwarf64 -gstatement-frontiers -gno-statement-frontiers -gvariable-location-views -gno-variable-location-views -ginternal-reset-location-views -gno-internal-reset-location-views -ginline-points -gno-inline-points -gvms -gz[=type] -gsplit-dwarf -gdescribe-dies -gno-describe-dies -fdebug-prefix-map=old=new -fdebug-types-section -fno-eliminate-unused-debug-types -femit-struct-debug-baseonly -femit-struct-debug-reduced -femit-struct-debug-detailed[=spec-list] -fno-eliminate-unused-debug-symbols -femit-class-debug-always -fno-merge-debug-strings -fno-dwarf2-cfi-asm -fvar-tracking -fvar-tracking-assignments
- گزینههای بهینهسازی
- -faggressive-loop-optimizations -falign-functions[=n[:m:[n2[:m2]]]] -falign-jumps[=n[:m:[n2[:m2]]]] -falign-labels[=n[:m:[n2[:m2]]]] -falign-loops[=n[:m:[n2[:m2]]]] -fmin-function-alignment=[n] -fno-allocation-dce -fallow-store-data-races -fassociative-math -fauto-profile -fauto-profile[=path] -fauto-inc-dec -fbranch-probabilities -fcaller-saves -fcombine-stack-adjustments -fconserve-stack -ffold-mem-offsets -fcompare-elim -fcprop-registers -fcrossjumping -fcse-follow-jumps -fcse-skip-blocks -fcx-fortran-rules -fcx-limited-range -fdata-sections -fdce -fdelayed-branch -fdelete-null-pointer-checks -fdevirtualize -fdevirtualize-speculatively -fdevirtualize-at-ltrans -fdse -fearly-inlining -fipa-sra -fexpensive-optimizations -ffat-lto-objects -ffast-math -ffinite-math-only -ffloat-store -fexcess-precision=style -ffinite-loops -fforward-propagate -ffp-contract=style -ffunction-sections -fgcse -fgcse-after-reload -fgcse-las -fgcse-lm -fgraphite-identity -fgcse-sm -fhoist-adjacent-loads -fif-conversion -fif-conversion2 -findirect-inlining -finline-stringops[=fn] -finline-functions -finline-functions-called-once -finline-limit=n -finline-small-functions -fipa-modref -fipa-cp -fipa-cp-clone -fipa-bit-cp -fipa-vrp -fipa-pta -fipa-profile -fipa-pure-const -fipa-reference -fipa-reference-addressable -fipa-reorder-for-locality -fipa-stack-alignment -fipa-icf -fira-algorithm=algorithm -flate-combine-instructions -flifetime-dse -flive-patching=level -fira-region=region -fira-hoist-pressure -fira-loop-pressure -fno-ira-share-save-slots -fno-ira-share-spill-slots -fisolate-erroneous-paths-dereference -fisolate-erroneous-paths-attribute -fivopts -fkeep-inline-functions -fkeep-static-functions -fkeep-static-consts -flimit-function-alignment -flive-range-shrinkage -floop-block -floop-interchange -floop-strip-mine -floop-unroll-and-jam -floop-nest-optimize -floop-parallelize-all -flra-remat -flto -flto-compression-level -flto-partition=alg -flto-incremental=path -flto-incremental-cache-size=n -fmalloc-dce -fmerge-all-constants -fmerge-constants -fmodulo-sched -fmodulo-sched-allow-regmoves -fmove-loop-invariants -fmove-loop-stores -fno-branch-count-reg -fno-defer-pop -fno-fp-int-builtin-inexact -fno-function-cse -fno-guess-branch-probability -fno-inline -fno-math-errno -fno-peephole -fno-peephole2 -fno-printf-return-value -fno-sched-interblock -fno-sched-spec -fno-signed-zeros -fno-toplevel-reorder -fno-trapping-math -fno-zero-initialized-in-bss -fomit-frame-pointer -foptimize-crc -foptimize-sibling-calls -fpartial-inlining -fpeel-loops -fpredictive-commoning -fprefetch-loop-arrays -fprofile-correction -fprofile-use -fprofile-use=path -fprofile-partial-training -fprofile-values -fprofile-reorder-functions -freciprocal-math -free -frename-registers -freorder-blocks -freorder-blocks-algorithm=algorithm -freorder-blocks-and-partition -freorder-functions -frerun-cse-after-loop -freschedule-modulo-scheduled-loops -frounding-math -fsave-optimization-record -fsched2-use-superblocks -fsched-pressure -fsched-spec-load -fsched-spec-load-dangerous -fsched-stalled-insns-dep[=n] -fsched-stalled-insns[=n] -fsched-group-heuristic -fsched-critical-path-heuristic -fsched-spec-insn-heuristic -fsched-rank-heuristic -fsched-last-insn-heuristic -fsched-dep-count-heuristic -fschedule-fusion -fschedule-insns -fschedule-insns2 -fsection-anchors -fselective-scheduling -fselective-scheduling2 -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops -fsemantic-interposition -fshrink-wrap -fshrink-wrap-separate -fsignaling-nans -fsingle-precision-constant -fsplit-ivs-in-unroller -fsplit-loops -fsplit-paths -fsplit-wide-types -fsplit-wide-types-early -fssa-backprop -fssa-phiopt -fstdarg-opt -fstore-merging -fstrict-aliasing -fipa-strict-aliasing -fthread-jumps -ftracer -ftree-bit-ccp -ftree-builtin-call-dce -ftree-ccp -ftree-ch -ftree-coalesce-vars -ftree-copy-prop -ftree-cselim -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre -fcode-hoisting -ftree-loop-if-convert -ftree-loop-im -ftree-phiprop -ftree-loop-distribution -ftree-loop-distribute-patterns -ftree-loop-ivcanon -ftree-loop-linear -ftree-loop-optimize -ftree-loop-vectorize -ftree-parallelize-loops=n -ftree-pre -ftree-partial-pre -ftree-pta -ftree-reassoc -ftree-scev-cprop -ftree-sink -ftree-slsr -ftree-sra -ftree-switch-conversion -ftree-tail-merge -ftree-ter -ftree-vectorize -ftree-vrp -ftrivial-auto-var-init -funconstrained-commons -funit-at-a-time -funroll-all-loops -funroll-loops -funsafe-math-optimizations -funswitch-loops -fipa-ra -fvariable-expansion-in-unroller -fvect-cost-model -fvpt -fweb -fwhole-program -fwpa -fuse-linker-plugin -fzero-call-used-regs --param name=value -O -O0 -O1 -O2 -O3 -Os -Ofast -Og -Oz.IP "گزینههای ابزارگذاری برنامه (Program Instrumentation Options)" 4 -p -pg -fprofile-arcs --coverage -ftest-coverage -fcondition-coverage -fpath-coverage -fprofile-abs-path -fprofile-dir=path -fprofile-generate -fprofile-generate=path -fprofile-info-section -fprofile-info-section=name -fprofile-note=path -fprofile-prefix-path=path -fprofile-update=method -fprofile-filter-files=regex -fprofile-exclude-files=regex -fprofile-reproducible=[multithreaded|parallel-runs|serial] -fsanitize=style -fsanitize-recover -fsanitize-recover=style -fsanitize-trap -fsanitize-trap=style -fasan-shadow-offset=number -fsanitize-sections=s1,s2,... -fsanitize-undefined-trap-on-error -fbounds-check -fcf-protection -fcf-protection=[full|branch|return|none|check] -fharden-compares -fharden-conditional-branches -fhardened -fharden-control-flow-redundancy -fhardcfr-skip-leaf -fhardcfr-check-exceptions -fhardcfr-check-returning-calls -fhardcfr-check-noreturn-calls=[always|no-xthrow|nothrow|never] -fstack-protector -fstack-protector-all -fstack-protector-strong -fstack-protector-explicit -fstack-check -fstack-limit-register=reg -fstack-limit-symbol=sym -fno-stack-limit -fsplit-stack -fstrub=disable -fstrub=strict -fstrub=relaxed -fstrub=all -fstrub=at-calls -fstrub=internal -fvtable-verify=[std|preinit|none] -fvtv-counts -fvtv-debug -finstrument-functions -finstrument-functions-once -finstrument-functions-exclude-function-list=sym,sym,... -finstrument-functions-exclude-file-list=file,file,... -fprofile-prefix-map=old=new -fpatchable-function-entry=N[,M]
- گزینههای پیشپردازنده (Preprocessor Options)
- -Aquestion=answer -A-question[=answer] -C -CC -Dmacro[=defn] -dD -dI -dM -dN -dU -fdebug-cpp -fdirectives-only -fdollars-in-identifiers -fexec-charset=charset -fextended-identifiers -finput-charset=charset -fmacro-prefix-map=old=new -fmax-include-depth=depth -fno-canonical-system-headers -fpch-deps -fpch-preprocess -fpreprocessed -ftabstop=width -ftrack-macro-expansion -fwide-exec-charset=charset -fworking-directory -H -imacros file -include file -M -MD -MF -MG -MM -MMD -MP -MQ -MT -Mno-modules -no-integrated-cpp -P -pthread -remap -traditional -traditional-cpp -trigraphs -Umacro -undef -Wp,option -Xpreprocessor option
- گزینههای اسمبلر (Assembler Options)
- -Wa,option -Xassembler option
- گزینههای پیونددهنده (Linker Options)
- object-file-name -fuse-ld=linker -llibrary -nostartfiles -nodefaultlibs -nolibc -nostdlib -nostdlib++ -e entry --entry=entry -pie -pthread -r -rdynamic -s -static -static-pie -static-libgcc -static-libstdc++ -static-libasan -static-libtsan -static-liblsan -static-libubsan -shared -shared-libgcc -symbolic -T script -Wl,option -Xlinker option -u symbol -z keyword
- گزینههای دایرکتوری (Directory Options)
- -Bprefix -Idir -I- -idirafter dir -imacros file -imultilib dir -iplugindir=dir -iprefix file -iquote dir -isysroot dir -isystem dir -iwithprefix dir -iwithprefixbefore dir --embed-dir=dir -Ldir -no-canonical-prefixes --no-sysroot-suffix -nostdinc -nostdinc++ --sysroot=dir
- گزینههای تولید کد (Code Generation Options)
- -fcall-saved-reg -fcall-used-reg -ffixed-reg -fexceptions -fnon-call-exceptions -fdelete-dead-exceptions -funwind-tables -fasynchronous-unwind-tables -fno-gnu-unique -finhibit-size-directive -fcommon -fno-ident -fpcc-struct-return -fpic -fPIC -fpie -fPIE -fno-plt -fno-jump-tables -fno-bit-tests -frecord-gcc-switches -freg-struct-return -fshort-enums -fshort-wchar -fverbose-asm -fpack-struct[=n] -fleading-underscore -ftls-model=model -fstack-reuse=reuse_level -ftrampolines -ftrampoline-impl=[stack|heap] -ftrapv -fwrapv -fvisibility=[default|internal|hidden|protected] -fstrict-volatile-bitfields -fsync-libcalls -fzero-init-padding-bits=value
- گزینههای توسعهدهنده (Developer Options)
- -dletters -dumpspecs -dumpmachine -dumpversion -dumpfullversion -fcallgraph-info[=su,da] -fchecking -fchecking=n -fdbg-cnt-list -fdbg-cnt=counter-value-list -fdisable-ipa-pass_name -fdisable-rtl-pass_name -fdisable-rtl-pass-name=range-list -fdisable-tree-pass_name -fdisable-tree-pass-name=range-list -fdump-debug -fdump-earlydebug -fdump-noaddr -fdump-unnumbered -fdump-unnumbered-links -fdump-final-insns[=file] -fdump-ipa-all -fdump-ipa-cgraph -fdump-ipa-inline -fdump-lang-all -fdump-lang-switch -fdump-lang-switch-options -fdump-lang-switch-options=filename -fdump-passes -fdump-rtl-pass -fdump-rtl-pass=filename -fdump-statistics -fdump-tree-all -fdump-tree-switch -fdump-tree-switch-options -fdump-tree-switch-options=filename -fcompare-debug[=opts] -fcompare-debug-second -fenable-kind-pass -fenable-kind-pass=range-list -fira-verbose=n -flto-report -flto-report-wpa -fmem-report-wpa -fmem-report -fpre-ipa-mem-report -fpost-ipa-mem-report -fopt-info -fopt-info-options[=file] -fmultiflags -fprofile-report -frandom-seed=string -fsched-verbose=n -fsel-sched-verbose -fsel-sched-dump-cfg -fsel-sched-pipelining-verbose -fstats -fstack-usage -ftime-report -ftime-report-details -fvar-tracking-assignments-toggle -gtoggle -print-file-name=library -print-libgcc-file-name -print-multi-directory -print-multi-lib -print-multi-os-directory -print-prog-name=program -print-search-dirs -Q -print-sysroot -print-sysroot-headers-suffix -save-temps -save-temps=cwd -save-temps=obj -time[=file]
- گزینههای وابسته به ماشین (Machine-Dependent Options)
- گزینههای
AArch64 (AArch64 Options) -mabi=name
-mbig-endian -mlittle-endian -mgeneral-regs-only
-mcmodel=tiny -mcmodel=small -mcmodel=large -mstrict-align
-mno-strict-align -momit-leaf-frame-pointer
-mtls-dialect=desc -mtls-dialect=traditional
-mtls-size=size -mfix-cortex-a53-835769
-mfix-cortex-a53-843419 -mlow-precision-recip-sqrt
-mlow-precision-sqrt -mlow-precision-div
-mpc-relative-literal-loads
-msign-return-address=scope
-mbranch-protection=none|standard|pac-ret[+leaf
+b-key]|bti|gcs
-mharden-sls=opts -march=name
-mcpu=name -mtune=name
-moverride=string -mverbose-cost-dump
-mstack-protector-guard=guard
-mstack-protector-guard-reg=sysreg
-mstack-protector-guard-offset=offset
-mtrack-speculation -moutline-atomics -mearly-ldp-fusion
-mlate-ldp-fusion -Wexperimental-fmv-target
گزینههای Adapteva Epiphany (Adapteva Epiphany Options) -mhalf-reg-file -mprefer-short-insn-regs -mbranch-cost=num -mcmove -mnops=num -msoft-cmpsf -msplit-lohi -mpost-inc -mpost-modify -mstack-offset=num -mround-nearest -mlong-calls -mshort-calls -msmall16 -mfp-mode=mode -mvect-double -max-vect-align=num -msplit-vecmove-early -m1reg-reg
گزینههای AMD GCN (AMD GCN Options) -march=gpu -mtune=gpu -mstack-size=bytes
گزینههای ARC (ARC Options) -mbarrel-shifter -mjli-always -mcpu=cpu -mA6 -mARC600 -mA7 -mARC700 -mdpfp -mdpfp-compact -mdpfp-fast -mno-dpfp-lrsr -mea -mno-mpy -mmul32x16 -mmul64 -matomic -mnorm -mspfp -mspfp-compact -mspfp-fast -msimd -msoft-float -mswap -mcrc -mdsp-packa -mdvbf -mlock -mmac-d16 -mmac-24 -mrtsc -mswape -mtelephony -mxy -misize -mannotate-align -marclinux -marclinux_prof -mlong-calls -mmedium-calls -msdata -mirq-ctrl-saved -mrgf-banked-regs -mlpc-width=width -G num -mvolatile-cache -mtp-regno=regno -malign-call -mauto-modify-reg -mbbit-peephole -mno-brcc -mcase-vector-pcrel -mcompact-casesi -mno-cond-exec -mearly-cbranchsi -mexpand-adddi -mindexed-loads -mlra -mlra-priority-none -mlra-priority-compact -mlra-priority-noncompact -mmillicode -mmixed-code -mq-class -mRcq -mRcw -msize-level=level -mtune=cpu -mmultcost=num -mcode-density-frame -munalign-prob-threshold=probability -mmpy-option=multo -mdiv-rem -mcode-density -mll64 -mfpu=fpu -mrf16 -mbranch-index
گزینههای ARM (ARM Options) -mapcs-frame -mno-apcs-frame -mabi=name -mapcs-stack-check -mno-apcs-stack-check -mapcs-reentrant -mno-apcs-reentrant -mgeneral-regs-only -msched-prolog -mno-sched-prolog -mlittle-endian -mbig-endian -mbe8 -mbe32 -mfloat-abi=name -mfp16-format=name -mthumb-interwork -mno-thumb-interwork -mcpu=name -march=name -mfpu=name -mtune=name -mprint-tune-info -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 -mpoke-function-name -mthumb -marm -mflip-thumb -mtpcs-frame -mtpcs-leaf-frame -mcaller-super-interworking -mcallee-super-interworking -mtp=name -mtls-dialect=dialect -mword-relocations -mfix-cortex-m3-ldrd -mfix-cortex-a57-aes-1742098 -mfix-cortex-a72-aes-1655431 -munaligned-access -mneon-for-64bits -mslow-flash-data -masm-syntax-unified -mrestrict-it -mverbose-cost-dump -mpure-code -mcmse -mfix-cmse-cve-2021-35465 -mstack-protector-guard=guard -mstack-protector-guard-offset=offset -mfdpic -mbranch-protection=none|standard|pac-ret[+leaf] [+bti]|bti[+pac-ret[+leaf]]
گزینههای AVR (AVR Options) -mmcu=mcu -mabsdata -maccumulate-args -mcvt -mbranch-cost=cost -mfuse-add=level -mfuse-move=level -mfuse-move2 -mcall-prologues -mgas-isr-prologues -mint8 -mflmap -mdouble=bits -mlong-double=bits -mno-call-main -mn_flash=size -mfract-convert-truncate -mno-interrupts -mmain-is-OS_task -mrelax -mrmw -mstrict-X -mtiny-stack -mrodata-in-ram -msplit-bit-shift -msplit-ldst -mshort-calls -mskip-bug -muse-nonzero-bits -nodevicelib -nodevicespecs -Waddr-space-convert -Wmisspelled-isr
گزینههای Blackfin (Blackfin Options) -mcpu=cpu[-sirevision] -msim -momit-leaf-frame-pointer -mno-omit-leaf-frame-pointer -mspecld-anomaly -mno-specld-anomaly -mcsync-anomaly -mno-csync-anomaly -mlow-64k -mno-low64k -mstack-check-l1 -mid-shared-library -mno-id-shared-library -mshared-library-id=n -mleaf-id-shared-library -mno-leaf-id-shared-library -msep-data -mno-sep-data -mlong-calls -mno-long-calls -mfast-fp -minline-plt -mmulticore -mcorea -mcoreb -msdram -micplb.Sp گزینههای C6X (C6X Options) -mbig-endian -mlittle-endian -march=cpu -msim -msdata=sdata-type
گزینههای CRIS (CRIS Options) -mcpu=cpu -march=cpu -mtune=cpu -mmax-stack-frame=n -metrax4 -metrax100 -mpdebug -mcc-init -mno-side-effects -mstack-align -mdata-align -mconst-align -m32-bit -m16-bit -m8-bit -mno-prologue-epilogue -melf -maout -sim -sim2 -mmul-bug-workaround -mno-mul-bug-workaround
گزینههای C-SKY (C-SKY Options) -march=arch -mcpu=cpu -mbig-endian -EB -mlittle-endian -EL -mhard-float -msoft-float -mfpu=fpu -mdouble-float -mfdivdu -mfloat-abi=name -melrw -mistack -mmp -mcp -mcache -msecurity -mtrust -mdsp -medsp -mvdsp -mdiv -msmart -mhigh-registers -manchor -mpushpop -mmultiple-stld -mconstpool -mstack-size -mccrt -mbranch-cost=n -mcse-cc -msched-prolog -msim
گزینههای Cygwin و MinGW (Cygwin and MinGW Options) -mconsole -mcrtdll=library -mdll -mnop-fun-dllimport -mthread -municode -mwin32 -mwindows -fno-set-stack-executable
گزینههای Darwin (Darwin Options) -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 -iframework -image_base -init -install_name -keep_private_externs -multi_module -multiply_defined -multiply_defined_unused -noall_load -no_dead_strip_inits_and_terms -nodefaultrpaths -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 (DEC Alpha Options) -mno-fp-regs -msoft-float -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 -msafe-bwa -msafe-partial -mfloat-vax -mfloat-ieee -mexplicit-relocs -msmall-data -mlarge-data -msmall-text -mlarge-text -mmemory-latency=time
گزینههای eBPF (eBPF Options) -mbig-endian -mlittle-endian -mframe-limit=bytes -mxbpf -mco-re -mno-co-re -mjmpext -mjmp32 -malu32 -mv3-atomics -mbswap -msdiv -msmov -mcpu=version -masm=dialect -minline-memops-threshold=bytes
گزینههای FR30 (FR30 Options) -msmall-model -mno-lsim
گزینههای FT32 (FT32 Options) -msim -mlra -mnodiv -mft32b -mcompress -mnopm
گزینههای FRV (FRV Options) -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 (GNU/Linux Options) -mglibc -muclibc -mmusl -mbionic -mandroid -tno-android-cc -tno-android-ld
گزینههای H8/300 (H8/300 Options) -mrelax -mh -ms -mn -mexr -mno-exr -mint32 -malign-300
گزینههای HPPA (HPPA Options) -march=architecture-type -matomic-libcalls -mbig-switch -mcaller-copies -mdisable-fpregs -mdisable-indexing -mordered -mfast-indirect-calls -mgas -mgnu-ld -mhp-ld -mfixed-range=register-range -mcoherent-ldcw -mjump-in-delay -mlinker-opt -mlong-calls -mlong-load-store -mno-atomic-libcalls -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 -msoft-mult -msio -mwsio -munix=unix-std -nolibdld -static -threads
گزینههای IA-64 (IA-64 Options) -mbig-endian -mlittle-endian -mgnu-as -mgnu-ld -mno-pic -mvolatile-asm-stop -mregister-names -msdata -mno-sdata -mconstant-gp -mauto-pic -mfused-madd -minline-float-divide-min-latency -minline-float-divide-max-throughput -mno-inline-float-divide -minline-int-divide-min-latency -minline-int-divide-max-throughput -mno-inline-int-divide -minline-sqrt-min-latency -minline-sqrt-max-throughput -mno-inline-sqrt -mdwarf2-asm -mearly-stop-bits -mfixed-range=register-range -mtls-size=tls-size -mtune=cpu-type -milp32 -mlp64 -msched-br-data-spec -msched-ar-data-spec -msched-control-spec -msched-br-in-data-spec -msched-ar-in-data-spec -msched-in-control-spec -msched-spec-ldc -msched-spec-control-ldc -msched-prefer-non-data-spec-insns -msched-prefer-non-control-spec-insns -msched-stop-bits-after-every-cycle -msched-count-spec-in-critical-path -msel-sched-dont-check-control-spec -msched-fp-mem-deps-zero-cost -msched-max-memory-insns-hard-limit -msched-max-memory-insns=max-insns
گزینههای LM32 (LM32 Options) -mbarrel-shift-enabled -mdivide-enabled -mmultiply-enabled -msign-extend-enabled -muser-enabled
گزینههای LoongArch (LoongArch Options) -march=arch-type -mtune=tune-type -mabi=base-abi-type -mfpu=fpu-type -msimd=simd-type -msoft-float -msingle-float -mdouble-float -mlsx -mno-lsx -mlasx -mno-lasx -mbranch-cost=n -maddr-reg-reg-cost=n -mcheck-zero-division -mno-check-zero-division -mcond-move-int -mno-cond-move-int -mcond-move-float -mno-cond-move-float -memcpy -mno-memcpy -mstrict-align -mno-strict-align -G num -mmax-inline-memcpy-size=n -mexplicit-relocs=style -mexplicit-relocs -mno-explicit-relocs -mdirect-extern-access -mno-direct-extern-access -mcmodel=code-model -mrelax -mpass-mrelax-to-as -mrecip -mrecip=opt -mfrecipe -mno-frecipe -mdiv32 -mno-div32 -mlam-bh -mno-lam-bh -mlamcas -mno-lamcas -mld-seq-sa -mno-ld-seq-sa -mtls-dialect=opt -mannotate-tablejump -mno-annotate-tablejump
گزینههای M32C (M32C Options) -mcpu=cpu -msim -memregs=number
گزینههای M32R/D (M32R/D Options) -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
گزینههای M680x0 (M680x0 Options) -march=arch -mcpu=cpu -mtune=tune -m68000 -m68020 -m68020-40 -m68020-60 -m68030 -m68040 -m68060 -mcpu32 -m5200 -m5206e -m528x -m5307 -m5407 -mcfv4e -mbitfield -mno-bitfield -mc68000 -mc68020 -mnobitfield -mrtd -mno-rtd -mdiv -mno-div -mshort -mno-short -mhard-float -m68881 -msoft-float -mpcrel -malign-int -mstrict-align -msep-data -mno-sep-data -mshared-library-id=n -mid-shared-library -mno-id-shared-library -mxgot -mno-xgot -mlong-jump-table-offsets
گزینههای MCore (MCore Options) -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
گزینههای MicroBlaze (MicroBlaze Options) -msoft-float -mhard-float -msmall-divides -mcpu=cpu -mmemcpy -mxl-soft-mul -mxl-soft-div -mxl-barrel-shift -mxl-pattern-compare -mxl-stack-check -mxl-gp-opt -mno-clearbss -mxl-multiply-high -mxl-float-convert -mxl-float-sqrt -mbig-endian -mlittle-endian -mxl-reorder -mxl-mode-app-model -mpic-data-is-text-relative
گزینههای MIPS (MIPS Options) -EL -EB -march=arch -mtune=arch -mips1 -mips2 -mips3 -mips4 -mips32 -mips32r2 -mips32r3 -mips32r5 -mips32r6 -mips64 -mips64r2 -mips64r3 -mips64r5 -mips64r6 -mips16 -mno-mips16 -mflip-mips16 -minterlink-compressed -mno-interlink-compressed -minterlink-mips16 -mno-interlink-mips16 -mabi=abi -mabicalls -mno-abicalls -mshared -mno-shared -mplt -mno-plt -mxgot -mno-xgot -mgp32 -mgp64 -mfp32 -mfpxx -mfp64 -mhard-float -msoft-float -mno-float -msingle-float -mdouble-float -modd-spreg -mno-odd-spreg -mabs=mode -mnan=encoding -mdsp -mno-dsp -mdspr2 -mno-dspr2 -mmcu -mmno-mcu -meva -mno-eva -mvirt -mno-virt -mxpa -mno-xpa -mcrc -mno-crc -mginv -mno-ginv -mmicromips -mno-micromips -mmsa -mno-msa -mloongson-mmi -mno-loongson-mmi -mloongson-ext -mno-loongson-ext -mloongson-ext2 -mno-loongson-ext2 -mfpu=fpu-type -msmartmips -mno-smartmips -mpaired-single -mno-paired-single -mdmx -mno-mdmx -mips3d -mno-mips3d -mmt -mno-mt -mllsc -mno-llsc -mlong64 -mlong32 -msym32 -mno-sym32 -Gnum -mlocal-sdata -mno-local-sdata -mextern-sdata -mno-extern-sdata -mgpopt -mno-gopt -membedded-data -mno-embedded-data -muninit-const-in-rodata -mno-uninit-const-in-rodata -mcode-readable=setting -msplit-addresses -mno-split-addresses -mexplicit-relocs -mno-explicit-relocs -mexplicit-relocs=release -mcheck-zero-division -mno-check-zero-division -mdivide-traps -mdivide-breaks -mload-store-pairs -mno-load-store-pairs -mstrict-align -mno-strict-align -mno-unaligned-access -munaligned-access -mmemcpy -mno-memcpy -mlong-calls -mno-long-calls -mmad -mno-mad -mimadd -mno-imadd -mfused-madd -mno-fused-madd -nocpp -mfix-24k -mno-fix-24k -mfix-r4000 -mno-fix-r4000 -mfix-r4400 -mno-fix-r4400 -mfix-r5900 -mno-fix-r5900 -mfix-r10000 -mno-fix-r10000 -mfix-rm7000 -mno-fix-rm7000 -mfix-vr4120 -mno-fix-vr4120 -mfix-vr4130 -mno-fix-vr4130 -mfix-sb1 -mno-fix-sb1 -mflush-func=func -mno-flush-func -mbranch-cost=num -mbranch-likely -mno-branch-likely -mcompact-branches=policy -mfp-exceptions -mno-fp-exceptions -mvr4130-align -mno-vr4130-align -msynci -mno-synci -mlxc1-sxc1 -mno-lxc1-sxc1 -mmadd4 -mno-madd4 -mrelax-pic-calls -mno-relax-pic-calls -mmcount-ra-address -mframe-header-opt -mno-frame-header-opt.Sp گزینههای MMIX (گزینههای 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 (گزینههای MN10300) -mmult-bug -mno-mult-bug -mno-am33 -mam33 -mam33-2 -mam34 -mtune=cpu-type -mreturn-pointer-on-d0 -mno-crt0 -mrelax -mliw -msetlb
گزینههای Moxie (گزینههای Moxie) -meb -mel -mmul.x -mno-crt0
گزینههای MSP430 (گزینههای MSP430) -msim -masm-hex -mmcu= -mcpu= -mlarge -msmall -mrelax -mwarn-mcu -mcode-region= -mdata-region= -msilicon-errata= -msilicon-errata-warn= -mhwmult= -minrt -mtiny-printf -mmax-inline-shift=
گزینههای NDS32 (گزینههای NDS32) -mbig-endian -mlittle-endian -mreduced-regs -mfull-regs -mcmov -mno-cmov -mext-perf -mno-ext-perf -mext-perf2 -mno-ext-perf2 -mext-string -mno-ext-string -mv3push -mno-v3push -m16bit -mno-16bit -misr-vector-size=num -mcache-block-size=num -march=arch -mcmodel=code-model -mctor-dtor -mrelax
گزینههای Nvidia PTX (گزینههای Nvidia PTX) -m64 -mmainkernel -moptimize
گزینههای OpenRISC (گزینههای OpenRISC) -mboard=name -mnewlib -mhard-mul -mhard-div -msoft-mul -msoft-div -msoft-float -mhard-float -mdouble-float -munordered-float -mcmov -mror -mrori -msext -msfimm -mshftimm -mcmodel=code-model
گزینههای PDP-11 (گزینههای PDP-11) -mfpu -msoft-float -mac0 -mno-ac0 -m40 -m45 -m10 -mint32 -mno-int16 -mint16 -mno-int32 -msplit -munix-asm -mdec-asm -mgnu-asm -mlra
گزینههای PowerPC گزینههای RS/6000 و PowerPC را ببینید.
گزینههای PRU (گزینههای PRU) -mmcu=mcu -minrt -mno-relax -mloop -mabi=variant
گزینههای RISC-V (گزینههای RISC-V) -mbranch-cost=N-instruction -mplt -mno-plt -mabi=ABI-string -mfdiv -mno-fdiv -mfence-tso -mno-fence-tso -mdiv -mno-div -misa-spec=ISA-spec-string -march=ISA-string -mtune=processor-string -mpreferred-stack-boundary=num -msmall-data-limit=N-bytes -msave-restore -mno-save-restore -mshorten-memrefs -mno-shorten-memrefs -mstrict-align -mno-strict-align -mcmodel=medlow -mcmodel=medany -mcmodel=large -mexplicit-relocs -mno-explicit-relocs -mrelax -mno-relax -mriscv-attribute -mno-riscv-attribute -malign-data=type -mbig-endian -mlittle-endian -mstack-protector-guard=guard -mstack-protector-guard-reg=reg -mstack-protector-guard-offset=offset -mcsr-check -mno-csr-check -mmovcc -mno-movcc -minline-atomics -mno-inline-atomics -minline-strlen -mno-inline-strlen -minline-strcmp -mno-inline-strcmp -minline-strncmp -mno-inline-strncmp -mtls-dialect=desc -mtls-dialect=trad
گزینههای RL78 (گزینههای RL78) -msim -mmul=none -mmul=g13 -mmul=g14 -mallregs -mcpu=g10 -mcpu=g13 -mcpu=g14 -mg10 -mg13 -mg14 -m64bit-doubles -m32bit-doubles -msave-mduc-in-interrupts
گزینههای RS/6000 و PowerPC (گزینههای RS/6000 و PowerPC) -mcpu=cpu-type -mtune=cpu-type -mcmodel=code-model -mpowerpc64 -maltivec -mno-altivec -mpowerpc-gpopt -mno-powerpc-gpopt -mpowerpc-gfxopt -mno-powerpc-gfxopt -mmfcrf -mno-mfcrf -mpopcntb -mno-popcntb -mpopcntd -mno-popcntd -mfprnd -mno-fprnd -mcmpb -mno-cmpb -mhard-dfp -mno-hard-dfp -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 -mupdate -mno-update -mavoid-indexed-addresses -mno-avoid-indexed-addresses -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 -mswdiv -msingle-pic-base -mprioritize-restricted-insns=priority -msched-costly-dep=dependence_type -minsert-sched-nops=scheme -mcall-aixdesc -mcall-eabi -mcall-freebsd -mcall-linux -mcall-netbsd -mcall-openbsd -mcall-sysv -mcall-sysv-eabi -mcall-sysv-noeabi -mtraceback=traceback_type -maix-struct-return -msvr4-struct-return -mabi=abi-type -msecure-plt -mbss-plt -msplit-patch-nops -mlongcall -mno-longcall -mpltseq -mno-pltseq -mblock-move-inline-limit=num -mblock-compare-inline-limit=num -mblock-compare-inline-loop-limit=num -mno-block-ops-unaligned-vsx -mstring-compare-inline-limit=num -misel -mno-isel -mvrsave -mno-vrsave -mmulhw -mno-mulhw -mdlmzb -mno-dlmzb -mprototype -mno-prototype -msim -mmvme -mads -myellowknife -memb -msdata -msdata=opt -mreadonly-in-sdata -mvxworks -G num -mrecip -mrecip=opt -mno-recip -mrecip-precision -mno-recip-precision -mveclibabi=type -mfriz -mno-friz -mpointers-to-nested-functions -mno-pointers-to-nested-functions -msave-toc-indirect -mno-save-toc-indirect -mpower8-fusion -mno-mpower8-fusion -mcrypto -mno-crypto -mhtm -mno-htm -mquad-memory -mno-quad-memory -mquad-memory-atomic -mno-quad-memory-atomic -mcompat-align-parm -mno-compat-align-parm -mfloat128 -mno-float128 -mfloat128-hardware -mno-float128-hardware -mgnu-attribute -mno-gnu-attribute -mstack-protector-guard=guard -mstack-protector-guard-reg=reg -mstack-protector-guard-offset=offset -mprefixed -mno-prefixed -mpcrel -mno-pcrel -mmma -mno-mmma -mrop-protect -mno-rop-protect -mprivileged -mno-privileged
گزینههای RX (گزینههای RX) -m64bit-doubles -m32bit-doubles -fpu -nofpu -mcpu= -mbig-endian-data -mlittle-endian-data -msmall-data -msim -mno-sim -mas100-syntax -mno-as100-syntax -mrelax -mmax-constant-size= -mint-register= -mpid -mallow-string-insns -mno-allow-string-insns -mjsr -mno-warn-multiple-fast-interrupts -msave-acc-in-interrupts
گزینههای S/390 و zSeries (گزینههای S/390 و zSeries) -mtune=cpu-type -march=cpu-type -mhard-float -msoft-float -mhard-dfp -mno-hard-dfp -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 -mhtm -mvx -mzvector -mtpf-trace -mno-tpf-trace -mtpf-trace-skip -mno-tpf-trace-skip -mfused-madd -mno-fused-madd -mwarn-framesize -mwarn-dynamicstack -mstack-size -mstack-guard -mhotpatch=halfwords,halfwords
گزینههای SH (گزینههای SH) -m1 -m2 -m2e -m2a-nofpu -m2a-single-only -m2a-single -m2a -m3 -m3e -m4-nofpu -m4-single-only -m4-single -m4 -m4a-nofpu -m4a-single-only -m4a-single -m4a -m4al -mb -ml -mdalign -mrelax -mbigtable -mfmovd -mrenesas -mno-renesas -mnomacsave -mieee -mno-ieee -mbitops -misize -minline-ic_invalidate -mpadstruct -mprefergot -musermode -multcost=number -mdiv=strategy -mdivsi3_libfunc=name -mfixed-range=register-range -maccumulate-outgoing-args -matomic-model=atomic-model -mbranch-cost=num -mzdcbranch -mno-zdcbranch -mcbranch-force-delay-slot -mfused-madd -mno-fused-madd -mfsca -mno-fsca -mfsrra -mno-fsrra -mpretend-cmove -mtas
گزینههای Solaris 2 (گزینههای Solaris 2) -mclear-hwcap -mno-clear-hwcap -mimpure-text -mno-impure-text -pthreads
گزینههای SPARC (گزینههای SPARC) -mcpu=cpu-type -mtune=cpu-type -mcmodel=code-model -mmemory-model=mem-model -m32 -m64 -mapp-regs -mno-app-regs -mfaster-structs -mno-faster-structs -mflat -mno-flat -mfpu -mno-fpu -mhard-float -msoft-float -mhard-quad-float -msoft-quad-float -mstack-bias -mno-stack-bias -mstd-struct-return -mno-std-struct-return -munaligned-doubles -mno-unaligned-doubles -muser-mode -mno-user-mode -mv8plus -mno-v8plus -mvis -mno-vis -mvis2 -mno-vis2 -mvis3 -mno-vis3 -mvis3b -mno-vis3b -mvis4 -mno-vis4 -mvis4b -mno-vis4b -mcbcond -mno-cbcond -mfmaf -mno-fmaf -mfsmuld -mno-fsmuld -mpopc -mno-popc -msubxc -mno-subxc -mfix-at697f -mfix-ut699 -mfix-ut700 -mfix-gr712rc
گزینههای System V (گزینههای System V) -Qy -Qn -YP,paths -Ym,dir
گزینههای V850 (گزینههای 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 -mv850e2v3 -mv850e2 -mv850e1 -mv850es -mv850e -mv850 -mv850e3v5 -mloop -mrelax -mlong-jumps -msoft-float -mhard-float -mgcc-abi -mrh850-abi -mbig-switch.Sp گزینههای VAX (VAX Options) -munix -mgnu -md -md-float -mg -mg-float -mlra
گزینههای Visium (Visium Options) -mdebug -msim -mfpu -mno-fpu -mhard-float -msoft-float -mcpu=cpu-type -mtune=cpu-type -msv-mode -muser-mode
گزینههای VMS (VMS Options) -mvms-return-codes -mdebug-main=prefix -mmalloc64 -mpointer-size=size
گزینههای VxWorks (VxWorks Options) -mrtp -msmp -non-static -Bstatic -Bdynamic -Xbind-lazy -Xbind-now
گزینههای x86 (x86 Options) -mtune=cpu-type -march=cpu-type -mtune-ctrl=feature-list -mdump-tune-features -mno-default -mfpmath=unit -masm=dialect -mno-fancy-math-387 -mno-fp-ret-in-387 -m80387 -mhard-float -msoft-float -mno-wide-multiply -mrtd -malign-double -mpreferred-stack-boundary=num -mincoming-stack-boundary=num -mcld -mcx16 -msahf -mmovbe -mcrc32 -mmwait -mrecip -mrecip=opt -mvzeroupper -mprefer-avx128 -mprefer-vector-width=opt -mpartial-vector-fp-math -mmove-max=bits -mstore-max=bits -mnoreturn-no-callee-saved-registers -mmmx -msse -msse2 -msse3 -mssse3 -msse4.1 -msse4.2 -msse4 -mavx -mavx2 -mavx512f -mavx512cd -mavx512vl -mavx512bw -mavx512dq -mavx512ifma -mavx512vbmi -msha -maes -mpclmul -mfsgsbase -mrdrnd -mf16c -mfma -mpconfig -mwbnoinvd -mptwrite -mclflushopt -mclwb -mxsavec -mxsaves -msse4a -m3dnow -m3dnowa -mpopcnt -mabm -mbmi -mtbm -mfma4 -mxop -madx -mlzcnt -mbmi2 -mfxsr -mxsave -mxsaveopt -mrtm -mhle -mlwp -mmwaitx -mclzero -mpku -mthreads -mgfni -mvaes -mwaitpkg -mshstk -mmanual-endbr -mcet-switch -mforce-indirect-call -mavx512vbmi2 -mavx512bf16 -menqcmd -mvpclmulqdq -mavx512bitalg -mmovdiri -mmovdir64b -mavx512vpopcntdq -mavx512vnni -mprfchw -mrdpid -mrdseed -msgx -mavx512vp2intersect -mserialize -mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -muintr -mhreset -mavxvnni -mamx-fp8 -mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert -mcmpccxadd -mamx-fp16 -mprefetchi -mraoint -mamx-complex -mavxvnniint16 -msm3 -msha512 -msm4 -mapxf -musermsr -mavx10.1 -mavx10.1-256 -mavx10.1-512 -mevex512 -mavx10.2 -mamx-avx512 -mamx-tf32 -mamx-transpose -mmovrs -mamx-movrs -mcldemote -mms-bitfields -mno-align-stringops -minline-all-stringops -minline-stringops-dynamically -mstringop-strategy=alg -mkl -mwidekl -mmemcpy-strategy=strategy -mmemset-strategy=strategy -mpush-args -maccumulate-outgoing-args -m128bit-long-double -m96bit-long-double -mlong-double-64 -mlong-double-80 -mlong-double-128 -mregparm=num -msseregparm -mveclibabi=type -mvect8-ret-in-mem -mpc32 -mpc64 -mpc80 -mdaz-ftz -mstackrealign -momit-leaf-frame-pointer -mno-red-zone -mno-tls-direct-seg-refs -mcmodel=code-model -mabi=name -maddress-mode=mode -m32 -m64 -mx32 -m16 -miamcu -mlarge-data-threshold=num -msse2avx -mfentry -mrecord-mcount -mnop-mcount -m8bit-idiv -minstrument-return=type -mfentry-name=name -mfentry-section=name -mavx256-split-unaligned-load -mavx256-split-unaligned-store -malign-data=type -mstack-protector-guard=guard -mstack-protector-guard-reg=reg -mstack-protector-guard-offset=offset -mstack-protector-guard-symbol=symbol -mgeneral-regs-only -mcall-ms2sysv-xlogues -mrelax-cmpxchg-loop -mindirect-branch=choice -mfunction-return=choice -mindirect-branch-register -mharden-sls=choice -mindirect-branch-cs-prefix -mneeded -mno-direct-extern-access -munroll-only-small-loops -mlam=choice
گزینههای x86 Windows گزینههای Cygwin و MinGW را ببینید.
گزینههای Xstormy16 (Xstormy16 Options) -msim
گزینههای Xtensa (Xtensa Options) -mconst16 -mno-const16 -mfused-madd -mno-fused-madd -mforce-no-pic -mserialize-volatile -mno-serialize-volatile -mtext-section-literals -mno-text-section-literals -mauto-litpools -mno-auto-litpools -mtarget-align -mno-target-align -mlongcalls -mno-longcalls -mabi=abi-type -mextra-l32r-costs=cycles -mstrict-align -mno-strict-align
گزینههای zSeries گزینههای S/390 و zSeries را ببینید..SS "گزینههای کنترل نوع خروجی (Options Controlling the Kind of Output)" کامپایل میتواند شامل حداکثر چهار مرحله باشد: پیشپردازش، کامپایل اصلی، اسمبلی و پیوند دادن، که همواره به همین ترتیب انجام میشوند. GCC قادر است چندین فایل را پیشپردازش و کامپایل کرده و آنها را به چند فایل ورودی اسمبلر یا یک فایل ورودی اسمبلر تبدیل کند؛ سپس هر فایل ورودی اسمبلر یک فایل شیء (object file) تولید میکند و مرحلهٔ پیوند، تمام فایلهای شیء را (چه مواردی که بهتازگی کامپایل شدهاند و چه مواردی که به عنوان ورودی مشخص شدهاند) در یک فایل اجرایی با یکدیگر ترکیب میکند.
برای هر فایل ورودی دادهشده، پسوند نام فایل مشخص میکند که چه نوع کامپایلی انجام شود:
- file.c
- کد منبع C که باید پیشپردازش شود.
- file.i
- کد منبع C که نباید پیشپردازش شود.
- file.ii
- کد منبع C++ که نباید پیشپردازش شود.
- file.m
- کد منبع Objective-C. توجه داشته باشید که برای کارکرد یک برنامهٔ Objective-C، باید آن را با کتابخانهٔ libobjc پیوند دهید.
- file.mi
- کد منبع Objective-C که نباید پیشپردازش شود.
- file.mm
- file.M
- کد منبع Objective-C++. توجه داشته باشید که برای کارکرد یک برنامهٔ Objective-C++، باید آن را با کتابخانهٔ libobjc پیوند دهید. توجه داشته باشید که .M دقیقاً به حرف بزرگ M اشاره دارد.
- file.mii
- کد منبع Objective-C++ که نباید پیشپردازش شود.
- file.h
- فایل سرآیند C، C++، Objective-C یا Objective-C++ جهت تبدیل به یک سرآیند ازپیشکامپایلشده (پیشفرض)، یا فایل سرآیند C، C++ برای تبدیل به یک مشخصهٔ Ada (از طریق گزینهٔ -fdump-ada-spec).
- file.cc
- file.cp
- file.cxx
- file.cpp
- file.CPP
- file.c++
- file.C
- کد منبع C++ که باید پیشپردازش شود. توجه داشته باشید که در .cxx، دو حرف آخر باید دقیقاً هر دو x باشند. به همین ترتیب، .C دقیقاً به حرف بزرگ C اشاره دارد.
- file.mm
- file.M
- کد منبع Objective-C++ که باید پیشپردازش شود.
- file.mii
- کد منبع Objective-C++ که نباید پیشپردازش شود.
- file.hh
- file.H
- file.hp
- file.hxx
- file.hpp
- file.HPP
- file.h++
- file.tcc
- فایل سرآیند C++ جهت تبدیل به یک سرآیند ازپیشکامپایلشده یا مشخصهٔ Ada.
- file.f
- file.for
- file.ftn
- file.fi
- کد منبع Fortran با قالب ثابت (fixed form) که نباید پیشپردازش شود.
- file.F
- file.FOR
- file.fpp
- file.FPP
- file.FTN
- کد منبع Fortran با قالب ثابت که باید پیشپردازش شود (با پیشپردازندهٔ سنتی).
- file.f90
- file.f95
- file.f03
- file.f08
- file.fii
- کد منبع Fortran با قالب آزاد (free form) که نباید پیشپردازش شود.
- file.F90
- file.F95
- file.F03
- file.F08
- کد منبع Fortran با قالب آزاد که باید پیشپردازش شود (با پیشپردازندهٔ سنتی).
- file.cob
- file.COB
- file.cbl
- file.CBL
- کد منبع COBOL.
- file.go
- کد منبع Go.
- file.d
- کد منبع D.
- file.di
- فایل رابط D.
- file.dd
- کد مستندات D (موسوم به Ddoc).
- file.ads
- فایل کد منبع Ada که شامل اعلان واحد کتابخانه (اعلان یک بسته، زیربرنامه یا جنریک، یا نمونهسازی یک جنریک) یا اعلان تغییر نام واحد کتابخانه (اعلان تغییر نام یک بسته، جنریک یا زیربرنامه) است. به چنین فایلهایی specs نیز گفته میشود.
- file.adb
- فایل کد منبع Ada شامل بدنهٔ واحد کتابخانه (بدنهٔ یک زیربرنامه یا بسته). به چنین فایلهایی bodies نیز گفته میشود.
- file.s
- کد اسمبلی (Assembler)..IP file.S 4
- file.sx
- کد اسمبلی که باید پیشپردازش شود.
- other
- یک فایل شیء که مستقیماً به مرحلهٔ پیوند (linking) ارسال میشود. با هر نام فایلی بدون پسوند شناختهشده به همین روش رفتار میشود.
میتوانید زبان ورودی را صریحاً با گزینهٔ -x مشخص کنید:
- -x language
- زبان (language)
فایلهای
ورودی پس از
آن را
صریحاً
مشخص
میکند (به
جای اینکه
به
کامپایلر
اجازه داده
شود
پیشفرضی
را بر اساس
پسوند نام
فایل
انتخاب
کند). این
گزینه بر
همهٔ
فایلهای
ورودی پس از
آن تا
گزینهٔ -x
بعدی اعمال
میشود.
مقادیر
ممکن برای
language عبارتند
از:
c c-header cpp-output c++ c++-header c++-system-header c++-user-header c++-cpp-output objective-c objective-c-header objective-c-cpp-output objective-c++ objective-c++-header objective-c++-cpp-output assembler assembler-with-cpp ada cobol d f77 f77-cpp-input f95 f95-cpp-input go
توجه داشته باشید که -x به معنی یک استاندارد زبانی خاص نیست. برای مثال، ممکن است -x f77 برای برخی کدهای منبع قدیمیتر به -std=legacy نیز نیاز داشته باشد.
- -x none
- تعیین صریح هرگونه زبانی را خاموش میکند، بهطوری که فایلهای پس از آن بر اساس پسوند نام فایلشان پردازش میشوند (گویی اصلاً از -x استفاده نشده است).
اگر تنها مایلید برخی از مراحل کامپایل انجام شوند، میتوانید از -x (یا پسوندهای نام فایل) استفاده کنید تا به gcc بگویید از کجا شروع کند، و از یکی از گزینههای -c، -S یا -E برای تعیین محل توقف gcc استفاده نمایید. توجه داشته باشید که برخی ترکیبها (برای مثال، -x cpp-output -E) به gcc دستور میدهند که اصلاً هیچ کاری انجام ندهد.
- -c
- فایلهای
منبع را
کامپایل یا
اسمبلی
میکند،
اما پیوند (link)
نمیزند.
مرحلهٔ
پیوند
اصلاً
انجام
نمیشود.
خروجی
نهایی به
شکل یک فایل
شیء به ازای
هر فایل
منبع خواهد
بود.
بهطور پیشفرض، نام فایل شیء برای یک فایل منبع با جایگزین کردن پسوند .c، .i، .s و غیره با .o ساخته میشود.
فایلهای ورودی ناشناخته که نیازی به کامپایل یا اسمبلی ندارند، نادیده گرفته میشوند.
- -S
- پس از
مرحلهٔ
کامپایل
واقعی
متوقف
میشود؛
اسمبلی را
انجام
نمیدهد.
خروجی برای
هر فایل
ورودی
مشخصشده
که اسمبلی
نیست، به
شکل یک فایل
کد اسمبلی
خواهد بود.
بهطور پیشفرض، نام فایل اسمبلی برای یک فایل منبع با جایگزین کردن پسوند .c، .i و غیره با .s ساخته میشود.
فایلهای ورودی که نیازی به کامپایل ندارند، نادیده گرفته میشوند.
- -E
- پس از
مرحلهٔ
پیشپردازش
متوقف
میشود؛
کامپایلر
اصلی را
اجرا
نمیکند.
خروجی به
شکل کد منبع
پیشپردازششده
است که به
خروجی
استاندارد
فرستاده
میشود.
فایلهای ورودی که نیازی به پیشپردازش ندارند، نادیده گرفته میشوند.
- -o file
- خروجی اصلی
را در فایل
file قرار
میدهد. این
به هر نوع
خروجی
تولیدشده،
خواه یک
فایل
اجرایی
باشد، یک
فایل شیء،
یک فایل
اسمبلی یا
کد C
پیشپردازششده
اعمال
میشود.
اگر -o مشخص نشده باشد، حالت پیشفرض قرار دادن یک فایل اجرایی در a.out، فایل شیء برای source.suffix در source.o، فایل اسمبلی آن در source.s، یک فایل سرایند پیشکامپایلشده در source.suffix.gch و تمام کد منبع C پیشپردازششده در خروجی استاندارد است.
اگرچه -o تنها خروجی اصلی را نامگذاری میکند، اما بر نامگذاری خروجیهای کمکی (auxiliary) و رونوشت (dump) نیز تأثیر میگذارد. مثالهای زیر را ببینید. مگر اینکه بازنویسی شوند، هر دو خروجی کمکی و رونوشت در همان دایرکتوری خروجی اصلی قرار میگیرند. در خروجیهای کمکی، پسوند فایل ورودی با پسوند نوع فایل خروجی کمکی جایگزین میشود؛ در خروجیهای رونوشت، پسوند فایل رونوشت به پسوند فایل ورودی الحاق میگردد. در دستورهای کامپایل، نام پایهٔ هر دو خروجی کمکی و رونوشت همان نام پایه خروجی اصلی است؛ در دستورهای کامپایل و پیوند، نام خروجی اصلی منهای پسوند اجرایی با نام فایل ورودی ترکیب میشود. اگر هر دو بدون در نظر گرفتن پسوند، نام پایهٔ یکسانی داشته باشند، حاصل این ترکیب همان نام پایه خواهد بود؛ در غیر این صورت، آنها با یک خط پیوند به هم متصل میشوند.
gcc -c foo.c ...
از foo.o به عنوان خروجی اصلی استفاده میکند و خروجیهای کمکی و رونوشتها را در کنار آن قرار میدهد؛ مثلاً فایل کمکی foo.dwo برای -gsplit-dwarf و فایل رونوشت foo.c.???r.final برای -fdump-rtl-final.
اگر یک فایل خروجی غیرپیوندی بهطور صریح مشخص شده باشد، فایلهای کمکی و رونوشت بهطور پیشفرض همان نام پایه را میگیرند:
gcc -c foo.c -o dir/foobar.o ...
خروجیهای کمکی را به نام dir/foobar.* و خروجیهای رونوشت را به نام dir/foobar.c.* نامگذاری خواهد کرد.
یک خروجی پیونددهنده در عوض به عنوان پیشوند برای خروجیهای کمکی و رونوشت عمل خواهد کرد:
gcc foo.c bar.c -o dir/foobar ...
بهطور کلی خروجیهای کمکی را dir/foobar-foo.* و dir/foobar-bar.*، و خروجیهای رونوشت را dir/foobar-foo.c.* و dir/foobar-bar.c.* نامگذاری خواهد کرد.
تنها استثنا برای موارد بالا زمانی است که فایل اجرایی نام پایهای مشترک با تک ورودی داشته باشد:
gcc foo.c -o dir/foo ...
که در این صورت خروجیهای کمکی dir/foo.* و خروجیهای رونوشت dir/foo.c.* نامگذاری میشوند.
مکان و نامهای خروجیهای کمکی و رونوشت را میتوان با گزینههای -dumpbase، -dumpbase-ext، -dumpdir، -save-temps=cwd و -save-temps=obj تنظیم کرد.
- -dumpbase dumpbase
- این گزینه
نام پایه را
برای
فایلهای
خروجی کمکی
و رونوشت
تعیین
میکند. این
گزینه بر
نام فایل
خروجی اصلی
تأثیری
ندارد.
خروجیهای
میانی،
هنگام حفظ
شدن، به
عنوان
خروجی اصلی
در نظر
گرفته
نمیشوند،
بلکه به
عنوان
خروجی کمکی
به حساب
میآیند:
gcc -save-temps -S foo.c
فایل پیشپردازششدهٔ (دیگر غیر) موقت را در foo.i ذخیره میکند و سپس به فایل خروجی (ضمنی) foo.s کامپایل میکند، در حالی که:
gcc -save-temps -dumpbase save-foo -c foo.c
در save-foo.i پیشپردازش کرده، به save-foo.s (که اکنون یک خروجی میانی و در نتیجه کمکی است) کامپایل میکند و سپس به فایل خروجی (ضمنی) foo.o اسمبلی میکند.
در نبود این گزینه، فایلهای رونوشت و کمکی نام خود را از فایل ورودی میگیرند، یا اگر فایلی صریحاً مشخص شده باشد، از فایل خروجی (غیرپیوندی): فایلهای خروجی رونوشت (مانند مواردی که با گزینههای -fdump-* درخواست شدهاند) با پسوند نام ورودی، و فایلهای خروجی کمکی (مواردی که توسط گزینههای غیر رونوشت دیگر درخواست شدهاند، مانند "-save-temps"، "-gsplit-dwarf"، "-fcallgraph-info") بدون آن.
تفکیک پسوند مشابهی برای خروجیهای رونوشت و کمکی میتواند برای -dumpbase basename.suf صریحاً دادهشده، با مشخص کردن -dumpbase-ext .suf نیز حاصل شود.
اگر dumpbase صریحاً با هرگونه مؤلفهٔ دایرکتوری مشخص شود، هرگونه مشخصهٔ dumppfx (مانند -dumpdir یا -save-temps=*) نادیده گرفته میشود و به جای الحاق به آن، dumpbase کاملاً آن را بازنویسی میکند: gcc foo.c -c -o dir/foo.o -dumpbase alt/foo \ -dumpdir pfx- -save-temps=cwd ...
خروجیهای کمکی و تخلیه (dump) را با نام alt/foo.* ایجاد میکند، با نادیده گرفتن dir/ در -o، پیشوند ./ ضمنیِ ناشی از -save-temps=cwd، و pfx- در -dumpdir.
هنگامی که -dumpbase در دستوری مشخص شود که چندین ورودی را کامپایل میکند، یا کامپایل و سپس پیوند (link) انجام میدهد، ممکن است با dumppfx، همانطور که ذیل -dumpdir مشخص شده، ترکیب شود. سپس، هر فایل ورودی با استفاده از dumppfx ترکیبی کامپایل شده، و مقادیر پیشفرض برای dumpbase و auxdropsuf به ازای هر فایل ورودی محاسبه میشود:
gcc foo.c bar.c -c -dumpbase main ...
فایلهای foo.o و bar.o را بهعنوان خروجیهای اصلی ایجاد میکند، و با استفاده از dumpbase بهعنوان پیشوند، از بازنویسی خروجیهای کمکی و dump جلوگیری کرده، و خروجیهای کمکی و dump را با نامهای main-foo.* و main-bar.* میسازد.
مشخص کردن یک رشته خالی بهعنوان dumpbase از تأثیر نام پایه (basename) خروجی در نامگذاری خروجیهای کمکی و dump در طول کامپایل جلوگیری کرده و مقادیر پیشفرض را محاسبه میکند:
gcc -c foo.c -o dir/foobar.o -dumpbase " ...
خروجیهای کمکی را dir/foo.* و خروجیهای dump را dir/foo.c.* نامگذاری خواهد کرد. توجه داشته باشید که چگونه نامهای پایه آنها از نام ورودی گرفته شده، اما دایرکتوری همچنان بهطور پیشفرض همان دایرکتوری خروجی است.
رشتهٔ خالی dumpbase مانع استفاده از نام پایه خروجی برای خروجیها در هنگام پیوند دادن (linking) نمیشود:
gcc foo.c bar.c -o dir/foobar -dumpbase " -flto ...
کامپایل فایلهای منبع، خروجیهای کمکی را به نامهای dir/foo.* و dir/bar.*، و خروجیهای dump را dir/foo.c.* و dir/bar.c.* نامگذاری خواهد کرد. کامپایل مجدد LTO در زمان پیوند دادن از dir/foobar. بهعنوان پیشوند فایلهای dump و کمکی استفاده خواهد کرد.
- -dumpbase-ext auxdropsuf
- هنگام ساخت
نام یک فایل
خروجی کمکی
(و نه dump)، پیش
از افزودن
هرگونه
پسوند، auxdropsuf
انتهایی را
از dumpbase حذف
میکند. در
صورت عدم
تعیین،
مقدار
پیشفرض
این گزینه
پسوند dumpbase
پیشفرض
خواهد بود؛
یعنی پسوند
فایل ورودی
هنگامی که
-dumpbase در خط
فرمان مشخص
نشده باشد،
یا زمانی که
dumpbase با dumppfx
ترکیب شود.
gcc foo.c -c -o dir/foo.o -dumpbase x-foo.c -dumpbase-ext .c ...
فایل dir/foo.o را بهعنوان خروجی اصلی ایجاد کرده و خروجیهای کمکی را در dir/x-foo.* تولید میکند، با در نظر گرفتن مکان خروجی اصلی و حذف پسوند .c از dumpbase. خروجیهای dump پسوند را حفظ میکنند: dir/x-foo.c.*.
اگر این گزینه با پسوند dumpbase مشخصشده همخوانی نداشته باشد نادیده گرفته میشود، مگر بهعنوان جایگزینی برای پسوند فایل اجرایی هنگام افزودن نام پایه خروجی پیونددهنده به dumppfx، همانطور که در زیر مشخص شده است:
gcc foo.c bar.c -o main.out -dumpbase-ext .out ...
فایل main.out را بهعنوان خروجی اصلی ایجاد میکند، و با استفاده از نام فایل اجرایی منهای auxdropsuf بهعنوان پیشوند، از بازنویسی خروجیهای کمکی و dump جلوگیری میکند و خروجیهای کمکی با نامهای main-foo.* و main-bar.* و خروجیهای dump با نامهای main-foo.c.* و main-bar.c.* میسازد.
- -dumpdir dumppfx
- هنگام ساخت
نام یک فایل
خروجی کمکی
یا dump، از dumppfx
بهعنوان
پیشوند
استفاده
میکند:
gcc -dumpdir pfx- -c foo.c ...
فایل foo.o را بهعنوان خروجی اصلی و خروجیهای کمکی را با نام pfx-foo.* ایجاد میکند و dumppfx دادهشده را با dumpbase پیشفرض که از خروجی اصلی پیشفرض مشتق شده (که خود نیز از نام ورودی مشتق شده است) ترکیب مینماید. خروجیهای dump نیز پسوند نام ورودی را میگیرند: pfx-foo.c.*.
اگر قرار است از dumppfx بهصورت نام دایرکتوری استفاده شود، باید به یک جداکننده دایرکتوری ختم گردد:
gcc -dumpdir dir/ -c foo.c -o obj/bar.o ...
فایل obj/bar.o را بهعنوان خروجی اصلی و خروجیهای کمکی را با نام dir/bar.* ایجاد میکند که dumppfx دادهشده را با dumpbase پیشفرض مشتقشده از نام خروجی اصلی ترکیب مینماید. خروجیهای dump نیز پسوند نام ورودی را دریافت میکنند: dir/bar.c.*.
این مقدار بهطور پیشفرض به مکان فایل خروجی تنظیم میشود، مگر اینکه فایل خروجی یک فایل خاص مانند "/dev/null" باشد. گزینههای -save-temps=cwd و -save-temps=obj درست مانند یک گزینه صریح -dumpdir، این مقدار پیشفرض را لغو میکنند. در صورتی که چندین گزینه از این دست داده شوند، آخرین مورد اولویت خواهد داشت:
gcc -dumpdir pfx- -c foo.c -save-temps=obj ...
فایل foo.o را تولید میکند و خروجیهای کمکی با نام foo.* خواهند بود، چرا که -save-temps=* بر dumppfx تعیینشده توسط گزینه پیشین -dumpdir اولویت دارد. اینکه =obj مقدار پیشفرض -save-temps است، یا اینکه دایرکتوری خروجی بهطور ضمنی دایرکتوری جاری است، تفاوتی ایجاد نمیکند. خروجیهای dump بهصورت foo.c.* نامگذاری میشوند.
هنگام کامپایل از چندین فایل ورودی، در صورت مشخص بودن -dumpbase، مقدار dumpbase منهای پسوند auxdropsuf بههمراه یک خط تیره (dash) به dumppfx صریح یا پیشفرض الحاق میشود (یا اگر شامل مؤلفههای دایرکتوری باشد، جایگزین آن میگردد)، بهطوری که هر یک از کامپایلهای چندگانه خروجیهای کمکی و dump با نامهای متفاوتی دریافت کنند.
gcc foo.c bar.c -c -dumpdir dir/pfx- -dumpbase main ...
خروجیهای dump کمکی را با افزودن dumpbase- به dumppfx، در dir/pfx-main-foo.* و dir/pfx-main-bar.* تولید میکند. خروجیهای dump بهترتیب پسوند فایل ورودی را حفظ میکنند: dir/pfx-main-foo.c.* و dir/pfx-main-bar.c.*. این مورد را با کامپایل تکورودی مقایسه کنید:
gcc foo.c -c -dumpdir dir/pfx- -dumpbase main ...
که با اعمال -dumpbase بر یک فایل منبع واحد، یک dumpbase مجزا به ازای هر فایل ورودی محاسبه و الحاق نمیکند. خروجیهای کمکی و dump آن در dir/pfx-main.* قرار میگیرند.
هنگام کامپایل و سپس پیوند دادن از چندین فایل ورودی، dumppfx پیشفرض یا صریحاً مشخصشده نیز تحت تبدیل dumpbase- بالا قرار میگیرد (مانند کامپایل foo.c و bar.c در بالا، اما بدون -c). اگر نه -dumpdir و نه -dumpbase داده نشده باشند، در عوض نام پایه خروجی پیونددهنده منهای auxdropsuf (در صورت تعیین) یا منهای پسوند فایل اجرایی (در غیر این صورت) بههمراه یک خط تیره به dumppfx پیشفرض الحاق میگردد. البته توجه داشته باشید که برخلاف موارد پیشین پیوند دادن:
gcc foo.c bar.c -dumpdir dir/pfx- -o main ...
نام خروجی main را به dumppfx الحاق نمیکند، زیرا -dumpdir بهصورت صریح مشخص شده است. هدف این است که dumppfx تعیینشده بهصورت صریح بتواند در صورت تمایل نام خروجی مشخصشده را بهعنوان بخشی از پیشوند شامل شود؛ تنها یک -dumpbase صریحاً مشخصشده با آن ترکیب میشود تا از نادیده گرفتن یک گزینه معنادار پرهیز گردد.
هنگام کامپایل و سپس پیوند دادن از یک فایل ورودی واحد، نام پایه خروجی پیونددهنده تنها در صورتی مانند بالا به dumppfx پیشفرض الحاق میشود که نام پایه مشترکی با نام فایل ورودی واحد نداشته باشد. این مسئله در موارد پیوند تکورودی در بالا بیان شد، اما نه با یک -dumpdir صریح که مانع ترکیب میشود، حتی اگر توسط -save-temps=* لغو شده باشد:
gcc foo.c -dumpdir alt/pfx- -o dir/main.exe -save-temps=cwd ...
خروجیهای کمکی با نام foo.* و خروجیهای dump با نام foo.c.*، در دایرکتوری کاری جاری همانطور که نهایتاً توسط -save-temps=cwd درخواست شده است، ذخیره میشوند.
برای جمعبندی کلی بهمنظور درک شهودی گرچه با دقتی اندک از جریان داده: نام خروجی اصلی به یک بخش دایرکتوری و یک بخش نام پایه (basename) تقسیم میشود؛ dumppfx روی اولی تنظیم میگردد، مگر اینکه توسط -dumpdir یا -save-temps=* لغو شود، و dumpbase روی دومی تنظیم میگردد، مگر اینکه توسط -dumpbase لغو شود. اگر ورودیهای چندگانه یا پیوند دادن در میان باشد، این dumpbase ممکن است با dumppfx ترکیب شده و از هر فایل ورودی گرفته شود. نامهای خروجی کمکی برای هر ورودی با ترکیب dumppfx، dumpbase منهای پسوند، و پسوند خروجی کمکی ساخته میشوند؛ نامهای خروجی dump تنها از این حیث تفاوت دارند که پسوند dumpbase در آنها حفظ میشود.
در خصوص خروجیهای کمکی و dump ایجادشده حین کامپایل مجدد LTO، ترکیبی از dumppfx و dumpbase، همانطور که داده شده یا از نام خروجی پیونددهنده (و نه ورودیها) مشتق شده باشد—حتی در مواردی که این ترکیب در غیر این صورت بدین شکل استفاده نمیشد—بههمراه یک نقطه در انتها که جایگزین خط تیره افزودهشده توسط کامپایلر (در صورت وجود) میشود، بهعنوان گزینه -dumpdir به lto-wrapper منتقل میگردد؛ با توجه به اینکه این برنامه درگیر پیوند دادن است، معمولاً هیچ -dumpbase و -dumpbase-ext دریافت نمیکند و آنها را نادیده میگیرد.
هنگام اجرای زیرکامپایلرها، lto-wrapper نامهای مراحل LTO را به dumppfx دریافتشده الحاق میکند، اطمینان حاصل مینماید که حاوی مؤلفه دایرکتوری باشد تا هرگونه -dumpdir را لغو کند، و آن را بهعنوان -dumpbase به زیرکامپایلرها ارسال مینماید..IP -v 4 دستورهای اجراشده برای پیشبرد مراحل کامپایل را (در خروجی خطای استاندارد) چاپ میکند. همچنین شماره نگارش برنامهٔ راهانداز کامپایلر، پیشپردازنده و خود کامپایلر را چاپ میکند.
- -###
- مانند -v است، با این تفاوت که دستورها اجرا نمیشوند و آرگومانها نقلقولبندی میشوند مگر آنکه فقط شامل نویسههای الفبایی-عددی یا "./-_" باشند. این گزینه برای اسکریپتهای شل جهت ثبت خطوط دستور تولیدشده توسط راهانداز مفید است.
- --help
- توضیحاتی دربارهٔ گزینههای خط فرمانی که برای gcc قابل فهم است را (در خروجی استاندارد) چاپ میکند. اگر گزینهٔ -v نیز مشخص شده باشد، --help به فرایندهای گوناگونی که توسط gcc فراخوانی میشوند نیز ارسال میشود تا آنها بتوانند گزینههای خط فرمان پذیرفتهشده توسط خود را نمایش دهند. اگر گزینهٔ -Wextra نیز (پیش از گزینهٔ --help) مشخص شده باشد، گزینههای خط فرمانی که هیچ مستنداتی ندارند نیز نمایش داده میشوند.
- --target-help
- شرحی از گزینههای خط فرمان ویژهٔ هر هدف را برای هر ابزار (در خروجی استاندارد) چاپ میکند. برای برخی اهداف، ممکن است اطلاعات ویژهٔ هدف بیشتری نیز چاپ شود.
- --help={class|[^]qualifier}[,...]
- توضیحاتی از گزینههای خط فرمان قابل فهم برای کامپایلر را که در تمام ردهها و توصیفکنندههای مشخصشده میگنجند (در خروجی استاندارد) چاپ میکند. ردههای پشتیبانیشده عبارتند از:
- optimizers
- تمام گزینههای بهینهسازی پشتیبانیشده توسط کامپایلر را نمایش میدهد.
- warnings
- تمام گزینههای کنترلکنندهٔ پیامهای هشداری که کامپایلر تولید میکند را نمایش میدهد.
- target
- گزینههای ویژهٔ هدف را نمایش میدهد. با این حال، بر خلاف گزینهٔ --target-help، گزینههای ویژهٔ هدف پیونددهنده و اسمبلر نمایش داده نمیشوند؛ زیرا این ابزارها در حال حاضر از نحو تعمیمیافتهٔ --help= پشتیبانی نمیکنند.
- params
- مقادیر شناختهشده توسط گزینهٔ --param را نمایش میدهد.
- language
- گزینههای پشتیبانیشده برای language را نمایش میدهد، که در آن language نام یکی از زبانهای پشتیبانیشده در این نگارش از GCC است. اگر گزینهای توسط همهٔ زبانها پشتیبانی شود، باید ردهٔ common انتخاب شود.
- common
- گزینههایی را که میان تمام زبانها مشترک هستند نمایش میدهد.
توصیفکنندههای پشتیبانیشده عبارتند از:
- undocumented
- تنها آن دسته از گزینههایی را نمایش میدهد که فاقد مستندات هستند.
- joined
- گزینههایی را نمایش میدهد که آرگومانی را میپذیرند که پس از علامت مساوی در همان متن پیوسته میآید، مانند: --help=target.
- separate
- گزینههایی را نمایش میدهد که آرگومانی را بهصورت کلمهای جداگانه پس از گزینهٔ اصلی میپذیرند، مانند: -o output-file.
بنابراین برای مثال، جهت نمایش تمام سوییچهای ویژهٔ هدف مستندنشده که توسط کامپایلر پشتیبانی میشوند، استفاده کنید از:
--help=target,undocumented
معنای یک توصیفکننده میتواند با افزودن نویسهٔ ^ به ابتدای آن معکوس شود، بنابراین برای مثال جهت نمایش تمام گزینههای هشدار دوحالته (یعنی مواردی که یا روشن هستند یا خاموش و آرگومانی نمیپذیرند) که دارای توضیحات هستند، استفاده کنید از:
--help=warnings,^joined,^undocumented
آرگومان ورودی به --help= نباید صرفاً از توصیفکنندههای معکوسشده تشکیل شده باشد.
ترکیب چندین رده امکانپذیر است، هرچند معمولاً خروجی را چنان محدود میکند که چیزی برای نمایش باقی نمیماند. با این حال یک مورد که در آن کار میکند زمانی است که یکی از ردهها target باشد. برای نمونه، جهت نمایش تمام گزینههای بهینهسازی ویژهٔ هدف، استفاده کنید از:
--help=target,optimizers
گزینهٔ --help= میتواند در خط فرمان تکرار شود. هر بار استفادهٔ متوالی، ردهٔ درخواستی گزینهها را نمایش میدهد و مواردی را که پیشتر نمایش داده شدهاند نادیده میگیرد. اگر --help نیز در هر کجای خط فرمان مشخص شده باشد، بر هر گزینهٔ --help= دیگری اولویت خواهد داشت.
اگر گزینهٔ -Q در خط فرمان قبل از گزینهٔ --help= ظاهر شود، متن توضیحی نمایش داده شده توسط --help= تغییر میکند. به جای شرح گزینههای نمایش دادهشده، مشخص میشود که آیا گزینه فعال، غیرفعال یا روی مقدار خاصی تنظیم شده است (با این فرض که کامپایلر در نقطهای که گزینهٔ --help= استفاده شده این موضوع را بداند).
در اینجا یک مثال کوتاهشده از پورت ARM برای gcc آورده شده است:
% gcc -Q -mabi=2 --help=target -c The following options are target specific: -mabi= 2 -mabort-on-noreturn [disabled] -mapcs [disabled]
خروجی نسبت به اثرات گزینههای پیشین خط فرمان حساس است، بنابراین به عنوان مثال میتوان فهمید که کدام بهینهسازیها در -O2 فعال هستند با استفاده از:
-Q -O2 --help=optimizers
همچنین میتوانید بهینهسازیهای دوحالتهای را که توسط -O3 فعال میشوند کشف کنید با استفاده از:
gcc -c -Q -O3 --help=optimizers > /tmp/O3-opts gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts diff /tmp/O2-opts /tmp/O3-opts | grep enabled
- --version
- شمارهٔ نگارش و حق تکثیر (کپیرایت) GCC فراخوانیشده را نمایش میدهد.
- -pass-exit-codes
- بهطور معمول اگر هر مرحله از کامپایلر یک کد بازگشتی غیرموفق بازگرداند، برنامهٔ gcc با کد خروج ۱ پایان مییابد. اگر -pass-exit-codes را مشخص کنید، برنامهٔ gcc در عوض با بزرگترین کد خطای عددی حاصل از هر مرحلهای که نشانگر خطا بوده است خارج میشود. بخشهای فرانتاند زبانهای C، C++ و Fortran در صورت مواجهه با خطای داخلی کامپایلر، کد ۴ را بازمیگردانند.
- -pipe
- استفاده از لولهها (pipe) به جای فایلهای موقت برای برقراری ارتباط بین مراحل مختلف کامپایل. این گزینه در برخی سیستمهایی که اسمبلر قادر به خواندن از لوله نیست کار نمیکند؛ اما اسمبلر GNU مشکلی در این مورد ندارد.
- -specs=file
- پردازش file پس از خواندن فایل استاندارد specs توسط کامپایلر، به منظور بازنویسی و جایگزینی مقادیر پیشفرضی که برنامهٔ راهانداز gcc هنگام تعیین سوییچهای ارسالی به cc1، cc1plus، as، ld و غیره استفاده میکند. بیش از یک -specs=file میتواند در خط فرمان مشخص شود و آنها به ترتیب، از چپ به راست پردازش میشوند.
- -wrapper
- تمام
زیردستورها
را ذیل یک
برنامهٔ
لفاف (wrapper)
فراخوانی
میکند. نام
برنامهٔ
لفاف و
پارامترهای
آن به صورت
فهرستی
جداشده با
کاما ارسال
میشوند.
gcc -c t.c -wrapper gdb,--args
این دستور تمام زیربرنامههای gcc را تحت gdb --args فراخوانی میکند، بنابراین فراخوانی cc1 به صورت gdb --args cc1 ... خواهد بود..IP -ffile-prefix-map=old=new 4 هنگام کامپایل فایلهای موجود در دایرکتوری old، هرگونه ارجاع به آنها در نتیجهٔ کامپایل به گونهای ثبت میشود که گویی فایلها در دایرکتوری new قرار دارند. مشخص کردن این گزینه معادل با مشخص کردن تمام گزینههای منفرد -f*-prefix-map است. از این گزینه میتوان برای ایجاد ساختهای بازتولیدپذیر (reproducible builds) که مستقل از مکان هستند استفاده کرد. دایرکتوریهای ارجاعشده توسط دیرکتیوها تحت تأثیر این گزینهها قرار نمیگیرند. همچنین نگاه کنید به -fmacro-prefix-map، -fdebug-prefix-map، -fprofile-prefix-map و -fcanon-prefix-map.
- -fcanon-prefix-map
- برای گزینههای -f*-prefix-map، به طور معمول مقایسهٔ پیشوند old با نام فایلی که معمولاً در نتیجهٔ کامپایل به آن ارجاع داده میشود، با استفاده از مقایسهٔ متنی پیشوندها یا نادیده گرفتن بزرگی و کوچکی حروف در سیستمهای فایل غیرحساس به حروف کوچک و بزرگ و برابر دانستن اسلش و بکاسلش در سیستمهای فایل مبتنی بر DOS انجام میشود. گزینهٔ -fcanon-prefix-map باعث میشود اینگونه مقایسهها روی مسیرهای استانداردشدهٔ (canonicalized) old و نام فایل ارجاعشده انجام شود.
- -fplugin=name.so
- کد افزونه (پلاگین) موجود در فایل name.so را بارگذاری میکند، با این فرض که یک شیء اشتراکی است که باید توسط کامپایلر dlopen' شود. نام پایهٔ فایل شیء اشتراکی برای شناسایی افزونه جهت تجزیهٔ آرگومانها استفاده میشود (به -fplugin-arg-name-key=value در زیر مراجعه کنید). هر افزونه باید توابع بازفراخوانی (callback) مشخصشده در Plugins API را تعریف کند.
- -fplugin-arg-name-key=value
- یک آرگومان به نام key با مقدار value را برای افزونهای به نام name تعریف میکند.
- -fdump-ada-spec[-slim]
- برای فایلهای منبع و گنجاندنی (include) زبانهای C و C++، مشخصات متناظر زبان Ada را تولید میکند.
- -fada-spec-parent=unit
- در ترکیب با -fdump-ada-spec[-slim] بالا، مشخصات Ada را به عنوان واحدهای فرزند از واحد والد unit تولید میکند.
- -fdump-go-spec=file
- برای فایلهای ورودی به هر زبانی، اعلانهای متناظر زبان Go را در file تولید میکند. این گزینه اعلانهای "const"، "type"، "var" و "func" زبان Go را ایجاد میکند که میتواند روشی مفید برای آغاز نوشتن یک واسط Go برای کدهای نوشتهشده به زبانی دیگر باشد.
- @file
- گزینههای
خط فرمان را
از file
میخواند.
گزینههای
خواندهشده
به جای
گزینهٔ
اصلی @file درج
میشوند.
اگر file وجود
نداشته
باشد یا
قابل
خواندن
نباشد، با
این گزینه
به صورت
لفظی رفتار
میشود و
حذف نخواهد
شد.
گزینهها در file با نویسههای فاصله خالی (whitespace) از هم جدا میشوند. یک نویسهٔ فاصله میتواند با محصور کردن کل گزینه در علامت نقلقول تکی یا دوتایی درون یک گزینه گنجانده شود. هر نویسهای (از جمله بکاسلش) میتواند با افزودن یک پیشوند بکاسلش به آن درج شود. خود file میتواند شامل گزینههای @file دیگری نیز باشد؛ هر نوع گزینه از این دست به صورت بازگشتی پردازش خواهد شد.
کامپایل برنامههای C++ (Compiling C++ Programs)
فایلهای منبع C++ طبق قرارداد از یکی از پسوندهای .C، .cc، .cpp، .CPP، .c++، .cp یا .cxx استفاده میکنند؛ فایلهای سرآیند C++ اغلب از .hh، .hpp، .H یا (برای کدهای قالب اشتراکی) .tcc استفاده میکنند؛ فایلهای پیشپردازششدهٔ C++ از پسوند .ii استفاده میکنند؛ و واحدهای واسط ماژول C++20 گاهی از .ixx، .cppm، .cxxm، .c++m یا .ccm استفاده میکنند.
ابزار GCC فایلهایی با این نامها را شناسایی کرده و آنها را به عنوان برنامههای C++ کامپایل میکند، حتی اگر کامپایلر را همانند روش کامپایل برنامههای C فراخوانی کنید (معمولاً با نام gcc).
با این حال، استفاده از gcc کتابخانهٔ C++ را اضافه نمیکند. g++ برنامهای است که GCC را فراخوانی کرده و پیوند دادن با کتابخانهٔ C++ را به صورت خودکار مشخص میکند. این برنامه با فایلهای .c، .h و .i مانند فایلهای منبع C++ به جای فایلهای منبع C رفتار میکند، مگر اینکه از -x استفاده شود. این برنامه همچنین هنگام پیشکامپایل کردن یک فایل سرآیند C با پسوند .h برای استفاده در کامپایلهای C++ کاربرد دارد. در بسیاری از سیستمها، g++ با نام c++ نیز نصب میشود.
هنگام کامپایل برنامههای C++، میتوانید بسیاری از همان گزینههای خط فرمانی را مشخص کنید که برای کامپایل برنامهها در هر زبان دیگری به کار میبرید؛ یا گزینههای خط فرمانی که برای C و زبانهای وابسته معنادار هستند؛ یا گزینههایی که تنها برای برنامههای C++ کاربرد دارند..SS "گزینههای کنترل گویش C (Options Controlling C Dialect)" گزینههای زیر گویش زبان C (یا زبانهای برگرفته از C مانند C++، Objective-C و Objective-C++) را که کامپایلر میپذیرد، کنترل میکنند:
- -ansi
- در حالت C، این گزینه معادل -std=c90 است. در حالت C++، معادل -std=c++98 است.
- -std=
- استاندارد
زبان را
تعیین
میکند. این
گزینه در
حال حاضر
تنها هنگام
کامپایل C
یا C++
پشتیبانی
میشود.
کامپایلر میتواند چندین استاندارد پایه مانند c90 یا c++98، و گویشهای گنو (GNU) از این استانداردها مانند gnu90 یا gnu++98 را بپذیرد. هنگامی که یک استاندارد پایه مشخص میشود، کامپایلر تمام برنامههای منطبق بر آن استاندارد و همچنین برنامههایی را که از افزونههای گنوی غیرمتناقض با آن استفاده میکنند، میپذیرد. برای نمونه، -std=c90 برخی از ویژگیهای GCC را که با ISO C90 ناسازگار هستند (مانند کلمات کلیدی "asm" و "typeof") خاموش میکند، اما سایر افزونههای گنو را که در ISO C90 فاقد معنا هستند (مانند حذف عبارت میانی در یک عبارت "?:")، غیرفعال نمیسازد. از سوی دیگر، هنگامی که یک گویش گنو از یک استاندارد مشخص میشود، تمام ویژگیهای پشتیبانیشده توسط کامپایلر فعال میشوند، حتی اگر آن ویژگیها معنای استاندارد پایه را تغییر دهند. در نتیجه، ممکن است برخی برنامههای کاملاً منطبق بر استاندارد (strict-conforming) رد شوند. استاندارد مشخصشده توسط -Wpedantic برای شناسایی اینکه کدام ویژگیها با توجه به آن نسخه از استاندارد افزونههای گنو محسوب میشوند، استفاده میشود. برای نمونه، -std=gnu90 -Wpedantic دربارهٔ کامنتهای سبک C++ با // هشدار میدهد، در حالی که -std=gnu99 -Wpedantic هشداری نمیدهد.
باید مقداری برای این گزینه مشخص شود؛ مقادیر ممکن عبارتند از:
- c90
- c89
- iso9899:1990
- پشتیبانی از تمام برنامههای ISO C90 (افزونههای خاص گنو که با ISO C90 در تضاد هستند غیرفعال میشوند). برای کد C معادل -ansi است.
- iso9899:199409
- استاندارد ISO C90 همراه با اصلاحات انجامشده در اصلاحیه ۱ (amendment 1).
- c99
- c9x
- iso9899:1999
- iso9899:199x
- استاندارد ISO C99. این استاندارد اساساً به طور کامل پشتیبانی میشود، به جز باگها و مسائل مربوط به ممیز شناور (floating-point) (که عمدتاً، اما نه کاملاً، به ویژگیهای اختیاری C99 در پیوستهای F و G مربوط میشوند). برای اطلاعات بیشتر به https://gcc.gnu.org/c99status.html مراجعه کنید. نامهای c9x و iso9899:199x منسوخ شدهاند.
- c11
- c1x
- iso9899:2011
- استاندارد ISO C11، بازنگری سال ۲۰۱۱ استاندارد ISO C. این استاندارد اساساً به طور کامل پشتیبانی میشود، به جز باگها، مسائل ممیز شناور (عمدتاً اما نه منحصراً مربوط به ویژگیهای اختیاری C11 در پیوستهای F و G) و پیوستهای اختیاری K (رابطهای بررسی محدوده یا Bounds-checking interfaces) و L (تحلیلپذیری یا Analyzability). نام c1x منسوخ شده است.
- c17
- c18
- iso9899:2017
- iso9899:2018
- استاندارد ISO C17، بازنگری سال ۲۰۱۷ استاندارد ISO C (منتشرشده در ۲۰۱۸). این استاندارد به جز تصحیح کاستیها و ایرادات (که همگی با -std=c11 نیز اعمال میشوند) و یک مقدار جدید برای "__STDC_VERSION__"، همانند C11 است و بنابراین تا همان اندازهٔ C11 پشتیبانی میشود.
- c23
- c2x
- iso9899:2024
- استاندارد ISO C23، بازنگری سال ۲۰۲۳ استاندارد ISO C (منتشرشده در ۲۰۲۴). نام c2x منسوخ شده است.
- c2y
- نسخهٔ بعدی استاندارد ISO C که همچنان در حال توسعه است. پشتیبانی از این نسخه آزمایشی و ناقص است.
- gnu90
- gnu89
- گویش گنو از ISO C90 (شامل برخی از ویژگیهای C99).
- gnu99
- gnu9x
- گویش گنو از ISO C99. نام gnu9x منسوخ شده است.
- gnu11
- gnu1x
- گویش گنو از ISO C11. نام gnu1x منسوخ شده است.
- gnu17
- gnu18
- گویش گنو از ISO C17.
- gnu23
- gnu2x
- گویش گنو از ISO C23. این مقدار پیشفرض برای کدهای C است. نام gnu2x منسوخ شده است.
- gnu2y
- نسخهٔ بعدی استاندارد ISO C، همچنان در حال توسعه، به علاوهٔ افزونههای گنو. پشتیبانی از این نسخه آزمایشی و ناقص است. نام gnu2x منسوخ شده است.
- c++98
- c++03
- استاندارد سال ۱۹۹۸ ISO C++ به همراه اصلاحیهٔ فنی سال ۲۰۰۳ و برخی گزارشهای رفع نقص اضافی. برای کدهای C++ معادل -ansi است.
- gnu++98
- gnu++03
- گویش گنو از -std=c++98.
- c++11
- c++0x
- استاندارد ۲۰۱۱ ISO C++ به همراه اصلاحیهها. نام c++0x منسوخ شده است.
- gnu++11
- gnu++0x
- گویش گنو از -std=c++11. نام gnu++0x منسوخ شده است.
- c++14
- c++1y
- استاندارد ۲۰۱۴ ISO C++ بههمراه اصلاحیهها. نام c++1y منسوخ شده است.
- gnu++14
- gnu++1y
- گویش گنو از -std=c++14. نام gnu++1y منسوخ شده است.
- c++17
- c++1z
- استاندارد ۲۰۱۷ ISO C++ بههمراه اصلاحیهها. نام c++1z منسوخ شده است.
- gnu++17
- gnu++1z
- گویش گنو از -std=c++17. این حالت پیشفرض برای کدهای C++ است. نام gnu++1z منسوخ شده است.
- c++20
- c++2a
- استاندارد ۲۰۲۰ ISO C++ بههمراه اصلاحیهها. پشتیبانی آزمایشی است و ممکن است در انتشارهای آینده به شیوههای ناسازگار تغییر کند. نام c++2a منسوخ شده است.
- gnu++20
- gnu++2a
- گویش گنو از -std=c++20. پشتیبانی آزمایشی است و ممکن است در انتشارهای آینده به شیوههای ناسازگار تغییر کند. نام gnu++2a منسوخ شده است.
- c++23
- c++2b
- استاندارد ۲۰۲۳ ISO C++ بههمراه اصلاحیهها (منتشر شده در ۲۰۲۴). پشتیبانی آزمایشی است و ممکن است در انتشارهای آینده به شیوههای ناسازگار تغییر کند. نام c++2b منسوخ شده است.
- gnu++23
- gnu++2b
- گویش گنو از -std=c++23. پشتیبانی آزمایشی است و ممکن است در انتشارهای آینده به شیوههای ناسازگار تغییر کند. نام gnu++2b منسوخ شده است.
- c++2c
- c++26
- بازنگری بعدی استاندارد ISO C++، برنامهریزیشده برای سال ۲۰۲۶. پشتیبانی کاملاً آزمایشی است و تقریباً بهطور قطع در انتشارهای آینده به شیوههای ناسازگار تغییر خواهد کرد.
- gnu++2c
- gnu++26
- گویش گنو از -std=c++2c. پشتیبانی کاملاً آزمایشی است و تقریباً بهطور قطع در انتشارهای آینده به شیوههای ناسازگار تغییر خواهد کرد.
- -aux-info filename
- خروجی دادن
اعلانهای
دارای
پیشنمونه
(prototyped) برای
تمام توابع
اعلانشده
یا
تعریفشده
در یک واحد
ترجمه، از
جمله توابع
موجود در
فایلهای
سرایند (header)،
در فایلی با
نام
دادهشده.
این گزینه
در هر زبانی
غیر از C
بدون پیام
نادیده
گرفته
میشود.
علاوه بر اعلانها، فایل در قالب توضیحات (کامنت)، مبدأ هر اعلان (فایل منبع و خط)، اینکه اعلان ضمنی بوده است، دارای پیشنمونه بوده یا فاقد پیشنمونه (I، N برای جدید یا O برای قدیمی، بهترتیب، در اولین نویسه پس از شماره خط و دونقطه)، و اینکه از یک اعلان آمده است یا یک تعریف (C یا F، بهترتیب، در نویسه بعدی) را مشخص میکند. در مورد تعاریف تابع، فهرستی از آرگومانها به سبک K&R بههمراه اعلانهایشان نیز در داخل توضیحات، پس از اعلان ارائه میشود.
- -fno-asm
- کلمات
"asm"،
"inline" یا
"typeof" را
بهعنوان
کلیدواژه
شناسایی
نمیکند تا
کد بتواند
از این
کلمات
بهعنوان
شناسه
استفاده
کند.
میتوانید
بهجای
آنها از
کلیدواژههای
"__asm__"،
"__inline__" و
"__typeof__"
استفاده
کنید. در C،
گزینه -ansi
متضمن -fno-asm
است.
در C++، کلمه "inline" یک کلیدواژه استاندارد است و تحت تأثیر این سوییچ قرار نمیگیرد. ممکن است بخواهید در عوض از پرچم -fno-gnu-keywords استفاده کنید که "typeof" را غیرفعال میکند اما به "asm" و "inline" کاری ندارد. در حالت C99 (-std=c99 یا -std=gnu99)، این سوییچ فقط بر کلیدواژههای "asm" و "typeof" تأثیر میگذارد، زیرا "inline" در ISO C99 یک کلیدواژه استاندارد است. در حالت C23 (-std=c23 یا -std=gnu23)، این سوییچ فقط بر کلیدواژه "asm" تأثیر میگذارد، زیرا "typeof" در ISO C23 یک کلیدواژه استاندارد است.
- -fno-builtin
- -fno-builtin-function
- توابع
توکار (built-in) را
که پیشوند
__builtin_ ندارند
شناسایی
نمیکند.
کامپایلر GCC معمولاً کدهای ویژهای تولید میکند تا برخی توابع توکار را با کارایی بیشتری مدیریت کند؛ برای مثال، فراخوانیهای "alloca" ممکن است به تکدستورهایی تبدیل شوند که مستقیماً پشته را تنظیم میکنند، و فراخوانیهای "memcpy" ممکن است به حلقههای کپی درونخطی تبدیل شوند. کد حاصل اغلب کوچکتر و سریعتر است، اما از آنجا که فراخوانیهای تابع دیگر به همان شکل ظاهر نمیشوند، نمیتوانید روی آنها نقطه توقف (breakpoint) بگذارید، و همچنین نمیتوانید با پیوند دادن به یک کتابخانه متفاوت رفتار توابع را تغییر دهید. علاوه بر این، هنگامی که یک تابع بهعنوان تابع توکار شناسایی میشود، GCC ممکن است از اطلاعات مربوط به آن تابع برای هشدار دادن درباره مشکلات فراخوانی آن، یا برای تولید کد کارآمدتر استفاده کند، حتی اگر کد حاصل همچنان شامل فراخوانیهای آن تابع باشد. برای نمونه، هشدارهایی با -Wformat برای فراخوانیهای نادرست "printf" صادر میشود هنگامی که "printf" توکار است و مشخص است که "strlen" حافظه سراسری را تغییر نمیدهد.
با گزینه -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))
- -fcond-mismatch
- مجاز دانستن عبارات شرطی با انواع (types) ناهمخوان در آرگومانهای دوم و سوم. مقدار چنین عبارتی void خواهد بود. این گزینه برای C++ پشتیبانی نمیشود.
- -ffreestanding
- تصریح میکند که کامپایل یک محیط خوداتکا (freestanding) را هدف گرفته است. این گزینه متضمن -fno-builtin است. محیط خوداتکا محیطی است که ممکن است کتابخانه استاندارد در آن وجود نداشته باشد و شروع برنامه لزوماً در "main" نباشد. بارزترین مثال، هسته سیستمعامل است. این گزینه معادل -fno-hosted است.
- -fgimple
- فعالسازی تجزیه (parsing) تعاریف توابع نشانهگذاریشده با "__GIMPLE". این یک قابلیت آزمایشی است که امکان آزمون واحد (unit testing) برای گذرگاههای (passes) GIMPLE را فراهم میکند.
- -fgnu-tm
- هنگامی که
گزینه -fgnu-tm
مشخص
میشود،
کامپایلر
برای گونهٔ
لینوکسی از
سند مشخصات
فعلی ABI
حافظه
تراکنشی
اینتل (Revision 1.1، ۶
مه ۲۰۰۹) کد
تولید
میکند. این
یک ویژگی
آزمایشی
است که با
تغییر
مشخصات
رسمی، ممکن
است رابط آن
در
نسخههای
آینده GCC
تغییر کند.
لطفاً توجه
داشته
باشید که
این ویژگی
روی همه
معماریها
پشتیبانی
نمیشود.
برای اطلاعات بیشتر درباره پشتیبانی GCC از حافظه تراکنشی،
توجه داشته باشید که ویژگی حافظه تراکنشی بههمراه استثناهای غیرفراخوانی (-fnon-call-exceptions) پشتیبانی نمیشود..IP -fgnu89-inline 4 گزینهٔ -fgnu89-inline به GCC میگوید که هنگام استفاده از حالت C99، از معناشناسی سنتی GNU برای توابع "inline" استفاده کند.
استفاده از این گزینه تقریباً معادل افزودن مشخصهٔ تابع "gnu_inline" به تمامی توابع inline است.
گزینهٔ -fno-gnu89-inline صراحتاً به GCC میگوید که هنگام حضور در حالت C99 یا gnu99، از معناشناسی C99 برای "inline" استفاده کند (یعنی رفتار پیشفرض را تعیین میکند). این گزینه در حالت -std=c90 یا -std=gnu90 پشتیبانی نمیشود.
ماکروهای پیشپردازندهٔ "__GNUC_GNU_INLINE__" و "__GNUC_STDC_INLINE__" میتوانند برای بررسی اینکه کدام معناشناسی برای توابع "inline" فعال است، به کار روند.
- -fhosted
- اعلان میکند که هدف کامپایل یک محیط میزبانیشده (hosted environment) است. این گزینه مستلزم -fbuiltin است. محیط میزبانیشده محیطی است که در آن کل کتابخانهٔ استاندارد در دسترس است و در آن نوع بازگشتی "main" برابر با "int" میباشد. تقریباً همه چیز به جز هستهٔ سیستمعامل (kernel) نمونههایی از آن هستند. این گزینه معادل -fno-freestanding است.
- -flax-vector-conversions
- تبدیلهای ضمنی میان بردارهایی با تعداد عناصر متفاوت و/یا انواع عناصر ناسازگار را مجاز میکند. این گزینه نباید برای کدهای جدید استفاده شود.
- -fms-extensions
- برخی
ساختارهای
غیراستاندارد
بهکاررفته
در
فایلهای
سرایند
مایکروسافت
را
میپذیرد.
در کد ++C، این گزینه اجازه میدهد تا نام اعضای ساختارها مشابه با اعلانهای انواع قبلی باشد.
typedef int UOW; struct ABC { UOW UOW; };برخی موارد فیلدهای بدون نام در ساختارها و اجتماعها (unions) تنها با این گزینه پذیرفته میشوند.
توجه داشته باشید که این گزینه برای تمامی هدفها به جز مقصدهای x86 که از ms-abi استفاده میکنند، غیرفعال است.
- -fpermitted-flt-eval-methods=style
- استاندارد
ISO/IEC TS 18661-3 مقادیر
مجاز جدیدی
را برای
"FLT_EVAL_METHOD"
تعریف
میکند که
نشان
میدهند
عملیات و
مقادیر
ثابتی که
دارای نوع
معنایی
تبادلی یا
قالب
گسترشیافته
هستند باید
با دقت و
دامنهٔ
همان نوع
ارزیابی
شوند. این
مقادیر
جدید،
زبرمجموعهای
از مقادیر
مجاز تحت C99/C11
هستند که
معنای سایر
مقادیر
مثبت
"FLT_EVAL_METHOD" را
مشخص
نمیکنند.
از این رو،
ممکن است
کدهای
منطبق بر C11
با انتظار
احتمال
وجود
مقادیر
جدید نوشته
نشده باشند.
گزینهٔ -fpermitted-flt-eval-methods مشخص میکند که آیا کامپایلر باید تنها مقادیر "FLT_EVAL_METHOD" تعیینشده در C99/C11 را مجاز بداند، یا مجموعهٔ گسترشیافتهٔ مقادیر مشخصشده در ISO/IEC TS 18661-3 را.
مقدار style بسته به نیاز یا "c11" است یا "ts-18661-3".
حالت پیشفرض هنگام استفاده از حالتهای منطبق بر استاندارد (-std=c11 یا مشابه آن) برابر با -fpermitted-flt-eval-methods=c11 است. پیشفرض در لهجههای GNU (-std=gnu11 یا مشابه آن)، -fpermitted-flt-eval-methods=ts-18661-3 است.
گزینههای -fdeps-* برای استخراج اطلاعات وابستگی ساختاریافته برای یک سورس استفاده میشوند. این امر شامل تعیین این است که چه منابع ارائهشده توسط دیگر فایلهای سورس برای کامپایل این سورس لازم خواهد بود و همچنین چه منابعی توسط خود این سورس ارائه میشوند. این اطلاعات را میتوان برای افزودن وابستگیهای موردنیاز بین قوانین کامپایل سورسهای وابسته بر اساس محتوای آنها به کار برد، به جای آنکه نیاز باشد چنین اطلاعاتی در ابزارهای ساخت نیز منعکس شوند.
- -fdeps-file=file
- محل نوشتن اطلاعات وابستگی ساختاریافته.
- -fdeps-format=format
- قالبی که باید برای اطلاعات وابستگی ساختاریافته استفاده شود. در حال حاضر p1689r5 تنها قالب پشتیبانیشده است. توجه داشته باشید هنگامی که این آرگومان مشخص میشود، خروجی -MF از برخی اطلاعات (بهویژه ماژولهای ++C) پاکسازی میشود تا از نحو توسعهیافتهٔ makefile که توسط اکثر ابزارها قابل فهم نیست استفاده نکند.
- -fdeps-target=file
- مشابه با -MT اما برای اطلاعات وابستگی ساختاریافته. این گزینه هدفی را مشخص میکند که در نهایت به منابع مورد نیاز احتیاج خواهد داشت و هر منبع استخراجشده از سورس را که ممکن است توسط سورسهای دیگر مورد نیاز باشد ارائه میدهد.
- -fplan9-extensions
- پذیرش برخی
ساختارهای
غیراستاندارد
استفادهشده
در کدهای Plan 9.
این گزینه -fms-extensions را فعال میکند، ارسال اشارهگرها به ساختارهایی با فیلدهای بینام به توابعی که انتظار اشارهگر به عناصر از نوع آن فیلد را دارند مجاز میسازد، و ارجاع به فیلدهای بینام اعلانشده با typedef را ممکن میکند. این گزینه فقط برای C پشتیبانی میشود و نه ++C.
- -fsigned-bitfields
- -funsigned-bitfields
- -fno-signed-bitfields
- -fno-unsigned-bitfields
- این گزینهها علامتدار بودن یا بدونعلامت بودن یک میدان بیتی (bit-field) را زمانی که در اعلان آن از هیچیک از "signed" یا "unsigned" استفاده نشده باشد، کنترل میکنند. به طور پیشفرض، چنین میدان بیتی علامتدار است، زیرا این رفتار سازگارتر است: انواع صحیح پایهای مانند "int" از انواع علامتدار هستند.
- -fsigned-char
- نوع "char"
را مانند
"signed char"
علامتدار
در نظر
میگیرد.
توجه داشته باشید که این معادل با -fno-unsigned-char است که شکل منفی -funsigned-char میباشد. به همین ترتیب، گزینهٔ -fno-signed-char معادل با -funsigned-char است.
- -funsigned-char
- نوع "char"
را مانند
"unsigned char"
بدونعلامت
در نظر
میگیرد.
هر نوع ماشین پیشفرضی برای اینکه "char" چگونه باید باشد دارد. این نوع به طور پیشفرض یا مانند "unsigned char" است یا مانند "signed char".
در حالت ایدهآل، یک برنامهٔ قابلحمل باید همیشه زمانی که به علامتدار بودن یک شیء وابسته است، از "signed char" یا "unsigned char" استفاده کند. اما برنامههای بسیاری نوشته شدهاند که صرفاً از "char" معمولی استفاده کرده و بسته به ماشینهایی که برای آنها نوشته شدهاند، انتظار دارند علامتدار باشد یا بدونعلامت. این گزینه و معکوس آن به شما اجازه میدهند کاری کنید که چنین برنامهای با پیشفرض برعکس کار کند.
نوع "char" همواره یک نوع متمایز از هر یک از "signed char" یا "unsigned char" است، حتی با وجود اینکه رفتارش همیشه دقیقاً مانند یکی از آن دو است.
- -fstrict-flex-arrays (فقط C و ++C)
- -fstrict-flex-arrays=level (فقط C و ++C)
- کنترل
میکند که
چه زمانی به
منظور
دسترسی به
عناصر یک
آرایه، با
آرایهٔ
انتهایی
ساختار به
عنوان عضو
آرایهٔ
منعطف (flexible array member)
برخورد شود.
مقدار level
سطح
سختگیری
را کنترل
میکند.
گزینهٔ -fstrict-flex-arrays معادل با -fstrict-flex-arrays=3 است که سختگیرانهترین حالت است؛ با آرایهٔ انتهایی تنها زمانی به عنوان عضو آرایهٔ منعطف برخورد میشود که مطابق با استاندارد C99 به بعد به عنوان عضو آرایهٔ منعطف اعلان شده باشد.
شکل منفی -fno-strict-flex-arrays معادل با -fstrict-flex-arrays=0 است که کمترین سختگیری را دارد. در این حالت با تمام آرایههای انتهایی ساختارها به عنوان اعضای آرایهٔ منعطف برخورد میشود.
دو سطح دیگر بین 0 و 3 وجود دارد که برای پشتیبانی از کدهای قدیمیتر که از افزونهٔ آرایه با طول صفر GCC ([0]) یا آرایهٔ یکعنصری به عنوان اعضای آرایهٔ منعطف ([1]) استفاده میکنند، ارائه شدهاند. زمانی که level برابر با 1 باشد، با آرایهٔ انتهایی به عنوان عضو آرایهٔ منعطف برخورد میشود چنانچه به صورت هر یک از []، [0]، یا [1] اعلان شده باشد. زمانی که level برابر با 2 باشد، با آرایهٔ انتهایی به عنوان عضو آرایهٔ منعطف برخورد میشود چنانچه به صورت هر یک از []، یا [0] اعلان شده باشد.
شما میتوانید این رفتار را برای یک فیلد آرایهٔ انتهایی مشخص از یک ساختار با استفاده از مشخصهٔ متغیر "strict_flex_array" کنترل کنید.
گزینهٔ -fstrict_flex_arrays با گزینهٔ -Wstrict-flex-arrays در تعامل است.
- -fsso-struct=endianness
- ترتیب
ذخیرهسازی
اسکالر
پیشفرض
برای
ساختارها و
اجتماعها
را روی
ترتیب بایت
(endianness)
مشخصشده
تنظیم
میکند.
مقادیر
پذیرفتهشده
عبارتند از
big-endian، little-endian و native
برای ترتیب
بایت بومیِ
هدف
(پیشفرض).
این گزینه
برای ++C
پشتیبانی
نمیشود.
هشدار: در صورتی که ترتیب بایت مشخصشده، ترتیب بایت بومی هدف نباشد، سوییچ -fsso-struct باعث میشود GCC کدی تولید کند که با کد تولیدشده بدون این گزینه از نظر دودویی (binary) سازگار نباشد..SS "گزینههای کنترل گویش ++C (Options Controlling C++ Dialect)" این بخش گزینههای خط فرمانی را شرح میدهد که فقط برای برنامههای ++C معنیدار هستند. شما همچنین میتوانید فارغ از اینکه برنامهتان به چه زبانی نوشته شده است، از اکثر گزینههای کامپایلر گنو استفاده کنید. برای نمونه، ممکن است یک فایل firstClass.C را اینگونه کامپایل کنید:
g++ -g -fstrict-enums -O -c firstClass.C
در این مثال، تنها -fstrict-enums گزینهای است که فقط برای برنامههای ++C در نظر گرفته شده است؛ شما میتوانید از سایر گزینهها با هر زبانی که توسط GCC پشتیبانی میشود استفاده کنید.
برخی از گزینهها برای کامپایل برنامههای C، مانند -std، برای برنامههای ++C نیز مرتبط هستند.
در اینجا فهرستی از گزینههایی آمده است که فقط برای کامپایل برنامههای ++C هستند:
- -fabi-version=n
- استفاده از
نسخهٔ n از ABI
مربوط به ++C.
مقدار
پیشفرض
نسخهٔ 0 است.
نسخهٔ 0 به نسخهای اشاره دارد که نزدیکترین انطباق را با مشخصات C++ ABI دارد. بنابراین، ABI بهدستآمده با استفاده از نسخهٔ 0 با رفع باگهای ABI در نسخههای مختلف G++ تغییر خواهد کرد.
نسخهٔ 1 نسخهای از C++ ABI است که نخستین بار در G++ 3.2 ظاهر شد.
نسخهٔ 2 نسخهای از C++ ABI است که نخستین بار در G++ 3.4 ظاهر شد و تا G++ 4.9 پیشفرض بود.
نسخهٔ 3 خطایی را در درهمسازی نام (mangling) یک آدرس ثابت به عنوان آرگومان الگو تصحیح میکند.
نسخهٔ 4، که نخستین بار در G++ 4.5 ظاهر شد، یک درهمسازی استاندارد را برای انواع برداری (vector types) پیادهسازی میکند.
نسخهٔ 5، که نخستین بار در G++ 4.6 ظاهر شد، درهمسازی صفت const/volatile روی انواع اشارهگر تابع، decltype یک اعلان ساده، و استفاده از پارامتر تابع در اعلان یک پارامتر دیگر را تصحیح میکند.
نسخهٔ 6، که نخستین بار در G++ 4.7 ظاهر شد، رفتار ارتقای نوع (promotion) برای شمارشهای محدودهدار (scoped enums) در C++11 و درهمسازی بستههای آرگومان الگو، const/static_cast، عملگرهای پیشوندی ++ و --، و تابع در محدودهٔ کلاس که به عنوان آرگومان الگو استفاده شده است را تصحیح میکند.
نسخهٔ 7، که نخستین بار در G++ 4.8 ظاهر شد، با nullptr_t به عنوان یک نوع توکار برخورد میکند و درهمسازی لامبداها را در محدودهٔ آرگومان پیشفرض تصحیح مینماید.
نسخهٔ 8، که نخستین بار در G++ 4.9 ظاهر شد، رفتار جایگزینی انواع تابع دارای صفتهای تبیینکنندهٔ function-cv را تصحیح میکند.
نسخهٔ 9، که نخستین بار در G++ 5.2 ظاهر شد، تراز (alignment) نوع "nullptr_t" را تصحیح میکند.
نسخهٔ 10، که نخستین بار در G++ 6.1 ظاهر شد، درهمسازی صفتهایی را که بر هویت نوع تأثیر میگذارند (مانند صفتهای قرارداد فراخوانی ia32، برای مثال stdcall) اضافه میکند.
نسخهٔ 11، که نخستین بار در G++ 7 ظاهر شد، درهمسازی عبارتهای نام یکسان درون یک تابع که در محدودههای متفاوتی اعلان شدهاند، درهمسازی اکنون از دوازدهمین رخداد به بعد تغییر میکند. این گزینه همچنین به طور ضمنی -fnew-inheriting-ctors را فعال میکند.
نسخهٔ 12، که نخستین بار در G++ 8 ظاهر شد، قراردادهای فراخوانی را برای کلاسهای خالی روی معماری مقصد x86_64 و برای کلاسهایی که فقط سازندههای رونوشت/انتقال (copy/move) حذفشده دارند تصحیح میکند. این نسخه به طور تصادفی قرارداد فراخوانی را برای کلاسهایی با یک سازندهٔ رونوشت حذفشده و یک سازندهٔ انتقال پیشپاافتاده (trivial) تغییر میدهد.
نسخهٔ 13، که نخستین بار در G++ 8.2 ظاهر شد، تغییر تصادفی در نسخهٔ 12 را اصلاح میکند.
نسخهٔ 14، که نخستین بار در G++ 10 ظاهر شد، درهمسازی عبارت nullptr را تصحیح میکند.
نسخهٔ 15، که نخستین بار در G++ 10.3 ظاهر شد، پسرفت (regression) برچسب ABI در G++ 10 را اصلاح میکند.
نسخهٔ 16، که نخستین بار در G++ 11 ظاهر شد، درهمسازی "__alignof__" را تغییر میدهد تا از "alignof" و نامهای عملگر وابسته متمایز باشد.
نسخهٔ 17، که نخستین بار در G++ 12 ظاهر شد، ساختار و چیدمان (layout) کلاسهایی را اصلاح میکند که از کلاسهای تجمیعی (aggregate) دارای مقداردهندههای اولیه پیشفرض اعضا در C++14 به بعد ارثبری میکنند.
نسخهٔ 18، که نخستین بار در G++ 13 ظاهر شد، درهمسازی لامبداهایی را که دارای زمینه (context) اضافی هستند اصلاح میکند.
نسخهٔ 19، که نخستین بار در G++ 14 ظاهر شد، درهمسازی پیوندهای ساختاریافته (structured bindings) را به گونهای اصلاح میکند که شامل برچسبهای ABI باشند.
نسخهٔ 20، که نخستین بار در G++ 15 ظاهر شد، درهمسازی لامبداها را در مقداردهندههای اولیه اعضای دادهای ایستا (static) اصلاح میکند.
همچنین ببینید: -Wabi.
- -fabi-compat-version=n
- در
مقصدهایی
که از
نامهای
مستعار قوی
(strong aliases)
پشتیبانی
میکنند، G++
هنگام
تعریف یک
نماد با نام
درهمسازیشدهٔ
نادرست، با
ایجاد یک
نام مستعار
با نام
درهمسازیشدهٔ
صحیح،
تغییرات mangling
را دور
میزند. این
سوییچ مشخص
میکند که
از کدام
نسخهٔ ABI
برای این
نام مستعار
استفاده
شود.
با -fabi-version=0 (پیشفرض)، مقدار این گزینه به طور پیشفرض روی 13 تنظیم میشود (سازگاری با GCC 8.2). اگر نسخهٔ ABI دیگری به صراحت انتخاب شده باشد، مقدار پیشفرض آن 0 خواهد بود. برای سازگاری با نسخههای 3.2 تا 4.9 کامپایلر GCC، از -fabi-compat-version=2 استفاده کنید.
اگر این گزینه مشخص نشده باشد ولی -Wabi=n داده شده باشد، از آن نسخه برای نامهای مستعار سازگاری استفاده میشود. اگر این گزینه همراه با -Wabi (بدون شمارهٔ نسخه) داده شود، نسخهٔ ارائهشده در این گزینه برای تولید هشدار به کار میرود.
- -fno-access-control
- غیرفعال کردن تمام بررسیهای دسترسی. این سوییچ عمدتاً برای دور زدن باگهای موجود در کد کنترل دسترسی کاربرد دارد.
- -faligned-new
- فعالسازی
پشتیبانی
از "new" در
C++17 برای
انواعی که
به ترازی (alignment)
بیشتر از
آنچه "void* ::operator
new(std::size_t)" فراهم
میکند
نیاز دارند.
یک آرگومان
عددی مانند
"-faligned-new=32"
میتواند
برای مشخص
کردن میزان
تراز (به
بایت) که
توسط آن
تابع فراهم
میشود
استفاده
گردد، اما
کاربران
اندکی نیاز
به
بازنویسی
مقدار
پیشفرض
alignof(std::max_align_t)
خواهند
داشت.
این پرچم به طور پیشفرض برای -std=c++17 فعال است.
- -fno-assume-sane-operators-new
- استاندارد ++C جایگزین کردن عملگرهای سراسری "new"، "new[]"، "delete" و "delete[]" را مجاز میداند، اگرچه بسیاری از برنامههای ++C آنها را جایگزین نکرده و فقط از نسخهٔ ارائهشده توسط پیادهسازی استفاده میکنند. علاوهبراین، استاندارد ++C نادیدهگرفتن و حذف این فراخوانیها را در صورتی که از عبارتهای new یا delete انجام شده باشند مجاز دانسته است (و به همین ترتیب، در صورت استفاده از توابع "__builtin_operator_new" یا "__builtin_operator_delete" نیز همین فرض در نظر گرفته میشود). این گزینه امکان کنترل برخی بهینهسازیها را در خصوص فراخوانی این عملگرها فراهم میکند. با گزینهٔ "-fassume-sane-operators-new-delete" کامپایلر GCC ممکن است فرض کند فراخوانی عملگرهای سراسریِ قابلجایگزینی از طریق عبارتهای new یا delete، یا از فراخوانیهای "__builtin_operator_new" یا "__builtin_operator_delete"، متغیرهای سراسری یا متغیرهایی را که ممکن است آدرس آنها به این عملگرها درز کند نمیخوانند و تغییر نمیدهند (وضعیت سراسری؛ بهجز "errno" برای عملگرهای "new" و "new[]"). این امر امکان انجام بیشترین بهینهسازیها را در طول این فراخوانیها فراهم میسازد و چیزی است که عملگرهای ارائهشده توسط پیادهسازی آن را برآورده میکنند؛ مگر اینکه جزئیات پیادهسازی "malloc" در کد قابلمشاهده باشد یا از قلابهای (hooks) "malloc" استفاده شده باشد، اما در صورتی که برنامهای این عملگرها را جایگزین کرده باشد ممکن است این شرط برقرار نباشد. این رفتار به طور پیشفرض فعال است. با گزینهٔ "-fno-assume-sane-operators-new-delete" کامپایلر GCC باید فرض کند همهٔ این فراخوانیها (چه از عبارتهای new یا delete باشند یا مستقیماً فراخوانی شوند) ممکن است وضعیت سراسری را بخوانند و بنویسند، مگر اینکه خلاف آن ثابت شود (مثلاً هنگامی که GCC پیادهسازی آنها را کامپایل میکند). اگر این عملگرها جایگزین شدهاند یا ممکن است جایگزین شوند و کد باید چنین رفتاری را در نظر داشته باشد، از این گزینه استفاده کنید.
- -fchar8_t
- -fno-char8_t
- فعالسازی
پشتیبانی
از "char8_t"
مطابق با
تصویب آن در
C++20. این مورد
شامل
افزودن نوع
بنیادین
جدید
"char8_t"،
ایجاد
تغییرات در
انواع
لیترالهای
رشتهای و
نویسهای
UTF-8، امضاهای
جدید برای
لیترالهای
تعریفشده
توسط
کاربر،
بهروزرسانیهای
مرتبط در
کتابخانهٔ
استاندارد،
و ماکروهای
آزمون
ویژگیِ
جدید
"__cpp_char8_t" و
"__cpp_lib_char8_t"
است.
این گزینه امکان بارگذاری بیشازحد (overload) توابع را برای رشتههای معمولی و UTF-8 فراهم میسازد:
int f(const char *); // #1 int f(const char8_t *); // #2 int v1 = f("text"); // Calls #1 int v2 = f(u8"text"); // Calls #2و امضاهای جدیدی را برای لیترالهای تعریفشده توسط کاربر معرفی میکند: int operator""_udl1(char8_t); int v3 = u8'x'_udl1; int operator""_udl2(const char8_t*, std::size_t); int v4 = u8"text"_udl2; template<typename T, T...> int operator""_udl3(); int v5 = u8"text"_udl3;
تغییر انواع رشتهها و نویسههای لفظی UTF-8 ناسازگاریهایی با استانداردهای ISO C++11 و پس از آن ایجاد میکند. برای نمونه، کد زیر بر اساس ISO C++11 درستشکل (well-formed) است، اما در صورت مشخص شدن -fchar8_t نادرستشکل (ill-formed) خواهد بود.
const char *cp = u8"xx";// error: invalid conversion from // `const char8_t*' to `const char*' int f(const char*); auto v = f(u8"xx"); // error: invalid conversion from // `const char8_t*' to `const char*' std::string s{u8"xx"}; // error: no matching function for call to // `std::basic_string<char>::basic_string()' using namespace std::literals; s = u8"xx"s; // error: conversion from // `basic_string<char8_t>' to non-scalar // type `basic_string<char>' requested - -fcheck-new
- بررسی میکند که اشارهگر بازگرداندهشده توسط "operator new" پیش از هرگونه تلاش برای تغییر حافظهٔ تخصیصیافته، غیرتهی (non-null) باشد. این بررسی معمولاً غیرضروری است چرا که استاندارد ++C تصریح میکند "operator new" تنها در صورتی 0 بازمیگرداند که بهصورت throw() اعلان شده باشد؛ در این حالت کامپایلر حتی بدون این گزینه نیز همواره مقدار بازگشتی را بررسی میکند. در سایر موارد، هنگامی که "operator new" دارای مشخصهٔ استثنای غیرخالی باشد، اتمام حافظه با پرتاب "std::bad_alloc" اعلام میشود. همچنین ببینید: new (nothrow).
- -fconcepts
- پشتیبانی
از ویژگی
مفاهیم (Concepts)
در ++C را برای
محدود کردن
آرگومانهای
قالب (template arguments)
فعال
میکند. با
-std=c++20 و
بالاتر،
مفاهیم
بخشی از
استاندارد
زبان
هستند،
بنابراین
-fconcepts بهطور
پیشفرض
فعال است.
برخی ساختارها که توسط مشخصات فنی پیشین «افزونههای ++C برای مفاهیم»، ISO 19217 (2015) مجاز بودند اما به استاندارد رسمی راه نیافتند، میتوانستند علاوه بر این با -fconcepts-ts فعال شوند. گزینهٔ -fconcepts-ts در GCC 14 منسوخ شد و در GCC 15 حذف گردید؛ از کاربران انتظار میرود کدهای خود را به مفاهیم C++20 تبدیل کنند.
- -fconstexpr-depth=n
- بیشینهٔ عمق ارزیابی تو در تو را برای توابع constexpr در C++11 روی n تنظیم میکند. وجود یک حد برای تشخیص بازگشت بیپایان در حین ارزیابی عبارات ثابت الزامی است. کمینهٔ مشخصشده توسط استاندارد 512 است.
- -fconstexpr-cache-depth=n
- بیشینهٔ سطح عمق ارزیابی تو در تو را برای توابع constexpr در C++11 که در حافظهٔ پنهان (cache) ذخیره میشوند روی n تنظیم میکند. این یک روش مکاشفهای (heuristic) است که بین سرعت کامپایل (زمانی که حافظهٔ پنهان از محاسبات تکراری جلوگیری میکند) و مصرف حافظه (زمانی که حافظهٔ پنهان به دلیل ارزیابیهای بسیار بازگشتی بسیار بزرگ میشود) تعادل برقرار میکند. مقدار پیشفرض 8 است. احتمال کمی وجود دارد که کاربران مایل به تغییر آن باشند، اما اگر کد شما محاسبات سنگین constexpr انجام میدهد ممکن است بخواهید برای یافتن مقداری که بهترین عملکرد را برای شما دارد، آزمایش کنید.
- -fconstexpr-fp-except
- پیوست F از
استاندارد C
مشخص
میکند که
استثناهای
ممیز شناور
IEC559 که در زمان
کامپایل رخ
میدهند
نباید
کامپایل را
متوقف
سازند.
کامپایلرهای
++C در طول
تاریخ از
این راهنما
پیروی
نکردهاند
و در عوض،
تقسیم ممیز
شناور بر
صفر را با
وجود داشتن
مقداری
کاملاً
معین،
غیرثابت در
نظر
گرفتهاند.
این پرچم به
کامپایلر
اعلام
میکند که
به پیوست F
نسبت به
سایر
قوانینی که
یک عملیات
خاص را
تعریفنشده
میدانند،
اولویت دهد.
constexpr float inf = 1./0.; // OK with -fconstexpr-fp-except
- -fconstexpr-loop-limit=n
- بیشینهٔ تعداد تکرارهای یک حلقه را در توابع constexpr در C++14 روی n تنظیم میکند. وجود این محدودیت برای تشخیص حلقههای بیپایان در طول ارزیابی عبارات ثابت لازم است. مقدار پیشفرض 262144 (1<<18) است.
- -fconstexpr-ops-limit=n
- بیشینهٔ تعداد عملیاتها را در طول یک ارزیابی constexpr منفرد تنظیم میکند. حتی زمانی که تعداد تکرارهای یک حلقه با محدودیت بالا کنترل شده باشد، چنانچه چندین حلقهٔ تو در تو وجود داشته باشند و هر کدام تکرارهای متعددی کمتر از حد مجاز فوق داشته باشند، یا اگر در بدنهٔ یک حلقه یا حتی خارج از حلقه عبارات بسیار زیادی نیاز به ارزیابی داشته باشند، ارزیابی constexpr حاصل ممکن است بیش از حد زمان ببرد. مقدار پیشفرض 33554432 (1<<25) است.
- -fcontracts
- پشتیبانی
آزمایشی از
ویژگی
قراردادها
(Contracts) در ++C را
فعال
میکند؛
همانطور
که برای
مدتی کوتاه
به
پیشنویس
کاری C++20 (سند N4820)
افزوده و
سپس حذف شد.
این
پیادهسازی
همچنین
شامل
بهبودهای
پیشنهادی
از اسناد P1290،
P1332 و P1429 است. این
قابلیت
عمدتاً
برای کسانی
در نظر
گرفته شده
که
علاقهمند
به آزمایش
در جهت
بهبود این
ویژگی و
رساندن آن
به
استانداردهای
آیندهٔ ++C
هستند.
در صورت نقض یک قرارداد بررسیشده، گردانندهٔ نقض (violation handler) فراخوانی میشود. کاربران میتوانند با تعریف تابع زیر، گردانندهٔ نقض را جایگزین کنند:
void handle_contract_violation (const std::experimental::contract_violation&);
مجموعههای متفاوتی از پرچمهای اضافی وجود دارند که میتوانند برای مشخص کردن این که کدام قراردادها و چگونه برای قراردادهای N4820، قراردادهای P1332 یا قراردادهای P1429 بررسی شوند، به همراه یکدیگر استفاده گردند؛ این مجموعهها را نمیتوان به طور همزمان با یکدیگر به کار برد.
- -fcontract-mode=[on|off]
- کنترل میکند که آیا هیچ قراردادی اساساً دارای معناشناسی باشد یا خیر. پیشفرض on است.
- -fcontract-assumption-mode=[on|off]
- [N4820] کنترل میکند که آیا قراردادهای دارای سطح axiom باید معناشناسی فرض (assume) داشته باشند یا خیر. پیشفرض on است.
- -fcontract-build-level=[off|default|audit]
- [N4820] مشخص میکند که برای کدام سطح از قراردادها بررسی تولید شود. پیشفرض default است.
- -fcontract-continuation-mode=[on|off]
- [N4820] کنترل میکند که آیا پس از نقض قرارداد، به برنامه اجازه داده شود به اجرا ادامه دهد یا خیر. یعنی آیا قراردادهای بررسیشده دارای معناشناسی maybe شرح داده شده در زیر باشند یا معناشناسی never. پیشفرض off است.
- -fcontract-role=<name>:<default>,<audit>,<axiom>
- [P1332] معناشناسی عینی (concrete semantics) را برای هر سطح از قرارداد در یک نقش قرارداد خاص مشخص میکند.
- -fcontract-semantic=[default|audit|axiom]:<semantic>
- [P1429] معناشناسی عینی را برای یک سطح قرارداد مشخص معین میکند.
- -fcontract-strict-declarations=[on|off]
- کنترل میکند که آیا افزودن قرارداد به یک تابع پس از نخستین اعلان آن رد شود یا خیر. پیشفرض off است.
معناشناسیهای عینی ممکنی که میتوان با -fcontract-role یا -fcontract-semantic مشخص کرد عبارتند از:
- "ignore"
- این قرارداد هیچ اثری ندارد.
- "assume"
- با این قرارداد مانند "[[assume]]" در C++23 رفتار میشود.
- "check_never_continue"
- "never"
- "abort"
- این قرارداد بررسی میشود. در صورت شکست، گردانندهٔ نقض فراخوانی میشود. اگر گرداننده بازگردد، "std::terminate" فراخوانی خواهد شد.
- "check_maybe_continue"
- "maybe"
- این قرارداد بررسی میشود. در صورت شکست، گردانندهٔ نقض فراخوانی میشود. اگر گرداننده بازگردد، اجرای برنامه بهطور عادی ادامه مییابد.
- -fdiagnostics-all-candidates
- به فرانتاند C++ اجازه میدهد هنگام شکست در تفکیک بارگذاری بیشازحد (overload resolution)، همهٔ کاندیداها را گزارش کند، از جمله زمانی که یک تابع حذفشده (deleted function) انتخاب شده باشد.
- -fno-elide-constructors
- استاندارد
C++ به
پیادهسازی
اجازه
میدهد از
ایجاد شیء
موقتی که
تنها برای
مقداردهی
اولیهٔ شیء
دیگری از
همان نوع
استفاده
میشود،
صرفنظر
کند. تعیین
این گزینه
این
بهینهسازی
را غیرفعال
کرده و G++ را
وادار
میکند در
تمام حالات
سازندهٔ
رونوشت (copy constructor)
را
فراخوانی
کند. این
گزینه
همچنین
باعث
میشود G++
توابع عضو
بدیهی (trivial) را
که در حالت
عادی
بهصورت
درونخطی
بسط
مییافتند،
فراخوانی
کند.
در C++17، کامپایلر ملزم است از این اشیاء موقت صرفنظر کند، اما این گزینه همچنان بر توابع عضو بدیهی تأثیر میگذارد.
- -fno-enforce-eh-specs
- کدی برای بررسی نقض مشخصات استثناها (exception specifications) در زمان اجرا تولید نمیکند. این گزینه استاندارد C++ را نقض میکند، اما ممکن است برای کاهش حجم کد در بیلدهای نهایی، بسیار شبیه به تعریف "NDEBUG"، مفید باشد. این گزینه به کد کاربر اجازهٔ پرتاب استثناهایی در نقض مشخصات استثناها را نمیدهد؛ کامپایلر همچنان بر اساس این مشخصات بهینهسازی میکند، بنابراین پرتاب یک استثنای غیرمنتظره منجر به رفتار تعریفنشده (undefined behavior) در زمان اجرا خواهد شد.
- -fextern-tls-init
- -fno-extern-tls-init
- استانداردهای
C++11 و OpenMP به
متغیرهای
"thread_local" و
"threadprivate"
اجازه
میدهند
دارای
مقداردهی
اولیهٔ
پویا (زمان
اجرا)
باشند. برای
پشتیبانی
از این
ویژگی،
هرگونه
استفاده از
چنین
متغیری از
طریق یک
تابع پوششی
انجام
میشود که
مقداردهی
اولیهٔ
لازم را
اجرا
میکند.
هنگامی که
استفاده و
تعریف
متغیر در یک
واحد ترجمه
(translation unit) باشند،
این سربار
میتواند
با
بهینهسازی
حذف شود،
اما هنگامی
که استفاده
در واحد
ترجمهٔ
متفاوتی
باشد،
سربار
چشمگیری به
وجود
میآید حتی
اگر متغیر
در عمل
نیازی به
مقداردهی
اولیهٔ
پویا
نداشته
باشد. اگر
برنامهنویس
مطمئن باشد
که هیچ
استفادهای
از متغیر در
یک TU
غیرتعریفکننده
نیازی به
راهاندازی
مقداردهی
اولیهٔ
پویا ندارد
(خواه به
این دلیل که
متغیر
بهصورت
ایستا
مقداردهی
اولیه شده
است، یا
اینکه
استفاده از
متغیر در TU
تعریفکننده
پیش از هر
استفادهای
در TU دیگر
اجرا خواهد
شد)،
میتواند
با گزینهٔ
-fno-extern-tls-init از این
سربار
جلوگیری
کند.
در مقصدهایی که از نامهای مستعار نماد (symbol aliases) پشتیبانی میکنند، پیشفرض -fextern-tls-init است. در مقصدهایی که از نامهای مستعار نماد پشتیبانی نمیکنند، پیشفرض -fno-extern-tls-init است.
- -ffold-simple-inlines
- -fno-fold-simple-inlines
- به فرانتاند C++ اجازه میدهد فراخوانیهای "std::move"، "std::forward"، "std::addressof" و "std::as_const" را سادهسازی و فولد (fold) کند. بر خلاف درونخطیسازی (inlining)، این به این معناست که هیچ اطلاعات اشکالزدایی برای این فراخوانیها تولید نخواهد شد. از آنجا که اشکالزدایی این توابع بهندرت مورد نیاز است، این پرچم بهطور پیشفرض فعال است مگر اینکه -fno-inline فعال باشد.
- -fno-gnu-keywords
- شناسهٔ "typeof" را به عنوان کلمهٔ کلیدی در نظر نمیگیرد، تا کد بتواند از این کلمه به عنوان یک شناسه استفاده کند. میتوانید به جای آن از کلمهٔ کلیدی "__typeof__" استفاده کنید. این گزینه به طور ضمنی توسط گویشهای صریح استاندارد ISO C++ اعمال میشود: -ansi، -std=c++98، -std=c++11 و غیره.
- -fno-immediate-escalation
- قابلیت
ارتقای
تابع فوری
(immediate function escalation) را که
به موجب آن
برخی توابع
میتوانند
مطابق با P2564R3
به consteval ارتقا
یابند،
فعال
نمیکند.
برای مثال:
consteval int id(int i) { return i; } constexpr int f(auto t) { return t + id(t); // id causes f<int> to be promoted to consteval } void g(int i) { f (3); }در C++20 کامپایل میشود: تابع "f" یک تابع ارتقایابندهٔ فوری است (به دلیل وجود "auto"، یک قالب تابع بوده و به صورت "constexpr" اعلان شده است) و id(t) یک عبارت ارتقایابندهٔ فوری است، بنابراین "f" به "consteval" ارتقا مییابد. در نتیجه، فراخوانی id(t) در یک بافتار فوری (immediate context) قرار میگیرد و ملزم به تولید یک مقدار ثابت نیست (این همان سازوکاری است که امکان ترکیب توابع consteval را فراهم میسازد). با این حال، با گزینهٔ -fno-immediate-escalation، تابع "f" به "consteval" ارتقا نمییابد، و از آنجا که فراخوانی تابع consteval یعنی id(t) یک عبارت ثابت نیست، کامپایلر کد را رد میکند.
این گزینه به صورت پیشفرض فعال است؛ این گزینه فقط در حالت C++20 یا بالاتر اثرگذار است.
- -fimplicit-constexpr
- توابع inline را در صورتی که شرایط لازم برای یک تابع constexpr را داشته باشند، بهطور ضمنی constexpr میکند. این گزینه میتواند در حالت C++14 یا بالاتر استفاده شود. این امر میتواند به تغییر مقداردهی اولیه از پویا به ایستا و دیگر بهینهسازیها بینجامد.
- -fno-implicit-templates
- هرگز برای قالبهای غیردرونخطی (non-inline) که بهطور ضمنی (یعنی بر اثر استفاده) نمونهسازی میشوند کدی تولید نمیکند؛ صرفاً برای نمونهسازیهای صریح کد تولید میکند. در صورت استفاده از این گزینه، باید ساختار کد خود را با دقت طوری تنظیم کنید که تمام نمونهسازیهای صریح لازم را در بر داشته باشد تا در هنگام پیوند با نمادهای تعریفنشده مواجه نشوید.
- -fno-implicit-inline-templates
- برای نمونهسازیهای ضمنی قالبهای درونخطی (inline) نیز کدی تولید نمیکند. حالت پیشفرض با توابع درونخطی به گونهٔ متفاوتی رفتار میکند تا کامپایل با بهینهسازی و بدون بهینهسازی به مجموعهٔ یکسانی از نمونهسازیهای صریح نیاز داشته باشند.
- -fno-implement-inlines
- برای صرفهجویی در فضا، نسخههای برونخطی (out-of-line) توابع درونخطی تحت کنترل "#pragma implementation" را تولید نمیکند. اگر این توابع در تمام مکانهایی که فراخوانی شدهاند درونخط نشوند، این امر موجب خطاهای پیونددهنده خواهد شد.
- -fmodules
- -fno-modules
- پشتیبانی از ماژولهای C++20 را فعال میکند. گزینهٔ -fno-modules معمولاً مورد نیاز نیست، زیرا حالت پیشفرض است. با اینکه این قابلیت جزوی از ویژگیهای C++20 است، در حال حاضر با انتخاب آن نسخه از استاندارد بهطور ضمنی فعال نمیشود.
- -fmodule-header
- -fmodule-header=user
- -fmodule-header=system
- یک فایل سرایند (header) را برای ایجاد یک واحد سرایند قابل واردسازی (importable header unit) کامپایل میکند.
- -fmodule-implicit-inline
- توابع عضوی که در تعاریف کلاس خود تعریف شدهاند، در کدهای ماژولار بهطور ضمنی درونخطی (inline) نیستند. این تفاوت با رفتار سنتی C++ بنا به دلایل موجهی است. با این حال، ممکن است در هنگام انتقال (porting) کد موجب دشواریهایی شود. این گزینه اینگونه تعاریف توابع را بهطور ضمنی inline میکند. با این وجود، این کار ناسازگاری ABI ایجاد میکند، بنابراین باید از آن در همهجا یا هیچجا استفاده کنید. (این تعاریف در خارج از یک ماژول نامگذاریشده در هر صورت بهطور ضمنی inline باقی میمانند.)
- -fno-module-lazy
- واردسازی تنبل (lazy importing) ماژول و ایجاد نگاشتکنندهٔ ماژول (module mapper) را غیرفعال میکند.
- -fmodule-mapper=[hostname]:port[?ident]
- -fmodule-mapper=|program[?ident] args...
- -fmodule-mapper==socket[?ident]
- -fmodule-mapper=<>[inout][?ident]
- -fmodule-mapper=<in>out[?ident]
- -fmodule-mapper=file[?ident]
- یک اوراکل برای پرسوجوی نگاشت نام ماژول به نام فایل. در صورت عدم تعیین، از متغیر محیطی CXX_MODULE_MAPPER استفاده میشود، و اگر تنظیم نشده باشد، یک پیشفرض درونفرآیندی ارائه میگردد.
- -fmodule-only
- صرفاً واسط ماژول کامپایلشده (Compiled Module Interface) را تولید میکند و از ایجاد هرگونه فایل شیء (object file) جلوگیری میکند.
- -fms-extensions
- هشدارهای Wpedantic را در رابطه با ساختارهای مورد استفاده در MFC، مانند int ضمنی و گرفتن اشارهگر به تابع عضو از طریق نحو غیراستاندارد، غیرفعال میکند.
- -fnew-inheriting-ctors
- اصلاحیهٔ P0136 در رابطه با معناشناسی وراثت سازندهها در C++11 را فعال میکند. این بخشی از C++17 است اما همچنین به عنوان یک گزارش نقص (Defect Report) برای C++11 و C++14 در نظر گرفته میشود. این پرچم بهطور پیشفرض فعال است مگر اینکه -fabi-version=10 یا پایینتر مشخص شده باشد..IP -fnew-ttp-matching 4 راهکار P0522 برای مسئلهٔ اصلی ۱۵۰ (Core issue 150)، دربارهٔ پارامترهای قالبِ قالب (template template parameters) و آرگومانهای پیشفرض را فعال میکند: این گزینه اجازه میدهد یک قالب دارای آرگومانهای قالب پیشفرض، به عنوان آرگومان برای یک پارامتر قالبِ قالب با پارامترهای قالب کمتر استفاده شود. این پرچم بهطور پیشفرض برای -std=c++17 فعال است.
- -fno-nonansi-builtins
- اعلانهای توکار (built-in) توابعی را که توسط ANSI/ISO C الزامی نشدهاند، غیرفعال میکند. این توابع شامل "ffs"، "alloca"، "_exit"، "index"، "bzero"، "conjf" و سایر توابع مرتبط میشوند.
- -fnothrow-opt
- با مشخصهٔ استثنای throw() مانند یک مشخصهٔ "noexcept" رفتار میکند تا سربار اندازهٔ کد متنی (text size) را در مقایسه با تابعی بدون مشخصهٔ استثنا کاهش دهد یا حذف کند. اگر تابع دارای متغیرهای محلی از انواعی با مخربهای غیربدیهی (non-trivial destructors) باشد، مشخصهٔ استثنا در عمل تابع را کوچکتر میکند زیرا پاکسازیهای EH برای آن متغیرها میتواند از طریق بهینهسازی حذف شود. اثر معنایی این است که پرتاب یک استثنا به خارج از تابعی با چنین مشخصهٔ استثنایی، به جای "unexpected" منجر به فراخوانی "terminate" میشود.
- -fno-operator-names
- با کلیدواژههای نام عملگر یعنی "and"، "bitand"، "bitor"، "compl"، "not"، "or" و "xor" به عنوان کلیدواژههای مترادف رفتار نمیکند.
- -fno-optional-diags
- پیامهای خطایابی و هشداری (diagnostics) را که استاندارد میگوید نیازی به صدور آنها توسط کامپایلر نیست، غیرفعال میکند. در حال حاضر، تنها پیام خطایابی از این دست که توسط G++ صادر میشود، مربوط به نامی است که درون یک کلاس دارای معانی چندگانه باشد.
- -fno-pretty-templates
- هنگامی که یک پیام خطا به یک تخصیص خاص (specialization) از یک قالب تابع اشاره میکند، کامپایلر بهطور معمول امضای قالب را به همراه آرگومانهای قالب و هرگونه typedef یا typename در امضا چاپ میکند (برای نمونه "void f(T) [with T = int]" به جای "void f(int)") تا مشخص باشد چه قالبی درگیر است. هنگامی که یک پیام خطا به تخصیص خاصی از یک قالب کلاس اشاره میکند، کامپایلر آرگومانهای قالبی را که با آرگومانهای قالب پیشفرض برای آن قالب مطابقت دارند، حذف میکند. اگر هر یک از این رفتارها درک پیام خطا را به جای آسانتر کردن، سختتر کند، میتوانید از -fno-pretty-templates برای غیرفعال کردن آنها استفاده کنید.
- -frange-for-ext-temps
- تمدید طول عمر اشیاء موقت در حلقههای for مبتنی بر دامنه (range-based for) در ++C را فعال میکند. با -std=c++23 و بالاتر، این قابلیت بخشی از استاندارد زبان است؛ بنابراین طول عمر اشیاء موقت بهطور پیشفرض تا انتهای حلقه تمدید میشود. این گزینه امکان میدهد که این رفتار در نسخههای قدیمیتر استاندارد نیز فعال شود.
- -fno-rtti
- تولید
اطلاعات
مربوط به هر
کلاسی که
دارای
توابع
مجازی است
را برای
استفاده
توسط
قابلیتهای
شناسایی
نوع زمان
اجرای ++C
("dynamic_cast" و
"typeid")
غیرفعال
میکند. اگر
از این
بخشهای
زبان
استفاده
نمیکنید،
میتوانید
با استفاده
از این پرچم
در فضا
صرفهجویی
کنید. توجه
داشته
باشید که
مدیریت
استثناها
نیز از همین
اطلاعات
استفاده
میکند،
اما G++ آن را
در صورت
نیاز تولید
مینماید.
عملگر
"dynamic_cast"
همچنان
میتواند
برای
تبدیلهایی
استفاده
شود که به
اطلاعات
نوع زمان
اجرا نیازی
ندارند،
مانند
تبدیل به
"void *" یا
به
کلاسهای
پایهٔ بدون
ابهام.
ترکیب کدهای کامپایلشده با -frtti با کدهای کامپایلشده با -fno-rtti ممکن است درست کار نکند. برای نمونه، اگر کلاسی که با -fno-rtti کامپایل شده است به عنوان کلاس پایه برای کلاسی استفاده شود که با -frtti کامپایل شده، برنامهها ممکن است در مرحلهٔ پیوند با شکست مواجه شوند.
- -fsized-deallocation
- اعلانهای
سراسری
توکار
void operator delete (void *, std::size_t) noexcept; void operator delete[] (void *, std::size_t) noexcept;
معرفیشده در C++14 را فعال میکند. این گزینه برای توابع آزادسازی حافظهٔ جایگزین و تعریفشده توسط کاربر مفید است که به عنوان نمونه، از اندازهٔ شیء برای سریعتر کردن آزادسازی استفاده میکنند. بهطور پیشفرض تحت -std=c++14 و بالاتر فعال است. پرچم -Wsized-deallocation دربارهٔ جاهایی که ممکن است نیاز به افزودن یک تعریف داشته باشند هشدار میدهد.
- -fstrict-enums
- به کامپایلر اجازه میدهد بر اساس این فرض بهینهسازی کند که مقدار یک نوع شمارشی (enumerated type) فقط میتواند یکی از مقادیر آن شمارش باشد (همانطور که در استاندارد ++C تعریف شده است؛ اساساً، مقداری که میتواند در حداقل تعداد بیتهای مورد نیاز برای نمایش تمامی شمارندهها قرار گیرد). این فرض ممکن است در صورتی که برنامه از یک تبدیل صریح (cast) برای تبدیل یک مقدار صحیح اختیاری به نوع شمارشی استفاده کند، معتبر نباشد. این گزینه روی نوع شمارشی با نوع زیربنایی مشخص (fixed underlying type) هیچ اثری ندارد.
- -fstrong-eval-order
- -fstrong-eval-order=kind
- عبارتهای
دسترسی به
اعضا،
اندیسگذاری
آرایه و
جابجایی
بیتی (shift) را به
ترتیب چپ به
راست، و
انتساب را
به ترتیب
راست به چپ،
طبق آنچه
برای C++17
تصویب شده
ارزیابی
میکند.
گزینهٔ
-fstrong-eval-order معادل
-fstrong-eval-order=all است، و
بهطور
پیشفرض با
-std=c++17 یا
بالاتر
فعال
میشود.
گزینهٔ -fstrong-eval-order=some تنها ترتیب دسترسی به اعضا و عبارتهای جابجایی بیتی را فعال میکند، و حالت پیشفرض برای لهجههای ++C پیش از C++17 است.
گزینهٔ -fstrong-eval-order=none معادل -fno-strong-eval-order است.
- -ftemplate-backtrace-limit=n
- حداکثر تعداد یادداشتهای نمونهسازی قالب (template instantiation notes) برای یک هشدار یا خطای منفرد را روی n تنظیم میکند. مقدار پیشفرض ۱۰ است.
- -ftemplate-depth=n
- حداکثر عمق نمونهسازی برای کلاسهای قالب را روی n تنظیم میکند. تعیین محدودیت روی عمق نمونهسازی قالب برای تشخیص بازگشتهای بیپایان در حین نمونهسازی کلاسهای قالب لازم است. برنامههای منطبق بر ANSI/ISO C++ نباید به عمق حداکثری بیشتر از ۱۷ (در C++11 به ۱۰۲۴ تغییر کرد) تکیه کنند. مقدار پیشفرض ۹۰۰ است، زیرا کامپایلر ممکن است در برخی موقعیتها پیش از رسیدن به ۱۰۲۴ با کمبود فضای پشته (stack) مواجه شود.
- -fno-threadsafe-statics
- کد اضافی برای استفاده از روالهای مشخصشده در C++ ABI به منظور مقداردهی اولیهٔ متغیرهای محلی ایستا به صورت امن در برابر ریسهها (thread-safe) را تولید نمیکند. میتوانید از این گزینه برای کاهش اندک اندازهٔ کد در برنامههایی که نیازی به امنیت ریسه ندارند استفاده کنید.
- -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
- این سوئیچ
اعلام
میکند که
کاربر قصد
مقایسهٔ
اشارهگرها
به توابع یا
متدهای
درونخطی (inline)
را که
آدرسهای
آنها در
اشیاء
اشتراکی
متفاوتی
گرفته شده
است ندارد.
اثر این کار این است که GCC ممکن است در عمل، متدهای درونخطی را با "__attribute__ ((visibility ("hidden")))" نشانهگذاری کند تا در جدول صادرات یک DSO ظاهر نشوند و هنگام استفاده در همان DSO به ارجاع غیرمستقیم PLT نیازی نداشته باشند. فعال کردن این گزینه میتواند تأثیر چشمگیری بر زمان بارگذاری و پیوند یک DSO داشته باشد، زیرا وقتی کتابخانه به طور گسترده از قالبها استفاده میکند، اندازهٔ جدول صادرات پویا را به شدت کاهش میدهد.
رفتار این سوئیچ کاملاً مشابه نشانهگذاری مستقیم متدها به عنوان hidden نیست، زیرا روی متغیرهای ایستای محلیِ تابع اثری نمیگذارد و سبب نمیشود کامپایلر استنتاج کند که تابع تنها در یک شیء اشتراکی تعریف شده است.
میتوانید یک متد را بهطور صریح با یک وضعیت دید (visibility) مشخص نشانهگذاری کنید تا اثر این سوئیچ برای آن متد خنثی شود. برای نمونه، اگر میخواهید اشارهگرها به یک متد درونخطی خاص را مقایسه کنید، میتوانید آن را با دید پیشفرض (default visibility) نشانهگذاری نمایید. نشانهگذاری کلاس دربرگیرنده با دید صریح هیچ اثری ندارد.
متدهای درونخطی که بهطور صریح نمونهسازی شدهاند از این گزینه تأثیر نمیپذیرند، زیرا در غیر این صورت پیوند آنها ممکن است از مرز کتابخانهٔ اشتراکی عبور کند.
- -fvisibility-ms-compat
- این پرچم
تلاش
میکند با
استفاده از
تنظیمات
دید، مدل
پیوند ++C در GCC
را با مدل Microsoft
Visual Studio سازگار
سازد.
این پرچم تغییرات زیر را در مدل پیوند GCC ایجاد میکند:
- 1.
- دید پیشفرض را مانند -fvisibility=hidden روی "hidden" تنظیم میکند.
- 2.
- انواع داده، به جز اعضایشان، بهطور پیشفرض پنهان نیستند.
- 3.
- قاعدهٔ تعریف واحد (One Definition Rule) برای انواعی بدون مشخصات دید صریح که در بیش از یک شیء اشتراکی تعریف شدهاند، ملایمتر گرفته میشود: این اعلانها در صورتی مجاز هستند که در زمان عدم استفاده از این گزینه نیز مجاز باشند.
در کدهای جدید بهتر است از -fvisibility=hidden استفاده شود و کلاسهایی که قرار است از بیرون قابل مشاهده باشند صادر گردند. متأسفانه این امکان وجود دارد که کدهای موجود، شاید به طور اتفاقی، به رفتار Visual Studio وابسته باشند.
از جمله پیامدهای این تغییرات این است که اعضای دادهای ایستای همنوع با نام یکسان اما تعریفشده در اشیاء اشتراکی متفاوت، متمایز خواهند بود؛ بنابراین تغییر یکی سبب تغییر دیگری نمیشود؛ و همچنین اشارهگرها به توابع عضوِ تعریفشده در اشیاء اشتراکی مختلف ممکن است در مقایسه برابر نباشند. هنگامی که این پرچم داده میشود، تعریف متفاوت انواع دارای نام یکسان، نقض ODR محسوب میشود. از پشتیبانی نماد ضعیف (weak symbol) استفاده نکن، حتی اگر توسط پیونددهنده ارائه شده باشد. بهطور پیشفرض، G++ در صورت موجود بودن، از نمادهای ضعیف استفاده میکند. این گزینه صرفاً برای آزمایش وجود دارد و نباید توسط کاربران نهایی استفاده شود؛ این کار منجر به تولید کد ضعیفتر شده و هیچ مزیتی ندارد. این گزینه ممکن است در نسخههای بعدی G++ حذف شود.
- -fext-numeric-literals (فقط C++ و Objective-C++)
- پسوندهای لیترال عددی موهومی (imaginary)، ممیز ثابت (fixed-point) یا تعریفشده توسط ماشین را به عنوان افزونههای GNU میپذیرد. هنگامی که این گزینه غیرفعال باشد، با این پسوندها به عنوان پسوندهای لیترال عددی تعریفشده توسط کاربر در C++11 رفتار میشود. این گزینه بهطور پیشفرض برای تمام گویشهای پیش از C++11 و تمام گویشهای GNU فعال است: -std=c++98، -std=gnu++98، -std=gnu++11، -std=gnu++14. این گزینه بهطور پیشفرض برای ISO C++11 به بعد (-std=c++11، ...) غیرفعال است.
- -nostdinc++
- برای فایلهای سرآیند در دایرکتوریهای استاندارد ویژه C++ جستجو نکن، اما سایر دایرکتوریهای استاندارد را همچنان جستجو کن. (این گزینه هنگام ساخت کتابخانه C++ استفاده میشود.)
- -flang-info-include-translate
- -flang-info-include-translate-not
- -flang-info-include-translate=header
- رویدادهای ترجمه include را اطلاع بده. گزینه اول ترجمههای include پذیرفتهشده را ذکر میکند، گزینه دوم ترجمههای include رد شده را ذکر خواهد کرد. قالب header ترجمههای include مربوط به آن سرآیند خاص را اطلاع میدهد. اگر header به شکل "user" یا "<system>" باشد، با استفاده از مسیر include به یک سرآیند کاربری یا سیستمی خاص تبدیل (resolve) خواهد شد.
- -flang-info-module-cmi
- -flang-info-module-cmi=module
- مسیرهای Compiled Module Interface را اطلاع بده. گزینه اول تمام مسیرهای CMI خواندهشده را ذکر میکند. قالب module خواندن CMI یک ماژول خاص را ثبت میکند. module ممکن است یک ماژول نامدار یا یک واحد سرآیند (header-unit) باشد (مورد دوم یا با بودن نام مسیری حاوی جداکنندههای دایرکتوری، یا با محصور بودن در "<>" یا "" مشخص میشود).
- -stdlib=libstdc++,libc++
- هنگامی که G++ برای پشتیبانی از این گزینه پیکربندی شده باشد، امکان مشخص کردن کتابخانههای زمان اجرای جایگزین C++ را فراهم میکند. دو گزینه در دسترس است: libstdc++ (زمان اجرای پیشفرض و بومی C++ برای G++) و libc++ که کتابخانه زمان اجرای C++ نصبشده روی برخی سیستمعاملها است (مانند نسخههای Darwin از Darwin11 به بعد). این گزینه G++ را تغییر میدهد تا از سرآیندهای کتابخانه مشخصشده استفاده کند و هنگامی که یک زمان اجرای C++ برای پیوند دادن لازم است، بهترتیب "-lstdc++" یا "-lc++" را صادر کند.
علاوه بر این، این گزینههای هشدار تنها برای برنامههای C++ معنا دارند:
- -Wabi-tag (فقط C++ و Objective-C++)
- زمانی که یک نوع دارای یک برچسب ABI در زمینهای استفاده شود که آن برچسب ABI را ندارد، هشدار بده. برای اطلاعات بیشتر در مورد برچسبهای ABI، به C++ Attributes مراجعه کنید.
- -Wcomma-subscript (فقط C++ و Objective-C++)
- درباره
استفاده از
عبارت
ویرگول (comma expression)
درون یک
عبارت
اندیسگذاری
هشدار بده.
این کاربرد
در C++20 منسوخ
شده و قرار
است در C++23 حذف
شود. با این
حال، یک
عبارت
ویرگول که
در "( )"
قرار گرفته
باشد منسوخ
نیست. مثال:
void f(int *a, int b, int c) { a[b,c]; // deprecated in C++20, invalid in C++23 a[(b,c)]; // OK }در C++23 داشتن عبارتهای جدا شده با ویرگول در اندیسگذاری مجاز است، مشروط بر آنکه یک عملگر اندیس سربارگذاریشده یافت شود و از تعداد و انواع درست آرگومانها پشتیبانی کند. G++ این نحو را که قبلاً برای کدهایی که در C++23 نامعتبر هستند اما در C++20 معتبر ولی منسوخ بودند معتبر بود، همراه با یک هشدار موشکافانه (pedantic) میپذیرد که میتوان آن را با -Wno-comma-subscript غیرفعال کرد.
بهطور پیشفرض با -std=c++20 فعال است مگر با -Wno-deprecated، و پس از -std=c++23 بدون توجه به -Wno-deprecated فعال خواهد بود. پیش از -std=c++20، با -Wdeprecated صریح فعال میشود.
این هشدار در حالت C++23 یا بالاتر با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wctad-maybe-unsupported (فقط C++ و Objective-C++)
- هنگام
انجام
استنتاج
آرگومان
الگوی کلاس
(CTAD) روی نوعی
بدون
راهنماهای
استنتاج
صریحاً
نوشتهشده،
هشدار بده.
این هشدار
مواردی را
مشخص
میکند که CTAD
تنها به این
دلیل موفق
شده که
کامپایلر
راهنماهای
استنتاج
ضمنی را
سنتز کرده
است، که
ممکن است مد
نظر
برنامهنویس
نبوده باشد.
برخی
شیوهنامهها
CTAD را تنها
روی انواعی
مجاز
میدانند
که بهطور
خاص «اعلام
آمادگی» (opt-in)
کرده
باشند؛
یعنی روی
انواعی که
برای
پشتیبانی
از CTAD طراحی
شدهاند.
این هشدار
را میتوان
با الگوی
زیر
فرونشاند:
struct allow_ctad_t; // any name works template <typename T> struct S { S(T) { } }; // Guide with incomplete parameter type will never be considered. S(allow_ctad_t) -> S<void>; - -Wctor-dtor-privacy (فقط C++ و Objective-C++)
- زمانی که کلاسی به نظر غیرقابل استفاده میرسد زیرا تمام سازندهها یا مخربهای آن کلاس خصوصی هستند و هیچ دوست (friend) یا تابع عضو استاتیک عمومی ندارد، هشدار بده. همچنین اگر هیچ متد غیرخصوصی وجود نداشته باشد و حداقل یک تابع عضو خصوصی وجود داشته باشد که سازنده یا مخرب نباشد، هشدار بده.
- -Wdangling-reference (فقط C++ و Objective-C++)
- زمانی که یک
مرجع به یک
شیء موقت که
طول عمر آن
به پایان
رسیده متصل
شود، هشدار
بده. برای
مثال:
int n = 1; const int& r = std::max(n - 1, n + 1); // r is dangling
در مثال بالا، دو شیء موقت ایجاد میشود (یکی برای هر آرگومان) و مرجعی به یکی از اشیاء موقت بازگردانده میشود. با این حال، هر دو شیء موقت در انتهای کل عبارت (full expression) نابود میشوند، بنابراین مرجع "r" معلق (dangling) است. این هشدار همچنین مراجع معلق را در فهرستهای مقداردهی اولیه اعضا تشخیص میدهد:
const int& f(const int& i) { return i; } struct S { const int &r; // r is dangling S() : r(f(10)) { } };توابع عضو نیز بررسی میشوند، اما فقط آرگومان شیء (object argument) آنها:
struct S { const S& self () { return *this; } }; const S& s = S().self(); // s is danglingبرخی توابع از این حیث ایمن هستند، برای مثال "std::use_facet": آنها یک مرجع را دریافت کرده و بازمیگردانند، اما یکی از آرگومانهای آن را بازنمیگردانند، که میتواند هشدار را گمراه کند. چنین توابعی را میتوان با محصور کردن آنها در یک "#pragma" از هشدار مستثنی کرد:
#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdangling-reference" const T& foo (const T&) { ... } #pragma GCC diagnostic popدستور "#pragma" همچنین میتواند کلاس را در بر بگیرد؛ در این حالت، هشدار برای تمام توابع عضو غیرفعال خواهد شد.
گزینه -Wdangling-reference همچنین در مورد کدهایی مانند زیر هشدار میدهد:
auto p = std::minmax(1, 2);
جایی که "std::minmax" مقدار "std::pair<const int&, const int&>" را بازمیگرداند، و هر دو مرجع پس از پایان کل عبارتی که حاوی فراخوانی "std::minmax" است معلق میشوند.
این هشدار برای کلاسهای شبه-"std::span" هشدار نمیدهد. ما کلاسهایی به شکل:
template<typename T> struct Span { T* data_; std::size len_; };را شبه-"std::span" در نظر میگیریم؛ یعنی کلاس یک کلاس غیر union است که دارای یک عضو دادهای اشارهگر و یک مخرب بدیهی (trivial) است.
این هشدار را میتوان با استفاده از مشخصه "gnu::no_dangling" غیرفعال کرد.
این هشدار با -Wextra فعال میشود..IP "-Wdelete-non-virtual-dtor (تنها C++ و Objective-C++)" 4 هنگامی که از "delete" برای تخریب نمونهای از یک کلاس استفاده میشود که دارای توابع مجازی و مخرب غیرمجازی است، هشدار میدهد. در صورتی که کلاس پایه فاقد مخرب مجازی باشد، حذف نمونهای از یک کلاس مشتقشده از طریق اشارهگری به کلاس پایه ناامن است. این هشدار توسط -Wall فعال میشود.
- -Wdeprecated-copy (تنها C++ و Objective-C++)
- در C++11 و بالاتر، هشدار میدهد که اعلان ضمنی سازنده رونوشت یا عملگر انتساب رونوشت در صورتی که کلاس دارای یک سازنده رونوشت یا عملگر انتساب رونوشت تعریفشده توسط کاربر باشد، منسوخ است. این هشدار توسط -Wextra فعال میشود. همراه با -Wdeprecated-copy-dtor، اگر کلاس دارای یک مخرب تعریفشده توسط کاربر باشد نیز منسوخ در نظر گرفته میشود.
- -Wno-deprecated-enum-enum-conversion (تنها C++ و Objective-C++)
- هشدار
مربوط به
حالتی را که
در آن
تبدیلات
حسابی
معمول روی
عملوندهایی
اعمال
میشود که
یکی از نوع
شمارشی و
دیگری از
نوع شمارشی
متفاوتی
است،
غیرفعال
میکند. این
تبدیل در C++20
منسوخ شد.
برای مثال:
enum E1 { e }; enum E2 { f }; int k = f - e;-Wdeprecated-enum-enum-conversion بهطور پیشفرض با -std=c++20 فعال است. در نسخههای پیش از C++20، این هشدار میتواند توسط -Wenum-conversion یا -Wdeprecated فعال شود.
- -Wno-deprecated-enum-float-conversion (تنها C++ و Objective-C++)
- هشدار
مربوط به
حالتی را که
در آن
تبدیلات
حسابی
معمول روی
عملوندهایی
اعمال
میشود که
یکی از نوع
شمارشی و
دیگری از
نوع ممیز
شناور است،
غیرفعال
میکند. این
تبدیل در C++20
منسوخ شد.
برای مثال:
enum E1 { e }; enum E2 { f }; bool b = e <= 3.7;-Wdeprecated-enum-float-conversion بهطور پیشفرض با -std=c++20 فعال است. در نسخههای پیش از C++20، این هشدار میتواند توسط -Wenum-conversion یا -Wdeprecated فعال شود.
- -Wdeprecated-literal-operator (تنها C++ و Objective-C++)
- هشدار
میدهد که
اعلان یک
عملگر لفظی
تعریفشده
توسط کاربر
(user-defined literal operator) با
وجود فاصله
پیش از
پسوند،
منسوخ است.
این هشدار
بهطور
پیشفرض در
C++23 یا با -Wdeprecated
صریح فعال
میشود.
string operator "" _i18n(const char*, std::size_t); // deprecated string operator ""_i18n(const char*, std::size_t); // preferred
- -Wdeprecated-variadic-comma-omission (تنها C++ و Objective-C++)
- هشدار
میدهد که
حذف کاما
پیش از
آرگومانهای
متغیر
"..." در
انتهای
فهرست
پارامترهای
تابع منسوخ
است. این
هشدار
بهطور
پیشفرض در
C++26 یا با -Wdeprecated
صریح فعال
میشود.
void f1(int...); // deprecated void f1(int, ...); // preferred template <typename ...T> void f2(T...); // ok template <typename ...T> void f3(T......); // deprecated
- -Wno-elaborated-enum-base
- برای C++11 و بالاتر، در صورتی که یک enum-base اضافی (نامعتبر) در یک elaborated-type-specifier استفاده شود، هشدار میدهد. به این معنا که اگر یک شمارش با نوع زیربنایی مشخص و بدون فهرست مقادیر شمارشی، در اعلانی غیر از یک اعلان مستقل از آن شمارش به کار رود. بهطور پیشفرض فعال است. این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-init-list-lifetime (تنها C++ و Objective-C++)
- درباره استفادههایی از "std::initializer_list" که احتمالاً منجر به اشارهگرهای معلق (dangling pointers) میشوند، هشدار نمیدهد. از آنجا که با آرایه زیربنایی یک "initializer_list" مانند یک شیء موقت معمولی در C++ رفتار میشود، بسیار محتمل است که بهطور ناخواسته اشارهگری به آن آرایه پس از پایان طول عمرش نگهداشته شود. برای مثال:
- اگر تابعی یک "initializer_list" موقت یا یک متغیر محلی "initializer_list" را برگرداند، طول عمر آرایه در پایان دستور return به پایان میرسد؛ بنابراین مقدار بازگرداندهشده دارای یک اشارهگر معلق است.
- اگر یک عبارت new یک "initializer_list" ایجاد کند، آرایه فقط تا پایان عبارت کاملِ (full-expression) دربرگیرنده زنده میماند؛ بنابراین "initializer_list" موجود در حافظه هیپ (heap) دارای یک اشارهگر معلق خواهد بود.
- هنگامی که
به یک متغیر
"initializer_list" از
یک فهرست
مقداردهی
درون آکولد
مقداردهی
شود، آرایه
موقت
ایجادشده
برای سمت
راست
انتساب
تنها تا
پایان
عبارت کامل
زنده
میماند؛
بنابراین
در دستور
بعدی،
متغیر
"initializer_list"
دارای یک
اشارهگر
معلق است.
// li's initial underlying array lives as long as li std::initializer_list<int> li = { 1,2,3 }; // assignment changes li to point to a temporary array li = { 4, 5 }; // now the temporary is gone and li has a dangling pointer int i = li.begin()[0] // undefined behavior - هنگامی که یک سازنده فهرست، اشارهگر "begin" را از آرگومان "initializer_list" ذخیره میکند، این کار طول عمر آرایه را افزایش نمیدهد؛ بنابراین اگر یک متغیر کلاس از یک "initializer_list" موقت ساخته شود، اشارهگر در پایان دستور اعلان متغیر بهصورت معلق باقی میماند.
- -Winvalid-constexpr
- هنگامی که
یک تابع
هرگز یک
عبارت ثابت
(constant expression) تولید
نمیکند،
هشدار
میدهد. در C++20
و پیش از
آن، برای هر
تابع و
الگوی تابع
"constexpr"،
باید حداقل
یک مجموعه
از
آرگومانها
در حداقل یک
نمونهسازی
(instantiation) وجود
داشته باشد
بهگونهای
که
فراخوانی
تابع یا
سازنده
بتواند یک
زیرعبارت
ارزیابیشده
از یک عبارت
ثابت اصلی (core
constant expression) باشد. C++23
این
محدودیت را
حذف کرد،
بنابراین
ممکن است
تابع یا
الگوی
تابعی با
نشان
"constexpr"
وجود داشته
باشد که هیچ
فراخوانی
آن شروط یک
عبارت ثابت
اصلی را
برآورده
نکند.
این هشدار بهطور پیشفرض در C++20 و پیش از آن به عنوان یک هشدار دقیق (pedantic) فعال است. در C++23، گزینه -Winvalid-constexpr میتواند فعال شود که در این صورت یک هشدار معمولی خواهد بود. برای مثال:
void f (int& i); constexpr void g (int& i) { // Warns by default in C++20, in C++23 only with -Winvalid-constexpr. f(i); } - -Winvalid-imported-macros
- معتبر بودن تعاریف همه ماکروهای واردشده (imported macros) را در پایان کامپایل بررسی میکند. این گزینه بهطور پیشفرض فعال نیست، چرا که تعیین آن نیازمند پردازش اضافی است. این گزینه هنگام آمادهسازی مجموعههایی از header-unitها برای اطمینان از سازگاری ماکروها مفید است.
- -Wno-literal-suffix (تنها C++ و Objective-C++)
- هنگامی که
یک لیترال
رشتهای یا
نویسهای
با یک ud-suffix که
با زیرخط
آغاز
نمیشود
دنبال شود،
هشدار
نمیدهد. به
عنوان یک
افزونه
منطبق با
استاندارد،
GCC با چنین
پسوندهایی
به عنوان
توکنهای
پیشپردازش
مجزا رفتار
میکند تا
سازگاری
عقبرو با
کدهایی که
از
ماکروهای
قالببندی
موجود در
"<inttypes.h>"
استفاده
میکنند
حفظ شود.
برای مثال:
#define __STDC_FORMAT_MACROS #include <inttypes.h> #include <stdio.h> int main() { int64_t i64 = 123; printf("My int64: %" PRId64"\n", i64); }در این حالت، با "PRId64" مانند یک توکن پیشپردازش مجزا برخورد میشود.
این گزینه همچنین هشدارهایی را کنترل میکند که در آنها یک عملگر لفظی تعریفشده توسط کاربر با شناسه پسوند لفظی که با زیرخط آغاز نمیشود، اعلان شده باشد. شناسههای پسوند لفظی که با زیرخط آغاز نمیشوند، برای استانداردسازیهای آینده رزرو شدهاند.
این هشدارها بهطور پیشفرض فعال هستند.
- -Wno-narrowing (تنها C++ و Objective-C++)
- برای
استانداردهای
C++11 و جدیدتر،
تبدیلات
باریککننده
(narrowing conversions)
همانطور
که در
استاندارد
الزامی
است،
بهطور
پیشفرض
تشخیص داده
میشوند.
تبدیل
باریککننده
از یک مقدار
ثابت منجر
به خطا
میشود، و
تبدیل
باریککننده
از یک مقدار
غیرثابت یک
هشدار
ایجاد
میکند؛
اما -Wno-narrowing این
گزارش خطا
یا هشدار را
سرکوب
میکند.
توجه داشته
باشید که
این گزینه
معنای کد
خوشساخت
(well-formed) را تغییر
نمیدهد؛
تبدیلات
باریککننده
همچنان در
زمینههای
SFINAE ناصحیح (ill-formed)
در نظر
گرفته
میشوند.
همراه با -Wnarrowing در C++98، هنگامی که تبدیل باریککنندهای که در C++11 ممنوع شده درون { } رخ دهد، هشدار میدهد؛ برای مثال: int i = { 2.2 }; // error: narrowing from double to int
این پرچم در -Wall و -Wc++11-compat گنجانده شده است.
- -Wnoexcept (فقط C++ و Objective-C++)
- هنگامی هشدار میدهد که یک عبارت noexcept به دلیل فراخوانی تابعی که فاقد مشخصات استثنای بدون پرتاب (یعنی throw() یا "noexcept") است اما کامپایلر میداند که هرگز استثنایی پرتاب نمیکند، به نادرست (false) ارزیابی شود.
- -Wnoexcept-type (فقط C++ و Objective-C++)
- هنگامی
هشدار
میدهد که
ویژگی C++17 که
"noexcept" را
بخشی از نوع
تابع قرار
میدهد،
نام
درهمپیچیدهٔ
(mangled name) یک نماد
را نسبت به C++14
تغییر دهد.
با -Wabi و -Wc++17-compat
فعال
میشود.
به عنوان مثال:
template <class T> void f(T t) { t(); }; void g() noexcept; void h() { f(g); }در C++14، "f" تابع "f<void(*)()>" را فراخوانی میکند، اما در C++17 "f<void(*)()noexcept>" را فراخوانی مینماید.
- -Wclass-memaccess (فقط C++ و Objective-C++)
- هنگامی
هشدار
میدهد که
مقصد
فراخوانیِ
یک تابع
حافظهٔ خام
مانند
"memset" یا
"memcpy"
شیئی از نوع
کلاس باشد،
و نوشتن در
چنین شیئی
ممکن است
سازنده یا
انتساب کپی
غیربدیهی
(non-trivial) یا
حذفشدهٔ
کلاس را دور
بزند،
درستیِ
ثابت (const-correctness) یا
کپسولهسازی
را نقض کند،
یا
اشارهگرهای
جدول مجازی
را تخریب
نماید.
تغییر
بازنمایی
چنین
اشیایی
ممکن است
ناورداهایی
را که توسط
توابع عضو
کلاس حفظ
میشوند
نقض کند.
برای مثال،
فراخوانی
"memset" در
زیر
تعریفنشده
است زیرا یک
شیء کلاس
غیربدیهی
را تغییر
میدهد و از
این رو
تشخیص داده
میشود. راه
ایمن برای
مقداردهی
اولیه یا
پاک کردن
حافظهٔ
اشیاء با
چنین
انواعی،
استفاده از
سازنده یا
عملگر
انتساب
مناسب در
صورت وجود
است.
std::string str = "abc"; memset (&str, 0, sizeof str);
گزینهٔ -Wclass-memaccess توسط -Wall فعال میشود. تبدیل صریح نوعِ (cast) اشارهگر شیء کلاس به "void *" یا به نوعی که بتواند به طور ایمن توسط تابع حافظهٔ خام دسترسی یابد، هشدار را سرکوب میکند.
- -Wnon-virtual-dtor (فقط C++ و Objective-C++)
- هنگامی هشدار میدهد که یک کلاس دارای توابع مجازی بوده و خودش یا کلاس پایهٔ چندریختی در دسترسش دارای یک مخرب غیرمجازی در دسترس باشد؛ در این حالت حذف نمونهای از کلاس مشتقشده از طریق اشارهگری به خود کلاس یا کلاس پایه امکانپذیر اما ناامن است. این هشدار در صورت تعیین -Weffc++ به طور خودکار فعال میشود. گزینهٔ -Wdelete-non-virtual-dtor (فعالشده با -Wall) باید ترجیح داده شود زیرا در مورد موارد ناامن بدون هشدارهای کاذب (false positives) هشدار میدهد.
- -Wregister (فقط C++ و Objective-C++)
- هنگام استفاده از مشخصکنندهٔ ردهٔ ذخیرهسازی "register" هشدار میدهد، مگر زمانی که بخشی از افزونهٔ Explicit Register Variables گنو باشد. استفاده از کلیدواژهٔ "register" به عنوان مشخصکنندهٔ ردهٔ ذخیرهسازی در C++11 منسوخ و در C++17 حذف شد. به طور پیشفرض با -std=c++17 فعال است.
- -Wreorder (فقط C++ و Objective-C++)
- هنگامی
هشدار
میدهد که
ترتیب
مقداردهندههای
اولیهٔ
اعضا
مشخصشده
در کد با
ترتیبی که
باید اجرا
شوند
مطابقت
نداشته
باشد. برای
نمونه:
struct A { int i; int j; A(): j (0), i (1) { } };کامپایلر مقداردهندههای اولیهٔ اعضا را برای "i" و "j" بازآرایی میکند تا با ترتیب اعلان اعضا مطابقت پیدا کند، و هشداری با همین مضمون صادر مینماید. این هشدار توسط -Wall فعال میشود.
- -Wno-pessimizing-move (فقط C++ و Objective-C++)
- این هشدار
زمانی صادر
میشود که
یک
فراخوانی
"std::move"
مانع از حذف
کپی (copy elision) شود.
سناریوی
معمولی که
در آن حذف
کپی
میتواند
رخ دهد،
هنگام
بازگشت از
تابعی با
نوع
بازگشتی
کلاس است،
زمانی که
عبارت
بازگرداندهشده
نام یک شیء
خودکارِ
غیرفرار (non-volatile)
است،
پارامتر
تابع نیست و
نوعی مشابه
نوع
بازگشتی
تابع دارد.
struct T { ... }; T fn() { T t; ... return std::move (t); }اما در این مثال، فراخوانی "std::move" مانع از حذف کپی میشود.
این هشدار توسط -Wall فعال میشود.
- -Wno-redundant-move (فقط C++ و Objective-C++)
- این گزینه
دربارهٔ
فراخوانیهای
زائدِ
"std::move"
هشدار
میدهد؛
یعنی زمانی
که عملیات
انتقال حتی
بدون
فراخوانی
"std::move" نیز
انجام
میشد. این
اتفاق به
این دلیل
میافتد که
کامپایلر
در
موقعیتهای
خاصی مانند
بازگرداندن
یک متغیر
محلی در
جایی که حذف
کپی قابل
اعمال
نیست،
ناچار است
با شیء
بهگونهای
رفتار کند
که گویی یک rvalue
است. در نظر
بگیرید:
struct T { ... }; T fn(T t) { ... return std::move (t); }در اینجا فراخوانی "std::move" زائد است. از آنجا که G++ مورد Core Issue 1579 را پیادهسازی میکند، مثال دیگر به این صورت است:
struct T { // convertible to U ... }; struct U { ... }; U fn() { T t; ... return std::move (t); }در این مثال، حذف کپی قابل اعمال نیست زیرا نوع عبارت بازگرداندهشده و نوع بازگشتی تابع متفاوت است، با این حال G++ با مقدار بازگشتی طوری رفتار میکند که گویی توسط یک rvalue مشخص شده است.
این هشدار توسط -Wextra فعال میشود.
- -Wrange-loop-construct (فقط C++ و Objective-C++)
- این هشدار
زمانی صادر
میشود که
یک حلقهٔ for
بر پایهٔ
دامنه در C++
در حال
ایجاد یک
کپی
غیرضروری
باشد. این
حالت
میتواند
زمانی رخ
دهد که
اعلان
دامنه یک
مرجع
نباشد، در
حالی که
احتمالاً
باید باشد.
برای مثال:
struct S { char arr[128]; }; void fn () { S arr[5]; for (const auto x : arr) { ... } }زمانی که نوعِ در حال کپی شدن یک نوع با قابلیت کپی بدیهی (trivially-copyable) باشد که اندازهٔ آن کمتر از ۶۴ بایت است، هشدار داده نمیشود.
این هشدار همچنین زمانی صادر میشود که یک متغیر حلقه در یک حلقهٔ for بر پایهٔ دامنه با مقداری از یک نوع متفاوت مقداردهی اولیه شود که به یک کپی منجر گردد. برای مثال:
void fn() { int arr[10]; for (const double &x : arr) { ... } }در مثال بالا، در هر تکرار حلقه یک مقدار موقت از نوع "double" ایجاد و نابود میشود که مرجع "const double &" به آن متصل شده است.
این هشدار توسط -Wall فعال میشود.
- -Wredundant-tags (فقط C++ و Objective-C++)
- دربارهٔ class-key
و enum-key زائد در
ارجاعها
به انواع
کلاس و
انواع
شمارشی در
زمینههایی
که میتوان
کلید را
بدون ایجاد
ابهام حذف
کرد، هشدار
میدهد.
برای مثال: struct
foo; struct foo *p; // warn that keyword struct can be eliminated
از سوی دیگر، در این مثال هیچ هشداری داده نمیشود:
struct foo; void foo (); // "hides" struct foo void bar (struct foo&); // no warning, keyword struct is necessary
- -Wno-subobject-linkage (فقط C++ و Objective-C++)
- هشدار ندهد اگر نوع یک کلاس دارای یک پایه (base) یا فیلدی باشد که نوع آن از فضای نام بینام (anonymous namespace) استفاده میکند یا به نوعی بدون پیوند (no linkage) وابسته است. اگر یک نوع A به یک نوع B بدون پیوند یا با پیوند درونی (internal linkage) وابسته باشد، تعریف آن در چندین واحد ترجمه (translation unit) نقض ODR خواهد بود؛ چرا که معنای B در هر واحد ترجمه متفاوت است. اگر A تنها در یک واحد ترجمه ظاهر شود، بهترین روش برای فرونشاندن هشدار این است که با قرار دادن آن در یک فضای نام بینام، به آن نیز پیوند درونی داده شود. کامپایلر این هشدار را برای انواعی که در فایل اصلی .C تعریف شدهاند صادر نمیکند، زیرا بعید است که آنها چندین تعریف داشته باشند. -Wsubobject-linkage به صورت پیشفرض فعال است.
- -Weffc++ (فقط C++ و Objective-C++)
- دربارهٔ نقض رهنمودهای شیوهنامهٔ زیر از مجموعه کتابهای Effective C++ اثر Scott Meyers هشدار میدهد:
- برای کلاسهایی با حافظهٔ تخصیصیافته به صورت پویا، یک سازندهٔ رونوشت (copy constructor) و یک عملگر انتساب (assignment operator) تعریف کنید.
- در سازندهها، مقداردهی اولیه را به انتساب ترجیح دهید.
- بگذارید "operator=" یک مرجع به *this برگرداند.
- هنگامی که باید یک شیء برگردانید، سعی نکنید مرجع برگردانید.
- بین شکلهای پیشوندی و پسوندی عملگرهای افزایش و کاهش تفاوت قائل شوید.
- هرگز عملگرهای "&&"، "||" یا "," را سربارگذاری (overload) نکنید.
این گزینه همچنین -Wnon-virtual-dtor را فعال میکند که آن هم یکی از توصیههای Effective C++ است. با این حال، این بررسی گسترش یافته است تا در مورد نبودِ ویرانکنندهٔ مجازی (virtual destructor) در کلاسهای پایهٔ غیرچندریختی (non-polymorphic) قابلدسترس نیز هشدار دهد.
هنگام انتخاب این گزینه دقت داشته باشید که سرآیندهای کتابخانهٔ استاندارد از همهٔ این رهنمودها پیروی نمیکنند؛ برای پالایش و حذف آن هشدارها از grep -v استفاده کنید.
- -Wno-exceptions (فقط C++ و Objective-C++)
- هشدار مربوط به حالتی که در آن یک مدیریتکنندهٔ استثنا (exception handler) توسط مدیریتکنندهٔ دیگری پوشانده (shadow) میشود را غیرفعال میکند؛ وضعیتی که میتواند نشاندهندهٔ ترتیب نادرستِ مدیریتکنندههای استثنا باشد.
- -Wstrict-null-sentinel (فقط C++ و Objective-C++)
- دربارهٔ استفاده از "NULL" بدون تبدیل نوع (uncasted) به عنوان نشانگر پایان (sentinel) هشدار میدهد. هنگام کامپایل تنها با GCC این یک نشانگر معتبر است، زیرا "NULL" به صورت "__null" تعریف شده است. اگرچه این یک ثابتِ اشارهگر تهی (null pointer constant) است نه یک اشارهگر تهی (null pointer)، تضمین میشود که اندازهای برابر با یک اشارهگر داشته باشد. اما این استفاده در میان کامپایلرهای گوناگون قابلحمل (portable) نیست.
- -Wno-non-template-friend (فقط C++ و Objective-C++)
- هشدارهای مربوط به زمانی را که توابع دوستِ غیرقالب (non-template friend functions) در داخل یک قالب اعلان میشوند، غیرفعال میکند. در نسخههای بسیار قدیمی GCC که پیش از پیادهسازی استاندارد ISO بودند، اعلانهایی مانند friend int foo(int) که در آنها نام تابع دوست یک شناسهٔ بدون صلاحیت (unqualified-id) است، میتوانست به عنوان یک تخصیص ویژه (specialization) از تابع قالب تفسیر شود؛ این هشدار برای تشخیص مشکلات سازگاری وجود دارد و به طور پیشفرض فعال است.
- -Wold-style-cast (فقط C++ و Objective-C++)
- اگر تبدیل نوع به سبک قدیمی (سبک C) به یک نوع غیر void در یک برنامهٔ C++ استفاده شود، هشدار میدهد. تبدیلهای نوع سبک جدید ("dynamic_cast"، "static_cast"، "reinterpret_cast" و "const_cast") کمتر در معرض اثرات ناخواسته هستند و جستجوی آنها بسیار آسانتر است.
- -Woverloaded-virtual (فقط C++ و Objective-C++)
- -Woverloaded-virtual=n
- زمانی که
اعلان یک
تابع،
توابع
مجازی کلاس
پایه را
پنهان
میکند
هشدار
میدهد. به
عنوان
مثال، در:
struct A { virtual void f(); }; struct B: public A { void f(int); // does not override };نسخهٔ کلاس "A" از تابع "f" در "B" پنهان میشود، و کدی مانند:
B* b; b->f();
کامپایل نمیشود.
در مواردی که تفاوت در امضاها تصادفی نیست، سادهترین راهحل افزودن یک اعلان using به کلاس مشتقشده برای آشکارسازی تابع پایه است؛ به عنوان مثال افزودن "using A::f;" به "B".
پسوند سطحِ اختیاری رفتاری را کنترل میکند که در آن همهٔ اعلانها در کلاس مشتقشده توابع مجازی کلاس پایه را بازنویسی (override) میکنند، حتی اگر همهٔ توابع کلاس پایه بازنویسی نشده باشند:
struct C { virtual void f(); virtual void f(int); }; struct D: public C { void f(int); // does override }این الگو کمتر احتمال دارد یک اشتباه باشد؛ اگر از D فقط به شکل مجازی استفاده شود، کاربر ممکن است به این نتیجه رسیده باشد که معناشناسی کلاس پایه برای برخی از سربارگذاریها مناسب است.
در سطح ۱، برای این حالت هشداری داده نمیشود؛ در سطح ۲ هشدار میدهد. -Woverloaded-virtual به تنهایی سطح ۲ را انتخاب میکند. سطح ۱ در -Wall گنجانده شده است.
- -Wno-pmf-conversions (فقط C++ و Objective-C++)
- پیام تشخیصی برای تبدیل یک اشارهگر مقید به تابع عضو (bound pointer to member function) به یک اشارهگر ساده را غیرفعال میکند.
- -Wsign-promo (فقط C++ و Objective-C++)
- زمانی هشدار میدهد که تفکیک سربارگذاری (overload resolution)، ترفیع از یک نوع بدونعلامت یا شمارشی به یک نوع علامتدار را به تبدیل به یک نوع بدونعلامت هماندازه ترجیح دهد. نسخههای قبلی G++ تلاش میکردند بدونعلامت بودن را حفظ کنند، اما استاندارد رفتار فعلی را الزامی کرده است.
- -Wtemplates (فقط C++ و Objective-C++)
- هنگام مواجهه با اعلان یک قالب اولیه (primary template) هشدار میدهد. برخی از قوانین کدنویسی استفاده از قالبها را منع میکنند و این گزینه میتواند برای اعمال این قانون استفاده شود. این هشدار در داخل فایلهای سرآیند سیستمی مانند STL غیرفعال است، بنابراین همچنان میتوان از STL استفاده کرد. همچنین میتوان قالبها را نمونهسازی (instantiate) یا تخصیص ویژه (specialize) کرد.
- -Wmismatched-new-delete (فقط C++ و Objective-C++)
- دربارهٔ
عدم تطابق
میان
فراخوانیهای
"operator new" یا
"operator delete" و
فراخوانی
متناظر با
تابع تخصیص
یا
آزادسازی
هشدار
میدهد. این
شامل
فراخوانیهای
"operator delete" در C++
با
اشارهگرهای
بازگرداندهشده
از فرمهای
ناسازگار
"operator new"، یا
از توابع
دیگری است
که اشیائی
را تخصیص
میدهند که
"operator delete"
برای آنها
آزادساز
مناسبی
نیست، و
همچنین
شامل
فراخوانی
سایر توابع
آزادسازی
با
اشارهگرهای
بازگرداندهشده
از "operator new"
میشود که
آن تابع
آزادسازی
برایشان
مناسب نیست.
به عنوان مثال، عبارت "delete" در تابع زیر تشخیص داده میشود زیرا با فرم آرایهای عبارت "new" که آرگومان اشارهگر از آن بازگردانده شده بود تطابق ندارد. به همین ترتیب، فراخوانی "free" نیز تشخیص داده میشود.
void f () { int *a = new int[n]; delete a; // warning: mismatch in array forms of expressions char *p = new char[n]; free (p); // warning: mismatch between new and free }گزینهٔ مرتبط -Wmismatched-dealloc عدم تطابقهای مربوط به توابع تخصیص و آزادسازی غیر از "operator new" و "operator delete" را تشخیص میدهد.
-Wmismatched-new-delete در -Wall گنجانده شده است..IP "-Wmismatched-tags (تنها C++ و Objective-C++)" 4 درباره اعلانهای structها، classها، و الگوهای کلاس و تخصیصهای (specializations) آنها با یک کلیدواژه کلاس (class-key) که با تعریف، یا با نخستین اعلان در صورت عدم ارائه تعریف، مطابقت ندارد هشدار میدهد.
برای نمونه، اعلان "struct Object" در فهرست آرگومانهای "draw" این هشدار را فعال میکند. برای جلوگیری از آن، یا کلیدواژه کلاس زاید "struct" را حذف کنید، یا آن را با "class" جایگزین نمایید تا با تعریفش مطابقت یابد.
class Object { public: virtual ~Object () = 0; }; void draw (struct Object*);همانطور که مثال بالا نشان میدهد، اعلان یک کلاس با کلیدواژه کلاس "struct" لزوماً اشتباه نیست. گزینه -Wmismatched-tags با این هدف در نظر گرفته شده که به دستیابی به شیوهای یکدست در اعلانهای کلاس کمک کند. در کدهایی که قرار است برای کامپایلرهای مبتنی بر Windows قابل حمل باشند، این هشدار به جلوگیری از ارجاعهای حلنشده ناشی از تفاوت در درهمسازی نمادهای (symbol mangling) اعلانشده با کلیدواژههای کلاس مختلف کمک میکند. این گزینه میتواند به تنهایی یا همراه با -Wredundant-tags به کار رود.
- -Wmultiple-inheritance (تنها C++ و Objective-C++)
- هنگامی که کلاسی با چندین کلاس پایه مستقیم تعریف شود هشدار میدهد. برخی از قواعد کدنویسی وراثت چندگانه را مجاز نمیدانند، و این گزینه میتواند برای اعمال آن قاعده استفاده شود. این هشدار درون فایلهای سرآیند سیستمی، مانند STL غیرفعال است، بنابراین همچنان میتوان از STL استفاده کرد. همچنین میتوان کلاسهایی تعریف نمود که به طور غیرمستقیم از وراثت چندگانه استفاده میکنند.
- -Wvirtual-inheritance
- هنگامی که کلاسی با یک کلاس پایه مستقیم مجازی تعریف شود هشدار میدهد. برخی از قواعد کدنویسی وراثت چندگانه را منع میکنند، و این گزینه میتواند برای اعمال آن قاعده استفاده شود. این هشدار درون فایلهای سرآیند سیستمی مانند STL غیرفعال است، بنابراین همچنان میتوان از STL استفاده نمود. همچنین میتوان کلاسهایی تعریف کرد که به طور غیرمستقیم از وراثت مجازی استفاده میکنند.
- -Wno-virtual-move-assign
- هشدارهای مربوط به ارثبری از یک پایه مجازی با عملگر انتساب انتقال (move assignment operator) غیربدیهی در C++11 را سرکوب میکند. این امر خطرناک است زیرا اگر کلاس پایه مجازی در امتداد بیش از یک مسیر قابل دسترسی باشد، چندین بار منتقل (move) میشود، که میتواند بدین معنا باشد که هر دو شیء در وضعیتِ «منتقلشده» (moved-from) قرار میگیرند. اگر عملگر انتساب انتقال طوری نوشته شده باشد که از انتقال یک شیءِ منتقلشده جلوگیری کند، میتوان این هشدار را غیرفعال کرد.
- -Wnamespaces
- هنگامی که تعریف یک فضای نام باز میشود هشدار میدهد. برخی قواعد کدنویسی فضاهای نام را مجاز نمیدانند، و این گزینه میتواند برای اعمال آن قاعده به کار رود. این هشدار درون فایلهای سرآیند سیستمی مانند STL غیرفعال است، بنابراین همچنان میتوان از STL استفاده کرد. همچنین میتوان از رهنمودهای using و نامهای واجد شرایط (qualified names) بهره برد.
- -Wno-template-body (تنها C++ و Objective-C++)
- تشخیص خطاها هنگام تجزیه (parse) یک الگو را غیرفعال میکند و به جای آن، تنها هنگام نمونهسازی الگو خطا صادر مینماید. این پرچم همچنین میتواند برای تنزل دادن چنین خطاهایی به هشدار با Wno-error= یا -fpermissive به کار رود.
- -Wno-template-id-cdtor (تنها C++ و Objective-C++)
- هشدار
درباره
استفاده از
simple-template-id به
عنوان declarator-id
برای یک
سازنده (constructor)
یا مخرب (destructor)
را که در C++20 از
طریق DR 2237
نامعتبر
شد،
غیرفعال
میکند.
برای نمونه:
template<typename T> struct S { S<T>(); // should be S(); ~S<T>(); // should be ~S(); };گزینه -Wtemplate-id-cdtor به طور پیشفرض با -std=c++20 فعال است؛ همچنین توسط -Wc++20-compat فعال میشود.
- -Wtemplate-names-tu-local
- هنگامی که
بدنه الگو،
افشای یک
موجودیت
محلی واحد
ترجمه (translation-unit-local entity)
را پنهان
میکند،
هشدار
میدهد. در
بیشتر
موارد،
ارجاع به یک
موجودیت
محلی واحد
ترجمه
(مانند یک
اعلان با
پیوند
درونی) در
موجودیتی
که به CMI یک
ماژول
فرستاده
میشود یک
خطا است. با
این حال،
درون
مقداردهنده
اولیه (initializer) یک
متغیر، یا
درون بدنه
یک تابع غیر
inline، این امر
یک افشا
محسوب
نمیشود و
خطایی صادر
نمیگردد.
این امر در صورتی که الگوهای متغیر یا تابع به چنین موجودیتی ارجاع دهند میتواند باعث شود به طور تصادفی غیرقابل استفاده شوند، چرا که سایر واحدهای ترجمه که الگو را وارد (import) میکنند هرگز قادر به نمونهسازی آن نخواهند بود. این هشدار تلاش میکند مواردی را که این وضعیت در آنها ممکن است رخ دهد شناسایی کند. وجود یک نمونهسازی صریح (explicit instantiation) این هشدار را بیصدا میکند.
این پرچم توسط -Wextra فعال میشود.
- -Wno-terminate (تنها C++ و Objective-C++)
- هشدار درباره عبارت throw را که بلافاصله منجر به فراخوانی "terminate" میشود، غیرفعال میکند.
- -Wno-vexing-parse (تنها C++ و Objective-C++)
- درباره
ابهام
نحویِ
«آزاردهندهترین
تجزیه» (most vexing parse)
هشدار
میدهد. این
گزینه
درباره
مواردی
هشدار
میدهد که
یک اعلان
شبیه تعریف
متغیر به
نظر
میرسد،
اما زبان C++
ایجاب
میکند که
به عنوان
اعلان تابع
تفسیر شود.
برای نمونه:
void f(double a) { int i(); // extern int i (void); int n(int(a)); // extern int n (int); }مثالی دیگر:
struct S { S(int); }; void f(double a) { S x(int(a)); // extern struct S x (int); S y(int()); // extern struct S y (int (*) (void)); S z(); // extern struct S z (void); }این هشدار گزینههایی را برای چگونگی برخورد با چنین ابهامی پیشنهاد میکند؛ برای نمونه میتواند حذف پرانتزها یا استفاده از آکولادها به جای آنها را پیشنهاد دهد.
این هشدار به طور پیشفرض فعال است.
- -Wno-class-conversion (تنها C++ و Objective-C++)
- هنگامی که یک تابع تبدیل، شیئی را به همان نوع، به یک کلاس پایه از آن نوع، یا به void تبدیل میکند، هشدار نمیدهد؛ چنین تابع تبدیلی هرگز فراخوانی نخواهد شد.
- -Wvolatile (تنها C++ و Objective-C++)
- درباره
استفادههای
منسوخشده
از
توصیفکننده
"volatile"
هشدار
میدهد. این
شامل
عبارتهای
پسوندی و
پیشوندی
"++" و
"--" برای
انواع مقید
به "volatile"،
استفاده از
انتسابهای
ساده که
عملوند سمت
چپ آنها
برای
مقدارشان
یک نوع
غیرکلاسی
مقید به
"volatile"
است،
انتسابهای
مرکب که در
آنها
عملوند چپ
نوع
غیرکلاسیِ
مقید به
"volatile"
است، نوع
بازگشتی
تابع مقید
به "volatile"،
نوع
پارامتر
مقید به
"volatile"، و
مقیدسازیهای
ساختاریافته
از یک نوع
مقید به
"volatile"
میشود. این
کاربرد در C++20
منسوخ
اعلام شد.
به طور پیشفرض با -std=c++20 فعال است. پیش از -std=c++20، با تصریح -Wdeprecated فعال میشود.
- -Waligned-new
- درباره یک
new-expression از نوعی
که به
ترازبندی
بزرگتری
نسبت به
alignof(std::max_align_t)
نیاز دارد
اما از یک
تابع تخصیص
بدون
پارامتر
ترازبندی
صریح
استفاده
میکند،
هشدار
میدهد. این
گزینه با -Wall
فعال
میشود.
به طور معمول این گزینه فقط درباره توابع تخصیص سراسری هشدار میدهد، اما -Waligned-new=all درباره توابع تخصیص عضو کلاس نیز هشدار میدهد.
- -Wno-placement-new
- -Wplacement-new=n
- درباره
عبارتهای
placement new با رفتار
تعریفنشده
هشدار
میدهد؛
مانند ساخت
یک شیء در
بافری که از
نوع شیء
کوچکتر
است. برای
نمونه،
عبارت placement new
زیر تشخیص
داده
میشود چرا
که تلاش
میکند
آرایهای
از ۶۴ عدد
صحیح را در
بافری با
اندازه
تنها ۶۴
بایت بسازد.
char buf [64]; new (buf) int[64];
این هشدار به طور پیشفرض فعال است.
- -Wplacement-new=1
- این سطح
پیشفرض
هشدار برای
-Wplacement-new است. در
این سطح،
هشدار برای
برخی از
ساختارهای
اکیداً
تعریفنشده
که GCC به
عنوان
افزونههایی
برای
سازگاری با
کدهای
موروثی
اجازه
میدهد،
صادر
نمیشود.
برای
نمونه،
عبارت
"new" زیر
در این سطح
تشخیص داده
نمیشود با
اینکه طبق
استاندارد
C++ رفتار
تعریفنشده
دارد، چرا
که فراتر از
انتهای
آرایه
تکعنصری
مینویسد.
struct S { int n, a[1]; }; S *s = (S *)malloc (sizeof *s + 31 * sizeof s->a[0]); new (s->a)int [32](); در این سطح، علاوه بر تشخیص تمام ساختارهای مشابه در سطح ۱، هشداری نیز برای عبارتهای placement new که یک شیء را در آخرین عضو ساختاری میسازند که نوع آن آرایهای تکعضوی است و اندازهاش از اندازه شیء در حال ساخت کوچکتر است، صادر میشود. در حالی که مثال قبلی تشخیص داده میشود، ساختار زیر از افزونه آرایه با عضو انعطافپذیر (flexible member array) برای جلوگیری از هشدار در سطح ۲ استفاده میکند. struct S { int n, a[]; }; S *s = (S *)malloc (sizeof *s + 32 * sizeof s->a[0]); new (s->a)int [32]();
- -Wcatch-value
- -Wcatch-value=n (فقط C++ و Objective-C++)
- درباره گردانندههای catch که از طریق ارجاع (reference) دریافت نمیکنند هشدار میدهد. با -Wcatch-value=1 (یا بهطور خلاصه -Wcatch-value) درباره نوعهای کلاس چندریختی (polymorphic) که با مقدار (by value) دریافت میشوند هشدار میدهد. با -Wcatch-value=2 درباره همه نوعهای کلاس که با مقدار دریافت میشوند هشدار میدهد. با -Wcatch-value=3 درباره همه نوعهایی که با ارجاع دریافت نمیشوند هشدار میدهد. -Wcatch-value توسط -Wall فعال میشود.
- -Wconditionally-supported (فقط C++ و Objective-C++)
- درباره ساختارهای با پشتیبانی مشروط (C++11 [intro.defs]) هشدار میدهد.
- -Wno-defaulted-function-deleted (فقط C++ و Objective-C++)
- زمانی که یک تابع صراحتاً پیشفرضشده (defaulted) توسط کامپایلر حذف (delete) میشود، هشدار میدهد. این حالت زمانی میتواند رخ دهد که نوع اعلانشده تابع با نوع تابعی که بهطور ضمنی اعلان میشد مطابقت نداشته باشد. این هشدار به صورت پیشفرض فعال است.
- -Wno-delete-incomplete (فقط C++ و Objective-C++)
- هنگام حذف کردن (delete) اشارهگری به نوع ناقص (incomplete type)، که ممکن است باعث رفتار تعریفنشده در زمان اجرا شود، هشدار نمیدهد. این هشدار به صورت پیشفرض فعال است.
- -Wextra-semi (فقط C++ و Objective-C++)
- درباره
نقطهویرگولهای
(semicolon) اضافه و
زائد هشدار
میدهد.
زمینههای
گوناگونی
وجود دارد
که یک
نقطهویرگول
اضافی
میتواند
در آنها رخ
دهد. یکی
نقطهویرگول
پس از
تعاریف
توابع
درونکلاسی
است که در
تمام
گویشهای C++
معتبر است
(و هرگز یک pedwarn
به شمار
نمیرود):
struct S { void foo () {}; };مورد دیگر نقطهویرگول اضافی در حوزه فضای نام (namespace scope) است که از C++11 مجاز دانسته شده (بنابراین در C++98 یک pedwarn است):
struct S { }; ;و مورد دیگر نیز نقطهویرگول اضافی در تعاریف کلاس است که از C++11 مجاز دانسته شده (بنابراین در C++98 یک pedwarn است):
struct S { int a; ; }; - -Wno-global-module (فقط C++ و Objective-C++)
- هشدار مربوط به زمانی که قطعه ماژول سراسری (global module fragment) یک واحد ماژول صرفاً از دستورالعملهای پیشپردازنده تشکیل نشده باشد را غیرفعال میکند.
- -Wno-inaccessible-base (فقط C++ و Objective-C++)
- این گزینه
هشدارهای
مربوط به
زمانی را
کنترل
میکند که
یک کلاس
پایه به
دلیل
ابهام، در
کلاسی که از
آن مشتق شده
غیرقابل
دسترس باشد.
این هشدار
به صورت
پیشفرض
فعال است.
توجه داشته
باشید که
هشدار
مربوط به
پایههای
مجازی مبهم
با گزینه -Wextra
فعال
میشود.
struct A { int a; }; struct B : A { }; struct C : B, A { }; - -Wno-inherited-variadic-ctor
- هشدارهای مربوط به استفاده از سازندههای به ارثبردهشده C++11 را در مواردی که کلاس پایه دارای یک سازنده متغیر C (variadic constructor) باشد، نادیده میگیرد؛ این هشدار به صورت پیشفرض فعال است زیرا بیضی سهنقطه (...) به ارث برده نمیشود.
- -Wno-invalid-offsetof (فقط C++ و Objective-C++)
- هشدارهای
ناشی از
اعمال
ماکروی
"offsetof" بر
روی
نوعهای
غیر POD (non-POD) را
نادیده
میگیرد.
مطابق با
استاندارد
۲۰۱۴ ISO C++،
اعمال
"offsetof" روی
نوعی که
دارای
چیدمان
غیراستاندارد
است (non-standard-layout)
تعریفنشده
است. با این
حال، در
پیادهسازیهای
موجود C++،
معمولاً
"offsetof"
نتایج
معناداری
ارائه
میدهد. این
پرچم برای
کاربرانی
است که
آگاهند کدی
غیرقابلحمل
(nonportable)
مینویسند
و عمداً
تصمیم
گرفتهاند
هشدار
مربوط به آن
را نادیده
بگیرند.
محدودیتهای روی "offsetof" ممکن است در نسخه آینده استاندارد C++ کاهش یابد.
- -Wsized-deallocation (فقط C++ و Objective-C++)
- درباره
تعریف یک
تابع
آزادسازی
حافظه بدون
اندازه (unsized deallocation)
void operator delete (void *) noexcept; void operator delete[] (void *) noexcept;
بدون تعریف تابع آزادسازی اندازه مشخص (sized deallocation) متناظر
void operator delete (void *, std::size_t) noexcept; void operator delete[] (void *, std::size_t) noexcept;
یا برعکس هشدار میدهد. به همراه -fsized-deallocation توسط -Wextra فعال میشود.
- -Wsuggest-final-types
- درباره نوعهایی با متدهای مجازی که در صورت اعلان نوع با مشخصکننده "final" در C++11 یا در صورت امکان اعلان در یک فضای نام ناشناس (anonymous namespace)، کیفیت کد بهبود مییابد هشدار میدهد. این به GCC اجازه میدهد فراخوانیهای چندریختی را با تهاجم بیشتری مجازیزدایی (devirtualize) کند. این هشدار با بهینهسازی زمان پیوند (link-time optimization)، که در آن اطلاعات مربوط به گراف سلسلهمراتب کلاسها کاملتر است، مؤثرتر خواهد بود.
- -Wsuggest-final-methods
- درباره متدهای مجازی که در صورت اعلان متد با مشخصکننده "final" در C++11، یا در صورت امکان، اعلان نوع آن در یک فضای نام ناشناس یا با مشخصکننده "final"، کیفیت کد بهبود مییابد هشدار میدهد. این هشدار با بهینهسازی زمان پیوند (link-time optimization)، که در آن اطلاعات مربوط به گراف سلسلهمراتب کلاسها کاملتر است، مؤثرتر عمل میکند. توصیه میشود ابتدا پیشنهادات -Wsuggest-final-types را بررسی کنید و سپس با نشانهگذاریهای جدید دوباره کامپایل نمایید.
- -Wsuggest-override
- درباره بازنویسی توابع مجازی که با کلمه کلیدی "override" علامتگذاری نشدهاند هشدار میدهد.
- -Wno-conversion-null (فقط C++ و Objective-C++)
- برای تبدیلها میان "NULL" و نوعهای غیر اشارهگر هشدار نمیدهد. -Wconversion-null به صورت پیشفرض فعال است..SS "گزینههای کنترلکننده گویشهای Objective-C و Objective-C++" (یادداشت: این راهنما خود زبانهای Objective-C و Objective-C++ را توصیف نمیکند.)
این بخش گزینههای خط فرمانی را شرح میدهد که تنها برای برنامههای Objective-C و Objective-C++ معنادار هستند. شما همچنین میتوانید از اغلب گزینههای مستقل از زبان کامپایلر GNU نیز استفاده کنید. برای نمونه، ممکن است فایلی مانند some_class.m را اینگونه کامپایل کنید:
gcc -g -fgnu-runtime -O -c some_class.m
در این مثال، -fgnu-runtime گزینهای است که تنها برای برنامههای Objective-C و Objective-C++ کاربرد دارد؛ سایر گزینهها را میتوانید با هر زبان پشتیبانیشده توسط GCC به کار ببرید.
توجه داشته باشید که از آنجا که Objective-C گسترشی از زبان C است، کامپایلهای Objective-C ممکن است از گزینههای مختص فرانتاند C نیز استفاده کنند (برای نمونه، -Wtraditional). به طور مشابه، کامپایلهای Objective-C++ میتوانند از گزینههای مختص C++ (مانند -Wabi) بهره ببرند.
در اینجا فهرستی از گزینههایی آمده است که تنها برای کامپایل برنامههای Objective-C و Objective-C++ به کار میروند:
- -fconstant-string-class=class-name
- از class-name به عنوان نام کلاسی که باید برای هر رشتهی دقیق (لیترال) مشخصشده با نحو "@"..."" نمونهسازی شود، استفاده میکند. در صورت استفاده از زماناجرای GNU، نام کلاس پیشفرض "NXConstantString" و در صورت استفاده از زماناجرای NeXT برابر "NSConstantString" خواهد بود (پایین را ببینید). در سکوهای Darwin / macOS، در صورتی که گزینه -fconstant-cfstrings نیز ارائه شده باشد، اولویتی بالاتر از تنظیمات -fconstant-string-class پیدا کرده و باعث میشود لیترالهای "@"..."" به عنوان رشتههای ثابت CoreFoundation پیادهسازی شوند. توجه داشته باشید که -fconstant-cfstrings نام مستعاری برای معادل وابسته به هدف -mconstant-cfstrings است.
- -fgnu-runtime
- تولید کد شیء (object code) سازگار با زماناجرای استاندارد Objective-C متعلق به GNU. این مقدار پیشفرض برای بیشتر انواع سیستمها است.
- -fnext-runtime
- تولید خروجی سازگار با زماناجرای NeXT. این مقدار پیشفرض برای سیستمهای مبتنی بر NeXT، از جمله Darwin / macOS است. ماکروی "__NEXT_RUNTIME__" تنها و تنها در صورتی از پیش تعریف میشود که از این گزینه استفاده شود.
- -fno-nil-receivers
- فرض میکند که تمام ارسالهای پیام Objective-C ("[receiver message:arg]") در این واحد ترجمه تضمین میکنند که گیرنده (receiver) "nil" نیست. این کار امکان استفاده از نقاط ورودی کارآمدتر را در زماناجرا فراهم میآورد. این گزینه تنها همراه با زماناجرای NeXT و نسخه ۰ یا ۱ از ABI در دسترس است.
- -fobjc-abi-version=n
- استفاده از نسخه n از ABI مربوط به Objective-C برای زماناجرای انتخابشده. این گزینه در حال حاضر تنها برای زماناجرای NeXT پشتیبانی میشود. در آن حالت، نسخه ۰ همان ABI سنتی (۳۲ بیتی) بدون پشتیبانی از ویژگیها (properties) و دیگر امکانات اضافهشده در Objective-C 2.0 است. نسخه ۱ همان ABI سنتی (۳۲ بیتی) به همراه پشتیبانی از ویژگیها و دیگر امکانات اضافهشده در Objective-C 2.0 است. نسخه ۲ همان ABI مدرن (۶۴ بیتی) است. در صورت مشخص نشدن، پیشفرض روی ماشینهای هدف ۳۲ بیتی نسخه ۰، و روی ماشینهای هدف ۶۴ بیتی نسخه ۲ است.
- -fobjc-call-cxx-cdtors
- برای هر
کلاس Objective-C،
بررسی
میکند که
آیا
متغیرهای
نمونه آن
شیئی از C++ با
سازنده
پیشفرض
غیربدیهی
(non-trivial) هستند یا
خیر. در این
صورت، یک
متد نمونه
ویژه به نام
"- (id) .cxx_construct"
میسازد که
سازندههای
پیشفرض
غیربدیهی
را روی هر
یک از این
متغیرهای
نمونه به
ترتیب اجرا
کرده و سپس
"self" را
برمیگرداند.
به طور
مشابه،
بررسی
میکند که
آیا متغیر
نمونهای
شیء C++ با
ویرانگر
غیربدیهی
هست یا خیر،
و در این
صورت متد
ویژه "- (void)
.cxx_destruct" را
میسازد که
همه این
ویرانگرهای
پیشفرض را
به ترتیب
معکوس اجرا
میکند.
متدهای "- (id) .cxx_construct" و "- (void) .cxx_destruct" که بدین ترتیب تولید شدهاند، تنها روی متغیرهای نمونهای عمل میکنند که در کلاس جاری Objective-C اعلان شدهاند و نه متغیرهای به ارث رسیده از ابرکلاسها. این مسئولیت زماناجرای Objective-C است که تمام این متدها را در سلسلهمراتب وراثت شیء فراخوانی کند. متدهای "- (id) .cxx_construct" بلافاصله پس از تخصیص نمونه شیء جدید توسط زماناجرا فراخوانی میشوند؛ متدهای "- (void) .cxx_destruct" بلافاصله پیش از آنکه زماناجرا نمونه شیء را آزاد کند فراخوانی میشوند.
تا زمان نگارش این مستندات، تنها زماناجرای NeXT در Mac OS X 10.4 و جدیدتر از فراخوانی متدهای "- (id) .cxx_construct" و "- (void) .cxx_destruct" پشتیبانی میکند.
- -fobjc-direct-dispatch
- اجازه پرشهای سریع به توزیعکننده پیام (message dispatcher) را میدهد. در Darwin این کار از طریق comm page انجام میشود.
- -fobjc-exceptions
- پشتیبانی نحوی را برای رسیدگی به استثناهای ساختاریافته در Objective-C، مشابه آنچه در C++ ارائه میشود، فعال میکند. این گزینه برای استفاده از کلیدواژههای Objective-C شامل @try، @throw، @catch، @finally و @synchronized الزامی است. این گزینه با هر دو زماناجرای GNU و زماناجرای NeXT در دسترس است (اما همراه با زماناجرای NeXT روی Mac OS X 10.2 و قبلتر در دسترس نیست).
- -fobjc-gc
- جمعآوری زباله (GC) را در برنامههای Objective-C و Objective-C++ فعال میکند. این گزینه تنها با زماناجرای NeXT در دسترس است؛ زماناجرای GNU پیادهسازی جمعآوری زباله متفاوتی دارد که به پرچمهای خاص کامپایلر نیاز ندارد.
- -fobjc-nilcheck
- برای زماناجرای NeXT با نسخه ۲ از ABI، قبل از انجام فراخوانی واقعی متد، گیرنده را برای مقادیر nil در فراخوانیهای متد بررسی میکند. این مقدار پیشفرض است و میتوان آن را با استفاده از -fno-objc-nilcheck غیرفعال کرد. متدهای کلاس و فراخوانیهای super، صرف نظر از نحوه تنظیم این پرچم، هرگز برای nil به این صورت بررسی نمیشوند. در حال حاضر، هنگامی که از زماناجرای GNU یا نسخهای قدیمیتر از ABI زماناجرای NeXT استفاده میشود، این پرچم هیچ کاری انجام نمیدهد.
- -fobjc-std=objc1
- مطابقت با نحو زبان Objective-C 1.0، زبانی که توسط GCC 4.0 شناخته میشود. این مورد تنها بر موارد افزودهشده Objective-C به زبان C/C++ تأثیر میگذارد؛ و تأثیری بر انطباق با استانداردهای C/C++، که توسط پرچمهای گزینههای مجزای گویش C/C++ کنترل میشوند، ندارد. هنگامی که از این گزینه با کامپایلر Objective-C یا Objective-C++ استفاده میشود، هر نحو Objective-C که برای GCC 4.0 ناشناخته باشد رد خواهد شد. این گزینه برای اطمینان از اینکه کد Objective-C شما با نسخههای قدیمیتر GCC قابل کامپایل است مفید خواهد بود.
- -freplace-objc-classes
- یک نشانگر ویژه درج میکند که به ld(1) دستور میدهد فایل شیء حاصل را به طور ایستا پیوند نزند و در عوض به dyld(1) اجازه دهد تا آن را در زمان اجرا بارگذاری کند. این مورد همراه با حالت اشکالزدایی Fix-and-Continue به کار میرود، که در آن ممکن است فایل شیء مورد نظر در حین اجرای برنامه بدون نیاز به راهاندازی مجدد برنامه، دوباره کامپایل شده و به صورت پویا بارگذاری مجدد شود. در حال حاضر، قابلیت Fix-and-Continue تنها همراه با زماناجرای NeXT در Mac OS X 10.3 و جدیدتر در دسترس است.
- -fzero-link
- هنگام کامپایل برای زماناجرای NeXT، کامپایلر معمولاً فراخوانیهای objc_getClass("...") را (در صورتی که نام کلاس در هنگام کامپایل مشخص باشد) با ارجاعات ایستای کلاس که در زمان بارگذاری مقداردهی اولیه میشوند جایگزین میکند، که کارایی زمان اجرا را بهبود میبخشد. مشخص کردن پرچم -fzero-link این رفتار را لغو کرده و سبب نگهداری فراخوانیهای objc_getClass("...") میشود. این در حالت اشکالزدایی Zero-Link مفید است، زیرا امکان تغییر پیادهسازیهای کلاسهای مجزا را در طول اجرای برنامه فراهم میآورد. زماناجرای GNU در حال حاضر بدون توجه به گزینههای خط فرمان، همواره فراخوانیهای objc_get_class("...") را حفظ میکند.
- -fno-local-ivars
- به طور پیشفرض، به متغیرهای نمونه در Objective-C میتوان طوری دسترسی داشت که گویی متغیرهای محلی از درون متدهای کلاسی هستند که در آن اعلان شدهاند. این امر میتواند منجر به سایهاندازی (shadowing) میان متغیرهای نمونه و سایر متغیرهایی شود که به صورت محلی در متد کلاس یا به طور سراسری با همان نام اعلان شدهاند. مشخص کردن پرچم -fno-local-ivars این رفتار را غیرفعال کرده و بنابراین از مشکلات سایهاندازی متغیرها جلوگیری میکند.
- -fivar-visibility=[public|protected|private|package]
- میزان دید (visibility) پیشفرض متغیرهای نمونه را روی گزینه مشخصشده تنظیم میکند تا متغیرهای نمونهای که بیرون از محدوده دستورالعملهای تعیینکننده دسترسی اعلان شدهاند، به طور پیشفرض دارای دید مشخصشده باشند.
- -gen-decls
- اعلانهای رابط (interface) را برای تمام کلاسهای دیدهشده در فایل مبدأ، در فایلی با نام sourcename.decl ذخیره (dump) میکند.
- -Wassign-intercept (تنها Objective-C و Objective-C++)
- هرگاه یک انتساب Objective-C توسط جمعآوری زباله (garbage collector) رهگیری شود، هشدار میدهد.
- -Wno-property-assign-default (تنها Objective-C و Objective-C++)
- اگر برای یک ویژگی شیء Objective-C هیچ معناشناسی انتسابی (assign semantics) مشخص نشده باشد، هشدار نمیدهد.
- -Wno-protocol (تنها Objective-C و Objective-C++)
- اگر کلاسی برای پیادهسازی یک پروتکل اعلان شده باشد، برای هر متدی در پروتکل که توسط کلاس پیادهسازی نشده باشد، هشداری صادر میشود. رفتار پیشفرض این است که برای هر متدی که صراحتاً در کلاس پیاده نشده باشد هشدار داده شود، حتی اگر پیادهسازی متد از ابرکلاس به ارث رسیده باشد. اگر از گزینه -Wno-protocol استفاده کنید، متدهای به ارث رسیده از ابرکلاس پیادهسازیشده در نظر گرفته میشوند و هشداری برای آنها صادر نمیشود..IP "-Wobjc-root-class (تنها Objective-C و Objective-C++)" 4 اگر رابط یک کلاس (class interface) فاقد ابرکلاس (superclass) باشد، هشدار میدهد. به عنوان مثال، اکثر کلاسها از "NSObject" (یا "Object") ارثبری میکنند. هنگام اعلان کلاسهایی که هدف آنها کلاس ریشه (root class) بودن است، میتوان با نشانهگذاری رابطهای آنها با "__attribute__((objc_root_class))" از نمایش این هشدار جلوگیری کرد.
- -Wselector (تنها Objective-C و Objective-C++)
- اگر در طول کامپایل، چندین متد با انواع مختلف برای یک سلکتور یکسان یافت شوند، هشدار میدهد. این بررسی بر روی فهرست متدها در مرحله نهایی کامپایل انجام میشود. علاوه بر این، بررسی برای هر سلکتوری که در یک عبارت @selector(...) ظاهر میشود و یک متد متناظر با آن سلکتور در طول کامپایل یافت شده است نیز صورت میگیرد. از آنجا که این بررسیها جدول متدها را فقط در پایان کامپایل پیمایش میکنند، چنانچه مرحله نهایی کامپایل حاصل نشود—برای مثال به دلیل بروز خطا در حین کامپایل یا استفاده از گزینه -fsyntax-only—این هشدارها تولید نمیشوند.
- -Wstrict-selector-match (تنها Objective-C و Objective-C++)
- اگر در زمان تلاش برای ارسال پیام با استفاده از یک سلکتور به گیرندهای از نوع "id" یا "Class"، چندین متد با انواع آرگومان یا نوع بازگشتی متفاوت برای آن سلکتور یافت شود، هشدار میدهد. هنگامی که این پرچم خاموش است (که رفتار پیشفرض میباشد)، کامپایلر در صورتی که تفاوتهای یافتشده فقط محدود به انواعی باشند که اندازه و تراز (alignment) یکسانی دارند، از این هشدارها صرفنظر میکند.
- -Wundeclared-selector (تنها Objective-C و Objective-C++)
- اگر عبارت @selector(...) اشارهکننده به یک سلکتور اعلاننشده یافت شود، هشدار میدهد. یک سلکتور زمانی اعلاننشده در نظر گرفته میشود که پیش از عبارت @selector(...)، هیچ متدی با آن نام چه به صورت صریح در اعلان @interface یا @protocol و چه به صورت ضمنی در بخش @implementation اعلان نشده باشد. این گزینه بررسیهای خود را همواره به محض یافتن عبارت @selector(...) انجام میدهد، در حالی که -Wselector بررسیهای خود را تنها در مرحله نهایی کامپایل به عمل میآورد. این امر همچنین قرارداد سبک کدنویسی مبنی بر لزوم اعلان متدها و سلکتورها پیش از استفاده را اعمال میکند.
- -print-objc-runtime-info
- یک سرایند C تولید میکند که بزرگترین ساختاری را که بر حسب مقدار (by value) ارسال میشود (در صورت وجود)، توصیف میکند.
گزینههای کنترل OpenMP و OpenACC (Options Controlling OpenMP and OpenACC)
کامپایلر GCC از افزونههای OpenMP برای زبانهای C، C++ و Fortran با استفاده از گزینه -fopenmp پشتیبانی میکند. به طور مشابه، افزونههای OpenACC در هر سه زبان با -fopenacc پشتیبانی میشوند.
- -foffload=disable
- -foffload=default
- -foffload=target-list
- مشخص
میکند که
کد برای
کدام
مقصدهای
برونسپاری
(offload targets) در OpenMP و OpenACC
باید تولید
شود. رفتار
پیشفرض،
معادل با
-foffload=default، تولید
کد برای
تمامی
مقصدهای
برونسپاری
پشتیبانیشده
است. حالت
-foffload=disable کد را
تنها برای
میزبان
جایگزین (host fallback)
تولید
میکند، در
حالی که
-foffload=target-list کد را
تنها برای
فهرست
مشخصشدهای
از مقصدهای
برونسپاری
که با کاما
از هم جدا
شدهاند،
تولید
مینماید.
مقصدهای برونسپاری در قالب سهتایی مقصد (target-triplet) داخلی GCC مشخص میشوند. میتوانید کامپایلر را با -v اجرا کنید تا فهرست مقصدهای برونسپاری پیکربندیشده در زیر "OFFLOAD_TARGET_NAMES" نمایش داده شود.
- -foffload-options=options
- -foffload-options=target-triplet-list=options
- با گزینه
-foffload-options=options،
کامپایلر GCC
گزینههای
(options)
مشخصشده
را به
کامپایلرها
برای تمامی
مقصدهای
برونسپاریِ
فعال ارسال
میکند.
میتوانید
با استفاده
از ساختار
-foffload-options=target-list=options
گزینههایی
را تعیین
کنید که
تنها بر روی
یک یا چند
مقصد مشخص
اعمال شوند.
target-list فهرستی
از مقادیر
جداشده با
کاما در
همان قالب
گزینه -foffload=
است.
خطوط فرمان نمونه عبارتند از:
-foffload-options='-fno-math-errno -ffinite-math-only' \ -foffload-options=nvptx-none=-latomic -foffload-options=amdgcn-amdhsa=-march=gfx906 - -fopenacc
- پردازش دستورالعملهای OpenACC شامل #pragma acc در C/C++ و !$acc در فرم آزاد Fortran و همچنین !$acc، c$acc و *$acc در فرم ثابت Fortran را فعال میکند. این گزینه مستلزم -pthread است، بنابراین تنها در مقصدهایی پشتیبانی میشود که دارای پشتیبانی از -pthread باشند.
- -fopenacc-dim=geom
- ابعاد محاسباتی پیشفرض را برای نواحی موازی برونسپاری که صراحتاً آنها را تعیین نکردهاند، مشخص میکند. مقدار geom یک سهتایی از اندازههای جداشده با : به ترتیب gang، worker و vector است. یک اندازه میتواند حذف شود تا از مقدار پیشفرض مخصوص مقصد استفاده گردد.
- -fopenmp
- پردازش
دستورالعملهای
OpenMP شامل #pragma omp،
[[omp::directive(...)]]، [[omp::decl(...)]] و
[[omp::sequence(...)]] در C/C++
را فعال
میسازد. در
Fortran، گزینه !$omp
و نشانگر
کامپایل
شرطی !$ را
فعال
میکند. در
فرم سورس
ثابت Fortran،
نشانگرها
همچنین
میتوانند
با c یا *
آغاز شوند.
این گزینه مستلزم -pthread است، بنابراین تنها بر روی مقصدهایی پشتیبانی میشود که از -pthread پشتیبانی کنند. همچنین -fopenmp مستلزم -fopenmp-simd نیز هست.
- -fopenmp-simd
- پردازش دستورالعملهای "simd"، "declare simd"، "declare reduction"، "assume"، "ordered"، "scan" و "loop" در OpenMP، و همچنین دستورالعملهای ترکیبی یا مرکبی که "simd" جزئی از آنهاست را به همراه "#pragma omp"، "[[omp::directive(...)]]"، "[[omp::sequence(...)]]" و "[[omp::decl(...)]]" در C/C++ و "!$omp" در Fortran فعال میکند. این گزینه علاوه بر این، نشانگر کامپایل شرطی !$ را در Fortran فعال میسازد. در قالب کد منبع ثابت Fortran، نشانگرها میتوانند با c یا * نیز آغاز شوند. سایر دستورالعملهای OpenMP نادیده گرفته میشوند. مگر اینکه -fopenmp نیز علاوه بر این مشخص شده باشد، ناحیه "loop" مستقل از بند "bind" مشخصشده، به ناحیه وظیفه جاری مقید (bind) میشود.
- -fopenmp-target-simd-clone
- -fopenmp-target-simd-clone=device-type
- علاوه بر
تولید
همزادهای (clones)
SIMD برای
توابعی که
با
دستورالعمل
"declare simd"
نشانهگذاری
شدهاند،
هنگام فعال
بودن این
گزینه، GCC
همچنین
برای
توابعی که
با
دستورالعمل
OpenMP به نام
"declare target"
نشانهگذاری
شده و برای
برداریسازی
(vectorization) مناسب
هستند
همزاد
تولید
میکند.
مقدار device-type
میتواند
یکی از
مقادیر
"none"،
"host"،
"nohost" و
"any" باشد
که با
کلیدواژههای
بند "device_type"
در
دستورالعمل
"declare target"
مطابقت
دارند؛
همزادها
برای
اشتراک
دستگاههای
مشخصشده
ایجاد
میشوند.
گزینه -fopenmp-target-simd-clone
معادل با
-fopenmp-target-simd-clone=any و
گزینه
-fno-openmp-target-simd-clone
معادل با
-fopenmp-target-simd-clone=none است.
در سطح بهینهسازی -O2 و بالاتر (به جز -Os یا -Og)، این بهینهسازی به طور پیشفرض روی -fopenmp-target-simd-clone=nohost تنظیم میشود؛ در غیر این صورت به طور پیشفرض غیرفعال است..SS "گزینههای کنترل قالببندی پیامهای عیبیابی (Options to Control Diagnostic Messages Formatting)" بهطور سنتی، پیامهای عیبیابی بدون در نظر گرفتن ویژگیهای دستگاه خروجی (مانند عرض آن و غیره) قالببندی شدهاند. میتوانید از گزینههای شرحدادهشده در زیر برای کنترل الگوریتم قالببندی پیامهای عیبیابی استفاده کنید؛ برای نمونه، تعداد نویسهها در هر خط، یا اینکه اطلاعات موقعیت در کد مبدأ با چه بسامدی باید گزارش شوند. توجه داشته باشید که ممکن است برخی پیشخوانهای زبان از این گزینهها پشتیبانی نکنند.
- -fmessage-length=n
- تلاش
میکند
پیامهای
خطا را
بهگونهای
قالببندی
کند که در
خطوطی با
حدود n
نویسه جای
گیرند. اگر
n صفر باشد،
هیچ شکست
خطی (line-wrapping)
انجام
نمیشود؛
هر پیام خطا
در یک خط
واحد ظاهر
خواهد شد.
این حالت
پیشفرض
برای تمام
پیشخوانها
است.
نکته - این گزینه بر نمایش دستورهای پیشپردازندهٔ #error و #warning، و ویژگی (attribute) تابع/نوع/متغیر deprecated نیز تأثیر میگذارد. با این وجود، بر پراگماهای pragma GCC warning و pragma GCC error اثری ندارد.
- -fdiagnostics-plain-output
- این گزینه درخواست میکند که خروجی عیبیابی تا حد ممکن ساده و بدون تزئین باشد، که ممکن است هنگام اجرای dejagnu یا ابزارهای دیگری که نیاز به تجزیهٔ خروجی عیبیابی دارند و ترجیح میدهند این خروجی در طول زمان پایدارتر بماند، مفید باشد. گزینهٔ -fdiagnostics-plain-output در حال حاضر معادل گزینههای زیر است: -fno-diagnostics-show-caret -fno-diagnostics-show-line-numbers -fdiagnostics-color=never -fdiagnostics-urls=never -fdiagnostics-path-format=separate-events -fdiagnostics-text-art-charset=none -fno-diagnostics-show-event-links در آینده، اگر GCC ظاهر پیشفرض پیامهای عیبیابی خود را تغییر دهد، گزینهٔ متناظر جهت غیرفعالسازی رفتار جدید به این فهرست افزوده خواهد شد.
- -fdiagnostics-show-location=once
- تنها در حالت شکستن خط (line-wrapping) معنادار است. به گزارشگر پیامهای عیبیابی دستور میدهد که اطلاعات مکان در کد مبدأ را یک بار صادر کند؛ بدین معنا که اگر پیام برای قرار گرفتن در یک خط فیزیکی واحد بیش از حد طولانی باشد و ناچار به شکستن شود، اطلاعات مکان در کد مبدأ دوباره و پیاپی (بهعنوان پیشوند) در خطوط ادامهٔ بعدی درج نخواهد شد. این رفتار پیشفرض است.
- -fdiagnostics-show-location=every-line
- تنها در حالت شکستن خط (line-wrapping) معنادار است. به گزارشگر پیامهای عیبیابی دستور میدهد که همان اطلاعات مکان در کد مبدأ را (بهعنوان پیشوند) برای خطوط فیزیکی حاصل از شکستن پیامی که برای قرار گرفتن در یک خط واحد بیش از حد طولانی است، درج نماید.
- -fdiagnostics-color[=WHEN]
- -fno-diagnostics-color
- استفاده از
رنگ در
پیامهای
عیبیابی.
مقدار WHEN
میتواند
never، always، یا auto
باشد. مقدار
پیشفرض
بستگی به
نحوهٔ
پیکربندی
کامپایلر
دارد؛
میتواند
هر یک از
گزینههای
WHEN بالا
باشد یا در
صورتی که
متغیر
محیطی GCC_COLORS
در محیط
وجود
نداشته
باشد، never و
در غیر این
صورت auto
باشد. مقدار
auto باعث
میشود GCC
تنها زمانی
از رنگ
استفاده
کند که
خروجی خطای
استاندارد
یک پایانه
باشد و در
یک پوستهٔ emacs
اجرا نشود.
شکلهای
-fdiagnostics-color و -fno-diagnostics-color
بهترتیب
نامهای
مستعاری
برای -fdiagnostics-color=always
و -fdiagnostics-color=never
هستند.
رنگها توسط متغیر محیطی GCC_COLORS تعریف میشوند. مقدار آن فهرستی از قابلیتها و زیررشتههای بازنمایی گرافیکی برگزیده (SGR) است که با دونقطه از هم جدا شدهاند. دستورهای SGR توسط پایانه یا شبیهساز پایانه تفسیر میشوند. (برای مقادیر مجاز و معانی آنها بهعنوان ویژگیهای نویسه، بخش مربوطه را در مستندات پایانه متنی خود ببینید.) این مقادیر زیررشته اعدادی صحیح در مبنای ۱۰ هستند و میتوان آنها را با نقطهویرگول به یکدیگر متصل کرد. مقادیر متداول برای الحاق شامل این مواردند: 1 برای پررنگ (bold)، 4 برای زیرخط (underline)، 5 برای چشمکزن (blink)، 7 برای معکوس (inverse)، 39 برای رنگ پیشفرض پیشزمینه، 30 تا 37 برای رنگهای پیشزمینه، 90 تا 97 برای رنگهای پیشزمینه در حالت ۱۶ رنگ، 38;5;0 تا 38;5;255 برای رنگهای پیشزمینه در حالتهای ۸۸ رنگ و ۲۵۶ رنگ، 49 برای رنگ پیشفرض پسزمینه، 40 تا 47 برای رنگهای پسزمینه، 100 تا 107 برای رنگهای پسزمینه در حالت ۱۶ رنگ، و 48;5;0 تا 48;5;255 برای رنگهای پسزمینه در حالتهای ۸۸ رنگ و ۲۵۶ رنگ.
مقدار پیشفرض GCC_COLORS عبارت است از:
error=01;31:warning=01;35:note=01;36:range1=32:range2=34:locus=01:\ quote=01:path=01;36:fixit-insert=32:fixit-delete=31:\ diff-filename=01:diff-hunk=32:diff-delete=31:diff-insert=32:\ type-diff=01;32:fnname=01;32:targs=35:valid=01;31:invalid=01;32\ highlight-a=01;32:highlight-b=01;34
که در آن 01;31 قرمز پررنگ، 01;35 سرخابی پررنگ، 01;36 فیروزهای پررنگ، 32 سبز، 34 آبی، 01 پررنگ، و 31 قرمز است. تنظیم GCC_COLORS روی یک رشتهٔ خالی رنگها را غیرفعال میکند. قابلیتهای پشتیبانیشده به شرح زیر هستند:
- "error="
- زیررشتهٔ SGR برای نشانگرهای :error.
- "warning="
- زیررشتهٔ SGR برای نشانگرهای :warning.
- "note="
- زیررشتهٔ SGR برای نشانگرهای :note.
- "path="
- زیررشتهٔ SGR برای رنگآمیزی مسیرهای رخدادهای جریان کنترل (control-flow) چاپشده از طریق -fdiagnostics-path-format=، مانند شناسههای رخدادهای مجزا و خطوط نشاندهندهٔ فراخوانیها و بازگشتهای بینرویهای (interprocedural).
- "range1="
- زیررشتهٔ SGR برای نخستین بازهٔ اضافی.
- "range2="
- زیررشتهٔ SGR برای دومین بازهٔ اضافی.
- "locus="
- زیررشتهٔ SGR برای اطلاعات مکان، file:line یا file:line:column و غیره.
- "quote="
- زیررشتهٔ SGR برای اطلاعات چاپشده درون گیومهها.
- "fnname="
- زیررشتهٔ SGR برای نامهای توابع ++C.
- "targs="
- زیررشتهٔ SGR برای مقیدسازیهای پارامتر الگوی توابع ++C.
- "fixit-insert="
- زیررشتهٔ SGR برای راهنماییهای تصحیح (fix-it) که متن پیشنهادی برای درج یا جایگزینی را ارائه میدهند.
- "fixit-delete="
- زیررشتهٔ SGR برای راهنماییهای تصحیح (fix-it) که متن پیشنهادی برای حذف را ارائه میدهند.
- "diff-filename="
- زیررشتهٔ SGR برای سرآیندهای نام فایل در وصلههای (patch) تولیدشده.
- "diff-hunk="
- زیررشتهٔ SGR برای آغاز تکهها (hunk) در وصلههای تولیدشده.
- "diff-delete="
- زیررشتهٔ SGR برای خطوط حذفشده در وصلههای تولیدشده.
- "diff-insert="
- زیررشتهٔ SGR برای خطوط درجشده در وصلههای تولیدشده.
- "type-diff="
- زیررشتهٔ SGR برای برجستهسازی انواع ناهماهنگ درون آرگومانهای الگو در پیشخوان ++C.
- "valid="
- زیررشتهٔ SGR برای برجستهسازی عناصر معتبر در نمودارهای هنر متنی (text art).
- "invalid="
- زیررشتهٔ SGR برای برجستهسازی عناصر نامعتبر در نمودارهای هنر متنی (text art).
- "highlight-a="
- "highlight-b="
- زیررشتههای SGR برای ایجاد تمایز بین دو مورد مختلف درون پیامهای عیبیابی، مانند یک جفت نوع ناسازگار. گزینهٔ -fdiagnostics-show-highlight-colors را ببینید.
- -fdiagnostics-urls[=WHEN]
- استفاده از
دنبالههای
گریز برای
جاسازی URLها
در
پیامهای
عیبیابی.
برای
نمونه،
هنگامی که
-fdiagnostics-show-option متنی
را منتشر
میکند که
گزینهٔ خط
فرمان
کنترلکنندهٔ
یک
عیبیابی
را نشان
میدهد، یک
URL برای
مستندات آن
گزینه
جاسازی
میشود.
مقدار WHEN میتواند never، always یا auto باشد. حالت auto باعث میشود GCC تنها زمانی از دنبالههای گریز URL استفاده کند که خطای استاندارد یک پایانه باشد، و در یک شل emacs یا هر پایانهٔ گرافیکی دیگری که ناسازگاری آن با این قابلیت شناخته شده است اجرا نشود، به پایین مراجعه کنید.
مقدار پیشفرض به نحوهٔ پیکربندی کامپایلر بستگی دارد. این مقدار میتواند هر یک از گزینههای WHEN بالا باشد.
کامپایلر GCC همچنین میتواند (از طریق گزینهٔ زمان پیکربندی --with-diagnostics-urls=auto-if-env) بهگونهای پیکربندی شود که مقدار پیشفرض تحت تأثیر متغیرهای محیط قرار گیرد. تحت چنین پیکربندی، اگر هر یک از متغیرهای محیط GCC_URLS یا TERM_URLS در محیط کامپایلر موجود و غیرخالی باشند، GCC بهطور پیشفرض از auto استفاده میکند، یا اگر هیچکدام نباشند از never استفاده میکند.
با این حال، حتی با -fdiagnostics-urls=always نیز رفتار برنامه وابسته به این متغیرهای محیط است: اگر GCC_URLS روی مقدار خالی یا no تنظیم شده باشد، URLها در پیامهای عیبیابی جاسازی نمیشوند. اگر روی st تنظیم شده باشد، URLها از دنبالههای گریز ST استفاده میکنند. اگر روی bel (پیشفرض) تنظیم شده باشد، URLها از دنبالههای گریز BEL استفاده میکنند. هر مقدار غیرخالی دیگری این ویژگی را فعال میکند. اگر GCC_URLS تنظیم نشده باشد، از TERM_URLS به عنوان جایگزین استفاده میشود. نکته: ST یک دنبالهٔ گریز ANSI و پایاندهندهٔ رشته ESC \ است؛ BEL یک نویسهٔ ASCII است (CTRL-G) که معمولاً صدایی مانند بوق پخش میکند.
در حال حاضر GCC تلاش میکند برخی پایانههایی را که شناخته شده است قابلیت URL را پیادهسازی نکردهاند و دارای باگ هستند (یا دستکم در برخی نسخههایی که هنوز در حال استفاده هستند باگ داشتهاند)، که در آنها دنبالههای گریز URL احتمالاً رفتار نادرستی دارند (یعنی نویسههای نامفهوم روی صفحه چاپ میکنند)، شناسایی کند. این فهرست در حال حاضر شامل xfce4-terminal، نسخههای خاصی از gnome-terminal که به باگدار بودن شناخته شدهاند، کنسول linux، و mingw است. این بررسی را میتوان با استفاده از -fdiagnostics-urls=always نادیده گرفت.
- -fno-diagnostics-show-option
- بهطور پیشفرض، هر پیام عیبیابی صادرشده شامل متنی است که گزینهٔ خط فرمانی را که مستقیماً عیبیابی را کنترل میکند نشان میدهد (اگر چنین گزینهای برای سازوکار عیبیابی شناختهشده باشد). تعیین پرچم -fno-diagnostics-show-option این رفتار را لغو میکند.
- -fno-diagnostics-show-caret
- بهطور پیشفرض، هر پیام عیبیابی صادرشده شامل خط کد منبع اصلی و یک علامت هشتک ^ است که ستون را نشان میدهد. این گزینه از نمایش این اطلاعات جلوگیری میکند. در صورت استفاده از گزینهٔ -fmessage-length=n، خط منبع به n نویسه بریده میشود. هنگامی که خروجی در پایانه نمایش داده میشود، عرض به مقدار مشخصشده توسط متغیر محیط COLUMNS، یا در صورت عدم تنظیم، به عرض پایانه محدود میشود.
- -fno-diagnostics-show-labels
- بهطور
پیشفرض،
هنگام چاپ
کد منبع (از
طریق -fdiagnostics-show-caret)،
پیامهای
عیبیابی
میتوانند
محدودههایی
از کد منبع
را با
اطلاعات
مرتبط
برچسبگذاری
کنند،
مانند نوع
عبارتها:
printf ("foo %s bar", long_i + long_j); ~^ ~~~~~~~~~~~~~~~ | | char * long intاین گزینه چاپ این برچسبها را لغو میکند (در مثال بالا، خطوط عمودی و متنهای "char *" و "long int").
- -fno-diagnostics-show-event-links
- بهطور
پیشفرض،
هنگام چاپ
مسیرهای
اجرا (از
طریق
-fdiagnostics-path-format=inline-events)،
کامپایلر GCC
خطوطی را
برای اتصال
رویدادهای
مرتبط چاپ
میکند،
مانند خطی
که
رویدادهای
۱ و ۲ را در
زیر به
یکدیگر وصل
میکند:
3 | if (p) | ^ | | | (1) following `false' branch (when `p' is NULL)... ->-+ | | | | |+------------------------------------------------------------+ 4 || return 0; 5 || return *p; || ~ || | |+-------->(2) ...to here | (3) dereference of NULL `p'
این گزینه چاپ چنین خطوط اتصالدهندهای را غیرفعال میکند.
- -fno-diagnostics-show-cwe
- پیامهای عیبیابی میتوانند بهطور اختیاری دارای یک شناسهٔ مرتبط CWE ("https://cwe.mitre.org/index.html") باشند. خود GCC تنها برای برخی از عیبیابیهای -fanalyzer چنین فرادادهای را ارائه میدهد. پلاگینهای GCC نیز ممکن است پیامهای عیبیابی را همراه با چنین فرادادهای ارائه دهند. بهطور پیشفرض، در صورت وجود این اطلاعات، همراه با پیام عیبیابی چاپ میشوند. این گزینه از چاپ این فراداده جلوگیری میکند.
- -fno-diagnostics-show-rules
- پیامهای عیبیابی میتوانند بهطور اختیاری دارای قوانینی مرتبط باشند، مانند قوانینی برگرفته از یک استاندارد کدنویسی یا یک مشخصات فنی. خود GCC این کار را برای هیچیک از عیبیابیهای خود انجام نمیدهد، اما پلاگینها ممکن است چنین کنند. بهطور پیشفرض، در صورت وجود این اطلاعات، همراه با پیام عیبیابی چاپ میشود. این گزینه از چاپ این فراداده جلوگیری میکند.
- -fno-diagnostics-show-highlight-colors
- کامپایلر GCC
میتواند
هنگام چاپ
پیامهای
عیبیابی و
نقلقول از
کد منبع
کاربر،
برای تأکید
و ایجاد
تمایز از
رنگ
استفاده
کند.
برای نمونه، در
demo.c: In function `test_bad_format_string_args': ../../src/demo.c:25:18: warning: format `%i' expects argument of type `int', but argument 2 has type `const char *' [-Wformat=] 25 | printf("hello %i", msg); | ~^ ~~~ | | | | int const char * | %s
- عبارت %i و "int" در پیام و همچنین "int" در کد منبع نقلشده با استفاده از "highlight-a" رنگآمیزی میشوند (بهطور پیشفرض سبز پررنگ)، و
- عبارت "const char *" در پیام و همچنین در کد منبع نقلشده هر دو با استفاده از "highlight-b" رنگآمیزی میشوند (بهطور پیشفرض آبی پررنگ).
هدف این است که توجه خواننده به ارتباط بین جنبههای مختلف پیام عیبیابی و کد منبع جلب شود، تا با استفاده از رنگ، عناصر مرتبط گروهبندی شده و موارد ناهمخوان متمایز شوند.
این رنگآمیزی اضافی در صورت فعال بودن چاپ رنگی (طبق -fdiagnostics-color=) بهطور پیشفرض فعال است، اما میتوان آن را جداگانه از طریق -fno-diagnostics-show-highlight-colors غیرفعال کرد.
- -fno-diagnostics-show-line-numbers
- بهطور پیشفرض، هنگام چاپ کد منبع (از طریق -fdiagnostics-show-caret)، یک حاشیهٔ سمت چپ برای نمایش شماره خطوط چاپ میشود. این گزینه این حاشیهٔ سمت چپ را پنهان میکند.
- -fdiagnostics-minimum-margin-width=width
- این گزینه حداقل عرض حاشیهٔ سمت چپ چاپشده توسط -fdiagnostics-show-line-numbers را کنترل میکند. مقدار پیشفرض آن 6 است.
- -fdiagnostics-parseable-fixits
- راهنماییهای
تصحیح (fix-it hints) را
در قالبی
قابل تجزیه
توسط
ماشین،
مناسب برای
پردازش
توسط IDEها
منتشر
میکند.
برای هر
اصلاح، خطی
پس از پیام
عیبیابی
مربوطه چاپ
میشود که
با رشتهٔ
"fix-it:" آغاز
میشود.
برای مثال:
fix-it:"test.c":{45:3-45:21}:"gtk_widget_show_all"مکان به صورت یک بازهٔ نیمهباز، بیانشده بر حسب تعداد بایتها مشخص میشود که از بایت ۱ برای ستون ابتدایی آغاز میگردد. در مثال بالا، بایتهای ۳ تا ۲۰ از خط ۴۵ فایل "test.c" باید با رشتهٔ مشخصشده جایگزین شوند:
00000000011111111112222222222 12345678901234567890123456789 gtk_widget_showall (dlg); ^^^^^^^^^^^^^^^^^^ gtk_widget_show_all
در نام فایل و رشتهٔ جایگزین، بکاسلش به صورت "\\"، تب به صورت "\t"، خط جدید به صورت "\n"، نقلقول دوگانه به صورت "\""، و نویسههای غیرقابل چاپ به صورت مبنای هشت (مانند تب عمودی به صورت "\013") با دنبالهٔ گریز مشخص میشوند.
یک رشتهٔ جایگزین خالی نشاندهندهٔ آن است که بازهٔ دادهشده باید حذف شود. یک بازهٔ خالی (برای مثال "45:3-45:3") نشاندهندهٔ آن است که رشته باید در موقعیت دادهشده درج گردد..IP -fdiagnostics-generate-patch 4 چاپ راهنماییهای اصلاحی (fix-it hints) در stderr در قالب unified diff، پس از چاپ هرگونه پیام عیبیابی. برای نمونه:
--- test.c +++ test.c @ -42,5 +42,5 @ void show_cb(GtkDialog *dlg) { - gtk_widget_showall(dlg); + gtk_widget_show_all(dlg); }تفاوت (diff) ممکن است رنگی باشد یا نباشد، که از همان قوانین مربوط به پیامهای عیبیابی پیروی میکند (ببینید -fdiagnostics-color).
- -fdiagnostics-show-template-tree
- در
فرانتاند
C++، هنگام
چاپ
پیامهای
عیبیابی
که
نشاندهندهٔ
عدم تطابق
انواع قالب
(template types) هستند،
مانند:
could not convert 'std::map<int, std::vector<double> >()' from 'map<[...],vector<double>>' to 'map<[...],vector<float>>
پرچم -fdiagnostics-show-template-tree چاپ یک ساختار درختمانند را فعال میکند که بخشهای مشترک و متفاوت انواع را نشان میدهد، مانند:
map< [...], vector< [double != float]>>بخشهایی که متفاوت هستند با رنگ برجسته میشوند (در این حالت “double” و “float”).
- -fno-elide-type
- بهطور
پیشفرض
هنگامی که
فرانتاند
C++ پیامهای
عیبیابی
نشاندهندهٔ
عدم تطابق
انواع قالب
را چاپ
میکند،
بخشهای
مشترک
انواع
بهصورت
“[...]” چاپ
میشوند تا
پیام خطا
سادهتر
شود. برای
نمونه:
could not convert 'std::map<int, std::vector<double> >()' from 'map<[...],vector<double>>' to 'map<[...],vector<float>>
مشخص کردن پرچم -fno-elide-type این رفتار را لغو میکند. این پرچم همچنین بر خروجی پرچم -fdiagnostics-show-template-tree تأثیر میگذارد.
- -fdiagnostics-path-format=KIND
- مشخص
میکند که
مسیر
رویدادهای
جریان
کنترل (control-flow)
برای
پیامهای
عیبیابی
دارای چنین
مسیری،
چگونه چاپ
شود.
مقدار KIND میتواند none، separate-events یا inline-events (پیشفرض) باشد.
مقدار none به معنای عدم چاپ مسیرهای عیبیابی است.
مقدار separate-events به معنای چاپ یک پیام عیبیابی جداگانه از نوع “note” برای هر رویداد درون عیبیابی است. برای نمونه:
test.c:29:5: error: passing NULL as argument 1 to 'PyList_Append' which requires a non-NULL parameter test.c:25:10: note: (1) when 'PyList_New' fails, returning NULL test.c:27:3: note: (2) when 'i < count' test.c:29:5: note: (3) when calling 'PyList_Append', passing NULL from (1) as argument 1
مقدار inline-events به معنای چاپ رویدادها بهصورت درونخطی (“inline”) در میان کد منبع است. این نما تلاش میکند تا رویدادها را در توالیهایی از رویدادهای بهاندازه کافی نزدیک به یکدیگر ادغام کند و آنها را بهصورت محدودههای برچسبدار درون کد منبع نمایش دهد.
برای نمونه، همان رویدادهای بالا ممکن است بهصورت زیر چاپ شوند:
'test': events 1-3 25 | list = PyList_New(0); | ^~~~~~~~~~~~~ | | | (1) when 'PyList_New' fails, returning NULL 26 | 27 | for (i = 0; i < count; i++) { | ~~~ | | | (2) when 'i < count' 28 | item = PyLong_FromLong(random()); 29 | PyList_Append(list, item); | ~~~~~~~~~~~~~~~~~~~~~~~~~ | | | (3) when calling 'PyList_Append', passing NULL from (1) as argument 1جریان کنترل بینروالی (Interprocedural) با گروهبندی رویدادها بر اساس فریم پشته (stack frame) و استفاده از تورفتگی برای نمایش چگونگی تودرتو شدن، پوش (push) و پاپ (pop) شدن فریمهای پشته نشان داده میشود.
برای نمونه:
'test': events 1-2 | | 133 | { | | ^ | | | | | (1) entering 'test' | 134 | boxed_int *obj = make_boxed_int (i); | | ~~~~~~~~~~~~~~~~~~ | | | | | (2) calling 'make_boxed_int' | +--> 'make_boxed_int': events 3-4 | | 120 | { | | ^ | | | | | (3) entering 'make_boxed_int' | 121 | boxed_int *result = (boxed_int *)wrapped_malloc (sizeof (boxed_int)); | | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | | | (4) calling 'wrapped_malloc' | +--> 'wrapped_malloc': events 5-6 | | 7 | { | | ^ | | | | | (5) entering 'wrapped_malloc' | 8 | return malloc (size); | | ~~~~~~~~~~~~~ | | | | | (6) calling 'malloc' | <-------------+ | 'test': event 7 | | 138 | free_boxed_int (obj); | | ^~~~~~~~~~~~~~~~~~~~ | | | | | (7) calling 'free_boxed_int' | (etc) - -fdiagnostics-show-path-depths
- این گزینه
هنگام چاپ
مسیرهای
جریان
کنترلِ
مرتبط با یک
پیام
عیبیابی،
اطلاعات
بیشتری
ارائه
میدهد.
اگر این گزینه مشخص شود، عمق پشته برای هر توالی از رویدادها در -fdiagnostics-path-format=inline-events چاپ خواهد شد. اگر همراه با -fdiagnostics-path-format=separate-events مشخص شود، عمق پشته و اعلان تابع هنگام چاپ هر رویداد در انتهای آن افزوده خواهد شد.
این گزینه برای استفادهٔ توسعهدهندگان GCC و توسعهدهندگان پلاگین هنگام اشکالزدایی پیامهای عیبیابی که جریان کنترل بینروالی را گزارش میکنند، در نظر گرفته شده است.
- -fno-show-column
- عدم چاپ شماره ستونها در پیامهای عیبیابی. این ممکن است در صورتی لازم باشد که پیامهای عیبیابی توسط برنامهای که شماره ستونها را درک نمیکند، مانند dejagnu، پویش (scan) شوند.
- -fdiagnostics-column-unit=UNIT
- انتخاب
واحد شماره
ستون. این
گزینه بر
پیامهای
عیبیابی
سنتی (در
صورت عدم
استفاده از
-fno-show-column) و
همچنین در
صورت
درخواست،
بر
پیامهای
عیبیابی
با قالب JSON
تأثیر
میگذارد.
واحد پیشفرض UNIT، یعنی display، تعداد ستونهای نمایشی اشغالشده توسط هر نویسه را در نظر میگیرد. این مقدار در مورد نویسههای برگه (tab) ممکن است بزرگتر از تعداد بایتهای مورد نیاز برای کدگذاری نویسه باشد، یا در مورد نویسههای چندبایتی ممکن است کوچکتر باشد. برای نمونه، نویسهٔ “GREEK SMALL LETTER PI (U+03C0)” یک ستون نمایش را اشغال میکند و کدگذاری UTF-8 آن به دو بایت نیاز دارد؛ نویسهٔ “SLIGHTLY SMILING FACE (U+1F642)” دو ستون نمایش را اشغال میکند و کدگذاری UTF-8 آن به چهار بایت نیاز دارد.
تنظیم UNIT روی byte شماره ستون را در تمام موارد به شمارش بایت خام تغییر میدهد، همانطور که پیش از نگارش 11.1.0 در GCC بهطور سنتی در خروجی درج میشد..IP -fdiagnostics-column-origin=ORIGIN 4 مبدأ شمارههای ستون، یعنی شماره ستونی که به اولین ستون اختصاص داده میشود را تعیین میکند. مقدار پیشفرض 1 با رفتار سنتی GCC و راهنمای نگارش GNU مطابقت دارد. برخی ابزارها ممکن است با مبدأ 0 عملکرد بهتری داشته باشند؛ هر مقدار غیرمنفی را میتوان مشخص کرد.
- -fdiagnostics-escape-format=FORMAT
- هنگامی که GCC
خطوط سورس
مربوطه را
برای یک
پیام
عیبیابی
چاپ
میکند،
معمولاً
سعی میکند
بایتهای
منبع را
مستقیماً
چاپ کند. با
این حال،
برخی از
پیامهای
عیبیابی
به مشکلات
کدگذاری در
فایل منبع،
مانند UTF-8
بدریخت یا
اشکالات
نرمالسازی
Unicode مربوط
میشوند.
این
عیبیابیها
به گونهای
نشانهگذاری
شدهاند که
GCC هنگام چاپ
خطوط سورس
مربوط به
آنها،
بایتهایی
را که اسکی (ASCII)
قابلچاپ
نیستند، به
صورت گریز
دادهشده (escaped)
چاپ میکند.
این گزینه نحوه گریز داده شدن چنین بایتهایی را کنترل میکند.
مقدار پیشفرض FORMAT، یعنی unicode، نویسههای یونیکدی را که اسکی قابلچاپ نیستند به صورت <U+XXXX> نمایش میدهد، و بایتهایی که با یک نویسه دارای کدگذاری معتبر UTF-8 مطابقت ندارند، به صورت مبنای شانزده به شکل <XX> نمایش داده خواهند شد.
برای مثال، یک خط منبع شامل رشته before و به دنبال آن نویسه یونیکد U+03C0 (با عنوان «GREEK SMALL LETTER PI»، با کدگذاری UTF-8 به صورت 0xCF 0x80) و به دنبال آن بایت 0xBF (یک بایت پایانی سرگردان در UTF-8)، و در ادامه رشته after، برای چنین پیامی به این صورت چاپ خواهد شد:
before<U+03C0><BF>after
تنظیم FORMAT روی bytes تمام بایتهای اسکی غیرقابلچاپ را به صورت <XX> نمایش میدهد؛ بنابراین کدگذاری زیرین نویسههای یونیکد غیر-ASCII را نشان میدهد. برای مثال بالا، عبارت زیر چاپ خواهد شد:
before<CF><80><BF>after
- -fdiagnostics-text-art-charset=CHARSET
- برخی
پیامهای
عیبیابی
میتوانند
حاوی
نمودارهای
«هنر متنی»
(text art) باشند:
تصاویری
ایجادشده
از متن که
برای نمایش
در قلمهای
تکعرض (monospaced)
در نظر
گرفته
شدهاند.
این گزینه نویسههایی را که باید در صورت وجود برای چاپ چنین نمودارهایی استفاده شوند، انتخاب میکند. مقدار CHARSET یکی از موارد none، ascii، unicode یا emoji است.
مقدار none از چاپ چنین نمودارهایی جلوگیری میکند. مقدار ascii تضمین میکند که این نمودارها کاملاً اسکی («ASCII art») باشند. مقدار unicode امکان استفاده محتاطانه از نویسههای ترسیمی یونیکد (مانند نویسههای ترسیم جدول و چارچوب) را فراهم میآورد. مقدار emoji علاوه بر آن، امکان استفاده از ایموجی در خروجی را اضافه میکند (مانند درج U+26A0 WARNING SIGN و به دنبال آن U+FE0F VARIATION SELECTOR-16 جهت انتخاب گونهٔ ایموجی آن نویسه).
مقدار پیشفرض emoji است، مگر زمانی که متغیر محیطی LANG روی C تنظیم شده باشد که در آن صورت پیشفرض ascii خواهد بود.
- -fdiagnostics-format=FORMAT
- یک قالب
متفاوت
برای چاپ
پیامهای
عیبیابی
انتخاب
میکند. FORMAT
شامل text،
sarif-stderr، sarif-file، json،
json-stderr یا json-file
است.
استفاده از این گزینه، هر «مقصد خروجی» دیگری را که از طریق -fdiagnostics-add-output= اضافه شده، یا توسط -fdiagnostics-set-output= تنظیم شده است، جایگزین میکند.
پیشفرض text است.
هر دو قالب sarif-stderr و sarif-file پیامهای عیبیابی را در قالب SARIF نسخه 2.1.0، به ترتیب به stderr یا به فایلی با نام source.sarif ارسال میکنند.
مقادیر مختلف json، json-stderr و json-file منسوخ شدهاند و به یک قالب خروجی قدیمی مبتنی بر JSON اشاره دارند. قالب json مترادفی برای json-stderr است. قالبهای json-stderr و json-file بهجز محل ارسال دادههای JSON، کاملاً یکسان هستند. با json-stderr، خروجی JSON به stderr ارسال میشود، در حالی که با json-file در source.gcc.json نوشته میشود.
- -fdiagnostics-add-output=DIAGNOSTICS-OUTPUT-SPEC
- یک «مقصد
خروجی»
اضافی برای
ارسال
پیامهای
عیبیابی
اضافه
میکند.
DIAGNOSTICS-OUTPUT-SPEC باید یک طرحواره (scheme) را مشخص کند که میتواند اختیاری با ":" و یک یا چند جفت KEY=VALUE دنبال شود، به این صورت:
<SCHEME> <SCHEME>:<KEY>=<VALUE> <SCHEME>:<KEY>=<VALUE>,<KEY2>=<VALUE2>
و غیره.
طرحوارهها، کلیدها یا مقادیری که نام آنها دارای پیشوند «experimental» است، ممکن است بدون اطلاع قبلی تغییر کنند یا حذف شوند.
SCHEME میتواند مقادیر زیر باشد:
- text
- ارسال
پیامهای
عیبیابی
به stderr با
استفاده از
قالب خروجی
متنی سنتی GCC.
کلیدهای پشتیبانیشده عبارتند از:
- color=[yes|no]
- بازنویسی تنظیمات رنگبندی مربوط به -fdiagnostics-color برای این خروجی متنی.
- experimental-nesting=[yes|no]
- فعالسازی یک حالت آزمایشی که بر روابط سلسلهمراتبی درون پیامهای عیبیابی تأکید دارد، و اطلاعات موقعیت مکانی را در خطوط جداگانه نمایش میدهد.
- experimental-nesting-show-locations=[yes|no]
- اگر "experimental-nesting=yes" باشد، مکانها به صورت پیشفرض نمایش داده میشوند؛ این کلید را روی "no" تنظیم کنید تا چاپ این مکانها غیرفعال شود. این ویژگی برای استفاده توسعهدهندگان GCC هنگام نگارش آزمونهای DejaGnu تعبیه شده است.
- experimental-nesting-show-levels=[yes|no]
- این یک گزینه اشکالزدایی برای استفاده همراه با "experimental-nesting=yes" است. این کلید را روی "yes" بگذارید تا سطوح تودرتویی به صراحت در خروجی چاپ شوند. این قابلیت برای استفاده توسعهدهندگان GCC در نظر گرفته شده است.
- sarif
- ارسال
پیامهای
عیبیابی
به یک فایل
در قالب SARIF.
کلیدهای پشتیبانیشده عبارتند از:
- file=FILENAME
- مشخص کردن نام فایلی که خروجی SARIF در آن نوشته میشود؛ احتمالاً با یک مسیر مطلق یا نسبی در ابتدا. در صورت عدم تعیین، پیشفرض source.sarif خواهد بود.
- version=[2.1|2.2-prerelease]
- مشخص کردن نسخه SARIF مورد استفاده برای خروجی. در صورت عدم تعیین، مقدار پیشفرض 2.1 است. "2.2-prerelease" از یک پیشنویس غیررسمی برای مشخصات آینده SARIF 2.2 استفاده میکند و در این نگارش صرفاً باید برای مقاصد آزمایشی استفاده شود.
برای مثال:
-fdiagnostics-add-output=sarif:version=2.1,file=foo.2.1.sarif -fdiagnostics-add-output=sarif:version=2.2-prerelease,file=foo.2.2.sarif
یک جفت خروجی اضافه میکند که هرکدام در فایلی متفاوت مینویسند و به ترتیب از نسخههای 2.1 و 2.2 استاندارد SARIF استفاده میکنند.
در قالب EBNF:
<diagnostics-output-specifier> = <diagnostics-output-name>
| <diagnostics-output-name>, ":", <key-value-pairs>;
<diagnostics-output-name> = "text" | "sarif";
<key-value-pairs> = <key-value-pair>
| <key-value-pair> "," <key-value-pairs>;
<key-value-pair> = <key> "=" <value>;
<key> = ? string without a '=' ? ;
<value> = ? string without a ',' ? ;
- -fdiagnostics-set-output=DIAGNOSTICS-OUTPUT-SPEC
- این گزینه
به روشی
مشابه با
-fdiagnostics-add-output= کار
میکند، با
این تفاوت
که به جای
افزودن یک
«مقصد
خروجی»
اضافی برای
پیامهای
عیبیابی،
تمام
مقصدهای
خروجی
موجود را
جایگزین
میکند؛
مانند
مقصدهایی
که از -fdiagnostics-format=،
-fdiagnostics-add-output= یا یک
فراخوانی
قبلی -fdiagnostics-set-output=
تعریف
شدهاند..IP
-fno-diagnostics-json-formatting 4
بهطور
پیشفرض،
هنگامی که JSON
برای
پیامهای
عیبیابی
صادر
میشود (از
طریق
-fdiagnostics-format=sarif-stderr،
-fdiagnostics-format=sarif-file،
-fdiagnostics-format=json،
-fdiagnostics-format=json-stderr،
-fdiagnostics-format=json-file)،
کامپایلر GCC
خطوط جدید و
فاصلههای
تورفتگی
اضافه
میکند تا
ساختار
سلسلهمراتبی
JSON از نظر
بصری
برجسته شود.
از -fno-diagnostics-json-formatting برای حذف این نویسههای فاصله (whitespace) استفاده کنید. این گزینه باید پیش از گزینهای که قرار است بر آن تأثیر بگذارد، مشخص شود.
این گزینه به منظور سازگاری با ابزارهایی در نظر گرفته شده است که انتظار ندارند خروجی حاوی خطوط جدید باشد، مانند آنچه در نگارشهای قدیمیتر GCC تولید میشد.
گزینههایی برای درخواست یا سرکوب هشدارها (Options to Request or Suppress Warnings)
هشدارها پیامهای عیبیابی هستند که ساختارهایی را گزارش میکنند که ذاتاً نادرست نیستند، اما خطرناک بوده یا نشان میدهند که ممکن است خطایی رخ داده باشد.
گزینههای مستقل از زبانِ زیر، هشدارهای خاصی را فعال نمیکنند، بلکه انواع پیامهای عیبیابیِ تولیدشده توسط GCC را کنترل میکنند.
- -fsyntax-only
- بررسی کد از نظر خطاهای نحوی، بدون انجام هیچ کار دیگری فراتر از آن.
- -fmax-errors=n
- حداکثر تعداد پیامهای خطا را به n محدود میکند؛ در این نقطه GCC به جای تلاش برای ادامهٔ پردازش کد منبع، متوقف میشود. اگر مقدار n برابر 0 باشد (پیشفرض)، هیچ محدودیتی در تعداد پیامهای خطای تولیدشده وجود نخواهد داشت. اگر -Wfatal-errors نیز مشخص شده باشد، -Wfatal-errors بر این گزینه تقدم دارد.
- -w
- سرکوب تمام پیامهای هشدار.
- -Werror
- تبدیل تمام هشدارها به خطا.
- -Werror=
- تبدیل
هشدار
مشخصشده
به خطا.
مشخصهٔ
هشدار به
انتها
پیوست
میشود؛
برای نمونه
-Werror=switch
هشدارهای
تحت کنترلِ
-Wswitch را به خطا
تبدیل
میکند. این
گزینه شکلی
منفی نیز
دارد که
برای لغو
اثر -Werror برای
هشدارهای
خاص به کار
میرود؛
برای نمونه
-Wno-error=switch سبب
میشود
هشدارهای
-Wswitch حتی
زمانی که -Werror
فعال است،
خطا به شمار
نیایند.
پیام هشدار برای هر هشدار قابل کنترل، شامل گزینهای است که آن هشدار را کنترل میکند. سپس میتوان آن گزینه را مطابق توضیحات بالا همراه با -Werror= و -Wno-error= به کار برد. (چاپ گزینه در پیام هشدار را میتوان با پرچم -fno-diagnostics-show-option غیرفعال کرد.)
توجه داشته باشید که مشخص کردن -Werror=foo بهطور خودکار مستلزم -Wfoo است. با این حال، -Wno-error=foo متضمن هیچ موردی نیست.
- -Wfatal-errors
- این گزینه باعث میشود کامپایلر با رخ دادن نخستین خطا، به جای تلاش برای ادامه دادن و چاپ پیامهای خطای بیشتر، فرایند کامپایل را لغو و متوقف کند.
میتوانید هشدارهای خاص متعددی را با گزینههایی که با -W آغاز میشوند درخواست کنید؛ برای نمونه -Wunused-variable برای درخواست هشدار در مورد اعلان متغیرهایی که هرگز استفاده نشدهاند. هر یک از این گزینههای هشدار خاص همچنین دارای یک شکل منفی است که برای غیرفعال کردن هشدارها با -Wno- آغاز میشود؛ برای نمونه، -Wno-unused-variable. این دفترچهٔ راهنما تنها یکی از این دو شکل را (هرکدام که حالت پیشفرض نباشد) فهرست میکند. برای گزینههای خاص زبانهای دیگر، به C++ Dialect Options و Objective-C and Objective-C++ Dialect Options نیز مراجعه کنید. هشدارهای تکمیلی را میتوان با فعالسازی تحلیلگر ایستا (static analyzer) به دست آورد؛
برخی گزینهها، مانند -Wall و -Wextra، گزینههای دیگری مانند -Wunused را فعال میکنند که آن هم ممکن است گزینههای بیشتری نظیر -Wunused-variable را فعال کند. اثر ترکیبی شکلهای مثبت و منفی این است که گزینههای خاصتر، مستقل از جایگاهشان در خط فرمان، نسبت به گزینههای عامتر اولویت دارند. برای گزینههایی با میزان ویژگی یکسان، آخرین گزینه اعمال میشود. گزینههایی که از طریق پراگماها (pragmas) فعال یا غیرفعال میشوند، طوری عمل میکنند که گویی در انتهای خط فرمان آمدهاند.
هنگامی که یک گزینهٔ هشدار ناشناخته درخواست شود (مانند -Wunknown-warning)، کامپایلر GCC خطایی مبنی بر ناشناخته بودن گزینه صادر میکند. با این حال، اگر شکل -Wno- به کار رود، رفتار اندکی متفاوت خواهد بود: هیچ پیام عیبیابی برای -Wno-unknown-warning صادر نمیشود مگر اینکه پیامهای عیبیابی دیگری در حال تولید باشند. این قابلیت اجازه میدهد گزینههای جدید -Wno- در کامپایلرهای قدیمیتر استفاده شوند، اما اگر مشکلی پیش بیاید، کامپایلر هشدار میدهد که یک گزینهٔ ناشناخته وجود دارد.
اثربخشی برخی هشدارها به فعال بودن بهینهسازیها نیز بستگی دارد. برای نمونه، -Wsuggest-final-types با بهینهسازی زمان پیوند (link-time optimization) مؤثرتر است. ممکن است برخی هشدارهای دیگر اصلاً صادر نشوند مگر اینکه بهینهسازی فعال شده باشد. اگرچه بهینهسازی بهطور کلی اثربخشی هشدارها دربارهٔ مشکلات جریان کنترل و جریان داده را بهبود میبخشد، در برخی موارد ممکن است موجب خطاهای مثبت کاذب (false positive) نیز بشود.
- -Wpedantic
- -pedantic
- صدور تمام
هشدارهای
خواستهشده
توسط
استانداردهای
دقیق ISO C و ISO C++؛
عیبیابی
تمام
برنامههایی
که از
افزونههای
ممنوع
استفاده
میکنند و
برخی
برنامههای
دیگر که از ISO C
و ISO C++ پیروی
نمیکنند.
این گزینه
از نگارش
استاندارد
ISO C یا C++
مشخصشده
با هر
گزینهٔ -std
به کار رفته
پیروی
میکند.
برنامههای معتبر ISO C و ISO C++ باید بدون توجه به فعال یا غیرفعال بودن این گزینه بهدرستی کامپایل شوند (گرچه موارد نادری نیازمند -ansi یا یک گزینهٔ -std برای تعیین نگارش استاندارد هستند). با این حال، بدون این گزینه، افزونههای خاص GNU و قابلیتهای سنتی C و C++ نیز پشتیبانی میشوند. با فعال بودن این گزینه، آنها عیبیابی میشوند (یا با -pedantic-errors رد میشوند).
گزینهٔ -Wpedantic باعث صدور پیام هشدار برای استفاده از کلمات کلیدی جایگزینی که نام آنها با __ آغاز و پایان مییابد، نمیشود. این قالب جایگزین را میتوان همچنین برای غیرفعال کردن هشدارها برای انواع غیر-ISO مربوط به __intN، یعنی __intN__ به کار برد. هشدارهای pedantic همچنین در عبارتی که پس از "__extension__" میآید غیرفعال میشوند. با این حال، تنها فایلهای سرآیند سیستمی باید از این روشها استفاده کنند؛ برنامههای کاربردی باید از آنها اجتناب ورزند.
برخی هشدارها دربارهٔ برنامههای ناسازگار توسط گزینههایی غیر از -Wpedantic کنترل میشوند؛ در بسیاری از موارد آنها توسط -Wpedantic فعال میشوند اما میتوان آنها را بهطور جداگانه با گزینهٔ اختصاصیشان غیرفعال کرد، مانند -Wpedantic -Wno-pointer-sign.
در جایی که استاندارد مشخصشده با -std نشاندهندهٔ یک لهجهٔ گسترشیافتهٔ GNU از C باشد، مانند gnu90 یا gnu99، یک استاندارد پایه متناظر وجود دارد، یعنی نگارشی از ISO C که لهجهٔ گسترشیافتهٔ GNU بر پایهٔ آن استوار است. هشدارهای ناشی از -Wpedantic در جاهایی صادر میشوند که توسط استاندارد پایه الزامی شده باشند. (منطقی نیست که چنین هشدارهایی تنها برای قابلیتهایی صادر شوند که در لهجهٔ GNU C مشخصشده نیستند، زیرا بنا بر تعریف، لهجههای GNU از C شامل تمام ویژگیهایی هستند که کامپایلر با گزینهٔ ارائهشده پشتیبانی میکند، و در نتیجه چیزی برای هشدار دادن وجود نخواهد داشت.)
- -pedantic-errors
- صدور خطا در
هر زمانی که
استاندارد
پایه (به -Wpedantic
نگاه کنید)
نیازمند یک
پیام
عیبیابی
باشد؛ در
برخی موارد
که رفتار
تعریفنشده
(undefined behavior) در زمان
کامپایل
وجود دارد و
در برخی
موارد دیگر
که مانع
کامپایل
برنامههای
معتبر
مطابق با
استاندارد
نمیشوند.
این گزینه
معادل -Werror=pedantic
نیست:
گزینهٔ
اخیر
احتمالاً
سودمند
نخواهد
بود، زیرا
تنها
عیبیابیهایی
را به خطا
تبدیل
میکند که
تحت کنترل
-Wpedantic هستند،
در حالی که
این گزینه
بر
عیبیابیهای
الزامی که
همیشه فعال
هستند یا
توسط
گزینههایی
غیر از -Wpedantic
کنترل
میشوند
نیز تأثیر
میگذارد.
اگر میخواهید عیبیابیهای الزامی که بهطور پیشفرض هشدار هستند، به خطا تبدیل شوند، اما تمایلی ندارید که عیبیابیهای -Wpedantic فعال شوند، میتوانید -pedantic-errors -Wno-pedantic را مشخص کنید (یا -pedantic-errors -Wno-error=pedantic برای فعال کردن آنها صرفاً به عنوان هشدار).
برخی از عیبیابیهای الزامی بهطور پیشفرض خطا هستند، اما میتوان با استفاده از -fpermissive یا گزینهٔ هشدار اختصاصی آنها، مثلاً -Wno-error=narrowing، آنها را به هشدار تقلیل داد.
برخی از عیبیابیها برای شیوههای غیر-ISO توسط گزینههای هشدار خاصی غیر از -Wpedantic کنترل میشوند، اما با -pedantic-errors نیز تبدیل به خطا میشوند. برای نمونه:
-Wattributes (برای صفتهای استاندارد) -Wchanges-meaning (C++) -Wcomma-subscript (C++23 یا جدیدتر) -Wdeclaration-after-statement (C90 یا قدیمیتر) -Welaborated-enum-base (C++11 یا جدیدتر) -Wimplicit-int (C99 یا جدیدتر) -Wimplicit-function-declaration (C99 یا جدیدتر) -Wincompatible-pointer-types -Wint-conversion -Wlong-long (C90 یا قدیمیتر) -Wmain -Wnarrowing (C++11 یا جدیدتر) -Wpointer-arith -Wpointer-sign -Wincompatible-pointer-types -Wregister (C++17 یا جدیدتر) -Wvla (C90 یا قدیمیتر) -Wwrite-strings (C++11 یا جدیدتر) .IP -fpermissive 4 تنزل دادن سطح برخی از پیامهای تشخیصی اجباری مربوط به کدهای ناسازگار با استاندارد، از خطا به هشدار. بنابراین، استفاده از -fpermissive اجازه میدهد برخی کدهای ناسازگار کامپایل شوند. برخی از پیامهای تشخیصی C++ تنها با این پرچم کنترل میشوند، اما این گزینه سطح برخی از پیامهای تشخیصی C و C++ را نیز که پرچم اختصاصی خود را دارند، تنزل میدهد:
-Wdeclaration-missing-parameter-type (تنها C و Objective-C) -Wimplicit-function-declaration (تنها C و Objective-C) -Wimplicit-int (تنها C و Objective-C) -Wincompatible-pointer-types (تنها C و Objective-C) -Wint-conversion (تنها C و Objective-C) -Wnarrowing (تنها C++ و Objective-C++) -Wreturn-mismatch (تنها C و Objective-C) -Wtemplate-body (تنها C++ و Objective-C++)
گزینهٔ -fpermissive در حالتهای قدیمی زبان C (-std=c89، -std=gnu89، -std=c90 و -std=gnu90) پیشفرض است.
- -Wall
- این گزینه
تمام
هشدارهای
مربوط به
ساختارهایی
را که برخی
کاربران
آنها را
مشکوک
میدانند و
بهسادگی
قابل
اجتناب
هستند (یا
میتوان
برای
جلوگیری از
هشدار،
آنها را
اصلاح کرد)،
حتی در
هنگام
استفاده
همراه با
ماکروها،
فعال
میکند. این
گزینه
همچنین
برخی
هشدارهای
خاص زبان را
که در C++ Dialect Options
و Objective-C and Objective-C++ Dialect Options
توصیف
شدهاند،
فعال
میسازد.
-Wall پرچمهای هشدار زیر را روشن میکند:
-Waddress -Waligned-new (تنها C++ و Objective-C++) -Warray-bounds=1 (تنها با -O2) -Warray-compare -Warray-parameter=2 -Wbool-compare -Wbool-operation -Wc++11-compat -Wc++14-compat -Wc++17compat -Wc++20compat -Wcatch-value (تنها C++ و Objective-C++) -Wchar-subscripts -Wclass-memaccess (تنها C++ و Objective-C++) -Wcomment -Wdangling-else -Wdangling-pointer=2 -Wdelete-non-virtual-dtor (تنها C++ و Objective-C++) -Wduplicate-decl-specifier (تنها C و Objective-C) -Wenum-compare (در C/ObjC؛ این گزینه بهطور پیشفرض در C++ روشن است) -Wenum-int-mismatch (تنها C و Objective-C) -Wformat=1 -Wformat-contains-nul -Wformat-diag -Wformat-extra-args -Wformat-overflow=1 -Wformat-truncation=1 -Wformat-zero-length -Wframe-address -Wimplicit (تنها C و Objective-C) -Wimplicit-function-declaration (تنها C و Objective-C) -Wimplicit-int (تنها C و Objective-C) -Winfinite-recursion -Winit-self (تنها C++ و Objective-C++) -Wint-in-bool-context -Wlogical-not-parentheses -Wmain (تنها برای C/ObjC و مگر در صورت استفاده از -ffreestanding) -Wmaybe-uninitialized -Wmemset-elt-size -Wmemset-transposed-args -Wmisleading-indentation (تنها برای C/C++) -Wmismatched-dealloc -Wmismatched-new-delete (تنها C++ و Objective-C++) -Wmissing-attributes -Wmissing-braces (تنها برای C/ObjC) -Wmultistatement-macros -Wnarrowing (تنها C++ و Objective-C++) -Wnonnull -Wnonnull-compare -Wopenmp-simd (تنها C و C++) -Woverloaded-virtual=1 (تنها C++ و Objective-C++) -Wpacked-not-aligned -Wparentheses -Wpessimizing-move (تنها C++ و Objective-C++) -Wpointer-sign (تنها برای C/ObjC) -Wrange-loop-construct (تنها C++ و Objective-C++) -Wreorder (تنها C++ و Objective-C++) -Wrestrict -Wreturn-type -Wself-move (تنها C++ و Objective-C++) -Wsequence-point -Wsign-compare (تنها C++ و Objective-C++) -Wsizeof-array-div -Wsizeof-pointer-div -Wsizeof-pointer-memaccess -Wstrict-aliasing -Wstrict-overflow=1 -Wswitch -Wtautological-compare -Wtrigraphs -Wuninitialized -Wunknown-pragmas -Wunused -Wunused-but-set-variable -Wunused-const-variable=1 (تنها برای C/ObjC) -Wunused-function -Wunused-label -Wunused-local-typedefs -Wunused-value -Wunused-variable -Wuse-after-free=2 -Wvla-parameter -Wvolatile-register-var -Wzero-length-bounds
توجه داشته باشید که برخی از پرچمهای هشدار توسط -Wall در بر گرفته نمیشوند. برخی از آنها در مورد ساختارهایی هشدار میدهند که کاربران عموماً آنها را مشکوک نمیدانند، اما ممکن است گاهی بخواهید آنها را بررسی کنید؛ برخی دیگر دربارهٔ ساختارهایی هشدار میدهند که در بعضی موارد ضروری هستند یا اجتناب از آنها دشوار است، و هیچ راه سادهای برای اصلاح کد جهت رفع هشدار وجود ندارد. برخی از آنها توسط -Wextra فعال میشوند، اما بسیاری از آنها باید بهصورت جداگانه فعال گردند.
- -Wextra
- این گزینه
برخی
پرچمهای
هشدار
اضافی را که
توسط -Wall
فعال
نمیشوند،
فعال
میکند.
(این گزینه
در گذشته -W
نامیده
میشد. نام
قدیمیتر
همچنان
پشتیبانی
میشود،
اما نام
جدید
گویاتر
است.)
-Wabsolute-value (تنها برای C/ObjC) -Walloc-size -Wcalloc-transposed-args -Wcast-function-type -Wclobbered -Wdangling-reference (تنها C++) -Wdeprecated-copy (تنها C++ و Objective-C++) -Wempty-body -Wenum-conversion (تنها برای C/ObjC) -Wexpansion-to-defined -Wignored-qualifiers (تنها برای C/C++) -Wimplicit-fallthrough=3 -Wmaybe-uninitialized -Wmissing-field-initializers -Wmissing-parameter-name (تنها C/ObjC) -Wmissing-parameter-type (تنها C/ObjC) -Wold-style-declaration (تنها C/ObjC) -Woverride-init (تنها C/ObjC) -Wredundant-move (تنها C++ و Objective-C++) -Wshift-negative-value (در C++11 تا C++17 و در C99 و جدیدتر) -Wsign-compare (تنها C++ و Objective-C++) -Wsized-deallocation (تنها C++ و Objective-C++) -Wstring-compare -Wtype-limits -Wuninitialized -Wunterminated-string-initialization -Wunused-parameter (تنها با -Wunused یا -Wall) -Wunused-but-set-parameter (تنها با -Wunused یا -Wall)
گزینهٔ -Wextra همچنین برای موارد زیر پیام هشدار چاپ میکند:
- یک اشارهگر با عدد صحیح صفر توسط "<"، "<="، ">" یا ">=" مقایسه شود.
- (تنها C++) یک شمارشگر (enumerator) و یک غیرشمارشگر هر دو در یک عبارت شرطی ظاهر شوند.
- (تنها C++) کلاسهای پایهٔ مجازی مبهم.
- (تنها C++) اندیسگذاری روی آرایهای که با "register" اعلان شده است.
- (تنها C++) گرفتن آدرس متغیری که با "register" اعلان شده است.
- (تنها C++) یک کلاس پایه در سازندهٔ رونوشت (copy constructor) یک کلاس مشتقشده مقداردهی اولیه نشده باشد.
- -Wabi (تنها C، Objective-C، C++ و Objective-C++)
- دربارهٔ
کدهایی که
تحت تأثیر
تغییرات ABI
قرار
میگیرند
هشدار
میدهد. این
شامل
کدهایی است
که ممکن است
با C++ ABI مستقل
از سازنده و
همچنین psABI
برای مقصد
خاص سازگار
نباشند.
هشدارهای
مورد دوم
بهطور
جداگانه
توسط -Wpsabi نیز
کنترل
میشوند،
که درون -Wabi
گنجانده
شده است.
از آنجا که اکنون رفتار پیشفرض G++ بهروزرسانی ABI در هر انتشار اصلی است، معمولاً -Wabi تنها زمانی دربارهٔ مشکلات سازگاری C++ ABI هشدار میدهد که در سری یک انتشار، بررسی جدیدی برای یک مشکل ABI که پس از انتشار اولیه کشف شده است، اضافه گردد. اگر نسخهٔ قدیمیتری از ABI انتخاب شود (با -fabi-version=n)، گزینهٔ -Wabi دربارهٔ موارد بیشتری هشدار میدهد.
همچنین میتوان -Wabi را با یک شماره نسخهٔ صریح برای هشدار در مورد سازگاری C++ ABI با یک سطح خاص از -fabi-version به کار برد؛ مثلاً -Wabi=2 برای هشدار دربارهٔ تغییرات نسبت به -fabi-version=2.
اگر یک شماره نسخهٔ صریح ارائه شده باشد و -fabi-compat-version مشخص نشده باشد، شماره نسخهٔ این گزینه برای نامهای مستعار سازگاری به کار میرود. اگر هیچ شماره نسخهٔ صریحی همراه با این گزینه ارائه نشود، اما -fabi-compat-version تعیین شده باشد، آن شماره نسخه برای هشدارهای C++ ABI استفاده میشود.
اگرچه تلاش شده است تا دربارهٔ تمام این موارد هشدار داده شود، اما احتمالاً مواردی وجود دارد که با وجود تولید کد ناسازگار توسط G++، هشداری برای آنها داده نمیشود. همچنین ممکن است مواردی وجود داشته باشد که در آنها هشدار صادر شود، اگرچه کد تولیدشده سازگار است.
اگر نگران این موضوع هستید که کد تولیدشده توسط G++ ممکن است از نظر باینری با کد تولیدشده توسط کامپایلرهای دیگر سازگار نباشد، باید کد خود را برای اجتناب از این هشدارها بازنویسی کنید.
ناسازگاریهای شناختهشده در -fabi-version=2 (که از GCC 3.4 تا 4.9 پیشفرض بود) شامل موارد زیر است:
extern int N;
template <int &> struct S {};
void n (S<N>) {2}
این مورد در -fabi-version=3 برطرف شد.
- نوعهای
برداری SIMD که
با استفاده
از "__attribute
((vector_size))" اعلان
میشدند،
به روشی غیر
استاندارد
درهمسازی
میشدند که
اجازه
بارگذاری
بیشازحد
(overload) توابعی
با بردارها
در
اندازههای
متفاوت را
نمیداد.
روش درهمسازی در -fabi-version=4 تغییر یافت.
- "__attribute ((const))" و
"noreturn" به
عنوان
توصیفکنندههای
نوع
درهمسازی
میشدند، و
"decltype"
مربوط به یک
اعلان ساده
حذف میشد (folded
away).
این مشکلات درهمسازی در -fabi-version=5 رفع شدند.
- شمارندههای
دامنهدار
(scoped enumerators) که به
عنوان
آرگومان به
یک تابع
چندآرگومانی
(variadic) ارسال
میشدند،
مانند
شمارندههای
بدون دامنه
ارتقا
مییافتند
و باعث
ایجاد خطا
در "va_arg"
میشدند.
روی اکثر
مقصدها،
این امر در
عمل بر ABI
ارسال
پارامترها
تأثیری
نمیگذارد،
زیرا راهی
برای ارسال
آرگومانی
کوچکتر از
"int" وجود
ندارد.
همچنین، ABI نحوه درهمسازی بستههای آرگومان قالب، "const_cast"، "static_cast"، افزایش/کاهش پیشوندی، و یک تابع در حوزه کلاس که به عنوان آرگومان قالب استفاده شده است را تغییر داد.
این مشکلات در -fabi-version=6 اصلاح شدند.
- لامبداها
در حوزه
آرگومان
پیشفرض
بهطور
نادرست
درهمسازی
میشدند، و
ABI نحوه
درهمسازی
"nullptr_t" را
تغییر داد.
این موارد در -fabi-version=7 اصلاح شدند.
- هنگام
درهمسازی
یک نوع تابع
با
توصیفکنندههای
cv تابع (function-cv-qualifiers)،
نوع تابع
بدون
توصیفکننده
به اشتباه
به عنوان یک
کاندیدای
جایگزینی
در نظر
گرفته
میشد.
این مورد در -fabi-version=8، که پیشفرض GCC 5.1 است، برطرف شد.
- decltype(nullptr) به
اشتباه
دارای
ترازبندی ۱
بود که منجر
به
دسترسیهای
ترازنشده
میشد. توجه
داشته
باشید که
این موضوع
بر ABI تابعی
با پارامتر
"nullptr_t"
تأثیری
نگذاشت،
زیرا
پارامترها
دارای
حداقل
ترازبندی
هستند.
این مورد در -fabi-version=9، که پیشفرض GCC 5.2 است، برطرف شد.
- ویژگیهای
مختص مقصد
که بر هویت
یک نوع اثر
میگذارند،
مانند
قراردادهای
فراخوانی ia32
در نوع یک
تابع (مانند
stdcall، regparm و غیره)،
بر نام
درهمسازیشده
تأثیری
نداشتند که
هنگام
استفاده از
اشارهگرهای
تابع به
عنوان
آرگومانهای
قالب منجر
به تداخل
نام میشد.
این مورد در -fabi-version=10، که پیشفرض GCC 6.1 است، رفع شد.
- -Wpsabi (تنها C، Objective-C، C++ و Objective-C++)
- -Wpsabi
هشدارهای
مربوط به
تغییرات ABI
مختص
پردازنده
را فعال
میکند،
مانند
تغییرات در
نیازمندیهای
ترازبندی
یا نحوه
ارسال
آرگومانهای
تابع. در
چندین مقصد
از جمله AArch64،
ARM، x86، MIPS، RS6000/PowerPC و S/390،
این جزئیات
در بین
نگارشهای
مختلف GCC و/یا
نگارشهای
مختلف
استانداردهای
زبان C یا C++
بهگونهای
تغییر
یافتهاند
که بر
سازگاری
باینری
کدهای
کامپایلشده
تأثیر
میگذارند.
با -Wpsabi،
کامپایلر GCC
میتواند
استفادههای
بالقوه
ناسازگار
را شناسایی
کرده و
درباره
آنها به
شما هشدار
دهد.
گزینه -Wpsabi بهطور پیشفرض فعال است و همچنین بهصورت ضمنی با -Wabi فعال میشود.
- -Wno-changes-meaning (تنها C++ و Objective-C++)
- زبان C++
ایجاب
میکند که
استفادههای
بدون قید از
یک نام در
درون یک
کلاس، در کل
حوزه کلاس
معنای
یکسانی
داشته
باشند؛
بنابراین
اعلان نام
پس از
استفاده از
آن بدقواره
(ill-formed) است:
struct A; struct B1 { A a; typedef A A; }; // warning, 'A' changes meaning struct B2 { A a; struct A { }; }; // error, 'A' changes meaningبهطور پیشفرض، حالت B1 تنها یک هشدار است زیرا هر دو اعلان نوع یکسانی دارند، در حالی که حالت B2 یک خطا به شمار میرود. هر دو پیام تشخیصی را میتوان با -Wno-changes-meaning غیرفعال کرد. همچنین میتوان حالت خطا را با -Wno-error=changes-meaning یا -fpermissive به یک هشدار تقلیل داد.
هر دو پیام تشخیصی توسط -fms-extensions نیز نادیده گرفته میشوند.
- -Wchar-subscripts
- اگر اندیس یک آرایه از نوع "char" باشد، هشدار میدهد. این یکی از عوامل شایع خطا است، زیرا برنامهنویسان اغلب فراموش میکنند که این نوع در برخی ماشینها علامتدار (signed) است. این هشدار توسط -Wall فعال میشود.
- -Wno-coverage-mismatch
- اگر هنگام استفاده از گزینه -fprofile-use، پروفایلهای بازخورد مطابقت نداشته باشند هشدار میدهد. اگر یک فایل مبدأ بین کامپایل با -fprofile-generate و کامپایل با -fprofile-use تغییر کند، ممکن است فایلهای حاوی بازخورد پروفایل با فایل مبدأ مطابقت نداشته باشند و GCC نتواند از اطلاعات بازخورد پروفایل استفاده کند. بهطور پیشفرض، این هشدار فعال است و به عنوان یک خطا تلقی میشود. از -Wno-coverage-mismatch میتوان برای غیرفعال کردن هشدار، یا از -Wno-error=coverage-mismatch میتوان برای غیرفعال کردن خطا استفاده کرد. غیرفعال کردن خطا برای این هشدار میتواند منجر به کدهای با بهینهسازی ضعیف شود و تنها در صورت وجود تغییرات بسیار جزئی، مانند رفع باگ در یک پایهکد موجود، مفید است. غیرفعال کردن کامل این هشدار توصیه نمیشود.
- -Wno-coverage-too-many-conditions
- اگر از -fcondition-coverage استفاده شود و یک عبارت دارای جملات بسیار زیادی باشد بهطوریکه GCC از پوشش صرفنظر کند، هشدار میدهد. صرفنظر از پوشش زمانی رخ میدهد که تعداد جملات در عبارت شرطی بیش از تعداد بیتهای موجود در یک "gcov_type_unsigned" باشد. این هشدار بهطور پیشفرض فعال است.
- -Wno-coverage-too-many-paths
- اگر از -fpath-coverage استفاده شود و یک تابع دارای مسیرهای بیش از حدی باشد بهطوریکه GCC از پوشش صرفنظر کند، هشدار میدهد. صرفنظر کردن توسط -fpath-coverage-limit کنترل میشود. این هشدار بهطور پیشفرض فعال است.
- -Wno-coverage-invalid-line-number
- در صورتی که
یک تابع به
دلیل
ماکروهای
نامعتبر
شماره خط (linenum)
زودتر از
آغازش به
پایان
برسد،
هشدار
میدهد. این
هشدار تنها
هنگامی
صادر
میشود که
--coverage فعال
باشد.
بهطور پیشفرض، این هشدار فعال است و به عنوان یک خطا در نظر گرفته میشود. از -Wno-coverage-invalid-line-number میتوان برای غیرفعال کردن هشدار، یا از -Wno-error=coverage-invalid-line-number میتوان برای غیرفعال کردن خطا استفاده کرد.
- -Wno-cpp (تنها C، Objective-C، C++، Objective-C++ و Fortran)
- پیامهای هشدار صادرشده توسط دستورات هدایتکننده "#warning" را فرو مینشاند.
- -Wdouble-promotion (تنها C، C++، Objective-C و Objective-C++)
- هنگامی که
مقداری از
نوع "float"
بهطور
ضمنی به
"double"
ارتقا
مییابد،
هشدار
میدهد.
پردازندههای
دارای واحد
ممیز شناور
۳۲ بیتی
«دقت
یگانه»
(single-precision)، نوع
"float" را
در
سختافزار
پیادهسازی
میکنند،
اما "double"
را در
نرمافزار
شبیهسازی
مینمایند.
در چنین
ماشینی،
انجام
محاسبات با
استفاده از
مقادیر
"double" به
دلیل سربار
لازم برای
شبیهسازی
نرمافزاری
بسیار
هزینهبرتر
است.
انجام تصادفی محاسبات با "double" بسیار آسان رخ میدهد زیرا لیترالهای ممیز شناور بهطور ضمنی از نوع "double" هستند. برای نمونه، در:
float area(float radius) { return 3.14159 * radius * radius; }کامپایلر تمام محاسبات را با "double" انجام میدهد زیرا لیترال ممیز شناور از نوع "double" است.
- -Wduplicate-decl-specifier (تنها C و Objective-C)
- اگر اعلانی دارای توصیفکننده تکراری "const"، "volatile"، "restrict" یا "_Atomic" باشد، هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wformat
- -Wformat=n
- فراخوانیهای
توابعی
نظیر
"printf" و
"scanf" و
غیره را
بررسی
میکند تا
اطمینان
حاصل شود
نوع
آرگومانهای
ارائهشده
با رشته
قالب
مشخصشده
مطابقت
دارند و
تبدیلهای
مشخصشده
در رشته
قالب معقول
و معتبر
هستند. این
شامل توابع
استاندارد
و سایر
توابع
مشخصشده
توسط
ویژگیهای
قالب، در
خانوادههای
"printf"،
"scanf"،
"strftime" و
"strfmon" (یک
افزونه X/Open که
در
استاندارد C
نیست) (یا
سایر
خانوادههای
مختص مقصد)
میشود.
اینکه
کدام توابع
بدون داشتن
صفتهای
قالب
مشخصشده
بررسی شوند
به نگارش
استاندارد
انتخابشده
بستگی
دارد، و
اینگونه
بررسیهای
توابع بدون
ویژگیهای
مشخصشده
توسط -ffreestanding یا
-fno-builtin
غیرفعال
میشوند.
قالبها در برابر قابلیتهای قالببندی پشتیبانیشده توسط GNU libc نگارش 2.2 بررسی میشوند. این قابلیتها شامل تمام ویژگیهای ISO C90 و C99 و همچنین ویژگیهایی از مشخصات Single Unix و برخی افزونههای BSD و GNU است. سایر پیادهسازیهای کتابخانه ممکن است از همه این ویژگیها پشتیبانی نکنند؛ GCC از دادن هشدار در مورد ویژگیهایی که فراتر از محدودیتهای یک کتابخانه خاص هستند پشتیبانی نمیکند. با این حال، اگر -Wpedantic همراه با -Wformat استفاده شود، در مورد ویژگیهای قالبی که در نگارش استاندارد انتخابی وجود ندارند هشدار داده میشود (اما نه برای قالبهای "strfmon"، زیرا در هیچ نگارشی از استاندارد C وجود ندارند).
- -Wformat
- گزینهٔ -Wformat معادل -Wformat=1 است، و -Wno-format معادل -Wformat=0 است. از آنجا که -Wformat همچنین آرگومانهای قالب تهی (null) را برای چندین تابع بررسی میکند، -Wformat به طور ضمنی شامل -Wnonnull نیز میشود. برخی جنبههای این سطح از بررسی قالب را میتوان با گزینههای روبرو غیرفعال کرد: -Wno-format-contains-nul، -Wno-format-extra-args و -Wno-format-zero-length. گزینهٔ -Wformat توسط -Wall فعال میشود.
- -Wformat=2
- فعالسازی -Wformat به همراه بررسیهای بیشتر قالب. در حال حاضر معادل -Wformat -Wformat-nonliteral -Wformat-security -Wformat-y2k است.
- -Wno-format-contains-nul
- اگر -Wformat مشخص شده باشد، دربارهٔ رشتههای قالبی که حاوی بایتهای NUL هستند هشدار ندهد.
- -Wno-format-extra-args
- اگر -Wformat مشخص
شده باشد،
دربارهٔ
آرگومانهای
اضافی برای
یک تابع
قالببندی
"printf" یا
"scanf"
هشدار ندهد.
استاندارد C
مشخص
میکند که
اینگونه
آرگومانها
نادیده
گرفته
میشوند.
در جایی که آرگومانهای استفادهنشده بین آرگومانهای استفادهشدهای قرار گیرند که با مشخصههای شماره عملوند $ مشخص شدهاند، معمولاً همچنان هشدار داده میشود، زیرا پیادهسازی نمیتواند بداند چه نوعی را باید برای رد کردن آرگومانهای استفادهنشده به "va_arg" ارسال کند. با این حال، در مورد قالبهای "scanf"، این گزینه هشدار را در صورتی که آرگومانهای استفادهنشده همگی اشارهگر باشند سرکوب میکند، زیرا استاندارد Single Unix مشخص میکند که چنین آرگومانهای استفادهنشدهای مجاز هستند.
- -Wformat-overflow
- -Wformat-overflow=level
- هشدار دربارهٔ فراخوانیهای توابع ورودی/خروجی قالببندیشده مانند "sprintf" و "vsprintf" که ممکن است باعث سرریز بافر مقصد شوند. هنگامی که تعداد دقیق بایتهای نوشتهشده توسط یک دستورالعمل قالب را نتوان در زمان ترجمه تعیین کرد، بر اساس روشهای اکتشافی که به آرگومان level و بهینهسازی وابستهاند تخمین زده میشود. در حالی که فعال کردن بهینهسازی در اکثر موارد دقت هشدار را بهبود میبخشد، همچنین ممکن است منجر به مثبت کاذب شود.
- -Wformat-overflow
- -Wformat-overflow=1
- سطح 1 از
-Wformat-overflow که توسط
-Wformat فعال
میشود
رویکردی
محافظهکارانه
را به کار
میگیرد که
فقط درباره
فراخوانیهایی
هشدار
میدهد که
به احتمال
زیاد باعث
سرریز بافر
میشوند. در
این سطح،
آرگومانهای
عددی
دستورالعملهای
قالب با
مقادیر
نامشخص
برابر یک
فرض
میشوند، و
رشتههای
با طول
ناشناخته،
خالی در نظر
گرفته
میشوند.
آرگومانهای
عددی که
مشخص است به
زیرمجموعهای
از نوع خود
محدود
هستند، یا
آرگومانهای
رشتهای که
خروجی
آنها چه با
دقت
دستورالعمل
آنها و چه
با
مجموعهای
متناهی از
رشتههای
لفظی محدود
شده باشد،
مقداری
درون آن
محدوده در
نظر گرفته
میشوند که
منجر به
بیشترین
بایت در
خروجی گردد.
برای مثال،
فراخوانی
زیر به
"sprintf"
شناسایی
میشود
زیرا حتی با
برابر صفر
بودن هر دو
متغیر a و
b، نویسهٔ
پایانی NUL
('\0') اضافه
شده توسط
تابع به
بافر مقصد،
فراتر از
انتهای آن
نوشته
خواهد شد.
افزایش
اندازهٔ
بافر به
میزان یک
بایت برای
جلوگیری از
هشدار کافی
است، هرچند
ممکن است
برای
جلوگیری از
سرریز کافی
نباشد.
void f (int a, int b) { char buf [13]; sprintf (buf, "a = %i, b = %i\n", a, b); } - -Wformat-overflow=2
- سطح 2 علاوه
بر این،
درباره
فراخوانیهایی
هشدار
میدهد که
ممکن است در
صورت
دریافت یک
آرگومان با
طول یا
اندازهٔ
کافی، بافر
مقصد را
سرریز کنند.
در سطح 2،
برای
آرگومانهای
عددی
ناشناخته
مقدار
کمینهٔ
قابل نمایش
برای انواع
علامتدار
با دقتی
بیشتر از ۱،
و در غیر
این صورت
مقدار
بیشینهٔ
قابل نمایش
فرض میشود.
آرگومانهای
رشتهای
ناشناخته
که طول
آنها را
نتوان
محدود به
دقت
دستورالعمل،
یا
مجموعهای
متناهی از
رشتههای
لفظی که
ممکن است به
آنها
ارزیابی
شوند، یا
آرایهٔ
نویسهای
که ممکن است
به آن اشاره
کنند فرض
کرد، ۱
نویسه
طولانی در
نظر گرفته
میشوند.
در سطح 2، فراخوانی در مثال بالا مجدداً شناسایی و گزارش میشود، اما این بار به این دلیل که با برابر بودن a با یک مقدار ۳۲ بیتی "INT_MIN"، اولین دستورالعمل %i برخی از ارقام خود را فراتر از انتهای بافر مقصد خواهد نوشت. برای ایمنسازی این فراخوانی بدون توجه به مقادیر این دو متغیر، اندازهٔ بافر مقصد باید به حداقل ۳۴ بایت افزایش یابد. GCC اندازهٔ کمینهٔ بافر را در یک یادداشت اطلاعاتی پس از هشدار درج میکند.
یک جایگزین برای افزایش اندازهٔ بافر مقصد، محدود کردن دامنهٔ مقادیر قالببندیشده است. بیشینهٔ طول آرگومانهای رشتهای را میتوان با مشخص کردن دقت در دستورالعمل قالب محدود کرد. هنگامی که بتوان آرگومانهای عددی دستورالعملهای قالب را محدود به کمتر از دقت نوع آنها فرض کرد، انتخاب یک تغییردهندهٔ طول مناسب برای مشخصکنندهٔ قالب، اندازهٔ بافر مورد نیاز را کاهش خواهد داد. برای مثال، اگر در مثال بالا بتوان فرض کرد که a و b در محدودهٔ دقت نوع "short int" هستند، استفاده از دستورالعمل قالب %hi یا تبدیل صریح نوع آرگومان به "short"، بیشینهٔ اندازهٔ مورد نیاز بافر را به ۲۴ بایت کاهش میدهد.
void f (int a, int b) { char buf [23]; sprintf (buf, "a = %hi, b = %i\n", a, (short)b); }
- -Wno-format-zero-length
- اگر -Wformat مشخص شده باشد، دربارهٔ قالبهای با طول صفر هشدار ندهد. استاندارد C مشخص میکند که قالبهای با طول صفر مجاز هستند.
- -Wformat-nonliteral
- اگر -Wformat مشخص شده باشد، همچنین در صورتی که رشتهٔ قالب یک رشته لفظی نبوده و بنابراین قابل بررسی نباشد، هشدار میدهد، مگر اینکه تابع قالب آرگومانهای قالب خود را به صورت یک "va_list" دریافت کند.
- -Wformat-security
- اگر -Wformat مشخص شده باشد، همچنین دربارهٔ استفادههایی از توابع قالب که نشاندهندهٔ مشکلات امنیتی احتمالی هستند هشدار میدهد. در حال حاضر، این گزینه دربارهٔ فراخوانیهای توابع "printf" و "scanf" در جایی که رشتهٔ قالب یک رشته لفظی نباشد و هیچ آرگومان قالبی وجود نداشته باشد، مانند "printf (foo);" هشدار میدهد. این ممکن است در صورتی که رشتهٔ قالب از ورودی غیرقابلاعتماد آمده باشد و حاوی %n باشد، یک رخنهٔ امنیتی باشد. (این مورد در حال حاضر زیرمجموعهای از مواردی است که -Wformat-nonliteral دربارهٔ آنها هشدار میدهد، اما در آینده ممکن است هشدارهایی به -Wformat-security اضافه شوند که در -Wformat-nonliteral گنجانده نشدهاند.)
- -Wformat-signedness
- اگر -Wformat مشخص شده باشد، همچنین در صورتی که رشتهٔ قالب نیازمند یک آرگومان بدون علامت باشد و آرگومان علامتدار باشد و بالعکس، هشدار میدهد.
- -Wformat-truncation
- -Wformat-truncation=level
- هشدار دربارهٔ فراخوانیهای توابع ورودی/خروجی قالببندیشده مانند "snprintf" و "vsnprintf" که ممکن است منجر به بریدهشدن خروجی شوند. هنگامی که نتوان تعداد دقیق بایتهای نوشتهشده توسط یک دستورالعمل قالب را در زمان ترجمه تعیین کرد، بر اساس روشهای اکتشافی که به آرگومان level و بهینهسازی وابستهاند تخمین زده میشود. در حالی که فعال کردن بهینهسازی در بیشتر موارد دقت هشدار را بهبود میبخشد، همچنین ممکن است منجر به مثبت کاذب شود. به جز مواردی که خلاف آن ذکر شده باشد، این گزینه از همان منطق -Wformat-overflow استفاده میکند.
- -Wformat-truncation
- -Wformat-truncation=1
- سطح 1 از -Wformat-truncation که توسط -Wformat فعال میشود رویکردی محافظهکارانه را به کار میگیرد که فقط درباره فراخوانیهایی به توابع کراندار هشدار میدهد که مقدار بازگشتی آنها استفاده نشده است و به احتمال زیاد منجر به بریدهشدن خروجی میشوند.
- -Wformat-truncation=2
- سطح 2 علاوه بر این، درباره فراخوانیهایی به توابع کراندار هشدار میدهد که مقدار بازگشتی آنها استفاده شده است و در صورت دریافت آرگومانی با طول یا اندازهٔ کافی، ممکن است به بریدهشدن منجر شوند.
- -Wformat-y2k
- اگر -Wformat مشخص
شده باشد،
همچنین
دربارهٔ
قالبهای
"strftime" که
ممکن است
سال را تنها
به صورت دو
رقمی تولید
کنند،
هشدار
میدهد..IP -Wnonnull 4
هشدار
دربارهٔ
ارسال یک
اشارهگر null
برای
آرگومانهایی
که با صفتِ
تابع
"nonnull" به
عنوان
نیازمند یک
مقدار غیر null
نشانهگذاری
شدهاند.
گزینهٔ -Wnonnull در -Wall و -Wformat گنجانده شده است. این گزینه میتواند با گزینهٔ -Wno-nonnull غیرفعال شود.
- -Wnonnull-compare
- هشدار
هنگام
مقایسهٔ یک
آرگومان
نشانهگذاریشده
با صفتِ
تابع
"nonnull" با null
در داخل
تابع.
گزینهٔ -Wnonnull-compare در -Wall گنجانده شده است. این گزینه میتواند با گزینهٔ -Wno-nonnull-compare غیرفعال شود.
- -Wnull-dereference
- هشدار اگر کامپایلر مسیرهایی را تشخیص دهد که به دلیل ارجاعزدایی از یک اشارهگر null، موجب رفتار خطاساز یا تعریفنشده (undefined behavior) میشوند. این گزینه تنها زمانی فعال است که -fdelete-null-pointer-checks فعال باشد، که در بیشتر معماریهای مقصد با بهینهسازیها فعال میشود. دقت این هشدارها به گزینههای بهینهسازیِ استفادهشده بستگی دارد.
- -Wno-musttail-local-addr
- دربارهٔ ارسال اشارهگر (یا در C++، یک ارجاع/مرجع) به یک متغیر محلی یا برچسب به آرگومان یک فراخوانی "musttail" هشدار نده. آن متغیرها پیش از دستور فراخوانی پایانی (tail call) از حوزه (scope) خارج میشوند.
- -Wmaybe-musttail-local-addr
- هشدار
هنگامی که
آدرس یک
متغیر محلی
میتواند
به یک
فراخوانی
"musttail" نشت
کند (escape)، مگر
اینکه پیش
از
فراخوانی
"musttail" از
حوزه خارج
شده باشد.
int foo (int *); int bar (int *x) { if (x[0] == 1) { int a = 42; foo (&a); /* Without the C<musttail> attribute this call would not be tail called, because address of the C<a> variable escapes and the second foo call could dereference it. With the attribute the local variables are assumed to go out of scope immediately before the tail call instruction and the compiler warns about this. */ [[gnu::musttail]] return foo (nullptr); } else { { int a = 42; foo (&a); } /* The C<a> variable isn't already in scope, so even when it escaped, even without C<musttail> attribute it would be undefined behavior to dereference it and the compiler could turn this into a tail call. No warning is diagnosed here. */ [[gnu::musttail]] return foo (nullptr); } }این هشدار توسط -Wextra فعال میشود.
- -Wnrvo (فقط C++ و Objective-C++)
- هشدار اگر
کامپایلر
کپی از یک
متغیر محلی
به مقدار
بازگشتی یک
تابع را در
زمینهای
که طبق [class.copy.elision]
مجاز است،
حذف نکند (elide
نکند). این
حذف کپی
معمولاً به
عنوان
بهینهسازی
مقدار
بازگشتی
نامگذاریشده
(NRVO یا Named Return Value Optimization)
شناخته
میشود.
برای
نمونه، در
مثال زیر
کامپایلر
نمیتواند
کپیها را
از هر دوی v1 و v2
حذف کند،
بنابراین
هیچکدام
را حذف
نمیکند.
std::vector<int> f() { std::vector<int> v1, v2; // ... if (cond) return v1; else return v2; // warning: not eliding copy } - -Winfinite-recursion
- هشدار
دربارهٔ
فراخوانیهای
بازگشتی
بینهایت.
این هشدار
در تمام
سطوح
بهینهسازی
مؤثر است
اما برای
تشخیص
بازگشت
بینهایت
در
فراخوانیهای
میان دو یا
چند تابع،
به
بهینهسازی
نیاز دارد.
گزینهٔ
-Winfinite-recursion در -Wall
گنجانده
شده است.
با -Wanalyzer-infinite-recursion مقایسه شود که تشخیص مشابهی ارائه میدهد، اما به شیوهای متفاوت پیادهسازی شده است (به عنوان بخشی از -fanalyzer).
- -Winit-self (فقط C، C++، Objective-C و Objective-C++)
- هشدار
دربارهٔ
متغیرهای
مقداردهینشدهای
که با
خودشان
مقداردهی
اولیه
میشوند.
توجه داشته
باشید که
این گزینه
تنها
میتواند
همراه با
گزینهٔ -Wuninitialized
استفاده
شود.
برای مثال، GCC در قطعهکد زیر دربارهٔ مقداردهینشده بودن "i" تنها زمانی هشدار میدهد که -Winit-self مشخص شده باشد:
int f() { int i = i; return i; }این هشدار در C++ توسط -Wall فعال میشود.
- -Wno-implicit-int (فقط C و Objective-C)
- این گزینه
هشدارهایی
را کنترل
میکند که
در آنها
اعلان،
نوعی را
مشخص
نمیکند.
این هشدار
به صورت
پیشفرض،
به عنوان یک
خطا، در C99 و
گویشهای
بعدی C، و
همچنین
توسط -Wall
فعال
میشود. این
خطا
میتواند
با استفاده
از -fpermissive
(همراه با
برخی
خطاهای
دیگر)، یا
فقط برای
این خطا، با
-Wno-error=implicit-int به یک
هشدار تنزل
یابد.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-implicit-function-declaration (فقط C و Objective-C)
- این گزینه
هشدارهایی
را کنترل
میکند که
در آنها یک
تابع پیش از
اعلان شدن
استفاده
شده است.
این هشدار
به صورت
پیشفرض،
به عنوان یک
خطا، در C99 و
گویشهای
بعدی C، و
همچنین
توسط -Wall
فعال
میشود. این
خطا
میتواند
با استفاده
از -fpermissive
(همراه با
برخی
خطاهای
دیگر)، یا
فقط برای
این خطا، با
-Wno-error=implicit-function-declaration به
یک هشدار
تنزل یابد.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wimplicit (فقط C و Objective-C)
- مشابه -Wimplicit-int و -Wimplicit-function-declaration است. این هشدار توسط -Wall فعال میشود.
- -Whardened
- هشدار
هنگامی که
-fhardened
گزینهای
از مجموعهٔ
خود را فعال
نکرده باشد
(که برای آن
به -fhardened
مراجعه
کنید). برای
نمونه،
استفادهٔ
همزمان از
-fhardened و -fstack-protector در
خط فرمان
باعث
میشود -Whardened
هشدار دهد
زیرا -fstack-protector-strong
توسط -fhardened
فعال
نخواهد شد.
این هشدار به صورت پیشفرض فعال است و تنها زمانی اثر دارد که -fhardened فعال باشد.
- -Wimplicit-fallthrough
- گزینهٔ -Wimplicit-fallthrough مشابه -Wimplicit-fallthrough=3 است و -Wno-implicit-fallthrough مشابه -Wimplicit-fallthrough=0 است.
- -Wimplicit-fallthrough=n
- هشدار
هنگامی که
یک case در switch
بدون وقفه
به مورد
بعدی ادامه
یابد (fall through رخ
دهد). برای
مثال:
switch (cond) { case 1: a = 1; break; case 2: a = 2; case 3: a = 3; break; }این هشدار زمانی که آخرین دستور یک case نتواند به مورد بعدی سرریز کند، هشداری صادر نمیکند؛ مثلاً زمانی که یک دستور return یا فراخوانی تابعی که با صفت noreturn اعلان شده وجود داشته باشد. گزینهٔ -Wimplicit-fallthrough= همچنین دستورهای جریان کنترل مانند if را در نظر میگیرد و تنها در موارد مقتضی هشدار میدهد. به عنوان مثال:
switch (cond) { case 1: if (i > 3) { bar (5); break; } else if (i < 1) { bar (0); } else return; default: ... }از آنجا که مواردی وجود دارد که در آنها ادامهیافتن یک switch case به مورد بعدی (fall through) مطلوب است، GCC صفتی با نام "__attribute__ ((fallthrough))" ارائه میدهد که به همراه یک دستور پوچ (null statement) برای فرونشاندن این هشداری که در حالت عادی رخ میدهد، استفاده میشود: switch (cond) { case 1: bar (0); __attribute__ ((fallthrough)); default: ... }
زبان C++17 روشی استاندارد برای فرونشاندن هشدار -Wimplicit-fallthrough با استفاده از "[[fallthrough]];" به جای صفت گنو فراهم میکند. در C++11 یا C++14 کاربران میتوانند از "[[gnu::fallthrough]];" استفاده کنند، که یک افزونه گنو است. به جای این صفتها، افزودن یک کامنت fallthrough نیز برای خاموش کردن هشدار امکانپذیر است. تمام بدنه کامنتِ سبک C یا C++ باید با عبارات منظم دادهشده در زیر مطابقت داشته باشد. آرگومان گزینه n مشخص میکند چه نوع کامنتهایی پذیرفته میشوند:
- *<-Wimplicit-fallthrough=0 هشدار را بهطور کامل غیرفعال میکند.>
- *<-Wimplicit-fallthrough=1 با عبارت منظم ".*" مطابقت دارد،>
- هر کامنتی به عنوان کامنت fallthrough در نظر گرفته میشود.
- *<-Wimplicit-fallthrough=2 بدون حساسیت به حروف بزرگ و کوچک با>
- عبارت منظم ".*falls?[ \t-]*thr(ough|u).*" مطابقت دارد.
- *<-Wimplicit-fallthrough=3 با حساسیت به حروف بزرگ و کوچک با یکی از>
- عبارات منظم زیر مطابقت دارد:
- *<"-fallthrough">
- *<"@fallthrough@">
- *<"lint -fallthrough[ \t]*">
- *<"[ \t.!]*(ELSE,? |INTENTIONAL(LY)? )?FALL(S | |-)?THR(OUGH|U)[ \t.!]*(-[^\n\r]*)?">
- *<"[ \t.!]*(Else,? |Intentional(ly)? )?Fall((s | |-)[Tt]|t)hr(ough|u)[ \t.!]*(-[^\n\r]*)?">
- *<"[ \t.!]*([Ee]lse,? |[Ii]ntentional(ly)? )?fall(s | |-)?thr(ough|u)[ \t.!]*(-[^\n\r]*)?">
- *<-Wimplicit-fallthrough=4 با حساسیت به حروف بزرگ و کوچک با یکی از>
- عبارات منظم زیر مطابقت دارد:
- *<"-fallthrough">
- *<"@fallthrough@">
- *<"lint -fallthrough[ \t]*">
- *<"[ \t]*FALLTHR(OUGH|U)[ \t]*">
- *<-Wimplicit-fallthrough=5 هیچ کامنتی را بهعنوان کامنت>
- fallthrough تشخیص نمیدهد، تنها صفتها هشدار را غیرفعال میکنند.
کامنت باید پس از فاصلههای خالی اختیاری و سایر کامنتها، با کلمات کلیدی "case" یا "default"، یا با یک برچسب کاربر که پیش از یک برچسب "case" یا "default" آمده است، دنبال شود.
switch (cond)
{
case 1:
bar (0);
/* FALLTHRU */
default:
...
}
هشدار -Wimplicit-fallthrough=3 توسط -Wextra فعال میشود.
- -Wno-if-not-aligned (تنها C، C++، Objective-C و Objective-C++)
- کنترل میکند که آیا هشدارهای ایجادشده توسط صفت "warn_if_not_aligned" باید صادر شوند یا خیر. این هشدارها بهطور پیشفرض فعال هستند.
- -Wignored-qualifiers (تنها C و C++)
- اگر نوع
بازگشتی یک
تابع دارای
توصیفگر
نوع (type qualifier)
مانند
"const"
باشد،
هشدار
میدهد. در ISO C
چنین
توصیفگر
نوعی
بیاثر
است، زیرا
مقدار
بازگرداندهشده
توسط یک
تابع lvalue نیست.
در C++، این
هشدار فقط
برای
نوعهای
اسکالر یا
"void" صادر
میشود.
استاندارد
ISO C نوعهای
بازگشتی
مقیدشده (qualified)
"void" را در
تعاریف
توابع
ممنوع کرده
است،
بنابراین
چنین
نوعهای
بازگشتی
حتی بدون
این گزینه
نیز همیشه
هشدار
دریافت
میکنند.
این هشدار همچنین توسط -Wextra فعال میشود.
- -Wno-ignored-attributes (تنها C و C++)
- این گزینه هشدارها را هنگام نادیده گرفته شدن یک صفت کنترل میکند. این گزینه با گزینه -Wattributes متفاوت است زیرا هر زمان کامپایلر تصمیم بگیرد یک صفت را کنار بگذارد، هشدار میدهد، نه فقط زمانی که صفت ناشناخته باشد، در جای نادرست استفاده شده باشد، و غیره. این هشدار بهطور پیشفرض فعال است.
- -Wmain
- اگر نوع
"main"
مشکوک باشد
هشدار
میدهد.
"main" باید
تابعی با
پیوند
خارجی (external linkage)
باشد، int
بازگرداند،
و صفر، دو
یا سه
آرگومان از
نوعهای
مناسب
دریافت کند.
این هشدار
بهطور
پیشفرض در
C++ فعال است و
توسط -Wall یا
-Wpedantic نیز
فعال
میشود.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wmisleading-indentation (تنها C و C++)
- زمانی که
تورفتگی کد
ساختار
بلوک را
منعکس
نمیکند،
هشدار
میدهد.
بهطور
مشخص، برای
عبارتهای
"if"،
"else"،
"while" و
"for" که
دارای یک
دستورِ
تحتِ
کنترلِ
بدون
آکولاد
هستند و به
دنبال آن یک
دستور
مهارنشده
با همان
میزان
تورفتگی
آمده باشد،
هشدار صادر
میشود.
در مثال زیر، فراخوانی “bar” به شکلی گمراهکننده طوری تورفته شده است که گویی توسط شرط “if” مهار شده است.
if (some_condition ()) foo (); bar (); /* Gotcha: this is not guarded by the "if". */
در صورت ترکیب تبها و فاصلهها، این هشدار از گزینه -ftabstop= برای تعیین همتراز بودن دستورها استفاده میکند (پیشفرض 8 است).
این هشدار برای کدهایی که دارای منطق پیشپردازنده چندخطی هستند، مانند مثال زیر، صادر نمیشود.
if (flagA) foo (0); #if SOME_CONDITION_THAT_DOES_NOT_HOLD if (flagB) #endif foo (1);این هشدار پس از یک دستورالعمل "#line" صادر نمیشود، زیرا این دستورالعمل معمولاً نشاندهنده کد تولید خودکار است و هیچ فرضی درباره ساختار فایلی که دستورالعمل به آن ارجاع میدهد نمیتوان داشت.
این هشدار توسط -Wall در C و C++ فعال میشود.
- -Wmissing-attributes
- زمانی که در
اعلان یک
تابع، یک یا
چند صفت که
تابع مرتبط
با آن اعلان
شده است
وجود
نداشته
باشد و
نبودِ
آنها ممکن
است بر صحت
یا کارایی
کد
تولیدشده
تأثیر
نامطلوب
بگذارد،
هشدار
میدهد. به
عنوان
مثال، این
هشدار برای
اعلانهای
نامهای
مستعاری (aliases)
صادر
میشود که
از صفتها
برای مشخص
کردن
نیازمندیهای
با محدودیت
کمتر نسبت
به اهداف
خود
استفاده
میکنند.
این وضعیت
معمولاً
نشاندهنده
یک فرصت
بهینهسازی
بالقوه است.
در مقابل،
گزینه -Wattribute-alias=2
هشدارهایی
را که در
صورت
محدودکنندهتر
بودن نام
مستعار
نسبت به هدف
صادر
میشوند
کنترل
میکند،
وضعیتی که
میتواند
به تولید کد
نادرست
منجر شود.
صفتهای
بررسیشده
شامل
"alloc_align"،
"alloc_size"،
"cold"،
"const"،
"hot"،
"leaf"،
"malloc"،
"nonnull"،
"noreturn"،
"nothrow"،
"pure"،
"returns_nonnull" و
"returns_twice"
هستند.
در C++، این هشدار زمانی صادر میشود که یک تخصیص صریح (explicit specialization) از یک الگوی اولیه (primary template) که با صفتهای "alloc_align"، "alloc_size"، "assume_aligned"، "format"، "format_arg"، "malloc" یا "nonnull" اعلان شده، بدون آن صفت اعلان شود. صفتهای "deprecated"، "error" و "warning" این هشدار را فرومینشانند.
میتوانید از صفت "copy" برای اعمال همان مجموعه صفتهای یک اعلان بر روی اعلانی دیگر استفاده کنید، بدون آنکه نیاز به برشمردن صریح صفتها باشد. این صفت را میتوان روی اعلانهای توابع، متغیرها، یا نوعها اعمال کرد.
گزینه -Wmissing-attributes توسط -Wall فعال میشود.
برای مثال، از آنجا که اعلان الگوی تابع اولیه زیر از هر دو صفت "malloc" و "alloc_size" استفاده میکند، اعلان تخصیص صریح این الگو به دلیل نداشتن یکی از صفتها تشخیص داده شده و هشدار دریافت میکند. template <class T> T* __attribute__ ((malloc, alloc_size (1))) allocate (size_t); template <> void* __attribute__ ((malloc)) // missing alloc_size allocate<void> (size_t);
- -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++، Objective-C، Objective-C++ و Fortran)
- اگر یک دایرکتوری include که توسط کاربر مشخص شده است وجود نداشته باشد، هشدار میدهد. این گزینه به طور پیشفرض برای C، C++، Objective-C و Objective-C++ غیرفعال است. برای Fortran، این گزینه به طور پیشفرض تا حدی فعال بوده و فقط برای -I و -J هشدار میدهد.
- -Wno-missing-profile
- این گزینه هشدارهای مربوط به نبود پروفایلهای بازخورد را هنگام استفاده از گزینهٔ -fprofile-use کنترل میکند. این گزینه مواردی را شناسایی میکند که در آن یک تابع جدید یا یک فایل جدید در فاصلهٔ بین کامپایل با -fprofile-generate و -fprofile-use، بدون تولید مجدد پروفایلها، اضافه شده باشد. در این موارد، فایلهای دادهٔ بازخورد پروفایل به ترتیب هیچ اطلاعات بازخوردی برای تابع یا فایل تازه افزوده شده ندارند. همچنین، در حالتی که فایلهای دادههای شمارش پروفایل (.gcda) حذف شده باشند، GCC نمیتواند از هیچ اطلاعات بازخورد پروفایلی استفاده کند. در تمام این موارد، هشدارهایی صادر میشود تا اطلاع دهد که مرحلهٔ تولید پروفایل باید انجام شود. نادیده گرفتن این هشدار میتواند منجر به کدی با بهینهسازی ضعیف شود. میتوان از -Wno-missing-profile برای غیرفعال کردن این هشدار استفاده کرد، اما این کار توصیه نمیشود و تنها باید زمانی انجام گیرد که نبود دادههای پروفایل موجه باشد.
- -Wmismatched-dealloc
- برای
فراخوانیهای
توابع
آزادسازی
با
آرگومانهای
اشارهگری
که از توابع
تخصیص
برگردانده
شدهاند در
حالی که
تابع اولی
آزادساز
مناسبی
برای آن
نیست،
هشدار
میدهد. یک
جفت تابع را
میتوان با
استفاده از
صفت "malloc"
به عنوان
تخصیصدهنده
و آزادساز
منطبق با
یکدیگر
پیوند داد.
به جز در
مواردی که
با گزینهٔ
-fno-builtin
غیرفعال
شده باشد،
توابع
استاندارد
"calloc"،
"malloc"،
"realloc" و
"free" و
همچنین
شکلهای
متناظر
"operator new" و
"operator delete" در C++
به طور ضمنی
به عنوان
تخصیصدهنده
و آزادساز
منطبق با
یکدیگر در
نظر گرفته
میشوند. در
مثال زیر،
"mydealloc"
آزادساز
اشارهگرهای
برگشتی از
"myalloc" است.
void mydealloc (void*); __attribute__ ((malloc (mydealloc, 1))) void* myalloc (size_t); void f (void) { void *p = myalloc (32); // ...use p... free (p); // warning: not a matching deallocator for myalloc mydealloc (p); // ok }در C++، گزینهٔ مرتبط -Wmismatched-new-delete ناهمخوانیهای مربوط به "operator new" یا "operator delete" را تشخیص میدهد.
گزینهٔ -Wmismatched-dealloc در -Wall گنجانده شده است.
- -Wmultistatement-macros
- دربارهٔ
ماکروهای
چنددستوریِ
ناامنی
هشدار
میدهد که
به نظر
میرسد
توسط
عبارتی
مانند
"if"،
"else"،
"for"،
"switch" یا
"while"
محافظت
شدهاند،
اما پس از
بسط ماکرو،
در واقع
تنها دستور
اول محافظت
میشود.
برای مثال:
#define DOIT x++; y++ if (c) DOIT;
مقدار "y" را بدون قید و شرط افزایش میدهد، نه فقط در زمانی که شرط "c" برقرار باشد. این مسئله معمولاً با قرار دادن ماکرو درون یک حلقهٔ do-while برطرف میشود:
#define DOIT do { x++; y++; } while (0) if (c) DOIT;این هشدار در C و C++ توسط -Wall فعال میشود.
- -Wparentheses
- هشدار
میدهد اگر
پرانتزها
در
بافتهای
خاصی جا
افتاده
باشند؛
مانند
زمانی که در
محلی که
انتظار
مقدار
درستی (truth value)
میرود یک
انتساب
قرار دارد،
یا وقتی
عملگرهایی
به صورت تو
در تو به
کار
رفتهاند
که اولویت
تقدم آنها
اغلب افراد
را به
اشتباه
میاندازد.
همچنین اگر مقایسهای مانند "x<=y<=z" دیده شود هشدار میدهد؛ این عبارت معادل "(x<=y ? 1 : 0) <= z" است، که تعبیری متفاوت از نشانهگذاری متداول ریاضی دارد.
همچنین در مورد استفادههای خطرناک از افزونهٔ گنو برای "?:" که در آن عملوند میانی حذف شده است، هشدار میدهد. هنگامی که شرط درون عملگر "?:" یک عبارت بولی باشد، مقدار حذفشده همیشه 1 است. در حالی که برنامهنویسان اغلب انتظار دارند مقداری باشد که در داخل عبارت شرطی محاسبه شده است.
برای C++ این گزینه همچنین دربارهٔ برخی موارد پرانتزهای غیرضروری در اعلانها هشدار میدهد، که میتواند نشاندهندهٔ تلاش برای فراخوانی تابع به جای اعلان باشد:
{ // Declares a local variable called mymutex. std::unique_lock<std::mutex> (mymutex); // User meant std::unique_lock<std::mutex> lock (mymutex); }این هشدار توسط -Wall فعال میشود.
- -Wno-self-move (تنها C++ و Objective-C++)
- این هشدار
زمانی
اعلام
میشود که
مقداری با
استفاده از
"std::move" به
خودش منتقل
شود. چنین
"std::move"
کردنی
معمولاً
هیچ اثری
ندارد.
struct T { ... }; void fn() { T t; ... t = std::move (t); }این هشدار توسط -Wall فعال میشود.
- -Wsequence-point
- دربارهٔ
کدهایی که
ممکن است به
دلیل نقض
قواعد نقاط
توالی (sequence point) در
استانداردهای
C و C++ دارای
معانی
تعریفنشده
باشند،
هشدار
میدهد.
استانداردهای C و C++ ترتیب ارزیابی عبارتها را در یک برنامهٔ C/C++ بر اساس نقاط توالی (sequence points) تعریف میکنند، که بیانگر یک ترتیب جزئی بین اجرای بخشهای برنامه است: بخشهایی که پیش از نقطهٔ توالی اجرا میشوند، و بخشهایی که پس از آن اجرا میگردند. این نقاط پس از ارزیابی یک عبارت کامل (عبارتی که بخشی از یک عبارت بزرگتر نیست)، پس از ارزیابی عملوند نخست عملگرهای "&&"، "||"، "? :" یا "," (ویرگول)، پیش از فراخوانی یک تابع (اما پس از ارزیابی آرگومانهای آن و عبارتی که تابع فراخوانیشده را مشخص میکند)، و در برخی جاهای دیگر رخ میدهند. به جز آنچه توسط قواعد نقطهٔ توالی بیان شده است، ترتیب ارزیابی زیرعبارتهای یک عبارت تعیین نشده است. تمام این قواعد تنها یک ترتیب جزئی را توصیف میکنند نه یک ترتیب کلی؛ زیرا برای نمونه، اگر دو تابع درون یک عبارت بدون وجود نقطهٔ توالی در میان آنها فراخوانی شوند، ترتیبی که توابع در آن فراخوانی میشوند نامشخص است. با این حال، کمیتهٔ استاندارد مقرر کرده است که فراخوانی توابع همپوشانی ندارند.
مشخص نشده است که در فاصلهٔ بین نقاط توالی، اعمال تغییرات بر مقادیر اشیاء دقیقاً چه زمانی اثرگذار میشوند. برنامههایی که رفتارشان به این موضوع وابسته است، دارای رفتار تعریفنشده (undefined behavior) هستند؛ استانداردهای C و C++ تصریح میکنند که «بین نقطهٔ توالی قبلی و بعدی، مقدار ذخیرهشدهٔ یک شیء با ارزیابی یک عبارت باید حداکثر یک بار تغییر کند. افزون بر این، مقدار قبلی تنها باید به منظور تعیین مقداری که قرار است ذخیره شود خوانده شود.». اگر برنامهای این قوانین را نقض کند، نتایج روی هر پیادهسازی خاص کاملاً غیرقابل پیشبینی خواهد بود.
نمونههایی از کدهایی با رفتار تعریفنشده عبارتند از "a = a++;"، "a[n] = b[n++]" و "a[i++] = i;". برخی موارد پیچیدهتر توسط این گزینه شناسایی نمیشوند و ممکن است گاهی نتایج مثبت کاذب (false positive) ایجاد کند، اما در کل در شناسایی این گونه اشکالات در برنامهها نسبتاً کارآمد ارزیابی شده است.
استاندارد C++17 ترتیب ارزیابی عملوندها را در موارد بیشتری مشخص میکند: به ویژه ایجاب میکند که سمت راست یک انتساب پیش از سمت چپ آن ارزیابی شود، بنابراین مثالهای بالا دیگر تعریفنشده به حساب نمیآیند. با این حال این گزینه همچنان دربارهٔ آنها هشدار میدهد تا به افراد کمک کند از نوشتن کدهایی که در C و بازنگریهای پیشین C++ تعریفنشده هستند خودداری نمایند.
متن استاندارد به شکلی گیجکننده نگاشته شده است، بنابراین دربارهٔ معنای دقیق قواعد نقطهٔ توالی در موارد خاص و ظریف مباحثاتی وجود دارد. پیوندهایی به مباحث مربوط به این موضوع، از جمله تعاریف رسمی پیشنهادی، را میتوان در صفحهٔ خواندنیهای GCC در نشانی https://gcc.gnu.org/readings.html یافت.
این هشدار برای C و C++ توسط -Wall فعال میشود..IP -Wno-return-local-addr 4 در مورد بازگرداندن یک اشارهگر (یا در C++، یک ارجاع) به متغیری که پس از بازگشت تابع از حوزه خارج میشود، هشدار نمیدهد.
- -Wreturn-mismatch
- درباره
دستورات
"return"
بدون عبارت
در توابعی
که مقدار
بازگشتی
آنها غیر
از "void"
است، هشدار
میدهد.
همچنین
درباره
دستور
"return"
همراه با یک
عبارت در
تابعی که
نوع
بازگشتی آن
"void" است
هشدار
میدهد،
مگر اینکه
نوع عبارت
نیز "void"
باشد. به
عنوان یک
افزونه گنو
(GNU extension)، مورد
دوم بدون
هشدار
پذیرفته
میشود مگر
اینکه -Wpedantic
استفاده
شده باشد.
تلاش برای استفاده از مقدار بازگشتی یک تابع غیر-"void" بهجز "main" که اجرای آن با رسیدن به آکولاد پایانی خاتمهدهنده تابع از انتهای آن خارج میشود، رفتاری تعریفنشده (undefined) است.
این هشدار مختص C بوده و بهطور پیشفرض فعال است. در C99 و گویشهای جدیدتر زبان، این مورد به عنوان خطا در نظر گرفته میشود. میتوان آن را با استفاده از -fpermissive (همراه با هشدارهای دیگر)، یا فقط برای این هشدار با -Wno-error=return-mismatch به یک هشدار تنزل داد.
- -Wreturn-type
- هرگاه
تابعی با
نوع
بازگشتی
تعریف شود
که بهطور
پیشفرض
"int" است،
هشدار
میدهد (مگر
اینکه -Wimplicit-int
فعال باشد
که اولویت
دارد).
همچنین اگر
اجرای
برنامه
ممکن است به
انتهای
بدنه تابع
برسد، یا
اگر تابع
اصلاً حاوی
هیچ دستور
"return"
نباشد،
هشدار
میدهد.
تلاش برای استفاده از مقدار بازگشتی یک تابع غیر-"void" بهجز "main" که با رسیدن به آکولاد پایانی خاتمهدهنده تابع از انتهای آن خارج میشود، تعریفنشده است.
برخلاف C، در C++ خارج شدن جریان اجرا از انتهای یک تابع غیر-"void" بهجز "main"، حتی زمانی که از مقدار تابع استفاده نمیشود نیز به رفتار تعریفنشده منجر میشود.
این هشدار در C++ بهطور پیشفرض و در غیر این صورت با -Wall فعال میشود.
- -Wno-shift-count-negative
- هشدارهای مربوط به منفی بودن تعداد شیفت را کنترل میکند. این هشدار بهطور پیشفرض فعال است.
- -Wno-shift-count-overflow
- هشدارهای مربوط به وضعیتی که در آن تعداد شیفت بزرگتر یا مساوی با پهنای بیت نوع داده باشد را کنترل میکند. این هشدار بهطور پیشفرض فعال است.
- -Wshift-negative-value
- در صورت شیفت به چپ یک مقدار منفی، هشدار میدهد. این هشدار با -Wextra در حالتهای C99 (و جدیدتر) و C++11 تا C++17 فعال میشود.
- -Wno-shift-overflow
- -Wshift-overflow=n
- این گزینهها هشدارهای مربوط به سرریزهای شیفت به چپ را کنترل میکنند.
- -Wshift-overflow=1
- این سطح هشدار -Wshift-overflow است و بهطور پیشفرض در حالتهای C99 و C++11 (و جدیدتر) فعال است. این سطح هشدار درباره شیفت به چپ ۱ به درون بیت علامت (sign bit) هشدار نمیدهد. (با این حال، در C، چنین سرریزی در زمینههایی که یک عبارت ثابت صحیح الزامی است همچنان پذیرفته نمیشود.) در حالت C++20 (و جدیدتر) هیچ هشداری صادر نمیشود، زیرا شیفتهای به چپ علامتدار همیشه سرریز چرخشی دارند (wrap).
- -Wshift-overflow=2
- این سطح هشدار همچنین در مورد شیفت به چپ ۱ به درون بیت علامت هشدار میدهد، مگر اینکه حالت C++14 (یا جدیدتر) فعال باشد.
- -Wswitch
- هرگاه یک دستور "switch" شاخصی از یک نوع شمارشی (enumerated type) داشته باشد و فاقد "case" برای یک یا چند کد نامگذاریشده از آن شمارش باشد، هشدار میدهد. (وجود برچسب "default" مانع این هشدار میشود.) برچسبهای "case" که با مقادیر شمارشگر (enumerator) تطابق ندارند نیز در صورت استفاده از این گزینه باعث بروز هشدار میشوند، مگر اینکه نوع شمارشی با صفت "flag_enum" نشانهگذاری شده باشد. این هشدار توسط -Wall فعال میشود.
- -Wswitch-default
- هرگاه یک دستور "switch" فاقد حالت "default" باشد، هشدار میدهد.
- -Wswitch-enum
- هرگاه یک دستور "switch" شاخصی از یک نوع شمارشی داشته باشد و فاقد "case" برای یک یا چند کد نامگذاریشده از آن شمارش باشد، هشدار میدهد. برچسبهای "case" که با مقادیر شمارشگر تطابق ندارند نیز در صورت استفاده از این گزینه باعث بروز هشدار میشوند، مگر اینکه نوع شمارشی با صفت "flag_enum" نشانهگذاری شده باشد. تنها تفاوت بین -Wswitch و این گزینه این است که این گزینه حتی در صورت وجود یک برچسب "default" نیز در مورد کدهای شمارشی از قلم افتاده هشدار میدهد.
- -Wno-switch-bool
- زمانی که یک
دستور
"switch"
دارای
شاخصی از
نوع بولی (boolean)
باشد و
مقادیر case
خارج از
محدوده نوع
بولی
باشند،
هشدار
نمیدهد.
میتوان با
تبدیل نوع (cast)
عبارت
کنترلکننده
به نوعی غیر
از "bool"،
این هشدار
را سرکوب
کرد. برای
مثال:
switch ((int) (a == 4)) { ... }این هشدار بهطور پیشفرض برای برنامههای C و C++ فعال است.
- -Wno-switch-outside-range
- این گزینه هشدارهایی را کنترل میکند که در آن مقدار یک "case" از دستور "switch" خارج از محدوده نوع مربوط به خود قرار دارد. این هشدار بهطور پیشفرض برای برنامههای C و C++ فعال است.
- -Wno-switch-unreachable
- زمانی که یک
دستور
"switch"
شامل
دستوراتی
بین عبارت
کنترلکننده
و اولین
برچسب case
باشد که
هرگز اجرا
نخواهند
شد، هشدار
نمیدهد.
برای مثال:
switch (cond) { i = 15; ... case 5: ... }گزینه -Wswitch-unreachable در صورتی که دستور بین عبارت کنترلکننده و اولین برچسب case صرفاً یک اعلان (declaration) باشد، هشدار نمیدهد:
switch (cond) { int i; ... case 5: i = 5; ... }این هشدار بهطور پیشفرض برای برنامههای C و C++ فعال است.
- -Wsync-nand (فقط C و C++)
- هنگامی که توابع توکار "__sync_fetch_and_nand" و "__sync_nand_and_fetch" به کار روند، هشدار میدهد. معناشناسی این توابع در GCC 4.4 تغییر کرده است.
- -Wtrivial-auto-var-init
- زمانی که "-ftrivial-auto-var-init" نتواند متغیر خودکار را مقداردهی اولیه کند، هشدار میدهد. یک وضعیت متداول، متغیر خودکاری است که بین عبارت کنترلکننده و اولین برچسب case از یک دستور "switch" اعلان شده باشد.
- -Wunused-but-set-parameter
- هرگاه به یک
پارامتر
تابع
مقداری
انتساب
داده شود،
اما در غیر
این صورت
(بهجز در
اعلان آن)
استفاده
نشود،
هشدار
میدهد.
برای سرکوب این هشدار از صفت "unused" استفاده کنید.
این هشدار همچنین با -Wunused همراه با -Wextra فعال میشود.
- -Wunused-but-set-variable
- هرگاه به یک
متغیر محلی
مقداری
انتساب
داده شود،
اما در غیر
این صورت
(بهجز در
اعلان آن)
استفاده
نشود،
هشدار
میدهد. این
هشدار با -Wall
فعال
میشود.
برای سرکوب این هشدار از صفت "unused" استفاده کنید.
این هشدار همچنین با -Wunused که خود با -Wall فعال میشود، فعال میگردد.
- -Wunused-function
- هرگاه یک
تابع static
اعلان شده
اما تعریف
نشود، یا یک
تابع static غیر-inline
استفاده
نشده باقی
بماند،
هشدار
میدهد. این
هشدار با -Wall
فعال
میشود..IP -Wunused-label
4 هرگاه یک
برچسب (label)
تعریف شده
اما
استفاده
نشده باشد،
هشدار
میدهد. این
هشدار توسط
-Wall فعال
میشود.
برای نادیده گرفتن این هشدار از مشخصهٔ "unused" استفاده کنید.
- -Wunused-local-typedefs (فقط در C، Objective-C، C++ و Objective-C++)
- هنگامی که یک typedef بهصورت محلی در یک تابع تعریف شده اما استفاده نشود، هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wunused-parameter
- هرگاه یک
پارامتر
تابع، جدا
از اعلانش
استفاده
نشود،
هشدار
میدهد. این
گزینه توسط
"-Wunused"
فعال
نمیشود
مگر آنکه
"-Wextra" نیز
مشخص شده
باشد.
برای نادیده گرفتن این هشدار از مشخصهٔ "unused" استفاده کنید.
- -Wno-unused-result
- اگر فراخوانندهٔ تابعی که با مشخصهٔ "warn_unused_result" نشانهگذاری شده از مقدار بازگشتی آن استفاده نکند، هشدار ندهد. پیشفرض -Wunused-result است.
- -Wunused-variable
- هرگاه یک
متغیر محلی
یا static جدا از
اعلانش
استفاده
نشود،
هشدار
میدهد. این
گزینه برای
C به معنای
-Wunused-const-variable=1 است،
اما برای C++
خیر. این
هشدار توسط
-Wall فعال
میشود.
برای نادیده گرفتن این هشدار از مشخصهٔ "unused" استفاده کنید.
- -Wunused-const-variable
- -Wunused-const-variable=n
- هرگاه یک
متغیر ثابت
static جدا از
اعلانش
استفاده
نشود،
هشدار
میدهد.
برای نادیده گرفتن این هشدار از مشخصهٔ "unused" استفاده کنید.
- -Wunused-const-variable=1
- دربارهٔ
متغیرهای static
const
استفادهنشدهای
که در واحد
ترجمهٔ
اصلی تعریف
شدهاند
هشدار
میدهد،
اما
دربارهٔ
متغیرهای static
const
اعلانشده
در هر
سرایند (header)
گنجاندهشدهای
هشدار
نمیدهد.
-Wunused-const-variable=1 در C توسط -Wunused-variable یا -Wunused فعال میشود، اما برای C++ خیر. در C این اعلان فضای ذخیرهسازی متغیر را تعریف میکند، اما در C++ این مورد خطا نیست زیرا متغیرهای const جایگزین "#define"ها میشوند.
- -Wunused-const-variable=2
- این سطح از هشدار همچنین دربارهٔ متغیرهای ثابت static استفادهنشده در سرایندها (بهجز سرایندهای سیستمی) هشدار میدهد. این سطح معادل شکل کوتاه -Wunused-const-variable است. این سطح هم در C و هم در C++ باید بهصراحت درخواست شود زیرا پاکسازی تمام سرایندهای گنجاندهشده ممکن است دشوار باشد.
- -Wunused-value
- هرگاه یک
عبارت
نتیجهای
را محاسبه
کند که
صراحتاً
استفاده
نمیشود،
هشدار
میدهد.
برای
نادیده
گرفتن این
هشدار
عبارت
استفادهنشده
را به "void"
تبدیل (cast)
کنید. این
شامل یک
عبارت-دستور
یا سمت چپ
یک عبارت
کاما است که
هیچ اثر
جانبی
ندارد. برای
مثال،
عبارتی
مانند
"x[i,j]"
باعث ایجاد
هشدار
میشود، در
حالی که
"x[(void)i,j]"
هشداری
تولید
نمیکند.
این هشدار توسط -Wall فعال میشود.
- -Wunused
- ترکیب تمام
گزینههای
-Wunused بالا،
بهجز
مواردی که
ذکر شده
باید
بهصورت
صریح تعیین
شوند.
برای دریافت هشدار دربارهٔ پارامتر استفادهنشدهٔ تابع، باید یا -Wextra -Wunused را تعیین کنید (توجه داشته باشید که -Wall دربردارندهٔ -Wunused است)، یا بهصورت جداگانه -Wunused-parameter و/یا -Wunused-but-set-parameter را مشخص کنید.
-Wunused تنها -Wunused-const-variable=1 را فعال میکند و نه -Wunused-const-variable، و آن هم فقط برای C، نه C++.
- -Wuse-after-free (فقط در C، Objective-C، C++ و Objective-C++)
- -Wuse-after-free=n
- دربارهٔ استفاده از اشارهگرها به اشیایی با تخصیص پویا که توسط فراخوانی یک تابع آزادسازی حافظه نامعین شدهاند هشدار میدهد. این هشدار در تمامی سطوح بهینهسازی فعال است اما ممکن است با بهینهسازی نتایج متفاوتی نسبت به حالت بدون بهینهسازی داشته باشد.
- -Wuse-after-free=1
- در سطح ۱ این هشدار تلاش میکند فقط استفادههای غیرمشروط از اشارهگرهای نامعینشده توسط یک فراخوانی آزادسازی یا یک فراخوانی موفق به "realloc" را تشخیص دهد، صرفنظر از اینکه فراخوانی منجر به تخصیص مجدد واقعی حافظه شده باشد یا خیر. این شامل فراخوانیهای double-"free" و همچنین استفاده در عبارات محاسباتی و رابطهای میشود. با وجود تعریفنشده بودن، استفاده از اشارهگرهای نامعین در عبارات برابری (یا نابرابری) در این سطح تشخیص داده نمیشود.
- -Wuse-after-free=2
- در سطح ۲،
علاوه بر
استفادههای
غیرمشروط،
این هشدار
استفادههای
مشروط از
اشارهگرهای
نامعینشده
با
فراخوانی
آزادسازی
را نیز
تشخیص
میدهد.
مشابه سطح
۱، استفاده
در عبارات
برابری (یا
نابرابری)
تشخیص داده
نمیشود.
برای مثال،
دومین
فراخوانی
به "free" در
تابع زیر در
این سطح
تشخیص داده
میشود:
struct A { int refcount; void *data; }; void release (struct A *p) { int refcount = --p->refcount; free (p); if (refcount == 0) free (p->data); // warning: p may be used after free } - -Wuse-after-free=3
- در سطح ۳،
این هشدار
استفاده از
اشارهگرهای
نامعین در
عبارات
برابری را
نیز تشخیص
میدهد.
تمام
استفادهها
از
اشارهگرهای
نامعین
تعریفنشده
هستند اما
آزمونهای
برابری
گاهی پس از
فراخوانیهای
"realloc"
بهمنظور
تلاش برای
تعیین
اینکه آیا
فراخوانی
منجر به
انتقال شیء
به آدرس
متفاوتی
شده ظاهر
میشوند.
این موارد
در یک سطح
جداگانه
تشخیص داده
میشوند تا
به گذار
تدریجی
کدهای
قدیمی به
جایگزینهای
امن کمک
کنند. برای
مثال،
آزمون
برابری در
تابع زیر در
این سطح
تشخیص داده
میشود:
void adjust_pointers (int**, int); void grow (int **p, int n) { int **q = (int**)realloc (p, n *= 2); if (q == p) return; adjust_pointers ((int**)q, n); }برای جلوگیری از هشدار در این سطح، بهجای اشارهگرها، آفستها را درون حافظهٔ تخصیصیافته ذخیره کنید. این رویکرد نیاز به تنظیم اشارهگرهای ذخیرهشده پس از تخصیص مجدد را برطرف میکند.
-Wuse-after-free=2 در -Wall گنجانده شده است.
- -Wuseless-cast (فقط در C، Objective-C، C++ و Objective-C++)
- هنگامی که
یک عبارت به
نوع خودش
تبدیل (cast)
شود، هشدار
میدهد. این
هشدار
زمانی که یک
شیء کلاس به
یک نوع
غیرمرجع
تبدیل شود
رخ
نمیدهد،
زیرا آن
روشی برای
ایجاد یک
متغیر موقت
است:
struct S { }; void g (S&&); void f (S&& arg) { g (S(arg)); // make arg prvalue so that it can bind to S&& } - -Wuninitialized
- اگر شیئی با
مدت زمان
ماندگاری
خودکار یا
تخصیصیافته
بدون اینکه
مقداردهی
اولیه شده
باشد
استفاده
شود، هشدار
میدهد. در
C++، همچنین
اگر یک مرجع
غیر-static یا یک
عضو "const"
غیر-static در
کلاسی بدون
سازنده
وجود داشته
باشد هشدار
میدهد.
علاوه بر این، ارسال یک اشارهگر (یا در C++ یک مرجع) به شیء مقداردهینشده به یک آرگومان با مشخصهٔ "const" از یک تابع داخلی (built-in) که مشخص است شیء را میخواند نیز توسط این هشدار تشخیص داده میشود. (برای توابع معمولی، -Wmaybe-uninitialized صادر میشود.)
اگر میخواهید دربارهٔ کدی که از مقدار مقداردهینشدهٔ متغیر در مقداردهی اولیهٔ خودش استفاده میکند هشدار دریافت کنید، از گزینهٔ -Winit-self استفاده کنید.
این هشدارها هم برای تکتک عناصر مقداردهینشدهٔ متغیرهای ساختار (struct)، اجتماع (union) یا آرایهها رخ میدهند و هم برای متغیرهایی که بهطور کامل مقداردهی اولیه نشدهاند. این هشدارها برای متغیرها یا عناصری که بهصورت "volatile" اعلان شدهاند رخ نمیدهند. از آنجا که این هشدارها به بهینهسازی وابستهاند، متغیرها یا عناصر دقیقی که برای آنها هشدار صادر میشود به گزینههای دقیق بهینهسازی و نسخهٔ GCC مورد استفاده بستگی دارند.
توجه داشته باشید که ممکن است برای متغیری که تنها برای محاسبهٔ مقداری استفاده میشود که خود آن مقدار هرگز استفاده نمیشود هشداری داده نشود، زیرا چنین محاسباتی ممکن است پیش از چاپ هشدارها توسط تحلیل جریان داده حذف شوند.
در C++، این گزینه همچنین دربارهٔ استفاده از اشیاء مقداردهینشده در فهرستهای مقداردهی اعضا (member-initializer-lists) هشدار میدهد. برای مثال، GCC دربارهٔ مقداردهینشده بودن "b" در قطعهکد زیر هشدار میدهد: struct A { int a; int b; A() : a(b) { } };
- -Wno-invalid-memory-model
- این گزینه
هشدارهای
مربوط به
فراخوانیهای
__atomic Builtins، __sync Builtins و
توابع
جنریک
اتمیک C11 را
با یک
آرگومان
سازگاری
حافظه که یا
برای آن
عملیات
نامعتبر
است یا خارج
از محدوده
مقادیر نوع
شمارشی
"memory_order"
قرار دارد،
کنترل
میکند.
برای مثال،
از آنجا که
توابع
توکار
"__atomic_store" و
"__atomic_store_n"
فقط برای
ترتیبات
حافظه relaxed، release و
sequentially consistent تعریف
شدهاند،
در کد زیر
خطا تشخیص
داده
میشود:
void store (int *i) { __atomic_store_n (i, 0, memory_order_consume); }گزینه -Winvalid-memory-model بهطور پیشفرض فعال است.
- -Wmaybe-uninitialized
- برای شیئی
با طول عمر
ذخیرهسازی
خودکار (automatic)
یا
تخصیصیافته
(allocated)، اگر
مسیری از
نقطه ورود
تابع به محل
استفاده از
شیء وجود
داشته باشد
که
مقداردهی
اولیه شده
است، اما
مسیرهای
دیگری نیز
وجود داشته
باشند که
شیء در
آنها
مقداردهی
اولیه نشده
باشد، در
صورتی که
کامپایلر
نتواند
اثبات کند
که مسیرهای
مقداردهینشده
در زمان
اجرا اجرا
نمیشوند،
یک هشدار
صادر
میکند.
علاوه بر این، ارسال اشارهگر (یا در ++C یک مرجع/reference) به یک شیء مقداردهینشده به آرگومان تابعی با واجد شرایط "const" نیز توسط این هشدار تشخیص داده میشود. (هشدار -Wuninitialized برای توابع توکاری صادر میشود که مشخص است شیء را میخوانند.) نشانهگذاری تابع با مشخصه "access (none)" نشان میدهد که از آرگومان برای دسترسی به شیء استفاده نمیشود و از صدور هشدار جلوگیری میکند.
این هشدارها تنها در زمان کامپایل بهینهسازیشده امکانپذیر هستند، زیرا در غیر این صورت GCC وضعیت متغیرها را پیگیری نمیکند.
این هشدارها اختیاری در نظر گرفته شدهاند زیرا ممکن است GCC نتواند تشخیص دهد که چه زمانی کد با وجود اینکه به ظاهر دارای خطا است، در واقعیت درست کار میکند. در اینجا نمونهای از چگونگی رخ دادن این حالت آمده است:
{ 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 این موضوع را نمیداند. برای فرونشاندن هشدار، باید یک حالت پیشفرض (default case) با assert(0) یا کدی مشابه قرار دهید.
این گزینه همچنین زمانی هشدار میدهد که ممکن است یک متغیر خودکارِ غیر-volatile بر اثر فراخوانی "longjmp" تغییر کند. کامپایلر فقط فراخوانیهای "setjmp" را میبیند. کامپایلر نمیتواند بداند که "longjmp" در کجا فراخوانی خواهد شد؛ در واقع، یک گرداننده سیگنال میتواند آن را در هر نقطهای از کد فراخوانی کند. در نتیجه، ممکن است هشداری دریافت کنید در حالی که در عمل هیچ مشکلی وجود ندارد، زیرا "longjmp" عملاً در نقطهای که باعث ایجاد مشکل شود فراخوانی نخواهد شد.
اگر تمام توابعی را که استفاده میکنید و هرگز بازنمیگردند به عنوان "noreturn" اعلان کنید، میتوان از برخی هشدارهای کاذب جلوگیری کرد.
این هشدار توسط -Wall یا -Wextra فعال میشود.
- -Wunknown-pragmas
- هنگامی که با یک دستورالعمل "#pragma" مواجه شود که برای GCC قابل فهم نیست، هشدار میدهد. در صورت استفاده از این گزینه خط فرمان، حتی برای عملگرهای pragma ناشناخته در فایلهای سرآیند (header) سیستمی نیز هشدار صادر میشود. اما اگر هشدارها فقط از طریق گزینه خط فرمان -Wall فعال شده باشند، چنین نخواهد بود.
- -Wno-pragmas
- در مورد استفادههای نادرست از pragma، مانند پارامترهای نادرست، نحو نامعتبر یا تداخل بین pragmaها هشدار نمیدهد. همچنین نگاه کنید به -Wunknown-pragmas.
- -Wno-pragma-once-outside-header
- هنگامی که از "#pragma once" در فایلی غیر از فایل سرآیند، مانند یک فایل اصلی (main) استفاده شود، هشدار نمیدهد.
- -Wno-prio-ctor-dtor
- اگر از اولویت بین 0 تا 100 برای constructor یا destructor استفاده شود، هشدار نمیدهد. استفاده از مشخصههای constructor و destructor به شما امکان میدهد تا اولویتی را برای سازنده/ویرانگر تعیین کنید تا ترتیب اجرای آنها قبل از فراخوانی "main" یا پس از بازگشت از آن کنترل شود. مقادیر اولویت باید بزرگتر از 100 باشند، زیرا کامپایلر مقادیر اولویت بین 0--100 را برای پیادهسازی خود رزرو کرده است.
- -Wstrict-aliasing
- این گزینه فقط هنگامی که -fstrict-aliasing فعال باشد کار میکند. این گزینه درباره کدهایی هشدار میدهد که ممکن است قوانین strict aliasing مورد استفاده کامپایلر برای بهینهسازی را نقض کنند. این هشدار تمام موارد را در بر نمیگیرد، اما تلاش میکند خطاهای رایجتر را بیابد. این گزینه در -Wall گنجانده شده است. این گزینه معادل -Wstrict-aliasing=3 است.
- -Wstrict-aliasing=n
- این گزینه
فقط هنگامی
که -fstrict-aliasing فعال
باشد کار
میکند. این
گزینه
درباره
کدهایی
هشدار
میدهد که
ممکن است
قوانین strict aliasing
مورد
استفاده
کامپایلر
برای
بهینهسازی
را نقض
کنند. سطوح
بالاتر
نشاندهنده
دقت بالاتر
(هشدارهای
مثبت کاذب
کمتر)
هستند. سطوح
بالاتر
همچنین به
تلاش
پردازشی
بیشتری
نیاز
دارند،
مشابه روش
عملکرد -O.
گزینه -Wstrict-aliasing
معادل -Wstrict-aliasing=3
است.
سطح ۱: تهاجمیترین، سریع، کمترین دقت. زمانی میتواند مفید باشد که سطوح بالاتر هشدار نمیدهند اما -fstrict-aliasing همچنان کد را دچار اختلال میکند، زیرا موارد منفی کاذب بسیار کمی دارد. با این حال، موارد مثبت کاذب زیادی دارد. برای تمام تبدیلهای اشارهگر بین انواع احتمالاً ناسازگار، حتی اگر هرگز ارجاعزدایی نشوند، هشدار میدهد. تنها در front end اجرا میشود.
سطح ۲: تهاجمی، سریع، دقت متوسط. ممکن است همچنان هشدارهای مثبت کاذب زیادی داشته باشد (البته نه به اندازه سطح ۱)، و موارد منفی کاذب کمی دارد (اما احتمالاً بیشتر از سطح ۱). برخلاف سطح ۱، فقط زمانی هشدار میدهد که یک آدرس گرفته شده باشد. درباره انواع ناقص هشدار میدهد. تنها در front end اجرا میشود.
سطح ۳ (پیشفرض برای -Wstrict-aliasing): باید موارد مثبت کاذب بسیار کم و منفی کاذب اندکی داشته باشد. در صورت فعال بودن بهینهسازی، کمی کندتر از سطوح ۱ یا ۲ است. الگوی رایج تغییر نوع+ارجاعزدایی (pun+dereference) را در front end مدیریت میکند: "*(int*)&some_float". اگر بهینهسازی فعال باشد، در back end نیز اجرا میشود و در آنجا به کمک اطلاعات points-to حساس به جریان داده (flow-sensitive) به موارد چنددستوری رسیدگی میکند. تنها زمانی هشدار میدهد که اشارهگر تبدیلشده ارجاعزدایی شود. درباره انواع ناقص هشدار نمیدهد.
- -Wstrict-overflow
- -Wstrict-overflow=n
- این گزینه
تنها زمانی
فعال است که
سرریز
علامتدار
(signed overflow)
تعریفنشده
باشد. این
گزینه
درباره
مواردی
هشدار
میدهد که
کامپایلر
بر اساس این
فرض که
سرریز
علامتدار
رخ
نمیدهد،
بهینهسازی
انجام
میدهد.
توجه داشته
باشید که
این گزینه
برای تمام
مواردی که
ممکن است در
کد سرریز رخ
دهد هشدار
نمیدهد:
تنها در
مواردی
هشدار
میدهد که
کامپایلر
بهینهسازی
خاصی اعمال
کند.
بنابراین
این هشدار
به سطح
بهینهسازی
بستگی دارد.
بهینهسازیای که فرض میکند سرریز علامتدار رخ نمیدهد، در صورتی که مقادیر متغیرهای درگیر به گونهای باشند که سرریز در عمل هرگز اتفاق نیفتد، کاملاً ایمن است. بنابراین این هشدار میتواند به سادگی یک نتیجه مثبت کاذب بدهد: هشداری درباره کدی که در عمل مشکلی ندارد. برای کمک به تمرکز بر مسائل مهم، چندین سطح هشدار تعریف شده است. هنگام تخمین این که یک حلقه به چند تکرار نیاز دارد، به ویژه هنگام تعیین اینکه آیا یک حلقه اصلاً اجرا خواهد شد یا خیر، هیچ هشداری برای استفاده از سرریز علامتدار تعریفنشده صادر نمیشود.
- -Wstrict-overflow=1
- درباره مواردی هشدار میدهد که هم جای تردید دارند و هم پرهیز از آنها آسان است. برای مثال کامپایلر عبارت "x + 1 > x" را به 1 ساده میکند. این سطح از -Wstrict-overflow توسط -Wall فعال میشود؛ سطوح بالاتر فعال نمیشوند و باید صریحاً درخواست شوند.
- -Wstrict-overflow=2
- همچنین درباره موارد دیگری که در آنها یک مقایسه به یک مقدار ثابت سادهسازی میشود هشدار میدهد. برای مثال: "abs (x) >= 0". این تنها زمانی میتواند ساده شود که سرریز عدد صحیح علامتدار تعریفنشده باشد، زیرا "abs (INT_MIN)" دچار سرریز شده و به "INT_MIN" تبدیل میشود که کمتر از صفر است. گزینه -Wstrict-overflow (بدون تعیین سطح) معادل -Wstrict-overflow=2 است..IP -Wstrict-overflow=3 4 همچنین درباره سایر مواردی که یک مقایسه سادهسازی میشود هشدار میدهد. برای نمونه: "x + 1 > 1" به "x > 0" ساده میشود.
- -Wstrict-overflow=4
- همچنین درباره سایر سادهسازیهایی که توسط موارد بالا پوشش داده نشدهاند هشدار میدهد. برای نمونه: "(x * 10) / 5" به "x * 2" ساده میشود.
- -Wstrict-overflow=5
- همچنین درباره مواردی هشدار میدهد که کامپایلر اندازه یک مقدار ثابت دخیل در یک مقایسه را کاهش میدهد. برای نمونه: "x + 2 > y" به "x + 1 >= y" ساده میشود. این مورد تنها در بالاترین سطح هشدار گزارش میشود زیرا این سادهسازی بر روی مقایسههای بسیاری اعمال میگردد، بنابراین این سطح هشدار شمار بسیار زیادی از موارد مثبت کاذب (false positive) را ایجاد میکند.
- -Wstring-compare
- برای
فراخوانیهایی
از "strcmp" و
"strncmp" که
نتیجه
آنها در
بررسیهای
برابری، به
دلیل
بزرگتر
بودن طول
یکی از
آرگومانها
از اندازه
آرایهای
که آرگومان
دیگر در آن
ذخیره شده
(یا کران در
مورد
"strncmp")،
صفر یا
غیرصفر
تعیین
میشود
هشدار
میدهد.
چنین
فراخوانیهایی
ممکن است
اشتباه
باشند. برای
نمونه،
فراخوانی
"strcmp" در
زیر مشخص و
گزارش
میشود
زیرا نتیجه
آن صرفنظر
از محتویات
آرایه
"a"
لزوماً
غیرصفر است.
extern char a[4]; void f (char *d) { strcpy (d, "string"); ... if (0 == strcmp (a, d)) // cannot be true puts ("a and d are the same"); }گزینه -Wstring-compare توسط -Wextra فعال میشود.
- -Wno-stringop-overflow
- -Wstringop-overflow
- -Wstringop-overflow=type
- برای
کدهایی که
بتوان به
صورت ایستا
تشخیص داد
موجب سرریز
بافر (buffer overflow) یا
سرریز
حافظه (memory overrun)
میشوند،
مانند
فراخوانیهای
"memcpy" و
"strcpy" که
از بافر
مقصد سرریز
میکنند،
هشدار
میدهد.
آرگومان
اختیاری یک
واحد بیشتر
از نوع
«بررسی
اندازه
شیء» (Object Size Checking)
است که برای
تعیین
اندازه
مقصد انجام
میگیرد.
این
آرگومان
تنها برای
توابع
رشتهای که
روی
آرایههای
نویسهای
عمل
میکنند
معنیدار
است؛ توابع
حافظه خام
مانند
"memcpy"
همیشه از
بررسی
اندازه شیء
نوع صفر
استفاده
میکنند.
این گزینه همچنین برای فراخوانیهایی که اندازهای بیشتر از بزرگترین شیء ممکن یا حداکثر "SIZE_MAX / 2" بایت را مشخص میکنند هشدار میدهد.
این گزینه در صورت فعال بودن بهینهسازی بهترین نتایج را ارائه میدهد، اما حتی بدون بهینهسازی نیز میتواند زیرمجموعه کوچکی از سرریزهای ساده بافر را در فراخوانی توابع توکار GCC مانند "__builtin_memcpy" که متناظر با توابع استاندارد هستند تشخیص دهد. در هر حال، این گزینه تنها درباره زیرمجموعهای از سرریزهای بافر هشدار میدهد که توسط توابع توکار بررسی سرریز متناظر تشخیص داده میشوند، مانند "__builtin___memcpy_chk" که در صورت عدم اطمینان از امن بودن دسترسی در زمان کامپایل، میتوانند بررسی زمان اجرا انجام دهند.
برای نمونه، این گزینه برای فراخوانی "strcpy" در زیر یک هشدار صادر میکند، زیرا حداقل ۵ نویسه (رشته "blue" شامل نویسه پایانی NUL) را درون بافری به اندازه ۴ کپی میکند.
enum Color { blue, purple, yellow }; const char* f (enum Color clr) { static char buf [4]; const char *str; switch (clr) { case blue: str = "blue"; break; case purple: str = "purple"; break; case yellow: str = "yellow"; break; } return strcpy (buf, str); // warning here }اثر این گزینه به توابع دستکاری رشته یا حافظه محدود نمیشود. در این مثال، یک هشدار صادر میشود زیرا یک آرایه ۱ عنصری به تابعی ارسال شده که نیازمند آرگومانی با دستکم ۴ عنصر است:
void f (int[static 4]); void g (void) { int *p = (int *) malloc (1 * sizeof(int)); f (p); // warning here }گزینه -Wstringop-overflow=2 به طور پیشفرض فعال است.
- -Wstringop-overflow
- -Wstringop-overflow=1
- گزینه -Wstringop-overflow=1 از بررسی اندازه شیء نوع صفر برای تعیین اندازههای اشیاء مقصد استفاده میکند. در این تنظیم، این گزینه برای نوشتن فراتر از انتهای زیراشیاءِ اشیاء بزرگتر که با اشارهگر به آنها دسترسی پیدا شده هشدار نمیدهد، مگر اینکه اندازه بزرگترین شیء دربرگیرنده معلوم باشد. هنگامی که مقصد ممکن است یکی از چندین شیء باشد، بزرگترین آنها در نظر گرفته میشود. در سیستمهای لینوکس، زمانی که بهینهسازی فعال باشد، این گزینه در این تنظیم برای همان کدهایی هشدار میدهد که ماکروی "_FORTIFY_SOURCE" با مقداری غیرصفر برای آنها هشدار صادر میکند.
- -Wstringop-overflow=2
- گزینه -Wstringop-overflow=2 از بررسی اندازه شیء نوع یک برای تعیین اندازههای اشیاء مقصد استفاده میکند. در این تنظیم، این گزینه در مورد سرریزها هنگام نوشتن در اعضای بزرگترین اشیاء کاملی که اندازه دقیق آنها معلوم است هشدار میدهد. با این حال، برای نوشتنهای بیشازحد در همان اعضای اشیاء نامعلوم که توسط اشارهگر ارجاع داده شدهاند هشدار نمیدهد، زیرا ممکن است به آرایههایی حاوی شمار نامعلومی از عناصر اشاره کنند. این حالت، تنظیم پیشفرض گزینه است.
- -Wstringop-overflow=3
- گزینه -Wstringop-overflow=3 از بررسی اندازه شیء نوع دو برای تعیین اندازههای اشیاء مقصد استفاده میکند. در این تنظیم، این گزینه درباره سرریز از کوچکترین شیء یا عضو دادهای هشدار میدهد. این محدودکنندهترین تنظیم این گزینه است که ممکن است به صدور هشدار برای کدهای امن منجر شود.
- -Wstringop-overflow=4
- گزینه -Wstringop-overflow=4 از بررسی اندازه شیء نوع سه برای تعیین اندازههای اشیاء مقصد استفاده میکند. در این تنظیم، این گزینه درباره سرریز از هر یک از اعضای دادهای هشدار میدهد، و هنگامی که مقصد یکی از چند شیء باشد از اندازه بزرگترین آنها برای تصمیمگیری درباره صدور هشدار استفاده میکند. مشابه -Wstringop-overflow=3، این تنظیم از گزینه ممکن است به صدور هشدار برای کدهای بیخطر بیانجامد.
- -Wno-stringop-overread
- برای
فراخوانی
توابع
دستکاری
رشته مانند
"memchr" یا
"strcpy" که
مشخص شود
فراتر از
انتهای
دنباله
مبدأ
میخوانند،
هشدار
میدهد.
گزینه -Wstringop-overread به طور پیشفرض فعال است.
- -Wno-stringop-truncation
- درباره
فراخوانیهای
توابع مقید
دستکاری
رشته مانند
"strncat"،
"strncpy" و
"stpncpy" که
ممکن است
رشته
کپیشده را
کوتاه (truncate)
کنند یا
مقصد را
بدون تغییر
باقی
بگذارند،
هشدار نده.
در مثال زیر، فراخوانی "strncat" کرانی را مشخص میکند که کمتر از طول رشته مبدأ است. در نتیجه، نسخه کپیشده مبدأ کوتاه خواهد شد و بنابراین این فراخوانی گزارش میشود. برای جلوگیری از این هشدار، از "bufsize - strlen (buf) - 1)" به عنوان کران استفاده کنید.
void append (char *buf, size_t bufsize) { strncat (buf, ".txt", 3); }به عنوان مثالی دیگر، فراخوانی زیر به "strncpy" منجر به کپی شدن تنها نویسههای پیش از NUL پایانی در "d" میشود، بدون اینکه NUL به انتهای آن افزوده گردد. فرض اینکه نتیجه "strncpy" لزوماً یک رشته خاتمهیافته با NUL است یک اشتباه متداول است و از این رو این فراخوانی گزارش میشود. برای جلوگیری از این هشدار زمانی که انتظار نمیرود نتیجه به NUL ختم شود، به جای آن "memcpy" را فراخوانی کنید. void copy (char *d, const char *s) { strncpy (d, s, strlen (s)); }
در مثال زیر، فراخوانی "strncpy" اندازهٔ بافر مقصد را به عنوان کران مشخص میکند. اگر طول رشتهٔ مبدأ برابر یا بزرگتر از این اندازه باشد، نتیجهٔ رونوشت به "NUL" ختم نخواهد شد. از این رو، این فراخوانی نیز شناسایی و گزارش میشود. برای جلوگیری از هشدار، "sizeof buf - 1" را به عنوان کران مشخص کرده و آخرین عنصر بافر را روی "NUL" تنظیم کنید.
void copy (const char *s) { char buf[80]; strncpy (buf, s, sizeof buf); ... }در شرایطی که یک آرایهٔ نویسهای برای ذخیرهٔ دنبالهای از بایتها بدون "NUL" پایانی در نظر گرفته شده باشد، میتوان چنین آرایهای را با صفت "nonstring" نشانهگذاری کرد تا از این هشدار جلوگیری شود. با این حال، چنین آرایههایی آرگومانهای مناسبی برای توابعی که انتظار رشتههای مختوم به "NUL" را دارند نیستند. برای کمک به شناسایی استفادههای نادرست تصادفی از چنین آرایههایی، GCC هشدارهایی صادر میکند مگر اینکه بتواند امن بودن استفاده را اثبات کند.
- -Wstrict-flex-arrays (فقط C و C++)
- دربارهٔ
استفادههای
نادرست از
اعضای
آرایهٔ
انعطافپذیر
(flexible array members) بر اساس
level صفت
"strict_flex_array
(level)"
متصل به
فیلد
آرایهٔ
انتهایی یک
ساختار در
صورت وجود،
و در غیر
این صورت بر
اساس level
گزینهٔ
-fstrict-flex-arrays=level
هشدار
میدهد.
گزینهٔ
"-Wstrict-flex-arrays"
تنها زمانی
مؤثر است که
level بزرگتر
از 0 باشد.
وقتی level=1 باشد، اگر به آرایهٔ انتهایی به عنوان یک عضو آرایهٔ انعطافپذیر ارجاع داده شود، برای ارجاع به آرایهٔ انتهایی ساختاری که ۲ یا چند عنصر دارد هشدار صادر میشود.
وقتی level=2 باشد، علاوه بر level=1، اگر به آرایه به عنوان یک عضو آرایهٔ انعطافپذیر ارجاع داده شود، هشدارهای بیشتری برای ارجاع به آرایهٔ انتهایی تکعنصری یک ساختار صادر میشود.
وقتی level=3 باشد، علاوه بر level=2، اگر به آرایه به عنوان یک عضو آرایهٔ انعطافپذیر ارجاع داده شود، هشدارهای بیشتری برای ارجاع به آرایهٔ انتهایی با طول صفر یک ساختار صادر میشود.
این گزینه زمانی که -ftree-vrp فعال باشد مؤثرتر است (پیشفرض برای -O2 و بالاتر)، اما برخی از هشدارها حتی بدون بهینهسازی نیز ممکن است شناسایی شوند.
- -Wsuggest-attribute=attribute-name
- در مواردی که افزودن یک صفت ممکن است سودمند باشد هشدار میدهد. مقدارهای attribute-name که در حال حاضر پشتیبانی میشوند در زیر فهرست شدهاند.
- -Wsuggest-attribute=pure
- -Wsuggest-attribute=const
- -Wsuggest-attribute=noreturn
- -Wmissing-noreturn
- -Wsuggest-attribute=malloc
- -Wsuggest-attribute=returns_nonnull
- دربارهٔ توابعی که ممکن است نامزد دریافت صفتهای "pure"، "const"، "noreturn"، "malloc" یا "returns_nonnull" باشند هشدار میدهد. کامپایلر تنها برای توابعی که در سایر واحدهای کامپایل قابل مشاهده هستند هشدار میدهد، یا (در مورد "pure" و "const") اگر نتواند اثبات کند که تابع به طور عادی بازمیگردد. یک تابع در صورتی به طور عادی بازمیگردد که حاوی یک حلقهٔ بینهایت نباشد یا به طور غیرعادی با پرتاب استثنا، فراخوانی "abort" یا به دام افتادن (trapping) پایان نیابد. این تحلیل نیازمند گزینهٔ -fipa-pure-const است که به طور پیشفرض در -O و بالاتر فعال است. سطوح بهینهسازی بالاتر دقت تحلیل را افزایش میدهند.
- -Wsuggest-attribute=format
- -Wmissing-format-attribute
- دربارهٔ
اشارهگرهای
تابعی که
ممکن است
نامزد
دریافت
صفتهای
"format"
باشند
هشدار
میدهد.
توجه داشته
باشید که
اینها فقط
نامزدهای
احتمالی
هستند، نه
قطعی. GCC حدس
میزند
اشارهگرهای
تابعی با
صفتهای
"format" که
در انتساب،
مقداردهی
اولیه،
ارسال
پارامتر یا
دستورهای
بازگشت
استفاده
میشوند،
باید صفت
"format"
متناظری در
نوع حاصل
داشته
باشند. به
این معنی که
سمت چپ
انتساب یا
مقداردهی
اولیه، نوع
متغیر
پارامتر،
یا نوع
بازگشتی
تابعِ
دربرگیرنده
به ترتیب
باید یک صفت
"format" نیز
داشته
باشند تا از
هشدار
جلوگیری
شود.
کامپایلر GCC همچنین دربارهٔ تعاریف توابعی که ممکن است نامزد دریافت صفتهای "format" باشند هشدار میدهد. مجدداً، اینها صرفاً نامزدهای احتمالی هستند. GCC حدس میزند که صفتهای "format" ممکن است برای هر تابعی که تابعی مانند "vprintf" یا "vscanf" را فراخوانی میکند مناسب باشد، اما این ممکن است همیشه صادق نباشد و برخی از توابعی که صفتهای "format" برای آنها مناسب است ممکن است شناسایی نشوند.
- -Wsuggest-attribute=cold
- دربارهٔ توابعی که ممکن است نامزد دریافت صفت "cold" باشند هشدار میدهد. این بر اساس تشخیص ایستا است و به طور کلی تنها دربارهٔ توابعی هشدار میدهد که همیشه منجر به فراخوانی یک تابع "cold" دیگر میشوند؛ مانند پوششدهندههای (wrappers) دستور "throw" در ++C یا توابع گزارش خطای مهلک که منجر به "abort" میشوند.
- -Walloc-size
- دربارهٔ فراخوانیهای توابع تخصیص حافظهٔ مزین به صفت "alloc_size" که اندازهای ناکافی برای نوع هدفِ اشارهگری که نتیجه به آن تخصیص مییابد مشخص میکنند، هشدار میدهد؛ از جمله شکلهای توکار (built-in) توابع "aligned_alloc"، "alloca"، "calloc"، "malloc" و "realloc".
- -Walloc-zero
- دربارهٔ فراخوانیهای توابع تخصیص حافظهٔ مزین به صفت "alloc_size" که صفر بایت را مشخص میکنند هشدار میدهد، از جمله شکلهای توکار توابع "aligned_alloc"، "alloca"، "calloc"، "malloc" و "realloc". از آنجا که رفتار این توابع در هنگام فراخوانی با اندازهٔ صفر در پیادهسازیهای مختلف متفاوت است (و در مورد "realloc" منسوخ شده است)، اتکا به آن ممکن است به باگهای نامحسوس در قابلیت حمل منجر شود و باید از آن اجتناب کرد.
- -Wcalloc-transposed-args
- دربارهٔ فراخوانیهای توابع تخصیص مزین به صفت "alloc_size" با دو آرگومان هشدار میدهد که از عملگر "sizeof" به عنوان آرگومان اندازهٔ اول استفاده کرده و از آن برای آرگومان اندازهٔ دوم استفاده نمیکنند. این یک هشدار مربوط به سبک کدنویسی است. طبق مستندات، آرگومان اول "calloc" تعداد عناصر در آرایه است، در حالی که آرگومان دوم اندازهٔ هر عنصر میباشد؛ بنابراین "calloc (n, sizeof (int))" بر "calloc (sizeof (int), n)" ترجیح داده میشود. اگر وجود "sizeof" در آرگومان اول و عدم وجود آن در دومی عمدی باشد، میتوان با استفاده از "calloc (sizeof (struct S) + 0, n)" یا "calloc (1 * sizeof (struct S), 4)" یا استفاده از "sizeof" در آرگومان دوم نیز هشدار را برطرف کرد.
- -Walloc-size-larger-than=byte-size
- دربارهٔ فراخوانیهای توابع مزین به صفت "alloc_size" که سعی در تخصیص شیءهایی بزرگتر از تعداد بایتهای مشخصشده دارند، یا در مواردی که نتیجهٔ محاسبهٔ اندازه در یک نوع عدد صحیح با دقت نامحدود از مقدار PTRDIFF_MAX در سامانهٔ مقصد فراتر میرود، هشدار میدهد. گزینهٔ -Walloc-size-larger-than=PTRDIFF_MAX به طور پیشفرض فعال است. هشدارهای کنترلشده توسط این گزینه را میتوان با مشخص کردن byte-size برابر با SIZE_MAX یا بیشتر، یا با استفاده از -Wno-alloc-size-larger-than غیرفعال کرد.
- -Wno-alloc-size-larger-than
- هشدارهای -Walloc-size-larger-than= را غیرفعال میکند. این گزینه معادل -Walloc-size-larger-than=SIZE_MAX یا مقادیر بزرگتر است.
- -Walloca
- این گزینه در مورد تمامی استفادهها از "alloca" در کد مبدأ هشدار میدهد.
- -Walloca-larger-than=byte-size
- این گزینه
در مورد
فراخوانیهای
"alloca" با
آرگومان
عدد صحیحی
که مقدار آن
صفر باشد،
یا توسط یک
گزارهٔ
کنترلی که
مقدار آن را
حداکثر به
byte-size محدود
کند مقید
نشده باشد،
هشدار
میدهد.
همچنین
برای
فراخوانیهایی
به "alloca"
که مقدار
کران در
آنها
نامشخص است
هشدار صادر
میکند.
آرگومانهای
با انواع
غیرصحیح
نامقید در
نظر گرفته
میشوند،
حتی اگر به
نظر برسد به
محدودهٔ
مورد
انتظار
محدود
شدهاند.
برای نمونه، یک حالت مقید از "alloca" میتواند چنین باشد:
void func (size_t n) { void *p; if (n <= 1000) p = alloca (n); else p = malloc (n); f (p); }در مثال بالا، ارسال "-Walloca-larger-than=1000" هشداری صادر نخواهد کرد زیرا مشخص است که فراخوانی "alloca" حداکثر ۱۰۰۰ بایت است. با این حال، اگر "-Walloca-larger-than=500" ارسال میشد، کامپایلر یک هشدار صادر میکرد.
از سوی دیگر، استفادههای نامقید مواردی از استفاده از "alloca" بدون هیچ گزارهٔ کنترلی برای محدود کردن آرگومان عدد صحیح آن هستند. برای نمونه: void func () { void *p = alloca (n); f (p); }
اگر "-Walloca-larger-than=500" ارسال شود، کد بالا هشداری ایجاد میکند، اما این بار به دلیل نبود بررسی محدوده (bounds checking).
توجه داشته باشید که حتی کدهایی که بهظاهر درست هستند و از اعداد صحیح علامتدار (signed integers) استفاده میکنند نیز ممکن است باعث ایجاد هشدار شوند:
void func (signed int n) { if (n < 500) { p = alloca (n); f (p); } }در مثال بالا، n میتواند منفی باشد که باعث میشود آرگومانی بزرگتر از حد انتظار بهصورت ضمنی به فراخوانی "alloca" ارسال (cast) شود.
این گزینه همچنین هنگامی که "alloca" در یک حلقه استفاده شود، هشدار میدهد.
گزینهٔ -Walloca-larger-than=PTRDIFF_MAX بهطور پیشفرض فعال است اما معمولاً تنها زمانی مؤثر است که -ftree-vrp فعال باشد (پیشفرض برای -O2 و بالاتر).
همچنین ببینید: -Wvla-larger-than=byte-size.
- -Wno-alloca-larger-than
- هشدارهای -Walloca-larger-than= را غیرفعال میکند. این گزینه معادل -Walloca-larger-than=SIZE_MAX یا بزرگتر است.
- -Warith-conversion
- دربارهٔ
تبدیلهای
ضمنی ناشی
از عملیات
حسابی
هشدار
میدهد،
حتی زمانی
که تبدیل
عملوندها
به همان نوع
نتواند
مقادیر
آنها را
تغییر دهد.
این گزینه
بر
هشدارهای
-Wconversion، -Wfloat-conversion و
-Wsign-conversion تأثیر
میگذارد.
void f (char c, int i) { c = c + i; // warns with B<-Wconversion> c = c + 1; // only warns with B<-Warith-conversion> } - -Warray-bounds
- -Warray-bounds=n
- دربارهٔ
اندیسها
یا
آفستهای
خارج از
محدوده در
آرایهها
هشدار
میدهد. این
هشدار با -Wall
فعال
میشود. این
گزینه
زمانی که
-ftree-vrp فعال
باشد
مؤثرتر است
(پیشفرض
برای -O2 و
بالاتر)،
اما
زیرمجموعهای
از موارد
حتی بدون
بهینهسازی
نیز صادر
میشوند.
بهطور پیشفرض، آرایهٔ انتهایی یک ساختار در صورتی که بر اساس استاندارد C99 به بعد به عنوان عضو آرایهٔ منعطف ([])، افزونهٔ آرایه با طول صفر در GCC ([0])، یا یک آرایهٔ تکعضوی ([1]) اعلان شده باشد، توسط -Warray-bounds یا -Warray-bounds=n به عنوان عضو آرایهٔ منعطف (flexible array member) در نظر گرفته میشود. در نتیجه، دربارهٔ اندیسها یا آفستهای خارج از محدوده در آرایههای با طول صفر یا تکعضوی بهطور پیشفرض هشداری داده نمیشود.
میتوانید گزینهٔ -fstrict-flex-arrays یا -fstrict-flex-arrays=level را اضافه کنید تا نحوهٔ رفتار این گزینه با آرایهٔ انتهایی یک ساختار به عنوان عضو آرایهٔ منعطف کنترل شود:
زمانی که level<=1 باشد، تغییری در رفتار پیشفرض ایجاد نمیشود.
زمانی که level=2 باشد، هشدارهای بیشتری برای اندیسها یا آفستهای خارج از محدوده در آرایههای تکعضوی صادر خواهد شد؛
زمانی که level=3 باشد، علاوه بر level=2، هشدارهای بیشتری برای اندیسها یا آفستهای خارج از محدوده در آرایههای با طول صفر صادر خواهد شد.
- -Warray-bounds=1
- این سطح پیشفرض هشدار برای -Warray-bounds است و با -Wall فعال میشود؛ سطوح بالاتر فعال نمیشوند و باید صراحتاً درخواست شوند.
- -Warray-bounds=2
- این سطح هشدار همچنین دربارهٔ نتایج میانی محاسبات اشارهگر (pointer arithmetic) که ممکن است مقادیر خارج از محدوده تولید کنند، هشدار میدهد. این سطح هشدار ممکن است تعداد بیشتری مثبت کاذب (false positive) ایجاد کند و بهطور پیشفرض غیرفعال است.
- -Wunterminated-string-initialization (تنها در C و Objective-C)
- دربارهٔ
آرایههای
نویسهای
که با یک
رشتهٔ لفظی
(string literal) به عنوان
دنبالههای
نویسهای
بدون
پایاندهنده
مقداردهی
اولیه
شدهاند
هشدار
میدهد،
مگر اینکه
اعلانی که
مقداردهی
میشود
دارای صفت
"nonstring"
باشد. برای
مثال:
char arr[3] = "foo"; /* Warning. */ char arr2[3] __attribute__((nonstring)) = "bar"; /* No warning. */
این هشدار با -Wextra فعال میشود. اگر -Wc++-compat فعال باشد، هشدار نگارش متفاوتی خواهد داشت و حتی در صورتی که اعلان در حال مقداردهی دارای صفت "nonstring" باشد نیز هشدار میدهد، زیرا در C++ چنین مقداردهیهایی یک خطا محسوب میشوند.
- -Warray-compare
- دربارهٔ
مقایسههای
برابری و
رابطهای
بین دو
عملوند از
نوع آرایه
هشدار
میدهد. این
مقایسه در C++20
منسوخ شده
است. برای
مثال:
int arr1[5]; int arr2[5]; bool same = arr1 == arr2;
گزینهٔ -Warray-compare با -Wall فعال میشود.
- -Warray-parameter
- -Warray-parameter=n
- دربارهٔ
اعلانهای
مجدد توابع
حاوی
پارامترهایی
از نوع
آرایه یا
اشارهگر
با انواع یا
اشکال
ناسازگار
هشدار
میدهد، و
تشخیص
دسترسیهای
خارج از
محدوده به
چنین
پارامترهایی
را از طریق
هشدارهایی
مانند -Warray-bounds
ممکن
میسازد.
اگر اولین اعلان تابع از شکل آرایه برای اعلان پارامتر استفاده کند، کران مشخصشده در آرایه به عنوان حداقل تعداد عناصر مورد انتظار در فراخوانیهای تابع و حداکثر تعداد عناصر مورد دسترسی توسط آن در نظر گرفته میشود. عدم ارسال آرگومانهایی با اندازهٔ کافی یا دسترسی به بیش از حداکثر تعداد عناصر ممکن است توسط هشدارهایی مانند -Warray-bounds یا -Wstringop-overflow تشخیص داده شود. در سطح ۱، این هشدار ناسازگاریهای مربوط به پارامترهای آرایهای که با استفاده از شکل "T[static N]" اعلان شدهاند را تشخیص میدهد.
برای مثال، این هشدار برای اعلان دوم "f" به کار میافتد زیرا اعلان نخست با کلمهٔ کلیدی "static" مشخص میکند که آرگومان آرایه باید حداقل چهار عنصر داشته باشد، در حالی که اعلان دوم اجازه میدهد آرایهای با هر اندازهای به "f" ارسال شود.
void f (int[static 4]); void f (int[]); // warning (inconsistent array form) void g (void) { int *p = (int *)malloc (1 * sizeof (int)); f (p); // warning (array too small) ... }در سطح ۲، این هشدار همچنین برای اعلانهای مجددی که شامل هرگونه ناسازگاری دیگر در اَشکال آرگومان آرایه یا اشارهگر نشاندهندهٔ اندازهٔ آرایه باشند صادر میشود. اشارهگرها و آرایههای با کران نامشخص یکسان در نظر گرفته میشوند و هشداری ایجاد نمیکنند.
void g (int*); void g (int[]); // no warning void g (int[8]); // warning (inconsistent array bound)
گزینهٔ -Warray-parameter=2 در -Wall گنجانده شده است. گزینهٔ -Wvla-parameter هشدارهایی را برای ناسازگاریهای مشابه شامل آرگومانهای آرایه با طول متغیر (Variable Length Array) صادر میکند.
شکل کوتاه گزینهٔ -Warray-parameter معادل -Warray-parameter=2 است. شکل منفی -Wno-array-parameter معادل -Warray-parameter=0 است.
- -Wattribute-alias=n
- -Wno-attribute-alias
- دربارهٔ اعلانهایی که از مشخصهٔ "alias" و مشخصههای مشابه استفاده میکنند و هدف آنها با نوع ناممستعار ناسازگار است، هشدار میدهد.
- -Wattribute-alias=1
- سطح هشدار پیشفرض گزینهٔ -Wattribute-alias، ناسازگاریهای بین نوع اعلان ناممستعار و نوع هدف آن را تشخیص میدهد. چنین ناسازگاریهایی معمولاً نشاندهندهٔ باگ هستند.
- -Wattribute-alias=2
- در این سطح،
-Wattribute-alias مواردی
را نیز
تشخیص
میدهد که
مشخصههای
اعلان
ناممستعار
محدودکنندهتر
از
مشخصههای
اعمالشده
بر هدف آن
باشند. این
عدم
تطابقها
میتوانند
بالقوه
منجر به
تولید کد
نادرست
شوند. در
موارد دیگر
ممکن است
بیخطر
بوده و
صرفاً با
افزودن
مشخصهٔ
مفقود به
هدف حل
شوند. برای
مقایسه،
گزینهٔ
-Wmissing-attributes را
ببینید که
در شرایطی
که اعلان
ناممستعار
نسبت به هدف
کمتر
محدودکننده
باشد
(بهجای
محدودکنندهتر
بودن)،
پیامهای
تشخیصی را
کنترل
میکند.
مشخصههای بررسیشده شامل "alloc_align"، "alloc_size"، "cold"، "const"، "hot"، "leaf"، "malloc"، "nonnull"، "noreturn"، "nothrow"، "pure"، "returns_nonnull" و "returns_twice" هستند.
گزینهٔ -Wattribute-alias معادل -Wattribute-alias=1 است. این مقدار پیشفرض است. میتوانید این هشدارها را با -Wno-attribute-alias یا -Wattribute-alias=0 غیرفعال کنید.
- -Wbidi-chars=[none|unpaired|any|ucn]
- دربارهٔ
نویسههای
کنترلی
دوجهتهٔ (bidirectional)
احتمالاً
گمراهکنندهٔ
UTF-8 در
کامنتها،
رشتههای
متنی صریح (string
literals)،
ثابتهای
نویسهای و
شناسهها
هشدار
میدهد.
چنین
نویسههایی
میتوانند
جهت نگارش
چپبهراست
را به
راستبهچپ
(و برعکس)
تغییر
دهند، که
این امر
میتواند
سبب
سردرگمی
میان ترتیب
منطقی و
ترتیب بصری
شود. این
موضوع ممکن
است خطرناک
باشد؛ برای
مثال، ممکن
است به نظر
برسد که
بخشی از کد
کامنت نشده
است، در
حالی که در
واقع کامنت
شده است.
سه سطح هشدار توسط GCC پشتیبانی میشود. حالت پیشفرض -Wbidi-chars=unpaired است که دربارهٔ بافتهای دوجهتهای (bidi) که بهدرستی خاتمه نیافتهاند هشدار میدهد. گزینهٔ -Wbidi-chars=none هشدار را غیرفعال میکند. گزینهٔ -Wbidi-chars=any دربارهٔ هرگونه استفاده از نویسههای کنترلی دوجهته هشدار میدهد.
بهطور پیشفرض، این هشدار دربارهٔ UCNها اخطار نمیدهد. با این حال، میتوان با استفاده از -Wbidi-chars=unpaired,ucn یا -Wbidi-chars=any,ucn چنین بررسی را فعال کرد. استفاده از -Wbidi-chars=ucn معتبر است و در صورتی که پیش از آن -Wbidi-chars=any مشخص نشده باشد، معادل -Wbidi-chars=unpaired,ucn خواهد بود.
- -Wbool-compare
- دربارهٔ
مقایسهٔ یک
عبارت بولی
با یک مقدار
عدد صحیح
متفاوت با
"true"/"false"
هشدار
میدهد.
برای
نمونه،
مقایسهٔ
زیر همواره
نادرست (false)
است:
int n = 5; ... if ((n > 1) == 2) { ... }این هشدار با -Wall فعال میشود.
- -Wbool-operation
- دربارهٔ
عملیات
مشکوک روی
عبارتهایی
از نوع بولی
هشدار
میدهد.
برای
نمونه،
نقیض بیتی (bitwise
negation) یک مقدار
بولی به
احتمال
بسیار قوی
یک باگ در
برنامه است.
برای زبان
C، این
گزینه
همچنین
دربارهٔ
افزایش (increment)
یا کاهش (decrement)
یک مقدار
بولی هشدار
میدهد، که
بهندرت
معنادار
است. (در ++C،
کاهش یک
مقدار بولی
همواره
نامعتبر
است. افزایش
یک مقدار
بولی در C++17
نامعتبر
بوده و در
سایر
نسخهها
منسوخ (deprecated)
است.)
این هشدار با -Wall فعال میشود.
- -Wduplicated-branches
- هنگامی که
یک دستور if-else
دارای
شاخههای
یکسان
باشد،
هشدار
میدهد. این
هشدار
مواردی
مانند زیر
را تشخیص
میدهد:
if (p != NULL) return 0; else return 0;
زمانی که هر دو شاخه تنها شامل یک دستور خالی (null statement) باشند هشدار نمیدهد. این هشدار همچنین برای عملگرهای شرطی نیز هشدار میدهد:
int i = x ? *p : *p;
- -Wduplicated-cond
- دربارهٔ
شرطهای
تکراری در
یک زنجیرهٔ
if-else-if هشدار
میدهد.
برای
نمونه،
برای کد زیر
هشدار صادر
میکند:
if (p->q != NULL) { ... } else if (p->q != NULL) { ... } - -Wframe-address
- هنگامی که توابع درونی __builtin_frame_address یا __builtin_return_address با یک آرگومان بزرگتر از 0 فراخوانی شوند، هشدار میدهد. چنین فراخوانیهایی ممکن است مقادیر نامعین بازگردانند یا باعث فروپاشی (crash) برنامه شوند. این هشدار در -Wall گنجانده شده است.
- -Wno-discarded-qualifiers (تنها در C و Objective-C)
- اگر توصیفکنندههای نوع (type qualifiers) در اشارهگرها نادیده گرفته شوند، هشدار نده. معمولاً کامپایلر زمانی که یک متغیر "const char *" به تابعی ارسال میشود که پارامتر "char *" میپذیرد هشدار میدهد. از این گزینه میتوان برای فرونشاندن چنین هشداری استفاده کرد.
- -Wno-discarded-array-qualifiers (تنها در C و Objective-C)
- اگر توصیفکنندههای نوع در آرایههایی که هدف اشارهگر هستند نادیده گرفته شوند، هشدار نده. معمولاً کامپایلر زمانی که یک متغیر "const int (*)[]" به تابعی ارسال میشود که پارامتر "int (*)[]" میپذیرد هشدار میدهد. از این گزینه میتوان برای فرونشاندن چنین هشداری استفاده کرد.
- -Wno-incompatible-pointer-types (تنها در C و Objective-C)
- زمانی که
تبدیلی بین
اشارهگرهایی
با انواع
ناسازگار
صورت
میگیرد،
هشدار نده.
این هشدار
برای
مواردی است
که توسط -Wno-pointer-sign
پوشش داده
نمیشوند؛
گزینهای
که برای
ارسال
آرگومان یا
انتساب
اشارهگر
با
علامتداری
(signedness) متفاوت
هشدار
میدهد.
بهطور پیشفرض، در C99 و گویشهای بعدی C، کامپایلر GCC با این مسئله مانند یک خطا برخورد میکند. این خطا میتواند با استفاده از -fpermissive (همراه با برخی خطاهای دیگر)، یا منحصراً برای این خطا با -Wno-error=incompatible-pointer-types به یک هشدار تنزل یابد.
این هشدار با گزینهٔ -pedantic-errors به یک خطا ارتقا مییابد.
- -Wno-int-conversion (تنها در C و Objective-C)
- دربارهٔ
تبدیلهای
ناسازگار
عدد صحیح به
اشارهگر و
اشارهگر
به عدد صحیح
هشدار نده.
این هشدار
مربوط به
تبدیلهای
ضمنی (implicit conversions)
است؛ برای
تبدیلهای
صریح (explicit conversions)
میتوان از
هشدارهای
-Wno-int-to-pointer-cast و -Wno-pointer-to-int-cast
استفاده
کرد.
بهطور پیشفرض، در C99 و گویشهای بعدی C، کامپایلر GCC با این مسئله مانند یک خطا برخورد میکند. این خطا میتواند با استفاده از -fpermissive (همراه با برخی خطاهای دیگر)، یا منحصراً برای این خطا با -Wno-error=int-conversion به یک هشدار تنزل یابد.
این هشدار با گزینهٔ -pedantic-errors به یک خطا ارتقا مییابد.
- -Wzero-as-null-pointer-constant
- هنگامی که یک مقدار مستقیم (literal) 0 به عنوان ثابت اشارهگر تهی (null pointer constant) استفاده شود، هشدار میدهد.
- -Wzero-length-bounds
- دربارهٔ
دسترسی به
عناصر
اعضای
آرایهٔ با
طول صفر که
ممکن است با
دیگر اعضای
همان شیء
همپوشانی
داشته
باشند،
هشدار
میدهد.
اعلان
آرایههای
با طول صفر
درونی
توصیه
نمیشود،
زیرا
دسترسی به
آنها
تعریفنشده
(undefined) است.
برای نمونه، دو ذخیرهسازی اول در تابع "bad" شناسایی میشوند زیرا عناصر آرایه با اعضای پس از آن یعنی "b" و "c" همپوشانی دارند. ذخیرهسازی سوم توسط -Warray-bounds شناسایی میشود، زیرا فراتر از مرزهای شیء دربرگیرنده است.
struct X { int a[0]; int b, c; }; struct X x; void bad (void) { x.a[0] = 0; // -Wzero-length-bounds x.a[1] = 1; // -Wzero-length-bounds x.a[2] = 2; // -Warray-bounds }گزینهٔ -Wzero-length-bounds توسط -Warray-bounds فعال میشود.
- -Wno-div-by-zero
- دربارهٔ تقسیم عدد صحیح بر صفر در زمان کامپایل هشدار نده. دربارهٔ تقسیم اعداد ممیز شناور بر صفر هشداری داده نمیشود، زیرا میتواند روشی معتبر برای دستیابی به مقادیر بینهایت و NaN باشد.
- -Wsystem-headers
- پیامهای
هشدار را
برای
ساختارهای
موجود در
فایلهای
سرآیند (header)
سیستم چاپ
میکند.
هشدارهای
ناشی از
سرآیندهای
سیستم
معمولاً با
این فرض که
مشکلات
واقعی را
نشان
نمیدهند و
تنها
خواندن
خروجی
کامپایلر
را دشوارتر
میکنند،
نادیده
گرفته
میشوند.
استفاده از
این گزینهٔ
خط فرمان به
GCC میگوید
هشدارهای
سرآیندهای
سیستم را
طوری صادر
کند که گویی
در کد کاربر
رخ
دادهاند.
با این حال،
توجه داشته
باشید که
استفاده از
-Wall همراه با
این گزینه،
دربارهٔ
پراگماهای
ناشناخته
در
سرآیندهای
سیستم
هشدار
نمیدهد---برای
آن، -Wunknown-pragmas نیز
باید
استفاده
شود..IP -Wtautological-compare 4
در صورتی که
یک مقایسه
با خود
همواره به
درست (true) یا
نادرست (false)
ارزیابی
شود، هشدار
میدهد. این
هشدار
اشتباهات
گوناگونی
را شناسایی
میکند،
مانند:
int i = 1; ... if (i > i) { ... }این هشدار همچنین درباره مقایسههای بیتی که همواره به درست یا نادرست ارزیابی میشوند هشدار میدهد؛ برای نمونه:
if ((a & 16) == 10) { ... }همواره نادرست خواهد بود.
این هشدار توسط -Wall فعال میشود.
- -Wtrailing-whitespace
- -Wtrailing-whitespace=kind
- درباره فاصلههای خالی انتهایی در انتهای خطوط، از جمله درون کامنتها، اما به جز فاصلههای خالی انتهایی در لیترالهای رشتهای خام هشدار میدهد. "-Wtrailing-whitespace" معادل "-Wtrailing-whitespace=blanks" است و تنها درباره نویسههای فاصله (space) و تب افقی (horizontal tab) در انتهای خط هشدار میدهد. "-Wtrailing-whitespace=any" علاوه بر آنها درباره نویسههای انتهایی تغییر صفحه (form feed) یا تب عمودی نیز هشدار میدهد. "-Wno-trailing-whitespace" یا "-Wtrailing-whitespace=none" این هشدار را غیرفعال میکنند، که حالت پیشفرض است. این یک هشدار مربوط به سبک کدنویسی است.
- -Wleading-whitespace=kind
- درباره ایرادهای سبکی در فاصلههای خالی ابتدایی هشدار میدهد، اما نه درباره میزان تورفتگی. برخی پروژهها از سبکهای کدنویسی استفاده میکنند که در آنها تنها از فاصلهها برای تورفتگی استفاده میشود، برخی دیگر تنها از تبها، و برخی دیگر از صفر یا چند تب (برای مضارب "-ftabstop=n") و به دنبال آن صفر یا کمتر از n فاصله استفاده میکنند. روی خطوطی که منحصراً شامل فاصلههای خالی هستند هشداری داده نمیشود (اگرچه ممکن است هشدار "-Wtrailing-whitespace=" صادر شود)، و درون لیترالهای رشتهای خام نیز هشداری صادر نمیشود. همچنین برای فاصلههای خالی ابتدایی درون کامنتهای چندخطی نیز هشدار صادر میشود. "-Wleading-whitespace=spaces" برای پروژههایی که میخواهند تورفتگی را فقط با فاصله انجام دهند، درباره فاصلههای خالی ابتدایی غیر از فاصله هشدار میدهد. "-Wleading-whitespace=tabs" برای پروژههایی که میخواهند تورفتگی را فقط با تبهای افقی انجام دهند، درباره فاصلههای خالی ابتدایی غیر از تبهای افقی هشدار میدهد. "-Wleading-whitespace=blanks" درباره فاصلههای خالی ابتدایی غیر از فاصلهها و تبهای افقی، یا درباره قرار گرفتن تب افقی پس از یک فاصله در ابتدای خط، یا درباره n یا بیشتر فاصله متوالی در ابتدای خط (که n آرگومان "-ftabstop=n" است، بهطور پیشفرض ۸) هشدار میدهد. "-Wleading-whitespace=none" این هشدار را غیرفعال میکند، که حالت پیشفرض است. این یک هشدار مربوط به سبک کدنویسی است.
- -Wtrampolines
- درباره ترامپولینهای (trampolines) تولیدشده برای اشارهگرها به توابع تو در تو هشدار میدهد. ترامپولین قطعه داده یا کد کوچکی است که در زمان اجرا بر روی پشته (stack) ایجاد میشود، هنگامی که نشانی یک تابع تو در تو گرفته شده است، و برای فراخوانی غیرمستقیم تابع تو در تو به کار میرود. برای برخی از مقاصد، این قطعه تنها از داده تشکیل شده است و بنابراین به رفتار ویژهای نیاز ندارد. اما برای بیشتر مقاصد، از کد تشکیل شده و بنابراین لازم است پشته قابل اجرا (executable) باشد تا برنامه بهدرستی کار کند.
- -Wfloat-equal
- اگر مقادیر
ممیز شناور
در
مقایسههای
برابری به
کار روند،
هشدار
میدهد.
ایده پشت این هشدار این است که گاهی اوقات (برای برنامهنویس) راحتتر است که مقادیر ممیز شناور را بهعنوان تقریبهایی از اعداد حقیقی با دقت نامحدود در نظر بگیرد. اگر چنین کاری میکنید، لازم است (از طریق تحلیل کد، یا روشهای دیگر) حداکثر یا حداکثر خطای احتمالی ناشی از محاسبات را محاسبه کرده و هنگام انجام مقایسهها (و هنگام تولید خروجی، که البته مسئله دیگری است) آن را لحاظ کنید. بهویژه، بهجای بررسی برابری، باید بررسی کنید که آیا بازه این دو مقدار همپوشانی دارد یا خیر؛ و این کار با عملگرهای رابطهای انجام میشود، بنابراین مقایسههای برابری احتمالاً نادرست هستند.
- -Wtraditional (تنها C و Objective-C)
- درباره ساختارهای خاصی که در C سنتی (traditional C) و ISO C رفتار متفاوتی دارند هشدار میدهد. همچنین درباره ساختارهای ISO C که هیچ معادلی در C سنتی ندارند، و/یا ساختارهای مسئلهداری که باید از آنها اجتناب شود هشدار میدهد.
- پارامترهای ماکرو که درون لیترالهای رشتهای در بدنه ماکرو ظاهر میشوند. در C سنتی جایگزینی ماکرو درون لیترالهای رشتهای انجام میشود، اما در ISO C اینگونه نیست.
- در C سنتی، برخی دستورات پیشپردازنده وجود نداشتند. پیشپردازندههای سنتی تنها خطی را یک دستور به حساب میآوردند که # در ستون ۱ آن خط قرار داشت. بنابراین -Wtraditional درباره دستوراتی که C سنتی میفهمد اما نادیده میگیرد چون # نویسه اول خط نیست، هشدار میدهد. همچنین پیشنهاد میکند دستوراتی مانند "#pragma" را که برای C سنتی قابل فهم نیستند با تورفتگی پنهان کنید. برخی پیادهسازیهای سنتی "#elif" را تشخیص نمیدهند، بنابراین این گزینه پیشنهاد میکند بهطور کلی از آن اجتناب کنید.
- ماکروی تابعگونهای که بدون آرگومان ظاهر شود.
- عملگر مثبت یکانی (+).
- پسوند ثابت صحیح U، یا پسوندهای ثابت ممیز شناور F یا L. (C سنتی از پسوند L روی ثابتهای صحیح پشتیبانی میکند.) توجه داشته باشید که این پسوندها در ماکروهای تعریفشده در سرآیندهای سیستمی اکثر سیستمهای امروزی ظاهر میشوند، مانند ماکروهای _MIN/_MAX در "<limits.h>". استفاده از این ماکروها در کد کاربر معمولاً ممکن است به هشدارهای کاذب بیانجامد، اما پیشپردازنده یکپارچه GCC زمینه کافی برای جلوگیری از هشدار در این موارد را دارد.
- تابعی که در یک بلوک بهصورت external اعلان شده و سپس پس از پایان آن بلوک استفاده شده است.
- یک عبارت "switch" عملوندی از نوع "long" داشته باشد.
- یک اعلان تابع غیر-"static" پس از یک اعلان "static" بیاید. این ساختار توسط برخی کامپایلرهای C سنتی پذیرفته نمیشود.
- نوع ISO یک ثابت صحیح، پهنا یا علامتدار بودن متفاوتی نسبت به نوع سنتی آن داشته باشد. این هشدار تنها در صورتی صادر میشود که مبنای عدد ده باشد؛ یعنی درباره مقادیر هگزادسیمال یا هشتهشتی که معمولاً نشاندهنده الگوهای بیتی هستند، هشداری داده نمیشود.
- استفاده از الحاق رشته در ISO شناسایی شود.
- مقداردهی اولیه ساختارهای مرکب خودکار (automatic aggregates).
- تداخل شناسهها با برچسبها (labels). C سنتی فاقد فضاینام مجزا برای برچسبها است.
- مقداردهی اولیه اجتماعها (unions). اگر مقداردهی اولیه صفر باشد، هشدار نادیده گرفته میشود. این کار با این فرض انجام میشود که مقداردهی صفر در کد کاربر با شرطهایی مانند "__STDC__" قرار گرفته تا از هشدارهای مفقود بودن مقداردهی اولیه جلوگیری شود و در C سنتی به مقداردهی اولیه پیشفرض به صفر متکی است.
- تبدیلها توسط پیشنمونهها (prototypes) میان مقادیر نقطه ثابت/ممیز شناور و برعکس. نبود این پیشنمونهها هنگام کامپایل با C سنتی مشکلات جدی ایجاد میکند. این زیرمجموعهای از هشدارهای تبدیل ممکن است؛ برای مجموعه کامل از -Wtraditional-conversion استفاده کنید.
- استفاده از تعاریف تابع به سبک ISO C. این هشدار عمداً برای اعلانهای پیشنمونه یا توابع با تعداد متغیر آرگومان (variadic) صادر نمیشود، زیرا این ویژگیهای ISO C هنگام استفاده از ماکروهای سازگاری با C سنتی در libiberty یعنی "PARAMS" و "VPARAMS" در کد شما ظاهر میشوند. همچنین این هشدار برای توابع تو در تو نادیده گرفته میشود زیرا آن ویژگی در حال حاضر یک افزونه GCC است و بنابراین ارتباطی با سازگاری با C سنتی ندارد.
- -Wtraditional-conversion (تنها C و Objective-C)
- اگر یک پیشنمونه باعث تبدیل نوعی شود که با آنچه در نبود پیشنمونه برای همان آرگومان رخ میداد متفاوت باشد، هشدار میدهد. این شامل تبدیلهای نقطه ثابت به ممیز شناور و برعکس، و تبدیلهایی است که پهنا یا علامتدار بودن یک آرگومان نقطه ثابت را تغییر میدهند، مگر زمانی که با ارتقای نوع پیشفرض (default promotion) یکسان باشد.
- -Wdeclaration-after-statement (تنها C و Objective-C)
- هنگامی که
یک اعلان پس
از یک دستور
در یک بلوک
قرار گیرد
هشدار
میدهد. این
ساختار که
از C++ شناخته
شده است، در
ISO C99 معرفی شد و
بهطور
پیشفرض در
GCC مجاز است.
این ساختار
توسط ISO C90
پشتیبانی
نمیشود.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wshadow
- هر زمان که یک متغیر محلی یا اعلان نوع، متغیر دیگر، پارامتر، نوع، عضو کلاس (در C++)، یا متغیر نمونه (در Objective-C) را بپوشاند (shadow کند)، یا هر زمان که یک تابع توکار (built-in) پوشانده شود، هشدار میدهد. توجه داشته باشید که در C++، کامپایلر در صورتی هشدار میدهد که یک متغیر محلی یک typedef صریح را بپوشاند، اما اگر یک struct/class/enum را بپوشاند هشدار نمیدهد. اگر این هشدار فعال باشد، شامل تمام موارد سایهاندازی محلی نیز میشود. این بدان معناست که در صورت استفاده از -Wshadow، گزینههای -Wno-shadow=local و -Wno-shadow=compatible-local نادیده گرفته میشوند. مشابه -Wshadow=global است..IP "-Wno-shadow-ivar (فقط Objective-C)" 4 هرگاه یک متغیر محلی بر روی یک متغیر نمونه (instance variable) در یک متد Objective-C سایه بیندازد (shadow کند)، هشدار ندهد.
- -Wshadow=global
- برای هرگونه سایهاندازی هشدار میدهد. مشابه -Wshadow است.
- -Wshadow=local
- هنگامی که یک متغیر محلی متغیر محلی دیگری یا یک پارامتر را بپوشاند (سایهاندازی کند)، هشدار میدهد.
- -Wshadow=compatible-local
- هنگامی
هشدار
میدهد که
یک متغیر
محلی متغیر
محلی دیگری
یا
پارامتری
را که نوع
آن با نوع
متغیر
سایهانداز
سازگار است
بپوشاند. در
C++، سازگاری
نوع در
اینجا به
این معناست
که نوع
متغیر
سایهانداز
قابل تبدیل
به نوع
متغیر
سایهاندازیشده
باشد. ایجاد
این پرچم
(علاوه بر
-Wshadow=local) بر این
ایده
استوار است
که هرگاه یک
متغیر محلی
متغیر
دیگری از
نوع
ناسازگار
را
بپوشاند،
این کار به
احتمال
زیاد عمدی
بوده و باگ
یا غلط
املایی
نیست،
همانطور
که در مثال
زیر نشان
داده شده
است:
for (SomeIterator i = SomeObj.begin(); i != SomeObj.end(); ++i) { for (int i = 0; i < N; ++i) { ... } ... }از آنجا که دو متغیر "i" در مثال بالا دارای نوعهای ناسازگار هستند، فعال کردنِ تنها -Wshadow=compatible-local هشداری صادر نمیکند. به دلیل ناسازگار بودن نوعهای آنها، اگر برنامهنویس به اشتباه یکی را به جای دیگری به کار ببرد، انتظار میرود بررسی نوع (type checking) متوجه آن شده و یک خطا یا هشدار صادر کند. استفاده از این پرچم به جای -Wshadow=local میتواند احتمالاً تعداد هشدارهای ناشی از سایهاندازیهای عمدی را کاهش دهد. توجه داشته باشید که این به این معنی نیز هست که سایهاندازی روی "const char *i" توسط "char *i" هشداری صادر نمیکند.
این هشدار توسط -Wshadow=local نیز فعال میشود.
- -Wlarger-than=byte-size
- هرگاه شیئی
تعریف شود
که اندازهٔ
آن از byte-size
بیشتر باشد
هشدار
میدهد.
گزینهٔ
-Wlarger-than=PTRDIFF_MAX به
طور
پیشفرض
فعال است.
هشدارهای
کنترلشده
با این
گزینه را
میتوان یا
با تعیین byte-size
به مقدار SIZE_MAX
یا بیشتر، و
یا با -Wno-larger-than
غیرفعال
کرد.
همچنین برای فراخوانی توابع دارای کران مانند "memchr" یا "strnlen" که کرانی بزرگتر از بزرگترین شیء ممکن تعیین میکنند (که به طور پیشفرض PTRDIFF_MAX بایت است)، هشدار میدهد. این هشدارها تنها با -Wno-larger-than قابل غیرفعالسازی هستند.
- -Wno-larger-than
- هشدارهای -Wlarger-than= را غیرفعال میکند. این گزینه معادل -Wlarger-than=SIZE_MAX یا بزرگتر است.
- -Wframe-larger-than=byte-size
- اگر اندازهٔ یک قاب تابع (stack frame) از byte-size فراتر رود، هشدار میدهد. محاسبهٔ انجامشده برای تعیین اندازهٔ قاب پشته تقریبی بوده و محافظهکارانه (دست بالا) نیست. نیازمندیهای واقعی ممکن است تا حدودی بیشتر از byte-size باشد، حتی اگر هشداری دریافت نکنید. علاوه بر این، هر فضایی که از طریق "alloca"، آرایههای با طول متغیر (variable-length arrays) یا ساختارهای مرتبط تخصیص یابد، توسط کامپایلر هنگام تعیین صدور یا عدم صدور هشدار لحاظ نمیشود. گزینهٔ -Wframe-larger-than=PTRDIFF_MAX به طور پیشفرض فعال است. هشدارهای کنترلشده توسط این گزینه را میتوان با مشخص کردن byte-size برابر با SIZE_MAX یا بیشتر، و یا توسط -Wno-frame-larger-than غیرفعال کرد.
- -Wno-frame-larger-than
- هشدارهای -Wframe-larger-than= را غیرفعال میکند. این گزینه معادل -Wframe-larger-than=SIZE_MAX یا بزرگتر است.
- -Wfree-nonheap-object
- هنگام تلاش
برای
آزادسازی
شیئی که در
هیپ (heap) تخصیص
داده نشده
است، یا با
استفاده از
اشارهگری
که از
فراخوانی
پیشین تابع
تخصیص
متناظر
بازگردانده
نشده است،
هشدار
میدهد.
برای
نمونه، از
آنجا که
فراخوانی
"stpcpy"
اشارهگری
به نویسهٔ
پایانی nul
بازمیگرداند
و نه به
ابتدای
شیء،
فراخوانی
"free" در
ادامه به
عنوان
خطا/هشدار
تشخیص داده
میشود.
void f (char *p) { p = stpcpy (p, "abc"); // ... free (p); // warning }گزینهٔ -Wfree-nonheap-object در -Wall گنجانده شده است.
- -Wstack-usage=byte-size
- اگر میزان
مصرف پشته
توسط یک
تابع ممکن
است از byte-size
فراتر رود،
هشدار
میدهد.
محاسبات
انجامشده
برای تعیین
مصرف پشته
محافظهکارانه
(دست بالا)
است. هر
فضایی که از
طریق
"alloca"،
آرایههای
با طول
متغیر یا
ساختارهای
مرتبط
تخصیص
یابد،
هنگام
تعیین صدور
یا عدم صدور
هشدار توسط
کامپایلر
لحاظ
میشود.
پیام خروجی مطابق با خروجی -fstack-usage است.
- اگر مصرف
پشته
کاملاً
ایستا باشد
اما از
مقدار
مشخصشده
فراتر رود:
warning: stack usage is 1120 bytes
- اگر مصرف
پشته (تا
حدی) پویا
ولی دارای
کران باشد:
warning: stack usage might be 1648 bytes
- اگر مصرف
پشته (تا
حدی) پویا و
فاقد کران
باشد:
warning: stack usage might be unbounded
گزینهٔ -Wstack-usage=PTRDIFF_MAX به صورت پیشفرض فعال است. هشدارهای کنترلشده با این گزینه را میتوان یا با تعیین byte-size به میزان SIZE_MAX یا بیشتر، و یا توسط -Wno-stack-usage غیرفعال کرد.
- -Wno-stack-usage
- هشدارهای -Wstack-usage= را غیرفعال میکند. این گزینه معادل -Wstack-usage=SIZE_MAX یا بزرگتر است.
- -Wunsafe-loop-optimizations
- اگر حلقه به دلیل اینکه کامپایلر نمیتواند هیچ فرضی دربارهٔ کران شاخصهای حلقه داشته باشد قابل بهینهسازی نباشد، هشدار میدهد. همراه با -funsafe-loop-optimizations، اگر کامپایلر چنین فرضیاتی را اعمال کند هشدار میدهد.
- -Wno-pedantic-ms-format (فقط مقصدهای MinGW)
- هنگامی که در ترکیب با -Wformat و -pedantic بدون افزونههای GNU استفاده شود، این گزینه هشدارهای مربوط به مشخصکنندههای عرض قالب غیراستاندارد (non-ISO) برای "printf" / "scanf" شامل "I32"، "I64" و "I" را که در مقصدهای Windows استفاده میشوند و به زماناجرای مایکروسافت (MS runtime) وابسته هستند، غیرفعال میکند.
- -Wpointer-arith
- دربارهٔ هر
چیزی که به
«اندازهٔ»
(size of) یک نوع
تابع یا نوع
"void"
وابسته
باشد هشدار
میدهد.
کامپایلر GNU C
برای سهولت
در محاسبات
با
اشارهگرهای
"void *" و
اشارهگرها
به توابع،
اندازهٔ
این نوعها
را ۱ در نظر
میگیرد. در
C++، همچنین
هنگامی که
یک عملیات
حسابی شامل
"NULL" باشد
هشدار
میدهد. این
هشدار توسط
-Wpedantic نیز
فعال
میشود.
این هشدار توسط -pedantic-errors به یک خطا تبدیل میشود.
- -Wno-pointer-compare
- اگر یک
اشارهگر
با یک ثابت
نویسهای
صفر مقایسه
شود، هشدار
ندهد. این
وضعیت
معمولاً به
این معناست
که قصد
برنامهنویس
بازگشایی
اشارهگر
(dereference) بوده است.
برای مثال:
const char *p = foo (); if (p == '\0') return 42;
توجه داشته باشید که کد بالا در C++11 نامعتبر است.
این هشدار به طور پیشفرض فعال است.
- -Wno-tsan
- هشدارهای
مربوط به
قابلیتهای
پشتیبانینشده
در ThreadSanitizer را
غیرفعال
میکند.
ابزار ThreadSanitizer از "std::atomic_thread_fence" پشتیبانی نمیکند و ممکن است موارد مثبت کاذب (false positive) گزارش کند.
- -Wtype-limits
- اگر یک مقایسه به دلیل محدودهٔ محدود نوع داده همیشه درست یا همیشه نادرست باشد هشدار میدهد، اما برای عبارتهای ثابت هشدار صادر نمیکند. برای مثال، اگر یک متغیر بدون علامت (unsigned) با استفاده از "<" یا ">=" با صفر مقایسه شود، هشدار میدهد. این هشدار توسط -Wextra نیز فعال میشود..IP "-Wabsolute-value (فقط C و Objective-C)" 4 هنگامی که تابع استاندارد مناسبتری در دسترس است، برای فراخوانی توابع استانداردی که قدر مطلق یک آرگومان را محاسبه میکنند، هشدار میدهد. برای نمونه، فراخوانی abs(3.14) این هشدار را فعال میکند چرا که تابع مناسبتر برای محاسبهٔ قدر مطلق یک آرگومان با نوع double تابع "fabs" است. این گزینه همچنین زمانی که آرگومانِ ارسالی به چنین تابعی دارای یک نوع بدون علامت (unsigned) باشد، هشدار میدهد. این هشدار را میتوان با یک تبدیل نوع (type cast) صریح برطرف کرد و همچنین توسط -Wextra فعال میشود.
- -Wcomment
- -Wcomments
- هرگاه توالیِ آغاز کامنت /* درون یک کامنت /* ظاهر شود، یا هرگاه یک بکاسلش-خطجدید (backslash-newline) درون یک کامنت // قرار گیرد، هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wtrigraphs
- اگر هرگونه
سهنگارهای
(trigraph) دیده شود
که ممکن است
معنای
برنامه را
تغییر دهد،
هشدار
میدهد.
دربارهٔ
سهنگارههای
درون
کامنتها
هشداری
داده
نمیشود،
مگر مواردی
که تشکیل یک
خطجدید
گریزخورده
(escaped newline) را
بدهند.
این گزینه بهطور ضمنی توسط -Wall فعال میشود. اگر -Wall داده نشود، این گزینه همچنان فعال است مگر اینکه سهنگارهها فعال شده باشند. برای تبدیل سهنگارهها بدون دریافت هشدار، اما همراه با دریافت سایر هشدارهای -Wall، از -trigraphs -Wall -Wno-trigraphs استفاده کنید.
- -Wundef
- اگر یک شناسهٔ تعریفنشده در یک دستورالعمل "#if" ارزیابی شود، هشدار میدهد. چنین شناسههایی با صفر جایگزین میشوند.
- -Wexpansion-to-defined
- هرگاه defined در بسط یک ماکرو دیده شود (از جمله حالتی که ماکرو توسط یک دستورالعمل #if بسط داده میشود)، هشدار میدهد. چنین کاربردی قابلحمل (portable) نیست. این هشدار همچنین توسط -Wpedantic و -Wextra فعال میشود.
- -Wunused-macros
- دربارهٔ
ماکروهای
تعریفشده
در فایل
اصلی که
استفاده
نشدهاند،
هشدار
میدهد. یک
ماکرو
استفادهشده
محسوب
میشود اگر
دستکم
یکبار بسط
داده شده یا
وجود آن
بررسی شده
باشد.
پیشپردازنده
همچنین اگر
ماکرو در
زمان
بازتعریف
یا حذف
تعریف (undefined
شدن)
استفاده
نشده باشد،
هشدار
میدهد.
دربارهٔ ماکروهای توکار (built-in)، ماکروهای تعریفشده در خط فرمان، و ماکروهای تعریفشده در فایلهای include هشداری داده نمیشود.
نکته: اگر یک ماکرو در عمل استفاده شده باشد، اما صرفاً در بلوکهای شرطی نادیدهگرفتهشده به کار رفته باشد، پیشپردازنده آن را به عنوان استفادهنشده گزارش میدهد. برای جلوگیری از این هشدار در چنین حالتی، میتوانید محدودهٔ (scope) تعریف ماکرو را، برای نمونه با انتقال آن به اولین بلوک نادیدهگرفتهشده، بهبود بخشید. همچنین میتوانید با چیزی شبیه به عبارت زیر، یک استفادهٔ ساختگی (dummy) ایجاد کنید:
#if defined the_macro_causing_the_warning #endif
- -Wno-endif-labels
- هرگاه متنی
پس از یک
"#else" یا
یک "#endif"
بیاید،
هشدار نده.
این حالت
گاهی در
برنامههای
قدیمیتر
با کدهایی
به فرم زیر
رخ میدهد:
#if FOO ... #else FOO ... #endif FOO
دومین و سومین "FOO" باید درون کامنت قرار گیرند. این هشدار بهطور پیشفرض فعال است.
- -Wbad-function-cast (فقط C و Objective-C)
- هنگامی که فراخوانی یک تابع به یک نوع ناسازگار تبدیل (cast) شود، هشدار میدهد. برای نمونه، اگر فراخوانی تابعی که یک نوع عدد صحیح را برمیگرداند به یک نوع اشارهگر تبدیل شود، هشدار میدهد.
- -Wc90-c99-compat (فقط C و Objective-C)
- دربارهٔ ویژگیهایی که در ISO C90 وجود ندارند اما در ISO C99 حاضرند، هشدار میدهد. برای نمونه، دربارهٔ استفاده از آرایههای با طول متغیر (variable length arrays)، نوع "long long"، نوع "bool"، لیترالهای مرکب (compound literals)، مقداردهندههای اولیهٔ مشخصشده (designated initializers) و غیره هشدار میدهد. این گزینه مستقل از حالت استانداردها است. هشدارها در عبارتی که پس از "__extension__" میآید غیرفعال میشوند.
- -Wc99-c11-compat (فقط C و Objective-C)
- دربارهٔ ویژگیهایی که در ISO C99 وجود ندارند اما در ISO C11 حاضرند، هشدار میدهد. برای نمونه، دربارهٔ استفاده از ساختارها و اجتماعات (unions) بینام، توصیفکنندهٔ نوع "_Atomic"، مشخصکنندهٔ ردهٔ حافظهٔ "_Thread_local"، مشخصکنندهٔ "_Alignas"، عملگر "Alignof"، کلمهٔ کلیدی "_Generic" و غیره هشدار میدهد. این گزینه مستقل از حالت استانداردها است. هشدارها در عبارتی که پس از "__extension__" میآید غیرفعال میشوند.
- -Wc11-c23-compat (فقط C و Objective-C)
- -Wc11-c2x-compat (فقط C و Objective-C)
- دربارهٔ
ویژگیهایی
که در ISO C11 وجود
ندارند اما
در ISO C23
حاضرند،
هشدار
میدهد.
برای
نمونه،
دربارهٔ
حذف رشته در
"_Static_assert"،
استفاده از
نحو [[]] برای
صفتها (attributes)،
استفاده از
انواع ممیز
شناور
دهدهی و
غیره هشدار
میدهد. این
گزینه
مستقل از
حالت
استانداردها
است.
هشدارها در
عبارتی که
پس از
"__extension__"
میآید
غیرفعال
میشوند.
نام -Wc11-c2x-compat
منسوخ شده
است.
هنگامی که کامپایل در حالت C23 نباشد، این هشدارها توسط -pedantic-errors به خطا (error) ارتقا مییابند.
- -Wc23-c2y-compat (فقط C و Objective-C)
- -Wc23-c2y-compat (فقط C و Objective-C)
- دربارهٔ
ویژگیهایی
که در ISO C23 وجود
ندارند اما
در ISO C2Y
حاضرند،
هشدار
میدهد.
برای
نمونه،
دربارهٔ
انتخاب بر
اساس یک نام
نوع بهجای
یک عبارت در
"_Generic"
هشدار
میدهد. این
گزینه
مستقل از
حالت
استانداردها
است.
هشدارها در
عبارتی که
پس از
"__extension__"
میآید
غیرفعال
میشوند.
هنگامی که کامپایل در حالت C2Y نباشد، این هشدارها توسط -pedantic-errors به خطا ارتقا مییابند.
- -Wc++-compat (فقط C و Objective-C)
- دربارهٔ ساختارهای ISO C که خارج از زیرمجموعهٔ مشترک ISO C و ISO C++ هستند هشدار میدهد؛ مانند درخواست برای تبدیل ضمنی از "void *" به یک اشارهگر به نوع غیر "void".
- -Wc++11-compat (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++ که معنای آنها میان ISO C++ 1998 و ISO C++ 2011 متفاوت است هشدار میدهد؛ مانند شناسههایی در ISO C++ 1998 که در ISO C++ 2011 کلمهٔ کلیدی هستند. این هشدار گزینهٔ -Wnarrowing را روشن کرده و توسط -Wall نیز فعال میشود.
- -Wc++14-compat (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++ که معنای آنها میان ISO C++ 2011 و ISO C++ 2014 متفاوت است هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wc++17-compat (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++ که معنای آنها میان ISO C++ 2014 و ISO C++ 2017 متفاوت است هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wc++20-compat (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++ که معنای آنها میان ISO C++ 2017 و ISO C++ 2020 متفاوت است هشدار میدهد. این هشدار توسط -Wall فعال میشود.
- -Wno-c++11-extensions (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++11 در کدی که با استفاده از یک استاندارد قدیمیتر C++ کامپایل میشود، هشدار نده. حتی بدون این گزینه، برخی از ساختارهای C++11 تنها در صورتی شناسایی خواهند شد که از -Wpedantic استفاده شود.
- -Wno-c++14-extensions (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++14 در کدی که با استفاده از یک استاندارد قدیمیتر C++ کامپایل میشود، هشدار نده. حتی بدون این گزینه، برخی از ساختارهای C++14 تنها در صورتی شناسایی خواهند شد که از -Wpedantic استفاده شود.
- -Wno-c++17-extensions (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++17 در کدی که با استفاده از یک استاندارد قدیمیتر C++ کامپایل میشود، هشدار نده. حتی بدون این گزینه، برخی از ساختارهای C++17 تنها در صورتی شناسایی خواهند شد که از -Wpedantic استفاده شود.
- -Wno-c++20-extensions (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++20 در کدی که با استفاده از یک استاندارد قدیمیتر C++ کامپایل میشود، هشدار نده. حتی بدون این گزینه، برخی از ساختارهای C++20 تنها در صورتی شناسایی خواهند شد که از -Wpedantic استفاده شود.
- -Wno-c++23-extensions (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++23 در کدی که با استفاده از یک استاندارد قدیمیتر C++ کامپایل میشود، هشدار نده. حتی بدون این گزینه، برخی از ساختارهای C++23 تنها در صورتی شناسایی خواهند شد که از -Wpedantic استفاده شود.
- -Wno-c++26-extensions (فقط C++ و Objective-C++)
- دربارهٔ ساختارهای C++26 در کدی که با استفاده از یک استاندارد قدیمیتر C++ کامپایل میشود، هشدار نده. حتی بدون این گزینه، برخی از ساختارهای C++26 تنها در صورتی شناسایی خواهند شد که از -Wpedantic استفاده شود.
- -Wcast-qual
- هرگاه
اشارهگری
طوری تبدیل
نوع (cast) شود که
یک
توصیفکنندهٔ
نوع را از
نوع مقصد
حذف کند،
هشدار
میدهد.
برای
نمونه، اگر
یک "const char *"
به یک "char
*" معمولی
تبدیل شود،
هشدار
میدهد.
همچنین هنگام انجام تبدیلی که یک توصیفکنندهٔ نوع را به شیوهای ناامن معرفی میکند، هشدار میدهد. برای نمونه، تبدیل نوع "char **" به "const char **" مانند این مثال ناامن است: /* p is char ** value. */ const char **q = (const char **) p; /* Assignment of readonly string to const char * is OK. */ *q = "string"; /* Now char** pointer points to read-only memory. */ **p = 'b';
- -Wcast-align
- هرگاه اشارهگری به نحوی تبدیل نوع (cast) شود که تراز (alignment) موردنیاز مقصد افزایش یابد، هشدار میدهد. برای نمونه، اگر در ماشینهایی که اعداد صحیح تنها در مرزهای دو یا چهار بایتی قابل دسترس هستند، یک "char *" به یک "int *" تبدیل نوع شود، هشدار میدهد.
- -Wcast-align=strict
- هرگاه اشارهگری به نحوی تبدیل نوع شود که تراز موردنیاز مقصد افزایش یابد، هشدار میدهد. برای نمونه، صرفنظر از ماشین مقصد، اگر یک "char *" به یک "int *" تبدیل نوع شود، هشدار میدهد.
- -Wcast-function-type
- زمانی که یک اشارهگر تابع به یک اشارهگر تابع ناسازگار تبدیل نوع شود، هشدار میدهد. در تبدیل نوعی که شامل انواع توابعی با فهرست آرگومان متغیر است، تنها انواع آرگومانهای اولیهای که ارائه شدهاند در نظر گرفته میشوند. هر پارامتری از نوع اشارهگر با هر نوع اشارهگر دیگری مطابقت دارد. هرگونه تفاوت بیضرر در انواع صحیح نادیده گرفته میشود، مانند "int" در برابر "long" در مقصدهای ILP32. به همین ترتیب، توصیفکنندههای نوع نادیده گرفته میشوند. نوع تابع "void (*) (void)" خاص است و با همهچیز مطابقت دارد، که میتواند برای فرونشاندن این هشدار استفاده شود. در تبدیل نوع شامل اشارهگر به انواع عضو، هرگاه تبدیل نوع، اشارهگر به نوع عضو را تغییر دهد، این هشدار صادر میشود. این هشدار توسط -Wextra فعال میشود.
- -Wcast-user-defined
- زمانی که
تبدیل نوع
به یک نوع
مرجع (reference type)
شامل یک
تبدیل
تعریفشده
توسط کاربر
که
برنامهنویس
ممکن است
انتظار
فراخوانی
آن را داشته
باشد
نباشد،
هشدار
میدهد.
struct A { operator const int&(); } a; auto r = (int&)a; // warningاین هشدار بهطور پیشفرض فعال است.
- -Wwrite-strings
- هنگام
کامپایل C،
به ثوابت
رشتهای
نوع "const
char[length]"
اختصاص
میدهد تا
کپی کردن
آدرس یکی از
آنها در یک
اشارهگر
غیر-"const"
"char *"
هشداری
ایجاد کند.
این
هشدارها به
شما کمک
میکنند در
زمان
کامپایل
کدهایی را
که ممکن است
تلاش کنند
در یک ثابت
رشتهای
بنویسند
پیدا کنید،
اما تنها در
صورتی که در
استفاده از
"const" در
اعلانها و
پیشنمونهها
بسیار دقیق
بوده باشید.
در غیر این
صورت، این
هشدارها
فقط مزاحمت
ایجاد
میکنند. به
همین دلیل
است که ما -Wall
را وادار به
درخواست
این
هشدارها
نکردهایم.
هنگام کامپایل C++، درباره تبدیل منسوخشده از رشتههای حرفی به "char *" هشدار میدهد. این هشدار بهطور پیشفرض برای برنامههای C++ فعال است.
این هشدار با -pedantic-errors در حالت C++11 یا جدیدتر به یک خطا ارتقا مییابد.
- -Wclobbered
- برای متغیرهایی که ممکن است توسط "longjmp" یا "vfork" تغییر کنند هشدار میدهد. این هشدار نیز توسط -Wextra فعال میشود.
- -Wno-complain-wrong-lang
- بهطور
پیشفرض،
پیشخوانهای
زبان زمانی
که یک گزینه
خط فرمان
معتبر باشد
اما برای آن
پیشخوان
قابل اعمال
نباشد،
اعلام
اشکال
میکنند.
این رفتار
را میتوان
با -Wno-complain-wrong-lang
غیرفعال
کرد، که
بیشتر
زمانی مفید
است که یک
گرداننده
کامپایلر
واحد برای
چندین فایل
منبع
نوشتهشده
به
زبانهای
مختلف
فراخوانی
شود، برای
نمونه:
$ g++ -fno-rtti a.cc b.f90
گرداننده g++ پیشخوان C++ را برای کامپایل a.cc و پیشخوان Fortran را برای کامپایل b.f90 فراخوانی میکند. پیشخوان دومی پیام f951: Warning: command-line option '-fno-rtti' is valid for C++/D/ObjC++ but not for Fortran را تشخیص میدهد، که میتوان آن را با -Wno-complain-wrong-lang غیرفعال کرد.
- -Wcompare-distinct-pointer-types (تنها C و Objective-C)
- اگر اشارهگرهایی از انواع متمایز بدون تبدیل نوع مقایسه شوند، هشدار میدهد. این هشدار بهطور پیشفرض فعال است.
- -Wconversion
- برای
تبدیلهای
ضمنی که
ممکن است
مقداری را
تغییر دهند
هشدار
میدهد. این
شامل تبدیل
بین اعداد
حقیقی و
صحیح،
مانند "abs
(x)" زمانی که
"x" از
نوع "double"
است؛ تبدیل
بین
علامتدار
و
بدونعلامت،
مانند "unsigned
ui = -1"؛ و
تبدیل به
انواع
کوچکتر،
مانند "sqrtf
(M_PI)" میشود.
برای
تبدیلهای
صریح مانند
"abs ((int) x)" و
"ui = (unsigned) -1"،
یا اگر
مقدار در
اثر تبدیل
تغییر نکند
مانند "abs
(2.0)" هشدار
داده
نمیشود.
هشدارهای
مربوط به
تبدیل بین
اعداد صحیح
علامتدار
و
بدونعلامت
را میتوان
با استفاده
از -Wno-sign-conversion
غیرفعال
کرد.
برای C++، همچنین در مورد رفع ابهام بارگذاری اضافی گیجکننده برای تبدیلهای تعریفشده توسط کاربر؛ و تبدیلهایی که هرگز از عملگر تبدیل نوع استفاده نمیکنند: تبدیل به "void"، همان نوع، یک کلاس پایه یا یک مرجع به آنها، هشدار میدهد. هشدارهای مربوط به تبدیل بین اعداد صحیح علامتدار و بدونعلامت بهطور پیشفرض در C++ غیرفعال هستند مگر اینکه -Wsign-conversion بهصراحت فعال شده باشد.
هشدارهای مربوط به تبدیل از محاسبات روی یک نوع کوچک به همان نوع، تنها با -Warith-conversion ارائه میشوند.
- -Wdangling-else
- درباره
ساختارهایی
که ممکن است
در آنها
ابهام وجود
داشته باشد
که شاخه
"else" به
کدام دستور
"if" تعلق
دارد،
هشدار
میدهد. در
اینجا
نمونهای
از چنین
حالتی
آورده شده
است:
{ if (a) if (b) foo (); else bar (); }در C/C++، هر شاخه "else" به درونیترین دستور ممکن "if" تعلق دارد، که در این مثال "if (b)" است. این اغلب آن چیزی نیست که برنامهنویس انتظار داشته است، همانطور که در مثال بالا با تورفتگی انتخابی برنامهنویس نشان داده شده است. هنگامی که پتانسیل چنین سردرگمی وجود داشته باشد، با مشخص شدن این گزینه، GCC یک هشدار صادر میکند. برای رفع هشدار، آکولادهای صریح در اطراف درونیترین دستور "if" اضافه کنید تا هیچ راهی وجود نداشته باشد که "else" بتواند به "if" دربرگیرنده تعلق یابد. کد حاصل به این شکل خواهد بود:
{ if (a) { if (b) foo (); else bar (); } }این هشدار توسط -Wparentheses فعال میشود.
- -Wdangling-pointer
- -Wdangling-pointer=n
- درباره استفاده از اشارهگرها (یا مراجع C++) به اشیایی با طول عمر ذخیرهسازی خودکار پس از پایان یافتن طول عمرشان هشدار میدهد. این شامل متغیرهای محلی اعلانشده در بلوکهای تودرتو، لیترالهای مرکب و سایر اشیاء موقت بدوننام میشود. علاوه بر این، درباره ذخیره آدرس چنین اشیایی در اشارهگرهای دررفته هشدار میدهد. این هشدار در تمام سطوح بهینهسازی فعال است اما ممکن است با بهینهسازی نتایج متفاوتی نسبت به حالت بدون بهینهسازی در پی داشته باشد.
- -Wdangling-pointer=1
- در سطح ۱، این هشدار تنها استفادههای بدون شرط از اشارهگرهای معلق را تشخیص میدهد.
- -Wdangling-pointer=2
- در سطح ۲، علاوه بر استفادههای بدون شرط، این هشدار استفادههای شرطی از اشارهگرهای معلق را نیز تشخیص میدهد.
فرم کوتاه -Wdangling-pointer معادل -Wdangling-pointer=2 است، در حالی که -Wno-dangling-pointer و -Wdangling-pointer=0 اثر یکسانی در غیرفعال کردن هشدارها دارند. -Wdangling-pointer=2 در -Wall گنجانده شده است.
این مثال هشدار را در سطح ۱ برمیانگیزد؛ آدرس شیء موقت بدوننام بهطور غیرمشروط در خارج از حوزه آن ارجاع داده شده است.
char f (char c1, char c2, char c3)
{
char *p;
{
p = (char[]) { c1, c2, c3 };
}
// warning: using dangling pointer 'p' to an unnamed temporary
return *p;
}
در تابع
زیر، ذخیره
کردن آدرس
متغیر محلی
"x" در
اشارهگر
دررفته *p
هشدار را در
سطح ۱
برمیانگیزد.
void g (int **p) { int x = 7; // warning: storing the address of local
variable 'x' in '*p' *p = &x; }
در این مثال، آرایه a هنگام استفاده از اشارهگر s خارج از حوزه (scope) قرار دارد. از آنجا که کدی که "s" را تنظیم میکند شرطی است، این هشدار در سطح ۲ فعال میشود.
extern void frob (const char *);
void h (char *s)
{
if (!s)
{
char a[12] = "tmpname";
s = a;
}
// warning: dangling pointer 's' to 'a' may be used
frob (s);
}
- -Wdate-time
- هنگام مواجهه با ماکروهای "__TIME__"، "__DATE__" یا "__TIMESTAMP__" هشدار میدهد، چرا که ممکن است مانع از کامپایلهای بازتولیدپذیرِ بیتبهبیت یکسان شوند.
- -Wempty-body
- اگر یک بدنه خالی در عبارتهای "if"، "else" یا "do while" رخ دهد هشدار میدهد. این هشدار با -Wextra نیز فعال میشود.
- -Wno-endif-labels
- در مورد نشانههای سرگردان پس از "#else" و "#endif" هشدار نمیدهد.
- -Wenum-compare
- درباره مقایسه بین مقادیرِ انواع شمارشی مختلف هشدار میدهد. در C++، عدم تطابق نوع شمارشی در عبارتهای شرطی نیز تشخیص داده میشود و این هشدار به طور پیشفرض فعال است. در C این هشدار با -Wall فعال میشود.
- -Wenum-conversion
- هنگامی که مقداری از یک نوع شمارشی به طور ضمنی به نوع شمارشی دیگری تبدیل شود، هشدار میدهد. این هشدار در C با -Wextra فعال میشود.
- -Wenum-int-mismatch (تنها C و Objective-C)
- درباره عدم
تطابق بین
نوع شمارشی
و نوع عدد
صحیح در
اعلانها
هشدار
میدهد.
برای نمونه:
enum E { l = -1, z = 0, g = 1 }; int foo(void); enum E foo(void);در C، یک نوع شمارشی با "char"، یک نوع عدد صحیح علامتدار، یا یک نوع عدد صحیح بدون علامت سازگار است. با این حال، از آنجا که انتخاب نوع زیربنایی یک نوع شمارشی وابسته به پیادهسازی (implementation-defined) است، چنین عدم تطابقهایی ممکن است موجب بروز مشکلات سازگاری و انتقالپذیری شوند. در C++، چنین عدم تطابقهایی یک خطا محسوب میشوند. در C، این هشدار با -Wall و -Wc++-compat فعال میشود.
- -Wjump-misses-init (تنها C و Objective-C)
- اگر یک
عبارت
"goto" یا یک
عبارت
"switch" به
جلو از روی
مقداردهی
اولیه یک
متغیر
بپرد، یا به
عقب به
برچسبی
بپرد که
متغیر پس از
آن
مقداردهی
اولیه شده
است، هشدار
میدهد. این
گزینه تنها
در مورد
متغیرهایی
هشدار
میدهد که
هنگام
اعلان
مقداردهی
اولیه
میشوند.
این هشدار
تنها برای C
و Objective-C
پشتیبانی
میشود؛ در
C++ چنین
انشعابی در
هر صورت یک
خطا است.
گزینه -Wjump-misses-init در -Wc++-compat گنجانده شده است. این هشدار را میتوان با گزینه -Wno-jump-misses-init غیرفعال کرد.
- -Wsign-compare
- هنگامی که مقایسه میان مقادیر علامتدار و بدون علامت بتواند نتیجه نادرستی به هنگام تبدیل مقدار علامتدار به بدون علامت ایجاد کند، هشدار میدهد. در C++، این هشدار با -Wall نیز فعال میشود. در C، با -Wextra نیز فعال است.
- -Wsign-conversion
- درباره تبدیلهای ضمنی که ممکن است علامت یک مقدار عدد صحیح را تغییر دهند، مانند انتساب یک عبارت عدد صحیح علامتدار به یک متغیر عدد صحیح بدون علامت، هشدار میدهد. یک تبدیل نوع صریح (explicit cast) این هشدار را بیاثر میکند. در C، این گزینه همچنین با -Wconversion فعال میشود.
- -Wflex-array-member-not-at-end (تنها C و C++)
- زمانی
هشدار
میدهد که
ساختاری
حاوی یک عضو
آرایه
انعطافپذیر
C99 به عنوان
آخرین
فیلد، در
انتهای یک
ساختار
دیگر قرار
نگرفته
باشد. این
هشدار به
عنوان مثال
در چنین
مواردی
هشدار
میدهد:
struct flex { int length; char data[]; }; struct mid_flex { int m; struct flex flex_data; int n; }; - -Wfloat-conversion
- برای تبدیلهای ضمنی که دقت یک مقدار حقیقی (اعشاری) را کاهش میدهند هشدار میدهد. این شامل تبدیل از حقیقی به عدد صحیح و از مقادیر حقیقی با دقت بالاتر به مقادیر حقیقی با دقت پایینتر است. این گزینه همچنین با -Wconversion فعال میشود.
- -Wno-scalar-storage-order
- درباره ساختارهای مشکوک مربوط به ترتیب ذخیرهسازی اسکالر معکوس هشدار نمیدهد.
- -Wsizeof-array-div
- درباره
تقسیم دو
عملگر sizeof
هنگامی که
اولی روی یک
آرایه
اعمال شده و
مقسومعلیه
برابر با
اندازه
عنصر آرایه
نباشد
هشدار
میدهد. در
چنین
حالتی، این
محاسبه
تعداد
عناصر
آرایه را که
احتمالاً
مقصود
کاربر بوده
به دست
نخواهد داد.
این هشدار
به عنوان
مثال در
مورد زیر
هشدار
میدهد:
int fn () { int arr[10]; return sizeof (arr) / sizeof (short); }این هشدار با -Wall فعال میشود.
- -Wsizeof-pointer-div
- برای تقسیمهای مشکوک دو عبارت sizeof که اندازه اشارهگر را بر اندازه عنصر تقسیم میکنند هشدار میدهد؛ روشی که شیوه معمول محاسبه اندازه آرایه است اما با اشارهگرها به درستی کار نخواهد کرد. این هشدار به عنوان مثال درباره "sizeof (ptr) / sizeof (ptr[0])" در صورتی که "ptr" نه یک آرایه، بلکه یک اشارهگر باشد هشدار میدهد. این هشدار با -Wall فعال میشود.
- -Wsizeof-pointer-memaccess
- برای
پارامترهای
طول مشکوک
به برخی
توابع
توکار
رشتهای و
حافظه در
صورتی که
آرگومان از
"sizeof"
استفاده
کند هشدار
میدهد. این
هشدار برای
مثال برای
"memset (ptr, 0, sizeof (ptr));"
در صورتی که
"ptr" یک
آرایه
نبوده بلکه
اشارهگر
باشد فعال
میشود و یک
اصلاح
احتمالی را
پیشنهاد
میدهد، یا
در مورد
"memcpy (&foo, ptr, sizeof
(&foo));". گزینه
-Wsizeof-pointer-memaccess
همچنین
درباره
فراخوانی
توابع
رونوشت
محدود رشته
مانند
"strncat" یا
"strncpy" که
کران را یک
عبارت
"sizeof" از
آرایه مبدا
تعیین
میکنند
هشدار
میدهد.
برای
نمونه، در
تابع زیر
فراخوانی
"strncat"
اندازه
رشته مبدا
را به عنوان
کران مشخص
میکند. این
کار
تقریباً به
طور قطع یک
اشتباه است
و بنابراین
فراخوانی
تشخیص داده
شده و گزارش
میشود.
void make_file (const char *name) { char path[PATH_MAX]; strncpy (path, name, sizeof path - 1); strncat (path, ".text", sizeof ".text"); ... }گزینه -Wsizeof-pointer-memaccess با -Wall فعال میشود.
- -Wno-sizeof-array-argument
- زمانی که عملگر "sizeof" روی پارامتری اعمال شود که در تعریف تابع به عنوان یک آرایه اعلان شده است، هشدار نمیدهد. این هشدار به طور پیشفرض برای برنامههای C و C++ فعال است.
- -Wmemset-elt-size
- برای فراخوانیهای مشکوک به تابع توکار "memset"، در صورتی که آرگومان اول به یک آرایه ارجاع داشته باشد و آرگومان سوم عددی برابر با تعداد عناصر باشد اما با اندازه آرایه در حافظه برابر نباشد، هشدار میدهد. این امر نشان میدهد که کاربر ضرب در اندازه عنصر را فراموش کرده است. این هشدار با -Wall فعال میشود.
- -Wmemset-transposed-args
- برای فراخوانیهای مشکوک به تابع توکار "memset" که در آنها آرگومان دوم صفر نبوده و آرگومان سوم صفر باشد هشدار میدهد. برای مثال، فراخوانی "memset (buf, sizeof buf, 0)" تشخیص داده میشود زیرا در عوض منظور "memset (buf, 0, sizeof buf)" بوده است. این پیغام خطا تنها در صورتی صادر میشود که آرگومان سوم یک مقدار لفظی صفر (literal zero) باشد. در غیر این صورت، اگر عبارتی باشد که به صفر تاشده (folded) باشد، یا تبدیل نوعِ صفر به نوعی دیگر باشد، بسیار کمتر محتمل است که آرگومانها به اشتباه جابهجا شده باشند و هشداری صادر نمیشود. این هشدار با -Wall فعال میشود.
- -Waddress
- درباره
استفادههای
مشکوک از
عبارتهای
آدرس هشدار
میدهد. این
موارد شامل
مقایسه
آدرس یک
تابع یا یک
شیء
اعلانشده
با ثابت
اشارهگر
پوچ (null pointer constant)
است، مانند
آنچه در void f (void); void g
(void) { if (!f) // warning: expression evaluates to false abort (); }
مقایسه یک اشارهگر با یک لیترال رشتهای، مانند
void f (const char *x) { if (x == "abc") // warning: expression evaluates to false puts ("equal"); }و بررسی برابری نتیجه جمع یا تفریق اشارهگر با null، مانند
void f (const int *p, int i) { return p + i == NULL; }چنین استفادههایی معمولاً نشاندهنده خطای برنامهنویس هستند: آدرس اکثر توابع و اشیاء لزوماً برابر با درست (true) ارزیابی میشود (استثنای آن نمادهای ضعیف یا weak symbols هستند)، بنابراین استفاده از آنها در یک عبارت شرطی ممکن است نشاندهنده جا افتادن پرانتز در فراخوانی یک تابع یا جا افتادن ارجاعگشایی در یک عبارت آرایهای باشد. زیرمجموعه این هشدار برای اشارهگرهای شیء را میتوان با تبدیل نوع عملوند اشارهگر به یک نوع عدد صحیح مانند "intptr_t" یا "uintptr_t" سرکوب کرد. مقایسه در برابر لیترالهای رشتهای به رفتار تعریفنشده منجر شده و قابلحمل نیست، و نشان میدهد که احتمالاً هدف فراخوانی "strcmp" بوده است. اگر عبارت مشکوک نتیجه گسترش یک ماکرو باشد، این هشدار سرکوب میشود. هشدار -Waddress توسط -Wall فعال میشود.
- -Wno-address-of-packed-member
- هنگامی که آدرس عضوی با بستهبندی فشرده (packed member) از یک struct یا union گرفته میشود، که معمولاً به مقدار اشارهگر ناتراز (unaligned) میانجامد، هشدار داده نشود. این گزینه بهطور پیشفرض فعال است.
- -Wlogical-op
- درباره
استفادههای
مشکوک از
عملگرهای
منطقی در
عبارات
هشدار
میدهد. این
شامل
استفاده از
عملگرهای
منطقی در
زمینههایی
است که به
احتمال
زیاد
انتظار یک
عملگر بیتی
(bit-wise) میرود.
همچنین
زمانی که
عملوندهای
یک عملگر
منطقی
یکسان
باشند،
هشدار
میدهد:
extern int a; if (a < 0 && a < 0) { ... } - -Wlogical-not-parentheses
- درباره
استفاده از
نقیض منطقی
(logical not) روی
عملوند سمت
چپ یک
مقایسه
هشدار
میدهد. این
گزینه در
صورتی که
عملوند سمت
راست یک
عبارت بولی
در نظر
گرفته شود
هشدار
نمیدهد.
هدف آن
شناسایی
کدهای
مشکوکی
مانند کد
زیر است:
int a; ... if (!a > 1) { ... }میتوان با قرار دادن عملوند سمت چپ (LHS) درون پرانتز، این هشدار را سرکوب کرد:
if ((!a) > 1) { ... }این هشدار توسط -Wall فعال میشود.
- -Waggregate-return
- اگر توابعی که ساختار (structure) یا اجتماع (union) بازمیگردانند تعریف یا فراخوانی شوند، هشدار میدهد. (در زبانهایی که میتوانید یک آرایه را بازگردانید، این کار نیز باعث ایجاد هشدار میشود.)
- -Wno-aggressive-loop-optimizations
- اگر کامپایلر در حلقهای با تعداد تکرار ثابت رفتار تعریفنشدهای شناسایی کند، هشدار ندهد. گزینه -Waggressive-loop-optimizations بهطور پیشفرض فعال است.
- -Wno-attributes
- در صورت
استفاده از
یک "__attribute__"
غیرمنتظره،
مانند
صفتهای
ناشناخته،
صفتهای
تابع
اعمالشده
روی
متغیرها و
غیره،
هشدار ندهد.
این گزینه
مانع از
خطاهای
ناشی از
استفاده
نادرست از
صفتهای
پشتیبانیشده
نمیشود.
هشدارهای مربوط به استفادههای نادرست از صفتهای استاندارد، با -pedantic-errors به خطا ارتقا مییابند.
علاوه بر این، با استفاده از -Wno-attributes=، میتوان هشدارهای مربوط به صفتهای حوزهدارِ ناشناخته (scoped attributes) را (در C++11 و C23) سرکوب کرد. برای نمونه، -Wno-attributes=vendor::attr هشدار درباره اعلان زیر را غیرفعال میکند:
[[vendor::attr]] void f();
همچنین میتوان با استفاده از -Wno-attributes=vendor:: هشدار مربوط به تمامی صفتها در یک فضای نام را غیرفعال کرد که مانع هشدار برای هر دوی این اعلانها میشود:
[[vendor::safe]] void f(); [[vendor::unsafe]] void f2();
توجه داشته باشید که -Wno-attributes= به معنای فعال شدن -Wno-attributes نیست.
- -Wno-builtin-declaration-mismatch
- اگر یک تابع
توکار (built-in) با
یک امضای
ناسازگار
یا به عنوان
چیزی غیر از
تابع اعلان
شود، یا
زمانی که یک
تابع
توکارِ
اعلانشده
با نوعی
فاقد
پیشنمونه
(prototype)، با
آرگومانهایی
فراخوانی
شود که نوع
ارتقایافتهٔ
آنها با
موارد مورد
انتظار
تابع
همخوانی
ندارد،
هشدار دهد.
هنگامی که
-Wextra مشخص
شود، اگر یک
تابع توکار
که آرگومان
میپذیرد
بدون
پیشنمونه
اعلان شود
نیز هشدار
داده
میشود.
هشدار
-Wbuiltin-declaration-mismatch
بهطور
پیشفرض
فعال است.
برای
جلوگیری از
این هشدار،
سرآیند
مناسب را
درج کنید تا
پیشنمونههای
توابع
توکار وارد
حوزه (scope) شوند.
برای نمونه، فراخوانی "memset" در زیر توسط این هشدار شناسایی میشود زیرا این تابع مقداری از نوع "size_t" را به عنوان آرگومان خود انتظار دارد اما نوع 32 برابر "int" است. با -Wextra، اعلان تابع نیز مشمول این هشدار میشود.
extern void* memset (); void f (void *d) { memset (d, '\0', 32); } - -Wno-builtin-macro-redefined
- در صورت بازتعریف برخی از ماکروهای توکار (built-in)، هشدار ندهد. این گزینه هشدارها را برای بازتعریف "__TIMESTAMP__"، "__TIME__"، "__DATE__"، "__FILE__" و "__BASE_FILE__" سرکوب میکند.
- -Wfree-labels (تنها در C و Objective-C)
- اگر یک
برچسب (label) به
چیزی غیر از
یک دستور
اعمال شود،
یا در
انتهای یک
دستور مرکب
(compound statement) قرار
گیرد،
هشدار دهد.
چنین
برچسبهایی
در C23 و
گویشهای
بعدی C مجاز
هستند، و در
سایر
گویشها به
عنوان یک
قابلیت
افزوده GCC در
دسترس قرار
دارند.
این هشدار همچنین توسط -Wc11-c23-compat فعال میشود. در صورت کامپایل برای نسخهای از C قبل از C23، با استفاده از -pedantic-errors به یک خطا تبدیل میشود.
- -Wheader-guard
- اگر یک محافظ معتبرِ درج چندگانهٔ سرآیند (multiple inclusion guard) در پیشپردازنده، بلافاصله بعد از دستورالعمل "#ifndef" یا "#if !defined" برای محافظ درج چندگانه، دستورالعمل "#define" داشته باشد که ماکرویی متفاوت از ماکروی محافظ اما با نام مشابه تعریف کند، و ماکروی واقعی محافظ درج چندگانه در دستورالعمل متناظر "#ifndef" در انتهای سرآیند تعریف نشده باشد، و دستورالعمل "#define" یک ماکروی شیءگونه (object-like) با تعریف خالی تعیین کرده باشد، هشدار دهد. در چنین حالتی، اغلب تنها یک غلط املایی در نام محافظ وجود دارد، چه در دستورالعمل "#ifndef" یا "#if !defined" و چه در دستورالعمل متعاقب "#define". این هشدار توسط -Wall فعال میشود.
- -Wstrict-prototypes (تنها در C و Objective-C)
- اگر تابعی بدون مشخص کردن انواع آرگومان اعلان یا تعریف شود، هشدار دهد. (تعریف تابع به سبک قدیمی بدون هشدار مجاز است در صورتی که پیش از آن اعلانی آمده باشد که انواع آرگومانها را مشخص کند.)
- -Wold-style-declaration (تنها در C و Objective-C)
- برای کاربردهای منسوخشونده (obsolescent) در یک اعلان، بر اساس استاندارد C، هشدار دهد. برای مثال، اگر مشخصکنندههای ردهٔ ذخیرهسازی (storage-class specifiers) مانند "static" اولین بخش در یک اعلان نباشند هشدار میدهد. این هشدار همچنین توسط -Wextra فعال میشود.
- -Wold-style-definition (تنها در C و Objective-C)
- اگر از
تعریف تابع
به سبک
قدیمی (old-style)
استفاده
شود، هشدار
دهد. حتی
اگر
پیشنمونهای
از قبل وجود
داشته باشد
نیز هشدار
داده
میشود.
تعریفی که
از ()
استفاده
میکند در
حالت C23 یک
تعریف به
سبک قدیمی
تلقی
نمیشود،
زیرا در آن
حالت معادل
(void) است، اما
برای
استانداردهای
قدیمیتر
تعریفی به
سبک قدیمی
در نظر
گرفته
میشود..IP
"-Wdeprecated-non-prototype (تنها
C و Objective-C)" 4 هشدار
میدهد اگر
تابعی که با
فهرست
پارامتر
خالی ()
اعلان شده
است، با یک
یا چند
آرگومان
فراخوانی
شود، یا اگر
پس از چنین
اعلانی با
تعریف
تابعی
دارای یک یا
چند
پارامتر
مواجه شود.
هر دو مورد
در C23 و
گویشهای
بعدی C خطا
محسوب
میشوند.
این هشدار همچنین توسط -Wc11-c23-compat فعال میشود.
- -Wmissing-parameter-name (تنها C و Objective-C)
- هشدار
میدهد اگر
در تعریف یک
تابع از نام
پارامتر
صرفنظر
شده و تنها
نوع آن مشخص
شده باشد.
از این
ویژگی
میتوان
برای
مستندسازی
استفاده
نشدن از یک
پارامتر در
تعریف تابع
بهره برد.
این قابلیت
بخشی از C23 و
گویشهای
بعدی C است و
در تمامی
گویشهای
دیگر به
عنوان یک
افزونهٔ GCC
در دسترس
قرار دارد.
این هشدار همچنین توسط -Wc11-c23-compat فعال میشود. هنگام ساخت برای نسخههای پیش از C23 در زبان C، با استفاده از -pedantic-errors به یک خطا تبدیل میشود.
- -Wmissing-parameter-type (تنها C و Objective-C)
- یک پارامتر
تابع بدون
مشخصکنندهٔ
نوع در
توابع به
سبک K&R اعلان
شده است:
void foo(bar) { }این هشدار همچنین توسط -Wextra فعال میشود.
- -Wno-declaration-missing-parameter-type (تنها C و Objective-C)
- اگر اعلان
یک تابع
شامل نام
پارامتر
بدون نوع
باشد،
هشدار
نمیدهد.
چنین
اعلانهایی
پیشنمونهای
برای تابع
ارائه
نمیدهند و
از اکثر
بررسیهای
نوع در
فراخوانیهای
تابع
جلوگیری
میکنند.
این هشدار به طور پیشفرض فعال است. در C99 و گویشهای بعدی C، با آن به عنوان یک خطا برخورد میشود. این خطا میتواند با استفاده از -fpermissive (به همراه برخی خطاهای دیگر)، یا فقط برای همین خطا با -Wno-error=declaration-missing-parameter-type به یک هشدار تنزل یابد.
این هشدار توسط -pedantic-errors به یک خطا ارتقا مییابد.
- -Wmissing-prototypes (تنها C و Objective-C)
- هشدار میدهد اگر یک تابع سراسری بدون اعلان قبلی پیشنمونه تعریف شده باشد. این هشدار حتی در صورتی که خود تعریف یک پیشنمونه ارائه دهد نیز صادر میشود. از این گزینه برای یافتن توابع سراسری که اعلان پیشنمونهٔ متناظری در یک فایل سرآیند ندارند استفاده کنید. این گزینه برای C++ معتبر نیست زیرا تمام اعلانهای تابع در آن پیشنمونه ارائه میدهند و یک اعلان نامتناظر به جای تداخل با اعلان قبلی، یک سربارگذاری (overload) را اعلان میکند. برای شناسایی اعلانهای مفقود در C++ از -Wmissing-declarations استفاده کنید.
- -Wmissing-variable-declarations (تنها C و Objective-C)
- هشدار میدهد اگر یک متغیر سراسری بدون اعلان قبلی تعریف شده باشد. از این گزینه برای یافتن متغیرهای سراسری که اعلان extern متناظری در یک فایل سرآیند ندارند استفاده کنید.
- -Wmissing-declarations
- هشدار میدهد اگر یک تابع سراسری بدون اعلان قبلی تعریف شده باشد؛ حتی در صورتی که خود تعریف یک پیشنمونه ارائه دهد، چنین هشداری صادر میشود. از این گزینه برای شناسایی توابع سراسری که در فایلهای سرآیند اعلان نشدهاند استفاده کنید. در C، برای توابعی که دارای اعلانهای غیرپیشنمونهای قبلی هستند هیچ هشداری صادر نمیشود؛ برای یافتن پیشنمونههای مفقود از -Wmissing-prototypes استفاده کنید. در C++، برای الگوهای تابع، توابع درونخطی (inline)، یا توابع موجود در فضاهای نام ناشناس (anonymous namespaces) هشداری صادر نمیشود.
- -Wmissing-field-initializers
- هشدار
میدهد اگر
مقداردهاولیهٔ
یک ساختار
فاقد برخی
از فیلدها
باشد. برای
نمونه، کد
زیر چنین
هشداری را
ایجاد
میکند،
زیرا "x.h"
به صورت
ضمنی صفر
است:
struct s { int f, g, h; }; struct s x = { 3, 4 };در C این گزینه دربارهٔ مقداردههای اولیهٔ نامدار (designated initializers) هشدار نمیدهد، بنابراین اصلاحیهٔ زیر هشداری ایجاد نمیکند:
struct s { int f, g, h; }; struct s x = { .f = 3, .g = 4 };در C این گزینه دربارهٔ مقداردهاولیهٔ صفر فراگیر { 0 } هشدار نمیدهد:
struct s { int f, g, h; }; struct s x = { 0 };به همین ترتیب، در C++ این گزینه دربارهٔ مقداردهاولیهٔ خالی { } هشدار نمیدهد، برای نمونه:
struct s { int f, g, h; }; s x = { };این هشدار در -Wextra گنجانده شده است. برای دریافت سایر هشدارهای -Wextra بدون این هشدار، از -Wextra -Wno-missing-field-initializers استفاده کنید.
- -Wno-missing-requires
- به طور
پیشفرض،
کامپایلر
در صورت
ظاهر شدن یک
concept-id به عنوان
یک simple-requirement در C++20
هشدار
میدهد:
bool satisfied = requires { C<T> };در اینجا در صورتی که C<T> یک عبارت معتبر باشد (که برای تمام Tها چنین است)، مقدار satisfied برابر با true خواهد بود. احتمالاً منظور کاربر نوشتن این عبارت بوده است:
bool satisfied = requires { requires C<T> };تا satisfied تنها در صورتی true باشد که مفهوم (concept) C برای نوع T برآورده شود.
این هشدار را میتوان با -Wno-missing-requires غیرفعال کرد.
- -Wno-missing-template-keyword
- نشانههای
دستیابی به
عضو شامل .، ->
و :: در صورتی
که شیء والد
وابسته (dependent)
باشد و عضوی
که نام برده
میشود یک
الگو (template)
باشد، باید
با
کلیدواژهٔ
"template"
دنبال شوند.
template <class X> void DoStuff (X x) { x.template DoSomeOtherStuff<X>(); // Good. x.DoMoreStuff<X>(); // Warning, x is dependent. }در موارد نادر ممکن است مثبتهای کاذب (false positives) رخ دهد. برای فرونشاندن این هشدار، عبارت را درون پرانتز قرار دهید. برای نمونه، کد زیر حتی در جایی که m و N عدد صحیح هستند، به عنوان یک الگو در نظر گرفته میشود:
void NotATemplate (my_class t) { int N = 5; bool test = t.m < N > (0); // Treated as a template. test = (t.m < N) > (0); // Same meaning, but not treated as a template. }این هشدار را میتوان با -Wno-missing-template-keyword غیرفعال کرد.
- -Wno-multichar
- در صورت استفاده از یک ثابت چندنویسهای ('FOOF') هشدار نمیدهد. معمولاً این ثابتها نشاندهندهٔ یک اشتباه نگارشی در کد کاربر هستند، زیرا مقادیر وابسته به پیادهسازی (implementation-defined) دارند و نباید در کدهای قابلحمل استفاده شوند.
- -Wnormalized=[none|id|nfc|nfkc]
- در ISO C و ISO C++، دو
شناسه در
صورتی
متفاوت
هستند که
دنبالههای
متفاوتی از
نویسهها
باشند. با
این حال،
گاهی اوقات
هنگام
استفاده از
نویسههای
خارج از
مجموعه
نویسههای
پایهٔ ASCII،
ممکن است دو
دنباله
نویسهٔ
متفاوت
داشته
باشید که
ظاهری
یکسان
دارند. برای
جلوگیری از
سردرگمی،
استاندارد
ISO 10646 برخی
قواعد
نرمالسازی
را تعیین
کرده است که
با اعمال
آنها
اطمینان
حاصل
میشود که
دو دنباله
با ظاهر
یکسان، به
دنبالهای
یکسان
تبدیل
میشوند. GCC
میتواند
در صورت
استفاده از
شناسههایی
که
نرمالسازی
نشدهاند
به شما
هشدار دهد؛
این گزینه
این هشدار
را کنترل
میکند.
چهار سطح هشدار توسط GCC پشتیبانی میشود. حالت پیشفرض -Wnormalized=nfc است که دربارهٔ هر شناسهای که در فرم نرمالشدهٔ "C" از استاندارد ISO 10646، یعنی NFC نباشد هشدار میدهد. NFC فرم توصیهشده برای بیشتر کاربردها است و با -Wnormalized معادل است.
متأسفانه برخی نویسهها توسط ISO C و ISO C++ در شناسهها مجاز دانسته شدهاند که پس از تبدیل به NFC، دیگر در شناسهها مجاز نیستند. به این معنا که هیچ راهی وجود ندارد که از این نمادها در ISO C یا C++ قابلحمل استفاده کنید و همهٔ شناسههایتان نیز در قالب NFC باشند. گزینهٔ -Wnormalized=id هشدار مربوط به این نویسهها را فرومینشاند. امید میرود که نسخههای آیندهٔ استانداردهای مربوطه این مشکل را تصحیح کنند، و به همین دلیل این گزینه پیشفرض نیست.
میتوانید با نوشتن -Wnormalized=none یا -Wno-normalized این هشدار را برای تمام نویسهها خاموش کنید. تنها زمانی باید این کار را انجام دهید که از طرح نرمالسازی دیگری (مانند "D") استفاده میکنید، زیرا در غیر این صورت به سادگی ممکن است اشکالاتی ایجاد کنید که به معنای واقعی کلمه دیدن آنها غیرممکن است.
برخی نویسهها در ISO 10646 معانی متفاوتی دارند اما در برخی قلمها یا روشهای نمایش، به ویژه پس از اعمال قالببندی، یکسان به نظر میرسند. برای نمونه "\u207F"، یعنی "SUPERSCRIPT LATIN SMALL LETTER N"، دقیقاً مانند یک "n" معمولی نمایش داده میشود که در بالانویس قرار گرفته است. استاندارد ISO 10646 طرح نرمالسازی NFKC را نیز برای تبدیل همهٔ اینها به یک فرم استاندارد تعریف کرده است، و اگر از -Wnormalized=nfkc استفاده کنید، در صورتی که کد شما در قالب NFKC نباشد GCC هشدار میدهد. این هشدار با هشدار دادن در مورد هر شناسهای که حاوی حرف O است به این دلیل که ممکن است با رقم 0 اشتباه گرفته شود قابل مقایسه است، و بنابراین پیشفرض نیست؛ اما اگر نتوان محیط برنامهنویسی را برای نمایش متمایز این نویسهها اصلاح کرد، ممکن است به عنوان یک قرارداد کدنویسی محلی مفید باشد..IP -Wno-attribute-warning 4 درباره استفاده از توابعی که با مشخصه "warning" اعلان شدهاند هشدار نده. بهطور پیشفرض، این هشدار فعال است. میتوان از -Wno-attribute-warning برای غیرفعال کردن هشدار، یا از -Wno-error=attribute-warning برای جلوگیری از ایجاد خطا در زمان همگردانی با پرچم -Werror استفاده کرد.
- -Wno-deprecated
- درباره
استفاده از
قابلیتهای
منسوخشده
هشدار نده.
در ++C، مشخص کردن صریح -Wdeprecated همچنین هشدارهایی را درباره برخی از قابلیتهایی که در استانداردهای بعدی زبان منسوخ شدهاند فعال میکند، بهویژه -Wcomma-subscript، -Wvolatile، -Wdeprecated-enum-float-conversion، -Wdeprecated-enum-enum-conversion، -Wdeprecated-literal-operator و -Wdeprecated-variadic-comma-omission.
- -Wno-deprecated-declarations
- درباره استفاده از توابع، متغیرها و انواعی که با استفاده از مشخصه "deprecated" بهعنوان منسوخ علامتگذاری شدهاند هشدار نده.
- -Wno-overflow
- درباره سرریز زمان همگردانی در عبارتهای ثابت هشدار نده.
- -Wno-odr
- درباره نقضهای «قاعده یک تعریف» (One Definition Rule) در طول بهینهسازی زمان پیوند هشدار بده. بهطور پیشفرض فعال است.
- -Wopenacc-parallelism
- درباره انتخابهای بالقوه نامطلوب و غیربهینه مربوط به موازیسازی OpenACC هشدار بده.
- -Wno-openmp
- درباره کدهای مشکوک OpenMP هشدار بده.
- -Wopenmp-simd
- اگر مدل هزینه بردارساز (vectorizer) بر دستورالعمل simd مربوط به OpenMP که توسط کاربر تعیین شده ارجحیت یابد، هشدار بده. گزینه -fsimd-cost-model=unlimited میتواند برای تسهیل و کاهش سختگیری مدل هزینه استفاده شود.
- -Woverride-init (تنها C و Objective-C)
- اگر یک فیلد
مقداردهیشده
بدون اثرات
جانبی
هنگام
استفاده از
مقداردهندههای
معین (designated initializers)
بازنویسی
شود، هشدار
بده.
این هشدار در -Wextra گنجانده شده است. برای دریافت سایر هشدارهای -Wextra بدون این مورد، از -Wextra -Wno-override-init استفاده کنید.
- -Wno-override-init-side-effects (تنها C و Objective-C)
- اگر یک فیلد مقداردهیشده دارای اثرات جانبی هنگام استفاده از مقداردهندههای معین بازنویسی شود، هشدار نده. این هشدار بهطور پیشفرض فعال است.
- -Wpacked
- اگر به یک
ساختار (structure)
مشخصه packed
داده شود،
اما این
مشخصه هیچ
تأثیری بر
چینش یا
اندازه
ساختار
نداشته
باشد،
هشدار بده.
چنین
ساختارهایی
ممکن است با
فایده
بسیار
ناچیز،
دچار عدم
تراز (misaligned)
شوند. برای
نمونه، در
این کد،
متغیر
"f.x" در
"struct bar"
تراز نیست
حتی اگر خود
"struct bar"
مشخصه packed را
نداشته
باشد:
struct foo { int x; char a, b, c, d; } __attribute__((packed)); struct bar { char z; struct foo f; }; - -Wnopacked-bitfield-compat
- سریهای 4.1، 4.2
و 4.3
کامپایلر GCC
مشخصه
"packed" را
روی
میدانهای
بیتی از نوع
"char"
نادیده
میگیرند.
این مورد در
GCC 4.4 برطرف شد،
اما این
تغییر
میتواند
منجر به
تفاوتهایی
در چینش
ساختار شود.
GCC در صورتی
که آفست
چنین فیلدی
در GCC 4.4 تغییر
کرده باشد،
شما را مطلع
میکند.
برای
نمونه، در
این ساختار
دیگر فاصله
لایه
پرکننده (padding)
۴ بیتی بین
فیلد "a"
و "b"
وجود ندارد:
struct foo { char a:4; char b:8; } __attribute__ ((packed));این هشدار بهطور پیشفرض فعال است. از -Wno-packed-bitfield-compat برای غیرفعال کردن این هشدار استفاده کنید.
- -Wpacked-not-aligned (تنها C، C++، Objective-C و Objective-C++)
- اگر یک فیلد
ساختار با
ترازبندی
صریحاً
مشخصشده
در یک struct یا union
فشرده (packed)
تراز
نباشد،
هشدار بده.
برای
نمونه، در
این کد
هشداری روی
"struct S"
صادر
میشود،
مانند "warning:
alignment 1 of 'struct S' is less than
8":
struct __attribute__ ((aligned (8))) S8 { char a[8]; }; struct __attribute__ ((packed)) S { struct S8 s8; };این هشدار توسط -Wall فعال میشود.
- -Wpadded
- اگر فاصلهگذاری پرکننده (padding) در یک ساختار گنجانده شود، چه برای تراز کردن عضوی از ساختار و چه برای تراز کردن کل ساختار، هشدار بده. گاهی در چنین مواقعی میتوان فیلدهای ساختار را بازآرایی کرد تا فاصله پرکننده کاهش یابد و در نتیجه اندازه ساختار کوچکتر شود.
- -Wredundant-decls
- اگر چیزی بیش از یک بار در همان حوزه (scope) اعلان شود، حتی در مواردی که اعلان چندگانه معتبر بوده و چیزی را تغییر نمیدهد، هشدار بده.
- -Wrestrict
- هنگامی که
شیء
ارجاعشده
توسط یک
پارامتر
مقید به
"restrict" (یا
در ++C، یک
پارامتر
مقید به
"__restrict") با
آرگومان
دیگری
همپوشانی
نامی (aliased)
پیدا کند،
یا زمانی که
کپیها
میان چنین
اشیایی با
هم
همپوشانی
داشته
باشند،
هشدار بده.
برای
نمونه،
فراخوانی
تابع
"strcpy" در
ادامه سعی
میکند تا
رشته را با
جایگزینی
نویسههای
ابتدایی با
چهار نویسه
آخر کوتاه
کند. با این
حال، به
دلیل اینکه
فراخوانی
نویسه NUL
پایانبخش
را در "a[4]"
مینویسد،
کپیها
همپوشانی
پیدا کرده و
این
فراخوانی
بهعنوان
خطا گزارش
میشود.
void foo (void) { char a[] = "abcd1234"; strcpy (a, a + 4); ... }گزینه -Wrestrict حتی بدون بهینهسازی هم مواردی از همپوشانی ساده را تشخیص میدهد، اما بهترین عملکرد را در -O2 و بالاتر دارد. این گزینه در -Wall گنجانده شده است.
- -Wnested-externs (تنها C و Objective-C)
- اگر یک اعلان "extern" درون یک تابع مشاهده شود، هشدار بده.
- -Winline
- اگر تابعی
که بهصورت
inline اعلان شده
است نتواند
درونخطی
شود، هشدار
بده. حتی با
این گزینه،
کامپایلر
شکست در
درونخطی
کردن
توابعی را
که در
سرآیندهای
سیستمی
اعلان
شدهاند
گزارش
نمیکند.
کامپایلر از روشهای اکتشافی متعددی برای تعیین این که تابعی درونخطی شود یا خیر استفاده میکند. برای نمونه، کامپایلر اندازه تابعی که قرار است درونخطی شود و میزان درونخطیسازیای که پیشتر در تابع فعلی انجام شده را در نظر میگیرد. بنابراین، تغییرات بهظاهر بیاهمیت در برنامه مبدأ میتواند باعث ظاهر شدن یا پنهان شدن هشدارهای ایجادشده توسط -Winline شود.
- -Winterference-size
- درباره
استفاده از
"std::hardware_destructive_interference_size"
مربوط به C++17
بدون تعیین
مقدار آن با
--param destructive-interference-size
هشدار بده.
همچنین
درباره
مقادیر
مشکوک برای
آن گزینه
هشدار بده.
این متغیر برای استفاده در کنترل چینش کلاس در نظر گرفته شده است، تا از اشتراکگذاری کاذب (false sharing) در کدهای همروند جلوگیری شود:
struct independent_fields { alignas(std::hardware_destructive_interference_size) std::atomic<int> one; alignas(std::hardware_destructive_interference_size) std::atomic<int> two; };در اینجا هدف این است که one و two به اندازه کافی از هم دور باشند تا عملیات ذخیرهسازی در یکی نیازمند دسترسی به دیگری برای بارگذاری مجدد خط حافظه نهان (cache line) نباشد.
بهطور پیشفرض، --param destructive-interference-size و --param constructive-interference-size بر اساس گزینه جاری -mtune تنظیم میشوند؛ معمولاً متناسب با اندازه خط حافظه نهان L1 برای CPU مقصد مشخص، و گاهی به صورت یک محدوده در صورت تنظیم برای یک مقصد عمومی. بنابراین، همه واحدهای ترجمه (translation units) که برای استفاده از این متغیرها به سازگاری ABI وابستهاند، باید با همان -mtune (یا -mcpu) همگردانی شوند.
اگر پایداری ABI اهمیت دارد، برای نمونه اگر کاربرد آن در سرآیند یک کتابخانه است، احتمالاً اصلاً نباید از متغیرهای hardware interference size استفاده کنید. همچنین میتوانید با استفاده از --param مقداری معین را اجبار نمایید.
اگر مطمئن هستید که استفاده شما از این متغیر تأثیری بر ABI خارج از ساخت واحد پروژه شما نمیگذارد، میتوانید هشدار را با -Wno-interference-size غیرفعال کنید..IP -Wint-in-bool-context 4 درباره استفاده مشکوک از مقادیر عدد صحیح در مواردی که مقادیر بولی مورد انتظار است هشدار میدهد؛ مانند عبارتهای شرطی (?:) با استفاده از ثابتهای صحیح غیربولی در یک بافت بولی، مانند "if (a <= b ? 2 : 3)". یا شیفت به چپ اعداد صحیح علامتدار در یک بافت بولی، مانند "for (a = 0; 1 << a; a++);". به همین ترتیب برای همه انواع ضربها بدون در نظر گرفتن نوع داده. این هشدار توسط -Wall فعال میشود.
- -Wno-int-to-pointer-cast
- هشدارهای ناشی از تبدیل نوع (cast) یک عدد صحیح با اندازه متفاوت به نوع اشارهگر را نادیده میگیرد. در C++، تبدیل نوع به یک نوع اشارهگر با اندازه کوچکتر یک خطا است. گزینه Wint-to-pointer-cast بهطور پیشفرض فعال است.
- -Wno-pointer-to-int-cast (تنها C و Objective-C)
- هشدارهای ناشی از تبدیل نوع یک اشارهگر به نوع عدد صحیح با اندازه متفاوت را نادیده میگیرد.
- -Winvalid-pch
- اگر یک سرآیند از پیش کامپایلشده (precompiled header) در مسیر جستجو یافت شود اما قابل استفاده نباشد، هشدار میدهد.
- -Winvalid-utf8
- اگر یک نویسه UTF-8 نامعتبر یافت شود، هشدار میدهد. این هشدار برای C++23 در صورت استفاده از -finput-charset=UTF-8 بهطور پیشفرض فعال است و با -pedantic-errors به خطا تبدیل میشود.
- -Wno-unicode
- اشکال نامعتبر توالیهای گریز محدودشده یا نامگذاریشده را که به عنوان نشانههای (tokens) مجزا در نظر گرفته میشوند، عیبیابی و گزارش نمیکند. گزینه Wunicode بهطور پیشفرض فعال است.
- -Wlong-long
- اگر از نوع
"long long"
استفاده
شود، هشدار
میدهد. این
گزینه توسط
هر یک از -Wpedantic
یا -Wtraditional در
حالتهای ISO C90
و C++98 فعال
میشود.
برای
جلوگیری از
پیامهای
هشدار، از
-Wno-long-long
استفاده
کنید.
این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wvariadic-macros
- اگر از ماکروهای با تعداد آرگومان متغیر (variadic macros) در حالت ISO C90 استفاده شود، یا ساختار نحو جایگزین GNU در حالت ISO C99 به کار رود، هشدار میدهد. این گزینه توسط هر یک از -Wpedantic یا -Wtraditional فعال میشود. برای جلوگیری از پیامهای هشدار، از -Wno-variadic-macros استفاده کنید.
- -Wno-varargs
- درباره استفادههای مشکوک از ماکروهای مورد استفاده برای مدیریت آرگومانهای متغیر مانند "va_start" هشدار نمیدهد. این هشدارها بهطور پیشفرض فعال هستند.
- -Wvector-operation-performance
- اگر عملیات برداری از طریق قابلیتهای SIMD معماری پیادهسازی نشده باشد، هشدار میدهد. عمدتاً برای بهینهسازی کارایی کاربرد دارد. عملیات برداری میتواند به صورت "piecewise" (تکهبهتکه) پیادهسازی شود، یعنی عملیات اسکالر روی هر عنصر بردار اعمال شود؛ "in parallel" (موازی)، یعنی عملیات برداری با استفاده از اسکالرهای با نوع عریضتر پیادهسازی شود که معمولاً از نظر کارایی بهینهتر است؛ و "as a single scalar" (به عنوان یک اسکالر منفرد)، یعنی بردار در یک نوع اسکالر جای میگیرد.
- -Wvla
- اگر از یک
آرایه با
طول متغیر
در کد
استفاده
شود، هشدار
میدهد. -Wno-vla
از هشدار
-Wpedantic درباره
آرایههای
با طول
متغیر
جلوگیری
میکند.
این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wvla-larger-than=byte-size
- در صورت
استفاده از
این گزینه،
کامپایلر
برای
اعلانهای
آرایههای
با طول
متغیر که
اندازه
آنها یا
نامحدود
است، یا
توسط
آرگومانی
محدود شده
که اجازه
میدهد
اندازه
آرایه از byte-size
بایت فراتر
رود، هشدار
میدهد. این
عملکرد
شبیه به
نحوه
کارکرد
-Walloca-larger-than=byte-size
است، اما
برای
آرایههای
با طول
متغیر.
توجه داشته باشید که GCC ممکن است آرایههای کوچک با طول متغیر با مقدار مشخص را به آرایههای معمولی بهینهسازی کند، بنابراین این هشدار ممکن است برای چنین آرایههایی صادر نشود.
گزینه -Wvla-larger-than=PTRDIFF_MAX بهطور پیشفرض فعال است، اما معمولاً تنها زمانی اثرگذار است که -ftree-vrp فعال باشد (پیشفرض برای -O2 و بالاتر).
همچنین ببینید: -Walloca-larger-than=byte-size.
- -Wno-vla-larger-than
- هشدارهای -Wvla-larger-than= را غیرفعال میکند. این گزینه معادل -Wvla-larger-than=SIZE_MAX یا بزرگتر است.
- -Wvla-parameter
- درباره
اعلانهای
مجدد
توابعی که
شامل
آرگومانهایی
با نوع
آرایه با
طول متغیر (VLA)
با انواع یا
اشکال
ناسازگار
هستند
هشدار
میدهد، و
امکان
تشخیص
دسترسیهای
خارج از
محدوده به
چنین
پارامترهایی
را توسط
هشدارهایی
مانند -Warray-bounds
فعال
میسازد.
اگر نخستین اعلان تابع از قالب VLA استفاده کند، کران مشخصشده در آرایه به عنوان حداقل تعداد عناصر مورد انتظار برای ارسال در فراخوانیهای تابع و حداکثر تعداد عناصری که توسط آن قابل دسترسی است در نظر گرفته میشود. عدم ارسال آرگومانهایی با اندازه کافی یا دسترسی به بیش از حداکثر تعداد عناصر ممکن است تشخیص داده و گزارش شود.
برای مثال، این هشدار برای اعلانهای مجدد زیر صادر میشود، زیرا نخستین اعلان اجازه میدهد آرایهای با هر اندازهای به "f" ارسال شود در حالی که اعلان دوم مشخص میکند آرگومان آرایه باید حداقل "n" عنصر داشته باشد. علاوه بر این، فراخوانی "f" با پارامتر کران VLA مرتبط فراتر از کران واقعی VLA نیز موجب ایجاد یک هشدار میشود.
void f (int n, int[n]); // warning: argument 2 previously declared as a VLA void f (int, int[]); void g (int n) { if (n > 4) return; int a[n]; // warning: access to a by f may be out of bounds f (sizeof a, a); ... }گزینه -Wvla-parameter در -Wall گنجانده شده است. گزینه -Warray-parameter هشدارهای مشابهی را برای آرگومانهای آرایه معمولی صادر میکند.
- -Wvolatile-register-var
- اگر یک متغیر ثبات (register variable) به صورت volatile اعلان شود، هشدار میدهد. اصلاحکننده volatile از تمام بهینهسازیهایی که ممکن است خواندن و/یا نوشتن در متغیرهای ثبات را حذف کنند جلوگیری نمیکند. این هشدار توسط -Wall فعال میشود.
- -Wno-xor-used-as-pow (تنها C، C++، Objective-C و Objective-C++)
- هشدارهای
مربوط به
استفاده از
"^"
(عملگر XOR) را
در جایی که
به نظر
میرسد هدف
کد به توان
رساندن
بوده است،
غیرفعال
میکند.
بهطور
خاص، این
هشدار
زمانی رخ
میدهد که
سمت چپ،
ثابت
دهدهی ۲ یا
۱۰ باشد و
سمت راست
نیز یک ثابت
دهدهی
باشد.
در C و C++، عملگر "^" به معنای XOR است، در حالی که در برخی زبانهای دیگر (مانند TeX و برخی نگارشهای BASIC) به معنای به توان رساندن است.
این هشدار را میتوان با تبدیل یکی از عملوندها به هگزادسیمال و همچنین با کامپایل کردن با -Wno-xor-used-as-pow غیرفعال کرد.
- -Wdisabled-optimization
- اگر یک مرحله بهینهسازی (optimization pass) درخواستشده غیرفعال شود، هشدار میدهد. این هشدار عموماً نشاندهنده وجود اشکالی در کد شما نیست؛ بلکه صرفاً نشان میدهد که بهینهسازهای GCC قادر به پردازش کارآمد کد نیستند. اغلب، مشکل این است که کد شما بسیار بزرگ یا بیش از حد پیچیده است؛ هنگامی که خود بهینهسازی احتمالاً زمان بسیار زیادی صرف میکند، GCC از بهینهسازی برنامهها خودداری میکند.
- -Wpointer-sign (تنها C و Objective-C)
- برای ارسال
آرگومان یا
انتساب
اشارهگر
با
علامتداری
(signedness) متفاوت،
هشدار
میدهد. این
گزینه تنها
برای C و Objective-C
پشتیبانی
میشود. این
هشدار به
صورت ضمنی
توسط -Wall و -Wpedantic
فعال
میشود، و
میتوان آن
را با -Wno-pointer-sign
غیرفعال
کرد.
این هشدار با -pedantic-errors به یک خطا ارتقا مییابد.
- -Wstack-protector
- این گزینه تنها زمانی اثرگذار است که -fstack-protector فعال باشد. این گزینه درباره توابعی که در برابر کوبش پشته (stack smashing) محافظت نشدهاند هشدار میدهد.
- -Woverlength-strings
- درباره
ثابتهای
رشتهای که
از طول
«حداقل
حداکثر» (minimum maximum)
تعیینشده
در
استاندارد C
طولانیتر
هستند
هشدار
میدهد.
کامپایلرهای
امروزی
عموماً به
ثابتهای
رشتهای
بسیار
طولانیتر
از حد مجاز
استاندارد
اجازه
میدهند،
اما
برنامههایی
با قابلیت
حمل بالا
باید از
استفاده از
رشتههای
طولانیتر
خودداری
کنند.
این محدودیت پس از الحاق ثابتهای رشتهای اعمال میشود و نویسه NUL پایانی را محاسبه نمیکند. در C90، این حد ۵۰۹ نویسه بود؛ در C99، به ۴۰۹۵ افزایش یافت. در C++98 هیچ حداقل حداکثر استانداردی مشخص نشده است، بنابراین برای رشتههای بیش از حد مجاز در C++ هشداری داده نمیشود.
این گزینه به صورت ضمنی توسط -Wpedantic فعال میشود، و میتوان با -Wno-overlength-strings آن را غیرفعال کرد.
- -Wunsuffixed-float-constants (تنها C و Objective-C)
- برای هر ثابت ممیز شناوری که پسوند ندارد، یک هشدار صادر میکند. هنگامی که همراه با -Wsystem-headers استفاده شود، درباره چنین ثابتهایی در فایلهای سرآیند سیستم نیز هشدار میدهد. این امر میتواند هنگام آمادهسازی کد برای استفاده با عملگر کاربردی (pragma) به نام "FLOAT_CONST_DECIMAL64" برگرفته از افزونه ممیز شناور دهدهی برای C99، مفید باشد..IP -Wno-lto-type-mismatch 4 در طول بهینهسازی زمان پیوند (link-time optimization)، دربارهٔ عدم تطابق نوع در اعلانهای سراسری از واحدهای ترجمهٔ گوناگون هشدار نمیدهد. نیازمند فعال بودن -flto است. بهطور پیشفرض فعال است.
- -Wno-designated-init (فقط C و Objective-C)
- فرونشاندن هشدارها هنگامی که از یک مقداردهی اولیهی ترتیبی برای مقداردهی اولیهی ساختاری که با مشخصهٔ "designated_init" علامتگذاری شده، استفاده شود.
گزینههای مهار تحلیل ایستا
- -fanalyzer
- این گزینه
تحلیلی
ایستا بر
جریان
برنامه را
فعال
میکند که
به دنبال
مسیرهای
میانرویهای
«جالب
توجه» در
میان کد
میگردد و
برای
مشکلات
یافتشده
در آنها
هشدار صادر
میکند.
این تحلیل بسیار پرهزینهتر از سایر هشدارهای GCC است.
از دید فنی، این گزینه یک اجرای نمادین مبتنی بر پوشش از کد در حال ترجمه انجام میدهد. این تحلیل نه معتبر است و نه کامل: میتواند مثبتهای کاذب و منفیهای کاذب داشته باشد. این ابزار به جای اثبات درستی برنامه، ابزاری برای اشکالیابی است.
تحلیلگر در این انتشار، تنها برای استفاده بر روی کد C مناسب است.
فعال کردن این گزینه در عمل هشدارهای زیر را فعال میکند:
-Wanalyzer-allocation-size -Wanalyzer-deref-before-check -Wanalyzer-double-fclose -Wanalyzer-double-free -Wanalyzer-exposure-through-output-file -Wanalyzer-exposure-through-uninit-copy -Wanalyzer-fd-access-mode-mismatch -Wanalyzer-fd-double-close -Wanalyzer-fd-leak -Wanalyzer-fd-phase-mismatch -Wanalyzer-fd-type-mismatch -Wanalyzer-fd-use-after-close -Wanalyzer-fd-use-without-check -Wanalyzer-file-leak -Wanalyzer-free-of-non-heap -Wanalyzer-imprecise-fp-arithmetic -Wanalyzer-infinite-loop -Wanalyzer-infinite-recursion -Wanalyzer-jump-through-null -Wanalyzer-malloc-leak -Wanalyzer-mismatching-deallocation -Wanalyzer-null-argument -Wanalyzer-null-dereference -Wanalyzer-out-of-bounds -Wanalyzer-overlapping-buffers -Wanalyzer-possible-null-argument -Wanalyzer-possible-null-dereference -Wanalyzer-putenv-of-auto-var -Wanalyzer-shift-count-negative -Wanalyzer-shift-count-overflow -Wanalyzer-stale-setjmp-buffer -Wanalyzer-tainted-allocation-size -Wanalyzer-tainted-array-index -Wanalyzer-tainted-assertion -Wanalyzer-tainted-divisor -Wanalyzer-tainted-offset -Wanalyzer-tainted-size -Wanalyzer-undefined-behavior-ptrdiff -Wanalyzer-undefined-behavior-strtok -Wanalyzer-unsafe-call-within-signal-handler -Wanalyzer-use-after-free -Wanalyzer-use-of-pointer-in-stale-stack-frame -Wanalyzer-use-of-uninitialized-value -Wanalyzer-va-arg-type-mismatch -Wanalyzer-va-list-exhausted -Wanalyzer-va-list-leak -Wanalyzer-va-list-use-after-va-end -Wanalyzer-write-to-const -Wanalyzer-write-to-string-literal
این گزینه تنها زمانی در دسترس است که GCC همراه با پشتیبانی از تحلیلگر پیکربندی شده باشد.
- -Wanalyzer-symbol-too-complex
- اگر -fanalyzer
فعال باشد،
تحلیلگر
از روشهای
مکاشفهای
گوناگون
برای تلاش
در جهت
ردگیری
وضعیت
حافظه
استفاده
میکند،
اما کدهای
به اندازهٔ
کافی
پیچیده
میتوانند
این
تلاشها را
ناکام
بگذارند.
بهطور پیشفرض، اگر مقادیر عبارتها از آستانهٔ تعیینشده توسط --param analyzer-max-svalue-depth=value فراتر رود، تحلیل بهطور خاموش از ردگیری آنها دست میکشد و به یک نمایش غیردقیق برای چنین عباراتی عقبنشینی میکند. گزینهٔ -Wanalyzer-symbol-too-complex در صورت رخداد این حالت هشدار میدهد.
- -Wanalyzer-too-complex
- اگر -fanalyzer
فعال باشد،
تحلیلگر
از روشهای
مکاشفهای
گوناگون
برای تلاش
در جهت کاوش
جریان مهار
و جریان
داده در
برنامه
استفاده
میکند،
اما کدهای
به اندازهٔ
کافی
پیچیده
میتوانند
این
تلاشها را
ناکام
بگذارند.
بهطور پیشفرض، اگر کد برای کاوش کامل تحلیلگر بیش از حد پیچیده باشد و به یک حد درونی برسد، تحلیل بدون اعلام متوقف میشود. گزینهٔ -Wanalyzer-too-complex در صورت رخداد این حالت هشدار میدهد.
- -Wno-analyzer-allocation-size
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن، از
-Wno-analyzer-allocation-size
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی در کد هشدار میدهد که در آنها اشارهگری به یک بافر مقداردهی میشود تا به بافری با اندازهای که مضربی از "sizeof (*pointer)" نیست اشاره کند.
ببینید: CWE-131: Incorrect Calculation of Buffer Size ("https://cwe.mitre.org/data/definitions/131.html").
- -Wno-analyzer-deref-before-check
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردنش از
-Wno-analyzer-deref-before-check
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی در کد هشدار میدهد که در آنها یک اشارهگر *پس از* اینکه مورد ارجاعزدایی قرار گرفته است، برای "NULL" بررسی میشود؛ امری که نشان میدهد اشارهگر میتوانسته NULL باشد. چنین مواردی بیانگر آن است که بررسی برای NULL یا زائد است، یا باید به پیش از ارجاعزدایی اشارهگر منتقل شود.
این پیام تشخیصی همچنین مقادیر دریافتشده توسط آرگومان تابعی را که با "__attribute__((nonnull))" علامتگذاری شده، نیازمند مقداری غیر از NULL در نظر میگیرد و بنابراین در صورتی که چنین مقادیری پس از بازگشت از فراخوانی چنان تابعی برای "NULL" بررسی شوند، اعلام اشکال خواهد کرد.
این پیام تشخیصی بعید است در صورت فعال بودن هر سطحی از بهینهسازی گزارش شود، زیرا منطق بهینهسازی GCC معمولاً چنین بررسیهایی برای NULL را زائد در نظر گرفته و پیش از آنکه تحلیلگر آنها را «ببیند»، آنها را حذف میکند. از این رو هنگام تلاش برای برانگیختن این پیام تشخیصی، بهینهسازی باید غیرفعال باشد.
- -Wno-analyzer-double-fclose
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردنش از
-Wno-analyzer-double-fclose
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی در کد هشدار میدهد که در آنها ممکن است تابع "fclose" بیش از یک بار بر روی یک "FILE *" فراخوانی شود.
ببینید: CWE-1341: Multiple Releases of Same Resource or Handle ("https://cwe.mitre.org/data/definitions/1341.html").
- -Wno-analyzer-double-free
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردنش از
-Wno-analyzer-double-free
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی در کد هشدار میدهد که در آنها ممکن است بیش از یک بار تابع آزادسازی بر روی یک اشارهگر فراخوانی شود، چه تابع "free" و چه آزادسازی ارجاعشده توسط مشخصهٔ "malloc".
ببینید: CWE-415: Double Free ("https://cwe.mitre.org/data/definitions/415.html").
- -Wno-analyzer-exposure-through-output-file
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردنش از
-Wno-analyzer-exposure-through-output-file
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی در میان کد هشدار میدهد که در آنها مقداری حساس از نظر امنیتی در یک فایل خروجی نوشته میشود (مانند نوشتن یک گذرواژه در یک پروندهٔ ثبت گزارش).
ببینید: CWE-532: Information Exposure Through Log Files ("https://cwe.mitre.org/data/definitions/532.html").
- -Wanalyzer-exposure-through-uninit-copy
- این هشدار
نیازمند هر
دو گزینهٔ
-fanalyzer و
استفاده از
یک افزایه
برای مشخص
کردن تابعی
است که از
میان یک
«مرز
اعتماد»
رونوشت
انجام
میدهد.
برای
غیرفعال
کردن آن از
-Wno-analyzer-exposure-through-uninit-copy
استفاده
کنید.
این پیام تشخیصی برای «نشت اطلاعات» هشدار میدهد - مسیرهایی در میان کد که در آنها مقادیر مقداردهینشده در میان یک مرز امنیتی رونوشت میشوند (مانند کدی در هستهٔ سیستمعامل که یک struct با مقداردهی ناقص را از پشته به فضای کاربری رونوشت میکند).
ببینید: CWE-200: Exposure of Sensitive Information to an Unauthorized Actor ("https://cwe.mitre.org/data/definitions/200.html").
- -Wno-analyzer-fd-access-mode-mismatch
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردنش از
-Wno-analyzer-fd-access-mode-mismatch
استفاده
کنید.
این پیام تشخیصی برای مسیرهایی در کد هشدار میدهد که در آنها برای یک توصیفگر فایلِ فقطنوشتنی عملیات "read" امتحان میشود، یا بالعکس.
این پیام تشخیصی همچنین برای مسیرهایی در کد هشدار میدهد که در آنها تابعی با مشخصهٔ "fd_arg_read (N)" با یک توصیفگر فایل بازشده با "O_WRONLY" در آرگومان مورد ارجاع "N" فراخوانی شود، یا تابعی با مشخصهٔ "fd_arg_write (N)" با یک توصیفگر فایل بازشده با "O_RDONLY" در آرگومان مورد ارجاع N فراخوانی گردد..IP -Wno-analyzer-fd-double-close 4 این هشدار به -fanalyzer نیاز دارد که آن را فعال میکند؛ از -Wno-analyzer-fd-double-close برای غیرفعال کردن آن استفاده کنید.
این هشدار تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها یک توصیفگر فایل میتواند بیش از یک بار بسته شود.
ببینید: CWE-1341: Multiple Releases of Same Resource or Handle ("https://cwe.mitre.org/data/definitions/1341.html").
- -Wno-analyzer-fd-leak
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛ از
-Wno-analyzer-fd-leak برای
غیرفعال
کردن آن
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها یک توصیفگر فایلِ باز، نشت (leak) پیدا میکند.
ببینید: CWE-775: Missing Release of File Descriptor or Handle after Effective Lifetime ("https://cwe.mitre.org/data/definitions/775.html").
- -Wno-analyzer-fd-phase-mismatch
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛ از
-Wno-analyzer-fd-phase-mismatch برای
غیرفعال
کردن آن
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها عملیاتی در فاز نادرستی از چرخه حیات یک توصیفگر فایل انجام میشود. برای مثال، در صورت تلاش برای فراخوانی "accept" روی یک سوکت جریانی (stream socket) که هنوز "listen" روی آن با موفقیت فراخوانی نشده است، هشدار خواهد داد.
ببینید: CWE-666: Operation on Resource in Wrong Phase of Lifetime ("https://cwe.mitre.org/data/definitions/666.html").
- -Wno-analyzer-fd-type-mismatch
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛ از
-Wno-analyzer-fd-type-mismatch برای
غیرفعال
کردن آن
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها عملیاتی روی نوع نادرستی از توصیفگر فایل انجام میشود. برای مثال، در صورت تلاش برای استفاده از عملیاتهای سوکت روی یک توصیفگر فایل دریافتشده از طریق "open"، یا هنگام تلاش برای استفاده از عملیات سوکت جریانی روی یک سوکت دیتاگرام (datagram socket)، هشدار خواهد داد.
- -Wno-analyzer-fd-use-after-close
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛ از
-Wno-analyzer-fd-use-after-close برای
غیرفعال
کردن آن
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها یک عملیات خواندن یا نوشتن روی یک توصیفگر فایل بستهشده فراخوانی میشود.
همچنین این هشدار تشخیصی برای مسیرهایی از کد که در آنها تابعی با ویژگی "fd_arg (N)" یا "fd_arg_read (N)" یا "fd_arg_write (N)" با یک توصیفگر فایل بستهشده در آرگومان ارجاعشدهی "N" فراخوانی میشود، هشدار میدهد.
- -Wno-analyzer-fd-use-without-check
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛ از
-Wno-analyzer-fd-use-without-check برای
غیرفعال
کردن آن
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها یک توصیفگر فایل بدون بررسی معتبر بودنش استفاده میشود.
همچنین این هشدار تشخیصی برای مسیرهایی از کد که در آنها تابعی با ویژگی "fd_arg (N)" یا "fd_arg_read (N)" یا "fd_arg_write (N)" با یک توصیفگر فایل، در آرگومان ارجاعشدهی "N"، بدون بررسی معتبر بودن آن فراخوانی میشود، هشدار میدهد.
- -Wno-analyzer-file-leak
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛ از
-Wno-analyzer-file-leak برای
غیرفعال
کردن آن
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها یک شیء جریان "FILE *" از "<stdio.h>" نشت پیدا میکند.
ببینید: CWE-775: Missing Release of File Descriptor or Handle after Effective Lifetime ("https://cwe.mitre.org/data/definitions/775.html").
- -Wno-analyzer-free-of-non-heap
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛ از
-Wno-analyzer-free-of-non-heap برای
غیرفعال
کردن آن
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها "free" روی یک اشارهگر غیرهیپ (non-heap) (مانند یک بافر روی پشته یا متغیری سراسری) فراخوانی میشود.
ببینید: CWE-590: Free of Memory not on the Heap ("https://cwe.mitre.org/data/definitions/590.html").
- -Wno-analyzer-imprecise-fp-arithmetic
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛ از
-Wno-analyzer-imprecise-fp-arithmetic
برای
غیرفعال
کردن آن
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها محاسبات ممیز شناور (floating-point) در مکانهایی که به محاسبات دقیق نیاز است استفاده میشود. این هشدار تشخیصی در حال حاضر تنها درباره استفاده از عملوندهای ممیز شناور درون محاسبه اندازه یک تخصیص حافظه هشدار میدهد.
- -Wno-analyzer-infinite-loop
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛ از
-Wno-analyzer-infinite-loop برای
غیرفعال
کردن آن
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی از کد هشدار میدهد که به نظر میرسد به یک حلقه بیپایان (infinite loop) منجر میشوند.
بهطور خاص، تحلیلگر زمانی این هشدار را صادر میکند که حلقهای را «مشاهده کند» که در آن:
- هیچ کار قابلمشاهدهای از بیرون در داخل حلقه انجام نشود
- هیچ راهی برای خروج از حلقه وجود نداشته باشد
- تحلیلگر در سراسر حلقه از وضعیت برنامه به اندازه کافی اطمینان داشته باشد که بداند موارد بالا صادق هستند
یک حالت برای صدور این هشدار زمانی است که مسیر اجرایی درون یک حلقه وجود داشته باشد که طی کردن آن در یک تکرار به این معنی باشد که همان مسیر در تمام تکرارهای بعدی نیز طی خواهد شد.
برای مثال در نظر بگیرید:
while (1)
{
char opcode = *cpu_state.pc;
switch (opcode)
{
case OPCODE_FOO:
handle_opcode_foo (&cpu_state);
break;
case OPCODE_BAR:
handle_opcode_bar (&cpu_state);
break;
}
}
تحلیلگر برای مورد بالا هشدار صادر خواهد کرد زیرا اگر "opcode" با هیچیک از موارد مطابقت نداشته باشد، دستور "switch" از شاخه ضمنی "default" پیروی میکند و باعث میشود بدنه حلقه با بدون تغییر ماندن "cpu_state.pc" به یک «no-op» تبدیل شود و در نتیجه از همان مقدار "opcode" در تمام تکرارهای بعدی استفاده کرده و منجر به یک حلقه بیپایان شود.
ببینید: CWE-835: Loop with Unreachable Exit Condition ('Infinite Loop') ("https://cwe.mitre.org/data/definitions/835.html").
- -Wno-analyzer-infinite-recursion
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛ از
-Wno-analyzer-infinite-recursion برای
غیرفعال
کردن آن
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی از کد هشدار میدهد که به نظر میرسد به بازگشت بیپایان (infinite recursion) منجر میشوند.
بهطور خاص، هنگامی که تحلیلگر یک فراخوانی بازگشتی را «مشاهده کند»، وضعیت حافظه در ورود به قاب (frame) جدید را با وضعیت آن در ورود به قاب قبلی آن تابع روی پشته مقایسه میکند. اگر به نظر برسد هیچ چیزی در حافظه تغییر نمیکند، هشدار صادر میشود؛ فرض بر این است که هرگونه تغییر مشاهدهشده در پارامترها یا متغیرهای سراسری منجر به پایان بازگشت میشود و در نتیجه از صدور هشدار جلوگیری میکند.
این هشدار تشخیصی احتمالاً مواردی از بازگشت بیپایان را که پیش از «مشاهده» توسط تحلیلگر، به دست بهینهساز به حلقه و تکرار تبدیل شدهاند از دست میدهد. بنابراین هنگام تلاش برای برانگیختن این هشدار تشخیصی، بهینهسازی باید غیرفعال شود.
با -Winfinite-recursion مقایسه کنید که هشدار تشخیصی مشابهی ارائه میدهد، اما به روش متفاوتی پیادهسازی شده است.
ببینید: CWE-674: Uncontrolled Recursion ("https://cwe.mitre.org/data/definitions/674.html").
- -Wno-analyzer-jump-through-null
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛ از
-Wno-analyzer-jump-through-null برای
غیرفعال
کردن آن
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها یک اشارهگر تابع "NULL" فراخوانی میشود..IP -Wno-analyzer-malloc-leak 4 این هشدار به -fanalyzer نیاز دارد که آن را فعال میکند؛ برای غیرفعال کردن آن از -Wno-analyzer-malloc-leak استفاده کنید.
این هشدار برای مسیرهایی از کد صادر میشود که در آنها اشارهگری که از طریق یک تخصیصدهنده حافظه تخصیص یافته، نشت کرده است: خواه از طریق "malloc"، یا تابعی که با مشخصه "malloc" علامتگذاری شده باشد.
ببینید CWE-401: Missing Release of Memory after Effective Lifetime ("https://cwe.mitre.org/data/definitions/401.html").
- -Wno-analyzer-mismatching-deallocation
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-mismatching-deallocation
استفاده
کنید.
این هشدار برای مسیرهایی از کد صادر میشود که در آنها بر اساس تابعی که برای تخصیص مقدار یک اشارهگر استفاده شده، تابع آزادسازی اشتباهی روی مقدار آن اشارهگر فراخوانی شده است. این هشدار عدم تطابق بین "free"، عملگر اسکالر "delete" و عملگر برداری "delete[]"، و مواردی که با استفاده از مشخصه "malloc" به عنوان جفتهای تخصیصدهنده/آزادکننده مشخص شدهاند را اعلام میکند.
ببینید CWE-762: Mismatched Memory Management Routines ("https://cwe.mitre.org/data/definitions/762.html").
- -Wno-analyzer-out-of-bounds
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-out-of-bounds
استفاده
کنید.
این هشدار برای مسیرهایی از کد صادر میشود که در آنها یک بافر قطعاً خارج از محدوده خوانده یا نوشته میشود. این هشدار برای مواردی اعمال میشود که تحلیلگر قادر به تعیین یک آفست ثابت باشد و برای دسترسیهای فراتر از انتهای یک بافر، گنجایش نیز مقداری ثابت باشد. علاوه بر این، تحلیلگر بررسیهای محدودی را برای دسترسیهای فراتر از انتها هنگامی که آفست و گنجایش نمادین باشند انجام میدهد.
ببینید CWE-119: Improper Restriction of Operations within the Bounds of a Memory Buffer ("https://cwe.mitre.org/data/definitions/119.html").
در مواردی که تحلیلگر قادر باشد، یک نمودار متنی ایجاد میکند که رابطه مکانی بین ناحیه حافظهای که تحلیلگر پیشبینی میکند به آن دسترسی پیدا شود را در برابر محدوده حافظهای که دسترسی به آن مجاز است به تصویر میکشد: اینکه آیا همپوشانی دارند، مماس هستند، به هم نزدیک یا دور هستند؛ کدام یک در حافظه قبل یا بعد از دیگری است، اندازههای نسبی درگیر، جهت دسترسی (خواندن در برابر نوشتن)، و در برخی موارد، مقادیر دادههای درگیر. این نمودار را میتوان با استفاده از -fdiagnostics-text-art-charset=none غیرفعال کرد.
- -Wno-analyzer-overlapping-buffers
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-overlapping-buffers
استفاده
کنید.
این هشدار برای مسیرهایی از کد صادر میشود که در آنها بافرهای همپوشان به یک رابط برنامهنویسی کاربردی (API) ارسال میشوند که رفتار آن روی چنین بافرهایی تعریفنشده است.
بهطور مشخص، این هشدار هنگام فراخوانی توابع زیر رخ میدهد
- *<"memcpy">
- *<"strcat">
- *<"strcpy">
برای مواردی که مشخص است بافرها همپوشانی دارند.
- -Wno-analyzer-possible-null-argument
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-possible-null-argument
استفاده
کنید.
این هشدار برای مسیرهایی از کد صادر میشود که در آنها مقداری که احتمالاً NULL است به آرگومان تابعی ارسال میشود که با "__attribute__((nonnull))" به عنوان نیازمند مقدار غیر-NULL علامتگذاری شده است.
ببینید CWE-690: Unchecked Return Value to NULL Pointer Dereference ("https://cwe.mitre.org/data/definitions/690.html").
- -Wno-analyzer-possible-null-dereference
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-possible-null-dereference
استفاده
کنید.
این هشدار برای مسیرهایی از کد صادر میشود که در آنها مقداری که احتمالاً NULL است ارجاعزدایی میشود.
ببینید CWE-690: Unchecked Return Value to NULL Pointer Dereference ("https://cwe.mitre.org/data/definitions/690.html").
- -Wno-analyzer-null-argument
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-null-argument
استفاده
کنید.
این هشدار برای مسیرهایی از کد صادر میشود که در آنها مقداری که مشخصاً NULL است به آرگومان تابعی ارسال میشود که با "__attribute__((nonnull))" به عنوان نیازمند مقدار غیر-NULL علامتگذاری شده است.
ببینید CWE-476: NULL Pointer Dereference ("https://cwe.mitre.org/data/definitions/476.html").
- -Wno-analyzer-null-dereference
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-null-dereference
استفاده
کنید.
این هشدار برای مسیرهایی از کد صادر میشود که در آنها مقداری که مشخصاً NULL است ارجاعزدایی میشود.
ببینید CWE-476: NULL Pointer Dereference ("https://cwe.mitre.org/data/definitions/476.html").
- -Wno-analyzer-putenv-of-auto-var
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-putenv-of-auto-var
استفاده
کنید.
این هشدار برای مسیرهایی از کد صادر میشود که در فراخوانی "putenv"، اشارهگری به یک متغیر خودکار (automatic) یا بافری روی پشته به آن ارسال میشود.
ببینید POS34-C. Do not call putenv() with a pointer to an automatic variable as the argument ("https://wiki.sei.cmu.edu/confluence/x/6NYxBQ").
- -Wno-analyzer-shift-count-negative
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-shift-count-negative
استفاده
کنید.
این هشدار برای مسیرهایی از کد صادر میشود که در آنها تلاش برای انجام عملیات شیفت با شمارش منفی صورت میگیرد. این هشدار مشابه با پیام -Wshift-count-negative پیادهسازیشده در فرانتاندهای C/C++ است، اما به جای بررسی ساده درخت نحو، بر اساس تحلیل مسیرهای میانروالی پیادهسازی شده است. با این حال، تحلیلگر اولویتی برای تشخیص چنین مسیرهایی قائل نمیشود، بنابراین موارد منفی کاذب نسبت به هشدارهای دیگر محتملتر است.
- -Wno-analyzer-shift-count-overflow
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-shift-count-overflow
استفاده
کنید.
این هشدار برای مسیرهایی از کد صادر میشود که در آنها تلاش برای انجام عملیات شیفت با شمارشی بزرگتر یا مساوی با دقت نوع عملوند صورت میگیرد. این هشدار مشابه با پیام -Wshift-count-overflow پیادهسازیشده در فرانتاندهای C/C++ است، اما به جای بررسی ساده درخت نحو، بر اساس تحلیل مسیرهای میانروالی پیادهسازی شده است. با این حال، تحلیلگر اولویتی برای تشخیص چنین مسیرهایی قائل نمیشود، بنابراین موارد منفی کاذب نسبت به هشدارهای دیگر محتملتر است.
- -Wno-analyzer-stale-setjmp-buffer
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-stale-setjmp-buffer
استفاده
کنید.
این هشدار برای مسیرهایی از کد صادر میشود که در آنها "longjmp" برای بازگشت به یک "jmp_buf" فراخوانی میشود که مربوط به یک فراخوانی "setjmp" در تابعی است که مقدار خود را برگردانده و خاتمه یافته است.
هنگامی که "setjmp" روی یک "jmp_buf" برای ثبت موقعیت بازگشت فراخوانی میشود، فریم پشته را ثبت میکند. هنگامی که تابع حاوی فراخوانی "setjmp" بازمیگردد، فریم پشته نامعتبر میشود. تلاش برای بازگشت به آن از طریق "longjmp" به فریم پشتهای ارجاع میدهد که دیگر وجود ندارد، و به احتمال زیاد منجر به فروپاشی برنامه (یا وضعیتی وخیمتر) میشود.
- -Wno-analyzer-tainted-allocation-size
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-allocation-size
استفاده
کنید.
این هشدار برای مسیرهایی از کد صادر میشود که در آنها مقداری که میتواند تحت کنترل یک مهاجم باشد، بدون پالایش و پاکسازی به عنوان اندازه تخصیص حافظه استفاده میشود؛ به طوری که یک مهاجم میتواند یک تخصیص بیش از حد بزرگ را تزریق کرده و به طور بالقوه موجب حمله انکار سرویس (DoS) شود.
ببینید CWE-789: Memory Allocation with Excessive Size Value ("https://cwe.mitre.org/data/definitions/789.html").
- -Wno-analyzer-tainted-assertion
- این هشدار
به -fanalyzer نیاز
دارد که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-assertion
استفاده
کنید.
این هشدار برای مسیرهایی از کد صادر میشود که در آنها مقداری که میتواند تحت کنترل یک مهاجم باشد، بدون اینکه ابتدا پالایش و پاکسازی شود به عنوان بخشی از یک شرط استفاده شده است، و آن شرط از فراخوانی تابعی محافظت میکند که با مشخصه "noreturn" علامتگذاری شده است (مانند تابع "__builtin_unreachable"). چنین توابعی معمولاً نشاندهنده خاتمه غیرعادی برنامه هستند، مانند گردانندههای شکست ادعا (assertion failure). برای مثال: assert (some_tainted_value < SOME_LIMIT);
در چنین مواردی:
- هنگامی که بررسی اعتبارسنجی (assertion-checking) فعال است: مهاجم میتواند با تزریق شکست در اعتبارسنجی، یک منع سرویس (denial of service) ایجاد کند
- هنگامی که بررسی اعتبارسنجی غیرفعال است، مانند زمان تعریف "NDEBUG"، مهاجم میتواند دادههایی را تزریق کند که فرآیند را تخریب کند، زیرا احتمالاً پیششرطی را که توسط کد فرض شده است نقض میکند.
توجه داشته باشید زمانی که بررسی اعتبارسنجی غیرفعال است، اعتبارسنجیها (assertions) معمولاً پیش از آنکه تحلیلگر فرصت «دیدن» آنها را پیدا کند توسط پیشپردازنده حذف میشوند؛ بنابراین این هشدار عیبیابی تنها میتواند روی ساختهایی هشدار تولید کند که بررسی اعتبارسنجی در آنها فعال است.
برای اهداف این هشدار، هر تابعی که با ویژگی "noreturn" مشخص شده باشد، از جمله "__builtin_unreachable"، بهعنوان یک مدیر خطای اعتبارسنجی احتمالی در نظر گرفته میشود. توجه داشته باشید که این توابع گاهی اوقات پیش از آنکه تحلیلگر آنها را «ببیند»، توسط بهینهساز حذف میشوند. از این رو، هنگام تلاش برای فعالسازی این پیام عیبیابی، بهینهسازی باید غیرفعال شود.
ببینید CWE-617: Reachable Assertion ("https://cwe.mitre.org/data/definitions/617.html").
این هشدار همچنین میتواند ساختارهای مشکلسازی مانند موارد زیر را گزارش دهد:
switch (some_tainted_value) {
case 0:
/* [...etc; various valid cases omitted...] */
break;
default:
__builtin_unreachable (); /* BUG: attacker can trigger this */
}
اگرچه از نظر فنی و دقیق، مورد بالا شکست اعتبارسنجی محسوب نمیشود.
- -Wno-analyzer-tainted-array-index
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-array-index
استفاده
کنید.
این عیبیابی درباره مسیرهایی در کد هشدار میدهد که در آنها مقداری که ممکن است تحت کنترل مهاجم باشد، بدون پاکسازی بهعنوان نمایه (index) دسترسی به یک آرایه استفاده میشود، بهگونهای که مهاجم میتواند یک دسترسی خارج از محدوده (out-of-bounds) تزریق کند.
ببینید CWE-129: Improper Validation of Array Index ("https://cwe.mitre.org/data/definitions/129.html").
- -Wno-analyzer-tainted-divisor
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-divisor
استفاده
کنید.
این عیبیابی درباره مسیرهایی در کد هشدار میدهد که در آنها مقداری که ممکن است تحت کنترل مهاجم باشد، بدون پاکسازی بهعنوان مقسومعلیه در یک عملیات تقسیم یا باقیمانده استفاده میشود، بهگونهای که مهاجم میتواند یک تقسیم بر صفر تزریق کند.
ببینید CWE-369: Divide By Zero ("https://cwe.mitre.org/data/definitions/369.html").
- -Wno-analyzer-tainted-offset
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-offset
استفاده
کنید.
این عیبیابی درباره مسیرهایی در کد هشدار میدهد که در آنها مقداری که ممکن است تحت کنترل مهاجم باشد، بدون پاکسازی بهعنوان آفست (انحراف) اشارهگر استفاده میشود، بهگونهای که مهاجم میتواند یک دسترسی خارج از محدوده تزریق کند.
ببینید CWE-823: Use of Out-of-range Pointer Offset ("https://cwe.mitre.org/data/definitions/823.html").
- -Wno-analyzer-tainted-size
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-tainted-size
استفاده
کنید.
این عیبیابی درباره مسیرهایی در کد هشدار میدهد که در آنها مقداری که ممکن است تحت کنترل مهاجم باشد، بدون پاکسازی بهعنوان اندازه عملیاتی مانند "memset" استفاده میشود، بهطوری که مهاجم میتواند یک دسترسی خارج از محدوده تزریق کند.
ببینید CWE-129: Improper Validation of Array Index ("https://cwe.mitre.org/data/definitions/129.html").
- -Wno-analyzer-undefined-behavior-ptrdiff
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-undefined-behavior-ptrdiff
استفاده
کنید.
این عیبیابی درباره مسیرهایی در کد هشدار میدهد که در آنها تفریق اشارهگرها رخ میدهد در حالی که اشارهگرها به بلوکهای متفاوتی از حافظه اشاره دارند. چنین کدی بر رفتار تعریفنشده متکی است، زیرا تفریق اشارهگر فقط برای مواردی تعریف شده است که هر دو اشارهگر به درون (یا بلافاصله پس از) همان آرایه اشاره داشته باشند.
ببینید CWE-469: Use of Pointer Subtraction to Determine Size ("https://cwe.mitre.org/data/definitions/469.html").
- -Wno-analyzer-undefined-behavior-strtok
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-undefined-behavior-strtok
استفاده
کنید.
این عیبیابی درباره مسیرهایی در کد هشدار میدهد که در آنها فراخوانی به تابع "strtok" با رفتار تعریفنشده انجام گرفته است.
بهطور خاص، ارسال NULL بهعنوان اولین پارامتر برای فراخوانی اولیه "strtok" در یک فرآیند، دارای رفتار تعریفنشده است.
- -Wno-analyzer-unsafe-call-within-signal-handler
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-unsafe-call-within-signal-handler
استفاده
کنید.
این عیبیابی درباره مسیرهایی در کد هشدار میدهد که در آنها تابعی که ناامن در برابر سیگنالهای ناهمگام (async-signal-unsafe) شناخته شده است (مانند "fprintf")، از درون یک کنترلکننده سیگنال (signal handler) فراخوانی میشود.
ببینید CWE-479: Signal Handler Use of a Non-reentrant Function ("https://cwe.mitre.org/data/definitions/479.html").
- -Wno-analyzer-use-after-free
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-use-after-free
استفاده
کنید.
این عیبیابی درباره مسیرهایی در کد هشدار میدهد که در آنها پس از فراخوانی یک آزادساز (deallocator) بر روی یک اشارهگر، مجدداً از آن اشارهگر استفاده میشود: چه "free" باشد، یا یک آزادساز که با ویژگی "malloc" به آن ارجاع داده شده است.
ببینید CWE-416: Use After Free ("https://cwe.mitre.org/data/definitions/416.html").
- -Wno-analyzer-use-of-pointer-in-stale-stack-frame
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-use-of-pointer-in-stale-stack-frame
استفاده
کنید.
این عیبیابی درباره مسیرهایی در کد هشدار میدهد که در آنها اشارهگری که به یک متغیر در فریم پشته بیاتشده (stale stack frame) اشاره دارد، ارجاعزدایی (dereference) میشود.
- -Wno-analyzer-va-arg-type-mismatch
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-va-arg-type-mismatch
استفاده
کنید.
این عیبیابی درباره مسیرهای بینرویهای (interprocedural) در کد هشدار میدهد که تحلیلگر در آنها تلاشی برای استفاده از "va_arg" جهت استخراج مقداری که به یک فراخوانی با تعداد آرگومان متغیر (variadic) ارسال شده را شناسایی میکند، اما از نوعی استفاده میشود که با نوع عبارت ارسالشده به فراخوانی همخوانی ندارد.
ببینید CWE-686: Function Call With Incorrect Argument Type ("https://cwe.mitre.org/data/definitions/686.html").
- -Wno-analyzer-va-list-exhausted
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-va-list-exhausted
استفاده
کنید.
این عیبیابی درباره مسیرهای بینرویهای در کد هشدار میدهد که تحلیلگر در آنها تلاشی برای استفاده از "va_arg" جهت دسترسی به مقدار بعدی ارسالشده به یک فراخوانی با آرگومان متغیر را شناسایی میکند، در حالی که تمام مقادیر درون "va_list" پیشتر مصرف شدهاند.
ببینید CWE-685: Function Call With Incorrect Number of Arguments ("https://cwe.mitre.org/data/definitions/685.html").
- -Wno-analyzer-va-list-leak
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-va-list-leak
استفاده
کنید.
این عیبیابی درباره مسیرهای بینرویهای در کد هشدار میدهد که تحلیلگر در آنها تشخیص میدهد "va_start" یا "va_copy" بر روی یک "va_list" فراخوانی شده است بدون اینکه فراخوانی متناظری برای "va_end" وجود داشته باشد.
- -Wno-analyzer-va-list-use-after-va-end
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-va-list-use-after-va-end
استفاده
کنید.
این عیبیابی درباره مسیرهای بینرویهای در کد هشدار میدهد که تحلیلگر در آنها تلاشی برای استفاده از یک "va_list" را پس از آنکه "va_end" روی آن فراخوانی شده است، شناسایی میکند. "va_list"..IP -Wno-analyzer-write-to-const 4 این هشدار نیازمند -fanalyzer است که آن را فعال میکند؛ برای غیرفعال کردن آن از -Wno-analyzer-write-to-const استفاده کنید.
این هشدار تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها تحلیلگر تلاشی برای نوشتن در یک شیء "const" از طریق اشارهگر را شناسایی کند. با این حال، تحلیلگر شناسایی چنین مسیرهایی را در اولویت قرار نمیدهد، بنابراین احتمال موارد منفی کاذب در مقایسه با سایر هشدارها بیشتر است.
- -Wno-analyzer-write-to-string-literal
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-write-to-string-literal
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها تحلیلگر تلاشی برای نوشتن در یک رشته لفظی (string literal) از طریق اشارهگر را شناسایی کند. با این حال، تحلیلگر شناسایی چنین مسیرهایی را در اولویت قرار نمیدهد، بنابراین احتمال موارد منفی کاذب در مقایسه با سایر هشدارها بیشتر است.
- -Wno-analyzer-use-of-uninitialized-value
- این هشدار
نیازمند -fanalyzer
است که آن
را فعال
میکند؛
برای
غیرفعال
کردن آن از
-Wno-analyzer-use-of-uninitialized-value
استفاده
کنید.
این هشدار تشخیصی درباره مسیرهایی از کد هشدار میدهد که در آنها از مقداری مقداردهینشده استفاده شده باشد.
ببینید: CWE-457: Use of Uninitialized Variable ("https://cwe.mitre.org/data/definitions/457.html").
تحلیلگر دارای اطلاعاتی تعبیهشده درباره رفتار توابع مدیریت حافظه زیر است:
- *<"alloca">
- *<توابع توکار "__builtin_alloc"،>
- "__builtin_alloc_with_align"، @item "__builtin_calloc"، "__builtin_free"، "__builtin_malloc"، "__builtin_memcpy"، "__builtin_memcpy_chk"، "__builtin_memset"، "__builtin_memset_chk"، "__builtin_realloc"، "__builtin_stack_restore" و "__builtin_stack_save"
- *<"calloc">
- *<"free">
- *<"malloc">
- *<"memset">
- *<"operator delete">
- *<"operator delete []">
- *<"operator new">
- *<"operator new []">
- *<"realloc">
- *<"strdup">
- *<"strndup">
درباره توابع زیر برای کار با توصیفکنندههای فایل:
- *<"open">
- *<"close">
- *<"creat">
- *<"dup"، "dup2" و "dup3">
- *<"isatty">
- *<"pipe" و "pipe2">
- *<"read">
- *<"write">
- *<"socket"، "bind"، "listen"، "accept" و "connect">
درباره توابع زیر برای کار با جریانهای "<stdio.h>":
- *<توابع توکار "__builtin_fprintf"،>
- "__builtin_fprintf_unlocked"، "__builtin_fputc"، "__builtin_fputc_unlocked"، "__builtin_fputs"، "__builtin_fputs_unlocked"، "__builtin_fwrite"، "__builtin_fwrite_unlocked"، "__builtin_printf"، "__builtin_printf_unlocked"، "__builtin_putc"، "__builtin_putchar"، "__builtin_putchar_unlocked"، "__builtin_putc_unlocked"، "__builtin_puts"، "__builtin_puts_unlocked"، "__builtin_vfprintf" و "__builtin_vprintf"
- *<"fopen">
- *<"fclose">
- *<"ferror">
- *<"fgets">
- *<"fgets_unlocked">
- *<"fileno">
- *<"fread">
- *<"getc">
- *<"getchar">
- *<"fprintf">
- *<"printf">
- *<"fwrite">
و درباره توابع زیر:
- *<توابع توکار "__builtin_expect"،>
- "__builtin_expect_with_probability"، "__builtin_strchr"، "__builtin_strcpy"، "__builtin_strcpy_chk"، "__builtin_strlen"، "__builtin_va_copy" و "__builtin_va_start"
- *<افزونههای گنو "error" و "error_at_line">
- *<"getpass">
- *<"longjmp">
- *<"putenv">
- *<"setjmp">
- *<"siglongjmp">
- *<"signal">
- *<"sigsetjmp">
- *<"strcat">
- *<"strchr">
- *<"strlen">
علاوه بر این، توابع گوناگونی با پیشوند "__analyzer_" معنای ویژهای برای تحلیلگر دارند که در دفترچه راهنمای درونیات GCC (GCC Internals) توصیف شدهاند.
پارامترهای مرتبط برای کنترل کاوش عبارتاند از:
- *<--param analyzer-bb-explosion-factor=value>
- *<--param analyzer-max-enodes-per-program-point=value>
- *<--param analyzer-max-recursion-depth=value>
- *<--param analyzer-min-snodes-for-call-summary=value>
گزینههای زیر تحلیلگر را کنترل میکنند:
- -fanalyzer-call-summaries
- سادهسازی
تحلیل
میانرویهای
با محاسبه
اثر برخی
فراخوانیها،
بهجای
کاوش تمامی
مسیرها در
طول تابع از
نقطه
فراخوانی
تا هر
بازگشت
ممکن.
در صورت فعال بودن، خلاصه فراخوانیها تنها برای توابعی استفاده میشوند که بیش از یک نقطه فراخوانی داشته باشند و به اندازه کافی پیچیده باشند (طبق --param analyzer-min-snodes-for-call-summary=value).
- -fanalyzer-checker=name
- محدود کردن تحلیلگر به اجرای تنها بررسیکننده (checker) نامبرده، و فعالسازی آن.
- -fanalyzer-debug-text-art-headings
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است. در صورت فعال بودن، تحلیلگر یادداشتهای بیشتری را به هر نموداری که تولید میکند خواهد افزود.
- -fno-analyzer-feasibility
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
بهطور پیشفرض، تحلیلگر بررسی میکند که آیا برای هر تشخیص صادرشده یک مسیر جریان کنترل امکانپذیر وجود دارد یا خیر: به این معنی که شرایط برقرارشده ناسازگار (مانعةالجمع) نباشند. تشخیصهایی که هیچ مسیر امکانپذیری برای آنها یافت نشود، رد میشوند. این پالایش را میتوان با -fno-analyzer-feasibility برای اشکالزدایی مسائل موجود در این کد لغو کرد.
- -fanalyzer-fine-grained
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
تحلیلگر بهطور درونی یک «گراف تفکیکشده» (exploded graph) میسازد که گرافهای جریان کنترل را با اطلاعات جریان داده ترکیب میکند.
بهطور پیشفرض، یک یال در این گراف میتواند شامل اثرات اجرای چندین دستورالعمل در یک بلوک پایه (basic block) باشد. با -fanalyzer-fine-grained، هر دستورالعمل یال اختصاصی خود را دریافت میکند.
- -fanalyzer-show-duplicate-count
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است: اگر چند مورد تشخیص به عنوان همزاد (تکراری) یکدیگر شناسایی شوند، هنگام گزارش بهترین مورد، یادداشتی صادر میکند که تعداد تشخیصهای اضافی سرکوبشده توسط منطق حذف موارد تکراری را نشان میدهد.
- -fanalyzer-show-events-in-system-headers
- بهطور پیشفرض، تحلیلگر با پنهان کردن رخدادهایی که کاملاً در یک سرایند سیستمی (system header) قرار دارند، مسیرهای تشخیصی سادهشدهای را صادر میکند. با -fanalyzer-show-events-in-system-headers چنین رخدادهایی دیگر پنهان (سرکوب) نمیشوند.
- -fno-analyzer-state-merge
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
بهطور پیشفرض، تحلیلگر تلاش میکند با ادغام وضعیتهای بهاندازه کافی مشابه در هر نقطه برنامه در حین ساخت «گراف تفکیکشده» خود، تحلیل را سادهتر کند. با -fno-analyzer-state-merge میتوان این ادغام را برای اشکالزدایی مسائل مدیریت وضعیت غیرفعال کرد.
- -fno-analyzer-state-purge
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
بهطور پیشفرض، تحلیلگر سعی میکند با پاکسازی جنبههایی از وضعیت در یک نقطه برنامه که به نظر میرسد دیگر مرتبط نیستند (مانند مقادیر متغیرهای محلی که در ادامه تابع به آنها دسترسی پیدا نمیشود و به تحلیل نشت حافظه نیز مربوط نیستند)، تحلیل را ساده کند.
با -fno-analyzer-state-purge میتوان این پاکسازی وضعیت را برای اشکالزدایی مسائل مدیریت وضعیت غیرفعال کرد.
- -fno-analyzer-suppress-followups
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
بهطور پیشفرض تحلیلگر پس از مواجهه با برخی تشخیصهای معین، کاوش در یک مسیر اجرا را متوقف میکند تا از صدور احتمالی آبشاری از تشخیصهای تکمیلی بعدی جلوگیری شود.
تشخیصهایی که تحلیل را در امتداد یک مسیر متوقف میکنند عبارتاند از:
- *<-Wanalyzer-null-argument>
- *<-Wanalyzer-null-dereference>
- *<-Wanalyzer-use-after-free>
- *<-Wanalyzer-use-of-pointer-in-stale-stack-frame>
- *<-Wanalyzer-use-of-uninitialized-value>
با -fno-analyzer-suppress-followups تحلیلگر حتی پس از چنین تشخیصهایی به کاوش در این مسیرها ادامه خواهد داد، که این امر ممکن است برای اشکالزدایی مسائل درون تحلیلگر یا در آزمونهای ارزیابی خرد (microbenchmarks) برای تشخیص رفتارهای تعریفنشده مفید باشد.
- -fanalyzer-transitivity
- این گزینه خاصیت تعدی (transitivity) قیدها را در تحلیلگر فعال میکند.
- -fno-analyzer-undo-inlining
- این گزینه
برای
توسعهدهندگان
تحلیلگر
در نظر
گرفته شده
است.
-fanalyzer در مقایسه با سایر ابزارهای تحلیل کد نسبتاً دیر اجرا میشود و برخی بهینهسازیها از پیش روی کد اعمال شدهاند. بهویژه درونخطسازی توابع (inlining) ممکن است رخ داده باشد، که منجر میشود مسیرهای اجرای میانرویهای صادرشده توسط تحلیلگر حاوی فریمهای تابعی باشند که با فریمهای موجود در کد مبدأ اصلی مطابقت ندارند.
بهطور پیشفرض، تحلیلگر تلاش میکند فریمهای تابع اصلی را بازسازی کرده و رخدادهایی را که فراخوانیهای درونخطشده را نشان میدهند صادر کند.
با -fno-analyzer-undo-inlining این تلاش برای بازسازی اطلاعات فریم اصلی میتواند غیرفعال شود، که میتواند هنگام اشکالزدایی مشکلات موجود در تحلیلگر کمککننده باشد.
- -fanalyzer-verbose-edges
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است. این گزینه جزئیات مشروحتر و سطحپایینتری را در توصیف جریان کنترل درون مسیرهای تشخیصی فعال میکند.
- -fanalyzer-verbose-state-changes
- این گزینه برای توسعهدهندگان تحلیلگر در نظر گرفته شده است. این گزینه جزئیات مشروحتر و سطحپایینتری را در توصیف رخدادهای مربوط به ماشینهای وضعیت درون مسیرهای تشخیصی فعال میکند.
- -fanalyzer-verbosity=level
- این گزینه
پیچیدگی
مسیرهای
جریان
کنترلی را
که برای
تشخیصهای
تحلیلگر
صادر
میشوند
کنترل
میکند.
مقدار level میتواند یکی از موارد زیر باشد:
- 0
- در این سطح، رخدادهای فراخوانی و بازگشت میانرویهای همراه با مرتبطترین رخدادهای تغییر وضعیت مربوط به یک تشخیص نمایش داده میشوند. برای نمونه، برای یک تشخیص "free" مضاعف (double-free)، هر دو فراخوانی به "free" نشان داده خواهند شد.
- 1
- مشابه سطح قبلی، اما رخدادهای مربوط به ورود به هر تابع را نیز نمایش میدهد.
- 2
- مشابه سطح
قبلی، اما
رخدادهای
مربوط به
جریان
کنترلی را
که در
برانگیختن
مشکل نقش
اساسی
دارند نیز
نمایش
میدهد
(مانند
«طیشدن
مسیر درست»
در یک شرط).
این سطح پیشفرض است.
- 3
- مشابه سطح قبلی، اما همه رخدادهای جریان کنترل را نمایش میدهد، نه فقط موارد مهم را.
- 4
- این سطح برای توسعهدهندگان تحلیلگر در نظر گرفته شده است؛ این سطح رخدادهای گوناگون دیگری را که برای اشکالزدایی تحلیلگر در نظر گرفته شدهاند، میافزاید.
- -fdump-analyzer
- جزئیات درونی اقدامات انجامشده توسط تحلیلگر را در file.analyzer.txt تخلیه میکند. گزینه -fdump-analyzer-stderr این گزینه را لغو و جایگزین میکند..IP -fdump-analyzer-stderr 4 جزئیات درونی درباره آنچه تحلیلگر انجام میدهد را در stderr تخلیه (dump) میکند. این گزینه -fdump-analyzer را لغو میکند.
- -fdump-analyzer-callgraph
- نمایشی از گراف فراخوانی (call graph) مناسب برای مشاهده با GraphViz را در file.callgraph.dot تخلیه میکند.
- -fdump-analyzer-exploded-graph
- نمایشی از «گراف بسطیافته» (exploded graph) مناسب برای مشاهده با GraphViz را در file.eg.dot تخلیه میکند. گرهها بر اساس وضعیتهای ماشین حالت با رنگ کدگذاری میشوند تا تغییرات وضعیت برجسته شود.
- -fdump-analyzer-exploded-nodes
- پیامهای تشخیصی صادر میکند که نشان میدهند گرههای «گراف بسطیافته» در چه موقعیتی نسبت به کد مبدأ برنامه قرار دارند.
- -fdump-analyzer-exploded-nodes-2
- نمایشی متنی از «گراف بسطیافته» را در file.eg.txt تخلیه میکند.
- -fdump-analyzer-exploded-nodes-3
- نمایشی متنی از «گراف بسطیافته» را در قالب یک فایل تخلیه به ازای هر گره، در file.eg-id.txt تخلیه میکند. این گزینه معمولاً تعداد زیادی فایل تخلیه ایجاد میکند.
- -fdump-analyzer-exploded-paths
- نمایشی متنی از «مسیر بسطیافته» (exploded path) را برای هر پیام تشخیصی در file.idx.kind.epath.txt تخلیه میکند.
- -fdump-analyzer-feasibility
- جزئیات درونی جستوجوی تحلیلگر برای یافتن مسیرهای امکانپذیر را تخلیه میکند. این جزئیات در قالبی مناسب برای مشاهده با GraphViz در فایلهایی با قالب نامگذاری file.*.fg.dot، file.*.tg.dot و file.*.fpath.txt نوشته میشوند.
- -fdump-analyzer-infinite-loop
- جزئیات درونی جستوجوی تحلیلگر برای یافتن حلقههای بیپایان را تخلیه میکند. این جزئیات در قالبی مناسب برای مشاهده با GraphViz در فایلهایی با قالب نامگذاری file.*.infinite-loop.dot نوشته میشوند.
- -fdump-analyzer-json
- نمایشی فشردهشده با ساختار JSON از جزئیات درونی تحلیلگر را در file.analyzer.json.gz تخلیه میکند. قالب دقیق آن ممکن است تغییر کند.
- -fdump-analyzer-state-purge
- مشابه با -fdump-analyzer-supergraph، نمایشی از «ابرگراف» (supergraph) مناسب برای مشاهده با GraphViz را تخلیه میکند، اما گراف را با اطلاعاتی درباره اینکه چه وضعیتی در هر گره پاکسازی خواهد شد حاشیهنویسی میکند. گراف در file.state-purge.dot نوشته میشود.
- -fdump-analyzer-supergraph
- نمایشهایی از «ابرگراف» مناسب برای مشاهده با GraphViz را در file.supergraph.dot و file.supergraph-eg.dot تخلیه میکند. این فایلها تمام گرافهای جریان کنترل برنامه را همراه با یالهای بینروالی برای فراخوانیها و بازگشتها نشان میدهند. تخلیه دوم شامل حاشیهنویسیهایی است که گرههای «گراف بسطیافته» و پیامهای تشخیصی مرتبط با آنها را نمایش میدهد.
- -fdump-analyzer-untracked
- هشدارهای سفارشی همراه با جزئیات درونی ویژه توسعهدهندگان تحلیلگر صادر میکند.
گزینههای اشکالزدایی برنامه (Options for Debugging Your Program)
برای اینکه به GCC اعلام کنید اطلاعات اضافی جهت استفاده توسط اشکالزدا تولید کند، تقریباً در تمام موارد تنها کافی است گزینه -g را به سایر گزینههای خود بیفزایید. برخی از قالبهای اشکالزدایی میتوانند همزمان وجود داشته باشند (مانند DWARF با CTF)، مشروط بر آنکه هر یک از آنها به صراحت با افزودن گزینه خط فرمان مربوطه به دیگر گزینههایتان فعال شده باشند.
کامپایلر GCC به شما اجازه میدهد از -g همراه با -O استفاده کنید. میانبرهای حاصل از بهینهسازی کد ممکن است گاهی غافلگیرکننده باشند: ممکن است برخی از متغیرهای تعریفشده اصلاً وجود نداشته باشند؛ جریان کنترل ممکن است لحظهای به جایی برود که انتظارش را نداشتید؛ برخی عبارات ممکن است اجرا نشوند زیرا نتایج ثابتی را محاسبه میکنند یا مقادیر آنها از پیش آماده است؛ برخی عبارات ممکن است به دلیل انتقال به بیرون از حلقهها در مکانهای متفاوتی اجرا شوند. با این وجود، اشکالزدایی خروجیِ بهینهشده امکانپذیر است. این امر استفاده از بهینهساز را برای برنامههایی که ممکن است باگ داشته باشند منطقی میسازد.
اگر از گزینه بهینهسازی دیگری استفاده نمیکنید، استفاده از -Og همراه با -g را مد نظر قرار دهید. بدون هیچ گزینه -Oای، برخی از مراحل کامپایلر که اطلاعات مفید برای اشکالزدایی را جمعآوری میکنند اصلاً اجرا نمیشوند؛ بنابراین استفاده از -Og ممکن است تجربه اشکالزدایی بهتری به همراه داشته باشد.
- -g
- اطلاعات
اشکالزدایی
را در قالب
بومی
سیستمعامل
(stabs، COFF، XCOFF یا DWARF)
تولید
میکند. GDB
میتواند
با این
اطلاعات
اشکالزدایی
کار کند.
در بیشتر سیستمهایی که از قالب stabs استفاده میکنند، -g اطلاعات اشکالزدایی اضافهای را فعال میکند که تنها GDB قادر به استفاده از آن است؛ این اطلاعات اضافه باعث کارکرد بهتر در GDB میشود، اما احتمالاً موجب فروپاشی (crash) سایر اشکالزداها شده یا مانع از خواندن برنامه توسط آنها میگردد. اگر میخواهید به طور قطع تولید شدن یا نشدن این اطلاعات اضافی را کنترل کنید، از -gvms استفاده کنید (به زیر مراجعه کنید).
- -ggdb
- اطلاعات اشکالزدایی را برای استفاده توسط GDB تولید میکند. این یعنی استفاده از گویاترین قالب در دسترس (DWARF، stabs یا قالب بومی در صورتی که هیچیک از آنها پشتیبانی نشوند)، شامل افزونههای GDB در صورت امکان.
- -gdwarf
- -gdwarf-version
- اطلاعات
اشکالزدایی
را در قالب DWARF
تولید
میکند (در
صورت
پشتیبانی).
مقدار version
میتواند 2،
3، 4 یا 5 باشد؛
نسخه
پیشفرض
برای بیشتر
هدفها 5
است (به
استثنای VxWorks،
TPF و Darwin / macOS که
نسخه
پیشفرض
آنها 2
است، و AIX که
پیشفرض آن
نسخه 4 است).
توجه داشته باشید که با DWARF نسخه 2، برخی پورتها به برخی افزونههای غیرمتعارض DWARF 3 در جدولهای بازپیچی (unwind tables) نیاز دارند و همواره از آنها استفاده میکنند.
نسخه 4 برای بهرهبرداری حداکثری ممکن است به GDB 7.0 و -fvar-tracking-assignments نیاز داشته باشد. نسخه 5 به GDB 8.0 یا بالاتر نیاز دارد.
کامپایلر GCC دیگر از نسخه 1 DWARF که تفاوتهای بنیادینی با نسخه 2 و نسخههای پس از آن دارد پشتیبانی نمیکند. به دلایل تاریخی، برخی دیگر از گزینههای مرتبط با DWARF مانند -fno-dwarf2-cfi-asm) ارجاع به نسخه 2 DWARF را در نام خود حفظ کردهاند، اما بر تمام نسخههای DWARF که در حال حاضر پشتیبانی میشوند اعمال میگردند.
- -gbtf
- درخواست تولید اطلاعات اشکالزدایی BTF. فرمت BTF قالب اشکالزدایی پیشفرض برای هدف eBPF است. در دیگر هدفها مانند x86، اطلاعات اشکالزدایی BTF میتواند همراه با اطلاعات اشکالزدایی DWARF تولید شود، به شرطی که هر دو قالب اشکالزدایی به طور صریح از طریق گزینههای خط فرمان مربوطهشان فعال شده باشند.
- -gprune-btf
- -gno-prune-btf
- هرس کردن
اطلاعات BTF
پیش از
انتشار.
هنگام هرس،
تنها
اطلاعات
نوع برای
انواعی که
توسط
متغیرهای
سراسری و
توابع در
دامنه فایل
(file-scope) استفاده
شدهاند
صادر خواهد
شد. در صورت
کامپایل
برای هدف BPF
با فعال
بودن BPF CO-RE،
اطلاعات
نوع برای
انواع
استفادهشده
در
بازنشانیهای
BPF CO-RE نیز صادر
میشود.
علاوه بر
این، انواع
struct و union که تنها
از طریق
اشارهگرها
از اعضای
سایر انواع
struct یا union به
آنها
ارجاع شده
است، هرس
شده و با BTF_KIND_FWD
جایگزین
میشوند،
گویی که این
انواع تنها
به عنوان
اعلانهای
رو به جلو (forward
declarations) در ورودی
حضور
داشتهاند.
این گزینه حجم اطلاعات BTF تولیدشده را به میزان چشمگیری کاهش میدهد، اما با از دست رفتن قابلتوجه جزئیات اطلاعات نوع همراه است. این گزینه اصولاً هنگام کامپایل برای هدف BPF مفید است تا اندازه شیء نهایی به حداقل رسیده و اطلاعات BTF که بلافاصله به فرایند بارگذاری برنامه BPF مرتبط نیستند حذف شوند.
این گزینه به صورت پیشفرض هنگام تولید اطلاعات BTF برای هدف BPF فعال است.
- -gctf
- -gctflevel
- درخواست
اطلاعات
اشکالزدایی
CTF و استفاده
از level برای
تعیین
میزان
اطلاعات
اشکالزدایی
CTF تولیدی.
اگر -gctf بدون
مقداری
برای level
مشخص شود،
سطح
پیشفرض
اطلاعات
اشکالزدایی
CTF برابر با 2
است.
اطلاعات اشکالزدایی CTF میتواند همراه با اطلاعات اشکالزدایی DWARF تولید شود، مشروط بر آنکه هر دو قالب اشکالزدایی به صورت صریح از طریق گزینههای خط فرمان مربوطه فعال شده باشند.
سطح 0 هیچگونه اطلاعات اشکالزدایی CTF تولید نمیکند. بنابراین، -gctf0 اثر -gctf را خنثی میکند.
سطح 1 اطلاعات CTF را صرفاً برای ردگیریها (tracebacks) تولید میکند. این اطلاعات شامل محل فراخوانی (callsite) است، اما شامل اطلاعات نوع نیست.
سطح 2 اطلاعات نوع را منحصراً برای موجودیتها (توابع، اشیاء داده و غیره) در دامنه فایل (file-scope) یا دامنه سراسری (global-scope) تولید میکند.
- -gvms
- اطلاعات اشکالزدایی را در قالب اشکالزدایی Alpha/VMS تولید میکند (در صورت پشتیبانی). این قالبی است که توسط DEBUG در سیستمهای Alpha/VMS استفاده میشود..IP -gcodeview 4 اطلاعات اشکالزدایی را در قالب اشکالزدایی CodeView (در صورت پشتیبانی) تولید میکند. این قالبی است که توسط Microsoft Visual C++ در Windows استفاده میشود.
- -glevel
- -ggdblevel
- -gvmslevel
- درخواست
اطلاعات
اشکالزدایی
و همچنین
استفاده از
level برای
مشخص کردن
میزان
اطلاعات.
سطح
پیشفرض ۲
است.
سطح ۰ اصلاً هیچ اطلاعات اشکالزدایی تولید نمیکند؛ بنابراین، -g0 اثر -g را خنثی میکند.
سطح ۱ کمترین مقدار اطلاعات را تولید میکند، به اندازهای که برای ایجاد ردیابی پشته (backtrace) در بخشهایی از برنامه که قصد اشکالزدایی آنها را ندارید کافی باشد. این شامل توصیف توابع و متغیرهای خارجی، و جدولهای شماره خط است، اما حاوی هیچ اطلاعاتی درباره متغیرهای محلی نیست.
سطح ۳ شامل اطلاعات اضافی است، مانند تمامی تعاریف ماکرو موجود در برنامه. برخی از اشکالزداها هنگام استفاده از -g3 از بسط ماکرو پشتیبانی میکنند.
اگر از چندین گزینه -g، همراه با شماره سطح یا بدون آن، استفاده کنید، آخرین گزینه از این دست مؤثر خواهد بود.
گزینه -gdwarf برای جلوگیری از سردرگمی با -gdwarf-level سطح اشکالزدایی متصل را نمیپذیرد. در عوض از یک گزینه اضافی -glevel برای تغییر سطح اشکالزدایی DWARF استفاده کنید.
- -fno-eliminate-unused-debug-symbols
- بهطور پیشفرض، برای نمادهایی که عملاً استفاده نمیشوند هیچ اطلاعات اشکالزدایی تولید نمیشود. اگر میخواهید اطلاعات اشکالزدایی برای تمام نمادها تولید شود، از این گزینه استفاده کنید.
- -femit-class-debug-always
- به جای انتشار اطلاعات اشکالزدایی برای یک کلاس C++ تنها در یک فایل شیء (object file)، آن را در تمامی فایلهای شیءِ استفادهکننده از آن کلاس منتشر میکند. این گزینه باید تنها با اشکالزداهایی استفاده شود که قادر به مدیریت روش عادی GCC در انتشار اطلاعات اشکالزدایی کلاسها نیستند، زیرا استفاده از این گزینه حجم اطلاعات اشکالزدایی را تا دو برابر افزایش میدهد.
- -fno-merge-debug-strings
- به پیونددهنده هدایت میدهد که رشتههای یکسان در اطلاعات اشکالزدایی در فایلهای شیء مختلف را با یکدیگر ادغام نکند. ادغام توسط همه اسمبلرها یا پیونددهندهها پشتیبانی نمیشود. ادغام، اندازه اطلاعات اشکالزدایی را در فایل خروجی به بهای افزایش زمان پردازش پیوند کاهش میدهد. ادغام بهطور پیشفرض فعال است.
- -fdebug-prefix-map=old=new
- هنگام کامپایل فایلهای مستقر در دایرکتوری old، اطلاعات اشکالزدایی توصیفکننده آنها را طوری ثبت میکند که گویی فایلها به جای آن در دایرکتوری new قرار دارند. این گزینه میتواند برای جایگزینی یک مسیر زمان ساخت (build-time) با یک مسیر زمان نصب (install-time) در اطلاعات اشکالزدایی به کار رود. همچنین میتواند با استفاده از . برای new، جهت تبدیل یک مسیر مطلق به یک مسیر نسبی استفاده شود. این کار میتواند منجر به ساختهای بازتولیدپذیرتری (reproducible builds) شود که مستقل از مکان هستند، اما ممکن است به یک دستور اضافی نیاز داشته باشد تا به GDB بگوید فایلهای منبع را در کجا پیدا کند. همچنین -ffile-prefix-map و -fcanon-prefix-map را ببینید.
- -fvar-tracking
- گذرگاه
ردیابی
متغیر (variable tracking pass)
را اجرا
میکند. این
مرحله
محاسبه
میکند که
متغیرها در
هر موقعیت
از کد در
کجا ذخیره
شدهاند.
سپس
اطلاعات
اشکالزدایی
بهتری
تولید
میشود (در
صورتی که
قالب
اطلاعات
اشکالزدایی
از این
اطلاعات
پشتیبانی
کند).
این گزینه بهطور پیشفرض هنگام کامپایل با بهینهسازی (-Os، -O، -O2، ...)، فعال بودن اطلاعات اشکالزدایی (-g) و در صورت پشتیبانیِ قالب اطلاعات اشکالزدایی از آن، فعال است.
- -fvar-tracking-assignments
- انتسابها
به
متغیرهای
کاربر را در
مراحل
اولیه
کامپایل
نشانهگذاری
میکند و
تلاش
میکند این
نشانهها
را در
سرتاسر
فرایند
کامپایل تا
انتها حفظ
کند تا
اطلاعات
اشکالزدایی
در حین
بهینهسازی
بهبود یابد.
استفاده از
-gdwarf-4 به همراه
آن توصیه
میشود.
این ویژگی حتی در صورت غیرفعال بودن var-tracking نیز میتواند فعال شود، که در این حالت نشانهها ایجاد و نگهداری میشوند، اما در پایان کنار گذاشته میشوند. بهطور پیشفرض، این پرچم به همراه -fvar-tracking فعال است، مگر زمانی که زمانبندی انتخابی (selective scheduling) فعال باشد.
- -gsplit-dwarf
- در صورت فعال بودن اطلاعات اشکالزدایی DWARF، تا حد امکان اطلاعات اشکالزدایی را در یک فایل خروجی جداگانه با پسوند .dwo تفکیک میکند. این گزینه به سامانه ساخت اجازه میدهد تا از پیوند دادن فایلهای حاوی اطلاعات اشکالزدایی اجتناب کند. برای سودمند بودن، این گزینه نیازمند اشکالزدایی است که توانایی خواندن فایلهای .dwo را داشته باشد.
- -gdwarf32
- -gdwarf64
- در صورت فعال بودن اطلاعات اشکالزدایی DWARF، گزینه -gdwarf32 قالب ۳۲ بیتی DWARF و گزینه -gdwarf64 قالب ۶۴ بیتی DWARF را انتخاب میکند. مقدار پیشفرض به هدف (target) بستگی دارد، هرچند در اکثر هدفها -gdwarf32 است. قالب ۳۲ بیتی DWARF کوچکتر است، اما نمیتواند بیش از ۲ گیبیبایت (2GiB) اطلاعات اشکالزدایی را در هیچیک از بخشهای اطلاعات اشکالزدایی DWARF پشتیبانی کند. قالب ۶۴ بیتی DWARF امکان ثبت اطلاعات اشکالزدایی بزرگتر را فراهم میکند اما ممکن است هنوز توسط همه مصرفکنندگان به خوبی پشتیبانی نشود.
- -gdescribe-dies
- ویژگیهای توصیف (description attributes) را به برخی از DIEهای DWARF که فاقد ویژگی نام هستند، مانند متغیرهای مصنوعی (artificial variables)، ارجاعهای خارجی، و DIEهای پارامتر نقطه فراخوانی (call site parameter)، اضافه میکند.
- -gpubnames
- بخشهای ".debug_pubnames" و ".debug_pubtypes" را در DWARF تولید میکند.
- -ggnu-pubnames
- بخشهای ".debug_pubnames" و ".debug_pubtypes" را در قالبی مناسب برای تبدیل به یک نمایه (index) جیدیبی GDB تولید میکند. این گزینه تنها همراه با پیونددهندهای مفید است که بتواند نمایه GDB نسخه ۷ را تولید کند.
- -fdebug-types-section
- هنگام استفاده از DWARF نسخه ۴ یا بالاتر، DIEهای نوع میتوانند به جای قرار گرفتن در بخش ".debug_info"، در بخش اختصاصی خود به نام ".debug_types" قرار گیرند. قرار دادن آنها در یک بخش comdat جداگانه کارآمدتر است، زیرا پیونددهنده میتواند موارد تکراری را حذف کند. اما همه مصرفکنندگان DWARF هنوز از بخشهای ".debug_types" پشتیبانی نمیکنند و در برخی شیءها، ".debug_types" به جای کوچکتر کردن، اطلاعات اشکالزدایی بزرگتری تولید میکند.
- -grecord-gcc-switches
- -gno-record-gcc-switches
- این کلید باعث میشود گزینههای خط فرمانی که برای فراخوانی کامپایلر استفاده شده و ممکن است بر تولید کد تأثیر بگذارند، به ویژگی DW_AT_producer در اطلاعات اشکالزدایی DWARF ضمیمه شوند. گزینهها با فاصله از یکدیگر و از نسخه کامپایلر جدا شده و متصل میگردند. این گزینه بهطور پیشفرض فعال است. همچنین برای روش دیگری از ذخیره گزینههای کامپایلر در فایل شیء، -frecord-gcc-switches را ببینید.
- -gstrict-dwarf
- استفاده از افزونههای نسخههای استاندارد DWARF جدیدتر از نسخه انتخابشده با -gdwarf-version را منع میکند. در بیشتر هدفها، استفاده از افزونههای DWARF بدون تداخل از نسخههای استاندارد بعدی مجاز است.
- -gno-strict-dwarf
- استفاده از افزونههای نسخههای استاندارد DWARF جدیدتر از نسخه انتخابشده با -gdwarf-version را مجاز میداند.
- -gas-loc-support
- به
کامپایلر
اطلاع
میدهد که
اسمبلر از
دستورالعملهای
".loc"
پشتیبانی
میکند. در
این صورت
ممکن است از
آنها
استفاده
کند تا
اسمبلر
جدولهای
شماره خط DWARF2+
را تولید
کند.
این امر عموماً مطلوب است، زیرا جدولهای شماره خط تولیدشده توسط اسمبلر بسیار فشردهتر از آنهایی است که خود کامپایلر میتواند تولید کند.
اگر در زمان پیکربندی GCC مشخص شود که اسمبلر از چنین دستورالعملهایی پشتیبانی میکند، این گزینه بهطور پیشفرض فعال خواهد شد.
- -gno-as-loc-support
- در صورتی که قرار باشد جدولهای شماره خط DWARF2+ تولید شوند، GCC را مجبور میکند تا این جدولها را بهصورت داخلی تولید کند.
- -gas-locview-support
- به
کامپایلر
اطلاع
میدهد که
اسمبلر از
انتساب
"view" و
بررسی
ادعای
بازنشانی (reset
assertion) در
دستورالعملهای
".loc"
پشتیبانی
میکند.
اگر در زمان پیکربندی GCC مشخص شود که اسمبلر از آنها پشتیبانی میکند، این گزینه بهطور پیشفرض فعال خواهد شد.
- -gno-as-locview-support
- در صورتی که -gvariable-location-views بهصراحت درخواست شده باشد، GCC را مجبور میکند تا شمارههای view را بهصورت داخلی اختصاص دهد.
- -gcolumn-info
- اطلاعات ستون موقعیت را علاوه بر فایل و سطر، در اطلاعات اشکالزدایی DWARF درج میکند. این گزینه به صورت پیشفرض فعال است.
- -gstatement-frontiers
- -gno-statement-frontiers
- این گزینه باعث میشود GCC نشانگرهایی را در نمایش درونی (internal representation) در آغاز دستورها ایجاد کند و آنها را در طول فرایند کامپایل تقریباً در جای خود نگه دارد، تا از آنها برای هدایت خروجی نشانگرهای "is_stmt" در جدول شماره سطرها استفاده کند. این قابلیت هنگام کامپایل با بهینهسازی (-Os، -O1، -O2، ...) و تولید اطلاعات اشکالزدایی DWARF 2 در سطح عادی، به طور پیشفرض فعال است.
- -gvariable-location-views
- -gvariable-location-views=incompat5
- -gno-variable-location-views
- فهرستهای
مکان متغیر
را با
شمارههای
نمای
افزایشیِ
مستخرج از
جدول شماره
سطرها
تکمیل
میکند. این
کار به
مصرفکنندگان
اطلاعات
اشکالزدایی
امکان
میدهد تا
وضعیت
برنامه را
در نقاط
خاصی بررسی
کنند، حتی
اگر هیچ
دستورالعمل
مرتبط با
مکانهای
سورسِ
متناظر در
آن نقطه
وجود
نداشته
باشد. اگر
اسمبلر
فاقد
پشتیبانی
از
شمارههای
نما در
جداول
شماره سطر
باشد، این
امر باعث
میشود
کامپایلر
جدول شماره
سطر را
تولید کند
که عموماً
فشردگی
آنها را تا
حدی کاهش
میدهد.
جداول
شماره سطر و
فهرستهای
مکان
ارتقایافته
کاملاً
سازگار با
گذشته
هستند،
بنابراین
مصرفکنندگانی
از اطلاعات
اشکالزدایی
که از این
افزونهها
آگاه
نیستند نیز
میتوانند
آنها را به
کار گیرند،
اما هیچ
بهرهای از
آنها
نخواهند
برد.
این گزینه هنگام تولید اطلاعات اشکالزدایی DWARF 2 در سطح عادی، تا زمانی که پشتیبانی در اسمبلر وجود داشته باشد، -fvar-tracking-assignments فعال باشد و -gstrict-dwarf غیرفعال باشد، به طور پیشفرض فعال است. هنگامی که پشتیبانی اسمبلر در دسترس نیست، این ویژگی ممکن است همچنان فعال باشد، اما GCC را مجبور به خروجی دادن جداول داخلی شماره سطر میکند، و اگر -ginternal-reset-location-views فعال نباشد، مطمئناً منجر به عدم تطابق خاموش نماهای مکان خواهد شد.
یک نمایش پیشنهادی برای شمارههای نما وجود دارد که با قالب فهرست مکان معرفیشده در DWARF 5 سازگار با گذشته نیست و میتواند با -gvariable-location-views=incompat5 فعال شود. این گزینه ممکن است در آینده حذف شود و صرفاً به عنوان یک پیادهسازی مرجع از نمایش پیشنهادی ارائه شده است. انتظار نمیرود مصرفکنندگان اطلاعات اشکالزدایی از این قالب توسعهیافته پشتیبانی کنند و استفاده از آن، آنها را از رمزگشایی فهرستهای مکان ناتوان خواهد کرد.
- -ginternal-reset-location-views
- -gno-internal-reset-location-views
- تلاش میکند نماهای مکانی را که میتوان از فهرستهای نمای مکان حذف کرد، تعیین کند. این امر مستلزم آن است که کامپایلر تخمینهای بسیار دقیقی از طول دستورالعملها داشته باشد که همیشه اینطور نیست، و ممکن است در هنگام استفاده از اسمبلری که از فهرستهای نمای مکان پشتیبانی نمیکند، باعث تولید بیسروصدای فهرستهای نمای نادرست شود. اسمبلر گنو (GNU assembler) هر گونه خطایی از این دست را با عنوان "view number mismatch" علامتگذاری خواهد کرد. این ویژگی تنها روی پورتهایی فعال است که یک تابع تخمین قابل اعتماد تعریف کرده باشند.
- -ginline-points
- -gno-inline-points
- اطلاعات اشکالزدایی گسترشیافته را برای توابع درونخطیشده (inlined) تولید میکند. نشانگرهای ردیابی نمای مکان در نقاط ورود درونخطی درج میشوند، تا بتوان شمارههای آدرس و نما را محاسبه کرده و در اطلاعات اشکالزدایی خروجی داد. این گزینه میتواند مستقل از نماهای مکان فعال شود که در این حالت شمارههای نما خروجی داده نخواهند شد، اما تنها میتواند همراه با statement frontiers فعال شود، و به طور پیشفرض تنها در صورتی فعال است که نماهای مکان فعال باشند.
- -gz[=type]
- در صورت پشتیبانی، بخشهای اشکالزدایی فشردهشده را در قالب DWARF تولید میکند. اگر type مشخص نشده باشد، نوع پیشفرض به قابلیتهای اسمبلر و پیونددهندهٔ مورداستفاده بستگی دارد. type میتواند یکی از مقادیر none (عدم فشردهسازی بخشهای اشکالزدایی) یا zlib (استفاده از فشردهسازی zlib در قالب ELF gABI) باشد. اگر پیونددهنده از نوشتن بخشهای اشکالزدایی فشرده پشتیبانی نکند، گزینه رد میشود. در غیر این صورت، چنانچه اسمبلر از آنها پشتیبانی نکند، -gz هنگام تولید فایلهای شیء (object files) به صورت خاموش نادیده گرفته میشود.
- -femit-struct-debug-baseonly
- اطلاعات
اشکالزدایی
را برای
انواع شبیه
به ساختار
(struct-like types) تنها
زمانی
منتشر
میکند که
نام پایه (base name)
فایل سورس
کامپایل با
نام پایه
فایلی که
ساختار در
آن تعریف
شده است
مطابقت
داشته باشد.
این گزینه اندازه اطلاعات اشکالزدایی را به طور چشمگیری کاهش میدهد، اما با احتمال از دست رفتن قابل توجه اطلاعات نوع برای اشکالزدا همراه است. برای گزینهای با شدت کمتر، -femit-struct-debug-reduced را ببینید. برای کنترل دقیقتر، -femit-struct-debug-detailed را ببینید.
این گزینه تنها با خروجی اشکالزدایی DWARF کار میکند.
- -femit-struct-debug-reduced
- اطلاعات
اشکالزدایی
را برای
انواع شبیه
به ساختار
تنها زمانی
منتشر
میکند که
نام پایه
فایل سورس
کامپایل با
نام پایه
فایلی که
نوع در آن
تعریف شده
است مطابقت
داشته
باشد، مگر
اینکه
ساختار یک
قالب (template)
باشد یا در
یک سرایند
سیستمی
تعریف شده
باشد.
این گزینه اندازه اطلاعات اشکالزدایی را به طور قابل توجهی کاهش میدهد، همراه با مقداری احتمالِ از دست رفتن اطلاعات نوع برای اشکالزدا. برای گزینهای با شدت بیشتر، -femit-struct-debug-baseonly را ببینید. برای کنترل دقیقتر، -femit-struct-debug-detailed را ببینید.
این گزینه تنها با خروجی اشکالزدایی DWARF کار میکند.
- -femit-struct-debug-detailed[=spec-list]
- انواع شبیه
به ساختار
را که
کامپایلر
برای آنها
اطلاعات
اشکالزدایی
تولید
میکند،
مشخص
مینماید.
هدف، کاهش
اطلاعات
اشکالزدایی
تکراریِ
ساختارها
میان
فایلهای
شیء مختلف
در یک
برنامه
یکسان است.
این گزینه نسخهای دقیقتر و با جزئیات بیشتر از -femit-struct-debug-reduced و -femit-struct-debug-baseonly است که برای اکثر نیازها کافی است.
یک مشخصه دارای نحو [dir:|ind:][ord:|gen:](any|sys|base|none) است.
کلمه اختیاری اول، مشخصه را به ساختارهایی که به صورت مستقیم استفاده میشوند (dir:) یا به صورت غیرمستقیم استفاده میشوند (ind:) محدود میکند. یک نوع ساختار زمانی مستقیماً استفاده میشود که نوع یک متغیر یا عضو باشد. کاربردهای غیرمستقیم از طریق اشارهگرها به ساختارها ناشی میشوند؛ بدین معنا که هرگاه استفاده از یک ساختار ناکامل (incomplete struct) معتبر باشد، استفاده غیرمستقیم است. یک مثال عبارت است از: struct one direct; struct two * indirect;.
کلمه اختیاری دوم، مشخصه را به ساختارهای معمولی (ord:) یا ساختارهای جنریک (gen:) محدود میکند. توضیح ساختارهای جنریک کمی پیچیده است. برای ++C، اینها تخصیصهای غیرصریح (non-explicit specializations) کلاسهای قالب، یا کلاسهای غیرقالب در درون موارد فوق هستند. زبانهای برنامهنویسی دیگر دارای generics هستند، اما -femit-struct-debug-detailed هنوز آنها را پیادهسازی نکرده است.
کلمه سوم فایلهای سورس را برای آن دسته از ساختارهایی تعیین میکند که کامپایلر باید اطلاعات اشکالزدایی را برایشان تولید کند. مقادیر none و any معنای معمول خود را دارند. مقدار base به این معنی است که نام پایه فایلی که اعلان نوع در آن قرار دارد، باید با نام پایه فایل کامپایل اصلی مطابقت داشته باشد. در عمل، این یعنی هنگام کامپایل foo.c، اطلاعات اشکالزدایی برای انواع اعلانشده در همان فایل و foo.h تولید میشود، اما برای سایر فایلهای سرایند تولید نمیشود. مقدار sys شامل انواعی است که شرط base را برآورده میکنند یا در سرایندهای سیستمی یا کامپایلر اعلان شدهاند.
ممکن است برای تعیین بهترین تنظیمات برای برنامهٔ خود نیاز به آزمون و بررسی داشته باشید.
مقدار پیشفرض -femit-struct-debug-detailed=all است.
این گزینه تنها با خروجی اشکالزدایی DWARF کار میکند.
- -fno-dwarf2-cfi-asm
- اطلاعات بازگردانی (unwind info) ساختار DWARF را به جای استفاده از دستورهای ".cfi_*" در GAS، به صورت بخش ".eh_frame" تولیدشده توسط کامپایلر منتشر میکند.
- -fno-eliminate-unused-debug-types
- به طور معمول، هنگام تولید خروجی DWARF، کامپایلر GCC از تولید خروجی نماد اشکالزدایی برای انواعی که در هیچ جای فایل سورس در حال کامپایل استفاده نشدهاند، خودداری میکند. گاهی اوقات مفید است که GCC اطلاعات اشکالزدایی را برای تمام انواع اعلانشده در یک واحد کامپایل (compilation unit) منتشر کند، صرفنظر از اینکه عملاً در آن واحد کامپایل استفاده شده باشند یا خیر؛ به عنوان مثال اگر در اشکالزدا بخواهید مقداری را به نوعی که در برنامه استفاده نشده (اما اعلان شده است) تبدیل (cast) کنید. با این حال، در اغلب موارد این کار به هدررفت حجم زیادی از فضا منجر میشود..SS "گزینههای کنترل بهینهسازی (Options That Control Optimization)" این گزینهها انواع مختلفی از بهینهسازیها را کنترل میکنند.
بدون هیچ گزینه بهینهسازی، هدف کامپایلر کاهش هزینه کامپایل و حصول اطمینان از دستیابی به نتایج مورد انتظار در هنگام اشکالزدایی (دیباگ) است. دستورها مستقل هستند: اگر برنامه را با یک نقطه توقف (breakpoint) بین دستورها متوقف کنید، میتوانید مقداری جدید به هر متغیری انتساب دهید یا شمارنده برنامه (program counter) را به هر دستور دیگری در تابع هدایت کنید و دقیقاً همان نتایجی را دریافت کنید که بر اساس کد منبع انتظار دارید.
فعال کردن پرچمهای بهینهسازی باعث میشود کامپایلر تلاش کند کارایی و/یا اندازه کد را به بهای زمان کامپایل و احتمالاً کاهش توانایی اشکالزدایی برنامه بهبود بخشد.
کامپایلر بهینهسازی را بر اساس شناختی که از برنامه دارد انجام میدهد. کامپایل همزمان چندین فایل به حالت یک فایل خروجی واحد، به کامپایلر امکان میدهد هنگام کامپایل هر یک از آنها، از اطلاعات کسبشده از تمام فایلها بهره ببرد.
همه بهینهسازیها مستقیماً با یک پرچم کنترل نمیشوند. تنها بهینهسازیهایی که دارای پرچم هستند در این بخش فهرست شدهاند.
بیشتر بهینهسازیها در سطح -O0 یا در صورتی که سطح -O در خط فرمان مشخص نشده باشد، بهطور کامل غیرفعال میشوند، حتی اگر پرچمهای بهینهسازی منفرد بهطور صریح تعیین شده باشند. بهطور مشابه، -Og از اجرای بسیاری از مراحل بهینهسازی جلوگیری میکند.
بسته به معماری هدف و نحوه پیکربندی GCC، ممکن است در هر سطح -O مجموعه کمی متفاوتی از بهینهسازیها نسبت به موارد ذکرشده در اینجا فعال شوند. میتوانید GCC را با -Q --help=optimizers فراخوانی کنید تا از مجموعه دقیق بهینهسازیهای فعالشده در هر سطح مطلع شوید.
- -O
- -O1
- بهینهسازی.
کامپایل
بهینهسازیشده
زمان تا حدی
بیشتر و
برای یک
تابع بزرگ،
حافظه
بسیار
بیشتری
مصرف
میکند.
با -O، کامپایلر تلاش میکند اندازه کد و زمان اجرا را کاهش دهد، بدون این که بهینهسازیهایی انجام دهد که زمان کامپایل زیادی میطلبند.
سطح -O سطح بهینهسازی توصیهشده برای کدهای بزرگ تولیدشده توسط ماشین (machine-generated) است، زیرا تعادلی منطقی بین زمان صرفشده برای کامپایل و مصرف حافظه برقرار میکند: سطوح بالاتر بهینهسازی، عملیات بهینهسازی را با پیچیدگی الگوریتمی بالاتری نسبت به -O انجام میدهند.
گزینه -O پرچمهای بهینهسازی زیر را فعال میکند:
-fauto-inc-dec -fbranch-count-reg -fcombine-stack-adjustments -fcompare-elim -fcprop-registers -fdce -fdefer-pop -fdelayed-branch -fdse -fforward-propagate -fguess-branch-probability -fif-conversion -fif-conversion2 -finline-functions-called-once -fipa-modref -fipa-profile -fipa-pure-const -fipa-reference -fipa-reference-addressable -fivopts -fmerge-constants -fmove-loop-invariants -fmove-loop-stores -fomit-frame-pointer -freorder-blocks -fshrink-wrap -fshrink-wrap-separate -fsplit-wide-types -fssa-backprop -fssa-phiopt -ftree-bit-ccp -ftree-ccp -ftree-ch -ftree-coalesce-vars -ftree-copy-prop -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre -ftree-phiprop -ftree-pta -ftree-scev-cprop -ftree-sink -ftree-slsr -ftree-sra -ftree-ter -funit-at-a-time
- -O2
- بهینهسازی
حتی بیشتر. GCC
تقریباً
تمام
بهینهسازیهای
پشتیبانیشده
را که
موازنهای
بین فضا و
سرعت (space-speed tradeoff)
ایجاد
نمیکنند،
انجام
میدهد. در
مقایسه با
-O، این
گزینه هم
زمان
کامپایل و
هم کارایی
کد
تولیدشده
را افزایش
میدهد.
گزینه -O2 تمام پرچمهای بهینهسازی مشخصشده توسط -O1 را فعال میکند. این گزینه همچنین پرچمهای بهینهسازی زیر را فعال مینماید:
-falign-functions -falign-jumps -falign-labels -falign-loops -fcaller-saves -fcode-hoisting -fcrossjumping -fcse-follow-jumps -fcse-skip-blocks -fdelete-null-pointer-checks -fdevirtualize -fdevirtualize-speculatively -fexpensive-optimizations -ffinite-loops -fgcse -fgcse-lm -fhoist-adjacent-loads -finline-functions -finline-small-functions -findirect-inlining -fipa-bit-cp -fipa-cp -fipa-icf -fipa-ra -fipa-sra -fipa-vrp -fisolate-erroneous-paths-dereference -flra-remat -foptimize-crc -foptimize-sibling-calls -foptimize-strlen -fpartial-inlining -fpeephole2 -freorder-blocks-algorithm=stc -freorder-blocks-and-partition -freorder-functions -frerun-cse-after-loop -fschedule-insns -fschedule-insns2 -fsched-interblock -fsched-spec -fstore-merging -fstrict-aliasing -fthread-jumps -ftree-builtin-call-dce -ftree-loop-vectorize -ftree-pre -ftree-slp-vectorize -ftree-switch-conversion -ftree-tail-merge -ftree-vrp -fvect-cost-model=very-cheap
لطفاً به هشدار ذیل -fgcse در رابطه با فراخوانی -O2 بر روی برنامههایی که از دستورهای پرش محاسبهشده (computed gotos) استفاده میکنند، توجه داشته باشید.
- -O3
- بهینهسازی
باز هم
بیشتر.
گزینه -O3
تمام
بهینهسازیهای
مشخصشده
توسط -O2 را
اعمال کرده
و همچنین
پرچمهای
بهینهسازی
زیر را روشن
میکند:
-fgcse-after-reload -fipa-cp-clone -floop-interchange -floop-unroll-and-jam -fpeel-loops -fpredictive-commoning -fsplit-loops -fsplit-paths -ftree-loop-distribution -ftree-partial-pre -funswitch-loops -fvect-cost-model=dynamic -fversion-loops-for-strides
- -O0
- کاهش زمان
کامپایل و
حصول
اطمینان از
ارائه
نتایج مورد
انتظار در
هنگام
اشکالزدایی.
این حالت
پیشفرض
است.
در سطح -O0، کامپایلر GCC بیشتر مراحل بهینهسازی را کاملاً غیرفعال میکند؛ این مراحل حتی در صورتی که صراحتاً در خط فرمان فعال شوند یا خروجی دستور -Q --help=optimizers آنها را بهصورت پیشفرض فعال نشان دهد، اجرا نخواهند شد. بسیاری از بهینهسازیهای انجامشده توسط GCC به تحلیل کد یا مراحل استانداردسازی (canonicalization) وابسته هستند که توسط -O فعال میشوند، و اجرای مجزای هر مرحله از بهینهسازی بهتنهایی فایدهای نخواهد داشت..IP -Os 4 بهینهسازی برای اندازه. -Os تمام بهینهسازیهای -O2 را فعال میکند، به جز مواردی که غالباً اندازهٔ کد را افزایش میدهند:
-falign-functions -falign-jumps -falign-labels -falign-loops -fprefetch-loop-arrays -freorder-blocks-algorithm=stc
همچنین -finline-functions را فعال میکند، کامپایلر را وادار میسازد تا به جای سرعت اجرا برای اندازهٔ کد تنظیم شود، و بهینهسازیهای بیشتری را که برای کاهش اندازهٔ کد طراحی شدهاند انجام میدهد.
- -Ofast
- نادیده گرفتن انطباق دقیق با استانداردها. -Ofast تمام بهینهسازیهای -O3 را فعال میکند. همچنین بهینهسازیهایی را فعال میسازد که برای تمام برنامههای منطبق بر استاندارد معتبر نیستند. این گزینه -ffast-math، -fallow-store-data-races و گزینهٔ ویژهٔ فرترن -fstack-arrays (مگر اینکه -fmax-stack-var-size مشخص شده باشد)، و -fno-protect-parens را روشن میکند. این گزینه -fsemantic-interposition را خاموش میکند.
- -Og
- بهینهسازی
تجربهٔ
اشکالزدایی.
-Og باید سطح
بهینهسازی
انتخابی
برای چرخهٔ
استاندارد
ویرایش-کامپایل-اشکالزدایی
باشد، که
سطح معقولی
از
بهینهسازی
را همزمان
با حفظ سرعت
بالای
کامپایل و
تجربهٔ
اشکالزدایی
مناسب
ارائه
میدهد. این
گزینه نسبت
به -O0
انتخاب
بهتری برای
تولید کد
قابل
اشکالزدایی
است زیرا
برخی از
گذرهای
کامپایلر
که اطلاعات
اشکالزدایی
را
جمعآوری
میکنند در
-O0 غیرفعال
هستند.
مانند -O0، گزینهٔ -Og نیز تعدادی از گذرهای بهینهسازی را بهطور کامل غیرفعال میکند تا گزینههای مجزایی که آنها را کنترل میکنند بیاثر شوند. در غیر این صورت -Og تمام پرچمهای بهینهسازی -O1 را به جز مواردی که ممکن است با اشکالزدایی تداخل داشته باشند، فعال میکند:
-fbranch-count-reg -fdelayed-branch -fdse -fif-conversion -fif-conversion2 -finline-functions-called-once -fmove-loop-invariants -fmove-loop-stores -fssa-phiopt -ftree-bit-ccp -ftree-dse -ftree-pta -ftree-sra
- -Oz
- بهینهسازی تهاجمی برای اندازه به جای سرعت. این کار در صورتی که دستورالعملها برای کدگذاری به بایتهای کمتری نیاز داشته باشند، ممکن است تعداد دستورالعملهای اجراشده را افزایش دهد. رفتار -Oz مشابه -Os است و شامل فعالسازی اکثر بهینهسازیهای -O2 میشود.
اگر از چندین گزینهٔ -O، همراه با شمارهٔ سطح یا بدون آن استفاده کنید، آخرین گزینه از این نوع مؤثر خواهد بود.
گزینههایی به فرم -fflag پرچمهای مستقل از ماشین را مشخص میکنند. اکثر پرچمها دارای دو حالت مثبت و منفی هستند؛ حالت منفی -ffoo بهصورت -fno-foo است. در جدول زیر، تنها یکی از حالتها فهرست شده است---حالتی که معمولاً از آن استفاده میکنید. شما میتوانید حالت دیگر را با حذف no- یا اضافه کردن آن بیابید.
گزینههای زیر بهینهسازیهای خاصی را کنترل میکنند. آنها یا توسط گزینههای -O فعال میشوند یا با مواردی که فعال شدهاند ارتباط دارند. میتوانید در موارد نادری که «تنظیم دقیق» بهینهسازیهای مورد نظر لازم است، از پرچمهای زیر استفاده کنید.
- -fno-defer-pop
- برای ماشینهایی که باید آرگومانها را پس از فراخوانی تابع از پشته بردارند (pop)، همیشه بهمحض بازگشت هر تابع، آرگومانها را فوراً pop میکند. در سطوح -O1 و بالاتر، گزینهٔ -fdefer-pop پیشفرض است؛ این ویژگی به کامپایلر اجازه میدهد تا بگذارد آرگومانها برای چندین فراخوانی تابع روی پشته انباشته شوند و سپس همه را یکباره pop کند.
- -fforward-propagate
- یک گذر
انتشار رو
به جلو (forward propagation)
روی RTL انجام
میدهد. این
گذر تلاش
میکند تا
دو
دستورالعمل
را ترکیب
کرده و
بررسی کند
که آیا
نتیجه قابل
سادهسازی
است یا خیر.
اگر باز
کردن حلقه (loop
unrolling) فعال
باشد، دو
گذر انجام
میشود و
دومی پس از
باز کردن
حلقه
زمانبندی
میگردد.
این گزینه بهطور پیشفرض در سطوح بهینهسازی -O1، -O2، -O3 و -Os فعال است.
- -favoid-store-forwarding
- -fno-avoid-store-forwarding
- بسیاری از
CPUها هنگامی
که یک
بارگذاری (load)
تا حدی به
ذخیرهسازیهای
(stores) کوچکتر
قبلی
وابسته
باشد، برای
چرخههای
متعددی
متوقف (stall)
میشوند.
این گذر
تلاش
میکند تا
چنین
مواردی را
شناسایی
کرده و با
تغییر
ترتیب load و store و
سپس تصحیح
مقدار
بارگذاریشده،
از این
جریمهٔ
کارایی
جلوگیری
نماید.
بهطور پیشفرض غیرفعال است.
- -ffp-contract=style
- -ffp-contract=off انقباض
و ادغام
عبارات
ممیز شناور
را غیرفعال
میکند.
-ffp-contract=fast ادغام
عبارات
ممیز شناور
مانند
تشکیل
عملیاتهای
ضرب و جمع
ادغامشده
(fused multiply-add) را در
صورتی که
مقصد از
آنها
پشتیبانی
سختافزاری
بومی داشته
باشد، فعال
میسازد.
-ffp-contract=on ادغام
عبارات
ممیز شناور
را در صورتی
که
استاندارد
زبان اجازه
دهد فعال
میکند. این
ویژگی برای
C و ++C
پیادهسازی
شده است،
جایی که
ادغام را
درون یک
عبارت فعال
میکند،
اما نه در
سراسر
دستورهای
مختلف.
پیشفرض برای زبان C در حالت منطبق بر استاندارد (-std=c11 یا مشابه آن) مقدار -ffp-contract=off و در غیر این صورت -ffp-contract=fast است.
- -fomit-frame-pointer
- اشارهگر
فریم (frame pointer) را
در توابعی
که به آن
نیازی
ندارند حذف
میکند. این
کار از
دستورالعملهای
ذخیره،
راهاندازی
و بازیابی
اشارهگر
فریم
جلوگیری
میکند؛
همچنین در
بسیاری از
معماریهای
مقصد یک
ثبات اضافی
را در دسترس
قرار
میدهد.
در برخی از معماریهای مقصد این پرچم هیچ اثری ندارد زیرا توالی فراخوانی استاندارد همواره از یک اشارهگر فریم استفاده میکند، بنابراین نمیتوان آن را حذف کرد.
توجه داشته باشید که -fno-omit-frame-pointer تضمین نمیکند که اشارهگر فریم در همهٔ توابع استفاده شود. چندین معماری مقصد همواره اشارهگر فریم را در توابع برگ (leaf functions) حذف میکنند.
بهطور پیشفرض در -O1 و بالاتر فعال است.
- -foptimize-crc
- حلقههای
محاسبهکنندهٔ
CRC
(انجامدهندهٔ
تقسیم
طولانی
چندجملهای)
را شناسایی
کرده و
آنها را با
یک
پیادهسازی
سریعتر
جایگزین
میکند.
CRCهای ۸، ۱۶،
۳۲ و ۶۴
بیتی با یک
چندجملهای
ثابت بدون
بیت پیشرو
۱، برای هر
دو حالت bit-forward و
bit-reversed شناسایی
میشوند.
اگر معماری
مقصد از
دستورالعمل
CRC پشتیبانی
کند و
چندجملهای
استفادهشده
در کد منبع
با
چندجملهای
دستورالعمل
CRC مطابقت
داشته
باشد، آن
دستورالعمل
CRC را تولید
میکند. در
غیر این
صورت، اگر
مقصد از
دستورالعمل
carry-less-multiplication
پشتیبانی
کند، CRC را با
استفاده از
آن تولید
مینماید؛
در غیر این
صورت CRC
مبتنی بر
جدول تولید
میکند.
بهطور پیشفرض در -O2 و بالاتر فعال است.
- -foptimize-sibling-calls
- فراخوانیهای
همسطح (sibling) و
بازگشتی
دمی (tail recursive) را
بهینهسازی
میکند.
در سطوح -O2، -O3 و -Os فعال است.
- -foptimize-strlen
- توابع
مختلف
رشتهای
استاندارد C
(مانند
"strlen"،
"strchr" یا
"strcpy") و
معادلهای
"_FORTIFY_SOURCE"
آنها را به
گزینههای
جایگزین
سریعتر
بهینهسازی
میکند.
در سطوح -O2 و -O3 فعال است.
- -finline-stringops[=fn]
- عملیاتهای
حافظه و
رشته (در
حال حاضر
تنها
"memset") را
بهصورت
درونخطی
باز
میکند،
حتی زمانی
که طول
متغیر باشد
یا به
اندازهای
بزرگ باشد
که به حلقه
نیاز پیدا
کند. این
گزینه بیش
از همه
همراه با
-ffreestanding و -fno-builtin
کاربرد
دارد.
در برخی شرایط، این گزینه به کامپایلر امکان میدهد کدی تولید کند که از همترازیهای مشخص و مضربهای طول بهره میبرد، اما حتی در این حالت نیز ممکن است کارایی کمتری نسبت به پیادهسازیهای بهینهشدهٔ زمان اجرا داشته باشد، و اندازهٔ کد را آنقدر افزایش دهد که حتی یک پیادهسازی با کارایی کمتر اما مشترک، به دلیل استفادهٔ بهتر از حافظههای نهان کد (code caches)، سریعتر اجرا شود. این گزینه بهطور پیشفرض غیرفعال است.
- -fno-inline
- هیچ تابعی
را بهصورت
درونخطی
باز
نمیکند،
مگر توابعی
که با
مشخصهٔ
"always_inline"
علامتگذاری
شده باشند.
این حالت در
زمان عدم
بهینهسازی،
پیشفرض
است.
میتوان توابع منفرد را با علامتگذاری توسط مشخصهٔ "noinline" از درونخطیسازی مستثنی کرد.
- -finline-small-functions
- توابع را در
صورتی که
بدنهٔ
آنها از کد
مورد نیاز
برای
فراخوانی
تابع
کوچکتر
باشد، درون
فراخوانندههای
آنها
ادغام
میکند (به
طوری که
اندازهٔ
کلی برنامه
کوچکتر
شود).
کامپایلر
بهصورت
اکتشافی (heuristic)
تصمیم
میگیرد
کدام توابع
به اندازهٔ
کافی ساده
هستند که
ارزش ادغام
به این روش
را داشته
باشند. این
درونخطیسازی
برای همهٔ
توابع
اعمال
میشود،
حتی توابعی
که inline تعریف
نشدهاند.
در سطوح -O2، -O3 و -Os فعال است.
- -findirect-inlining
- فراخوانیهای
غیرمستقیمی
را نیز که
به لطف
درونخطیسازیهای
قبلی مشخص
میشود در
زمان
کامپایل
شناختهشده
هستند،
درونخطی
میکند. این
گزینه تنها
زمانی
اثرگذار
است که خود
درونخطیسازی
توسط
گزینههای
-finline-functions یا -finline-small-functions
روشن شده
باشد.
در سطوح -O2، -O3 و -Os فعال است.
- -finline-functions
- تمام توابع
را برای
درونخطیسازی
در نظر
میگیرد،
حتی اگر inline
اعلام نشده
باشند.
کامپایلر
بهصورت
اکتشافی
تصمیم
میگیرد چه
توابعی
ارزش ادغام
به این روش
را دارند.
اگر تمام فراخوانیها به یک تابع مشخص ادغام شوند و آن تابع بهصورت "static" اعلام شده باشد، در این صورت معمولاً آن تابع دیگر به عنوان یک کد اسمبلی مستقل تولید نمیشود.
در سطوح -O2، -O3 و -Os فعال است. همچنین توسط -fprofile-use و -fauto-profile فعال میشود..IP -finline-functions-called-once 4 همه توابع "static" را که تنها یکبار فراخوانی شدهاند، حتی در صورتی که با "inline" مشخص نشده باشند، برای دروننشانی در فراخوانندهشان در نظر میگیرد. اگر فراخوانیِ یک تابع مفروض ادغام (دروننشانی) شود، آن تابع بهطور مستقل به عنوان کد اسمبلی در خروجی تولید نمیشود.
در سطوح -O1، -O2، -O3 و -Os فعال میشود، اما در -Og فعال نیست.
- -fearly-inlining
- توابع
مشخصشده
با "always_inline"
و توابعی را
که بدنه
آنها
کوچکتر از
سربار
فراخوانی
تابع به نظر
میرسد،
پیش از
انجام
ابزارگذاری
-fprofile-generate و گذر
اصلی
دروننشانی،
بهصورت
زودهنگام
دروننشانی
میکند.
انجام این
کار فرآیند
تحلیل
کارایی (profiling)
را بسیار
کمهزینهتر
کرده و
معمولاً
سرعت
دروننشانی
را در
برنامههایی
که
زنجیرههای
بزرگی از
توابع
پوششی (wrapper)
تودرتو
دارند،
افزایش
میدهد.
بهطور پیشفرض فعال است.
- -fipa-sra
- جایگزینی
اسکالر
میانروالها
برای
ساختارهای
تجمیعی،
حذف
پارامترهای
بلااستفاده
و جایگزینی
پارامترهای
ارجاعی با
پارامترهای
مقداری را
انجام
میدهد.
در سطوح -O2، -O3 و -Os فعال میشود.
- -finline-limit=n
- بهطور
پیشفرض، GCC
اندازه
توابعی را
که امکان
دروننشانی
دارند
محدود
میکند. این
پرچم امکان
کنترل کلی
این
محدودیت را
فراهم
میسازد. n
حداکثر
اندازه
توابعی است
که
میتوانند
بر حسب
تعداد
شبهدستورالعملها
دروننشانی
شوند.
دروننشانی در عمل توسط چندین پارامتر کنترل میشود که میتوان آنها را با استفاده از --param name=value بهصورت جداگانه تعیین کرد. گزینه -finline-limit=n برخی از این پارامترها را به شرح زیر تنظیم میکند:
- max-inline-insns-single
- روی n/2 تنظیم میشود.
- max-inline-insns-auto
- روی n/2 تنظیم میشود.
برای مستندات مربوط به پارامترهای منفرد کنترلکننده دروننشانی و مقادیر پیشفرض آنها، به بخشهای بعدی مراجعه کنید.
نکته: ممکن است هیچ مقداری برای -finline-limit وجود نداشته باشد که دقیقاً معادل رفتار پیشفرض باشد.
نکته: شبهدستورالعمل در این زمینه خاص، نشاندهنده یک معیار انتزاعی از اندازه تابع است؛ به هیچ عنوان نشاندهنده شمار دستورالعملهای اسمبلی واقعی نبوده و به همین ترتیب ممکن است معنای دقیق آن از یک نسخه به نسخه دیگر تغییر کند.
- -fno-keep-inline-dllexport
- این یک نگارش ریزدانهتر از -fkeep-inline-functions است که فقط برای توابعی که با استفاده از صفت یا declspec از نوع "dllexport" اعلان شدهاند اعمال میشود.
- -fkeep-inline-functions
- در C، توابع "static" اعلانشده با "inline" را حتی اگر در تمامی فراخوانندههایشان دروننشانی شده باشند، در فایل شیء (object file) صادر میکند. این سوئیچ بر توابعی که از افزونه "extern inline" در GNU C90 استفاده میکنند تأثیری ندارد. در C++، تمام توابع دروننشانیشده را بدون استثنا در فایل شیء صادر میکند.
- -fkeep-static-functions
- توابع "static" را در فایل شیء صادر میکند، حتی اگر آن تابع هرگز استفاده نشده باشد.
- -fkeep-static-consts
- متغیرهای
اعلانشده
بهصورت
"static const" را
در زمانی که
بهینهسازی
فعال نیست
صادر
میکند،
حتی اگر به
آن متغیرها
ارجاع داده
نشده باشد.
GCC این گزینه را بهطور پیشفرض فعال میکند. چنانچه مایلید بدون در نظر گرفتن وضعیت بهینهسازی، کامپایلر را ملزم به بررسی ارجاع به متغیر کنید، از گزینه -fno-keep-static-consts استفاده نمایید.
- -fmerge-constants
- تلاش
میکند
ثوابت
یکسان
(ثوابت
رشتهای و
ثوابت ممیز
شناور) را
در سراسر
واحدهای
کامپایل
ادغام کند.
اگر اسمبلر و پیونددهنده از این قابلیت پشتیبانی کنند، این گزینه در کامپایل بهینهسازیشده پیشفرض است. برای جلوگیری از این رفتار از -fno-merge-constants استفاده کنید.
در سطوح -O1، -O2، -O3 و -Os فعال میشود.
- -fmerge-all-constants
- تلاش
میکند
ثوابت
یکسان و
متغیرهای
یکسان را
ادغام کند.
این گزینه متضمن -fmerge-constants است. علاوه بر موارد -fmerge-constants، این گزینه حتی مواردی چون آرایههای مقداردهیشده با مقادیر ثابت یا متغیرهای ثابت مقداردهیشده از انواع صحیح یا ممیز شناور را نیز در نظر میگیرد. زبانهایی مانند C یا C++ الزام میکنند که هر متغیر، از جمله نمونههای چندگانه یک متغیر در فراخوانیهای بازگشتی، موقعیتهای حافظه مجزایی داشته باشند؛ بنابراین استفاده از این گزینه منجر به رفتاری ناسازگار با استاندارد میشود.
- -fmodulo-sched
- زمانبندی پیمانهای نوسانی (swing modulo scheduling) را درست پیش از نخستین گذر زمانبندی اجرا میکند. این گذر درونیترین حلقهها را بررسی کرده و با همپوشانی تکرارهای گوناگون، دستورالعملهای آنها را بازآرایی میکند.
- -fmodulo-sched-allow-regmoves
- زمانبندی پیمانهای تهاجمیتری را بر پایه SMS با مجاز شمردن انتقالهای ثبات اجرا میکند. با فعال کردن این پرچم، برخی یالهای پادوابستگی حذف میشوند که این امر به تولید دستورات انتقال ثبات بر مبنای تحلیل طول عمر متغیرها منجر میگردد. این گزینه تنها در صورت فعال بودن -fmodulo-sched اثربخش خواهد بود.
- -fno-branch-count-reg
- گذر
بهینهسازی
بررسیکننده
فرصتهای
استفاده از
دستورالعملهای
«کاهش و
پرش» روی یک
ثبات
شمارنده را
به جای
توالی
دستوراتی
که یک ثبات
را کاهش
داده، با
صفر مقایسه
کرده و سپس
بر مبنای
نتیجه پرش
میکنند،
غیرفعال
میسازد.
این گزینه
تنها در
معماریهایی
مفهوم دارد
که از چنین
دستوراتی
پشتیبانی
میکنند،
از جمله x86،
PowerPC، IA-64 و S/390. توجه
داشته
باشید که
گزینه -fno-branch-count-reg
دستورالعملهای
کاهش و پرشی
را که توسط
دیگر
گذرهای
بهینهسازی
به جریان
دستورات
تولیدشده
افزوده
شدهاند،
حذف
نمیکند.
پیشفرض در سطوح -O1 و بالاتر، بهجز -Og، فعال بودن -fbranch-count-reg است.
- -fno-function-cse
- نشانی
توابع را در
ثباتها
قرار
نمیدهد؛
به این
ترتیب هر
دستوری که
یک تابع
ثابت را
فراخوانی
میکند،
صراحتاً
نشانی تابع
را در بر
خواهد داشت.
این گزینه منجر به کدی با کارایی کمتر میشود، اما برخی ترفندهای نامتعارف که خروجی اسمبلی را دستکاری میکنند ممکن است با بهینهسازیهای اعمالشده در غیاب این گزینه دچار ناسازگاری شوند.
پیشفرض -ffunction-cse است.
- -fno-zero-initialized-in-bss
- چنانچه
معماری
مقصد از بخش
BSS پشتیبانی
کند، GCC
بهطور
پیشفرض
متغیرهایی
را که با
صفر
مقداردهی
اولیه
شدهاند
درون BSS قرار
میدهد. این
کار
میتواند
حجم فایل
نهایی را
کاهش دهد.
این گزینه رفتار فوق را غیرفعال میکند، چرا که برخی برنامهها صراحتاً به قرار گرفتن متغیرها در بخش داده وابسته هستند؛ مثلاً برای اینکه برنامه اجرایی بتواند ابتدای آن بخش را پیدا کند و/یا مفروضاتی بر آن اساس در نظر بگیرد.
پیشفرض، بهجز در زبان Ada، گزینه -fzero-initialized-in-bss است.
- -fthread-jumps
- بهینهسازیهایی
را انجام
میدهد که
بررسی
میکنند
آیا یک پرش
به مکانی
منشعب
میشود که
مقایسه
دیگری تحت
پوشش
مقایسه اول
در آن یافت
شود یا خیر.
در صورت
برقراری
این شرط،
بسته به
اینکه
وضعیت شرط
درست یا
نادرست
تشخیص داده
شود، شاخه
اول به مقصد
شاخه دوم یا
نقطهای
بلافاصله
پس از آن
بازهدایت
میشود.
در سطوح -O1، -O2، -O3 و -Os فعال میشود.
- -fsplit-wide-types
- هنگام
استفاده از
نوع
دادهای که
چندین ثبات
را اشغال
میکند،
مانند "long
long" در
سامانههای
۳۲ بیتی،
ثباتها را
تفکیک کرده
و آنها را
بهطور
مستقل
تخصیص
میدهد. این
کار
معمولاً
کدی با
کارایی
بهتر برای
آن نوعها
تولید
میکند،
اما ممکن
است
عیبیابی
را دشوارتر
سازد.
در سطوح -O1، -O2، -O3 و -Os فعال میشود.
- -fsplit-wide-types-early
- نوعهای
عریض را در
مراحل
اولیه
کامپایل
بهطور
کامل تفکیک
میکند، نه
در مراحل
بسیار
پایانی. این
گزینه هیچ
اثری ندارد
مگر آنکه
-fsplit-wide-types فعال
باشد.
این گزینه در برخی مقاصد بهطور پیشفرض فعال است.
- -fcse-follow-jumps
- در حذف
زیرعبارتهای
مشترک (CSE)،
دستورات
پرش را در
شرایطی که
به مقصد پرش
از هیچ مسیر
دیگری
دسترسی
وجود
نداشته
باشد،
دنبال و
بررسی
میکند.
برای
نمونه،
هنگامی که CSE
با یک گزاره
"if"
دارای بند
"else"
روبرو
میشود، در
صورتی که
شرط
آزمایششده
نادرست
باشد، پرش
را دنبال
میکند.
در سطوح -O2، -O3 و -Os فعال میشود..IP -fcse-skip-blocks 4 این گزینه مشابه -fcse-follow-jumps است، اما باعث میشود CSE پرشهایی را که بهطور شرطی از روی بلوکها رد میشوند دنبال کند. هنگامی که CSE با یک عبارت سادهٔ "if" بدون بند else مواجه میشود، -fcse-skip-blocks باعث میشود CSE پرش اطراف بدنهٔ "if" را دنبال کند.
در سطوح -O2، -O3 و -Os فعال میشود.
- -frerun-cse-after-loop
- اجرای مجدد
حذف
زیرعبارتهای
مشترک (CSE) پس
از انجام
بهینهسازیهای
حلقه.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fgcse
- انجام یک
مرحلهٔ
سراسریِ
حذف
زیرعبارتهای
مشترک (GCSE). این
مرحله
همچنین
انتشار
سراسری
مقادیر
ثابت و
رونوشت (copy and constant
propagation) را انجام
میدهد.
نکته: هنگام کامپایل برنامهای که از computed gotos (یک افزونهٔ GCC) استفاده میکند، ممکن است با غیرفعال کردن مرحلهٔ سراسری حذف زیرعبارتهای مشترک از طریق افزودن -fno-gcse به خط فرمان، به کارایی زمان اجرای بهتری دست یابید.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fgcse-lm
- هنگامی که
-fgcse-lm فعال
است، حذف
سراسری
زیرعبارتهای
مشترک تلاش
میکند
بارگذاریهایی
(loads) را که فقط
توسط
ذخیرهسازیها
(stores) درون خود
از بین
میروند،
جابهجا
کند. این
امر امکان
میدهد
حلقهای
حاوی توالی
بارگذاری/ذخیرهسازی
به یک
بارگذاری
بیرون از
حلقه و یک
رونوشت/ذخیرهسازی
درون حلقه
تبدیل شود.
بهطور پیشفرض زمانی که -fgcse فعال باشد، فعال است.
- -fgcse-sm
- هنگامی که
-fgcse-sm فعال
باشد،
مرحلهای
برای
انتقال
ذخیرهسازی
(store motion) پس از حذف
سراسری
زیرعبارتهای
مشترک اجرا
میشود. این
مرحله تلاش
میکند
ذخیرهسازیها
را به خارج
از حلقهها
منتقل کند.
هنگامی که
در کنار -fgcse-lm
استفاده
شود،
حلقههای
حاوی توالی
بارگذاری/ذخیرهسازی
میتوانند
به یک
بارگذاری
پیش از حلقه
و یک
ذخیرهسازی
پس از حلقه
تبدیل شوند.
در هیچ سطح بهینهسازی فعال نیست.
- -fgcse-las
- هنگامی که
-fgcse-las فعال
است،
مرحلهٔ حذف
سراسری
زیرعبارتهای
مشترک،
بارگذاریهای
زائدی را که
پس از
ذخیرهسازی
در همان
مکان حافظه
رخ میدهند
(چه زائد
جزئی و چه
کامل) حذف
میکند.
در هیچ سطح بهینهسازی فعال نیست.
- -fgcse-after-reload
- هنگامی که
-fgcse-after-reload فعال
است، یک
مرحلهٔ حذف
بارگذاریهای
زائد پس از reload
انجام
میشود. هدف
این مرحله
پاکسازی
بیرونریزیهای
(spilling) زائد به
حافظه است.
توسط -O3، -fprofile-use و -fauto-profile فعال میشود.
- -faggressive-loop-optimizations
- این گزینه به بهینهساز حلقه اعلام میکند که از محدودیتهای زبان برای استخراج کرانهای تعداد تکرارهای یک حلقه استفاده کند. این فرض میکند که کد حلقه با ایجاد مواردی چون سرریز عدد صحیح علامتدار یا دسترسی به آرایه خارج از محدوده، رفتار تعریفنشده (undefined behavior) ایجاد نمیکند. کرانهای تعداد تکرار یک حلقه برای هدایت باز کردن حلقه (loop unrolling)، پوستهکنی حلقه (peeling) و بهینهسازیهای آزمون خروج از حلقه استفاده میشوند. این گزینه بهطور پیشفرض فعال است.
- -funconstrained-commons
- این گزینه به کامپایلر اعلام میکند متغیرهای تعریفشده در بلوکهای اشتراکی (مانند common blocks در فرترن) ممکن است بعداً با آرایههای طولانیتر در انتها جایگزین شوند. این امر از برخی بهینهسازیها که وابسته به دانستن کرانهای آرایه هستند جلوگیری میکند.
- -fcrossjumping
- انجام
تبدیل پرش
متقاطع (cross-jumping).
این تبدیل
کدهای
یکسان را
یکپارچه
کرده و حجم
کد را کاهش
میدهد.
ممکن است
کارایی کد
نهایی بهتر
از حالت
بدون پرش
متقاطع
باشد یا
نباشد.
در سطوح -O2، -O3 و -Os فعال میشود.
- -fauto-inc-dec
- ترکیب افزایش یا کاهش آدرسها با دسترسیهای حافظه. این مرحله در معماریهایی که دستورالعملی برای پشتیبانی از این قابلیت ندارند همیشه نادیده گرفته میشود. بهطور پیشفرض در -O1 و بالاتر روی معماریهایی که از آن پشتیبانی میکنند فعال است.
- -fdce
- انجام حذف کدهای مرده (DCE) روی RTL. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fdse
- انجام حذف ذخیرهسازیهای مرده (DSE) روی RTL. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fif-conversion
- تلاش برای
تبدیل
پرشهای
شرطی به
معادلهای
بدون
انشعاب (branch-less).
این شامل
استفاده از
دستورالعملهای
انتقال
شرطی (conditional moves)، min،
max، تنظیم
پرچمها و
abs، و برخی
شگردهای
قابل انجام
با محاسبات
حسابی
استاندارد
است.
استفاده از
اجرای شرطی
روی
تراشههایی
که از آن
پشتیبانی
میکنند
توسط -fif-conversion2
کنترل
میشود.
در سطوح -O1، -O2، -O3 و -Os فعال است، اما با -Og فعال نمیشود.
- -fif-conversion2
- استفاده از
اجرای شرطی
(در صورت در
دسترس بودن)
برای تبدیل
پرشهای
شرطی به
معادلهای
بدون
انشعاب.
در سطوح -O1، -O2، -O3 و -Os فعال است، اما با -Og فعال نمیشود.
- -fdeclone-ctor-dtor
- مشخصات ABI
زبان C++
نیازمند
چندین
نقطهٔ ورود
برای
سازندهها
و مخربها
است: یکی
برای
زیرشیء
پایه، یکی
برای شیء
کامل، و یکی
برای مخرب
مجازی که پس
از آن operator delete را
فراخوانی
میکند.
برای یک
سلسلهمراتب
دارای
پایههای
مجازی،
انواع پایه
و کامل
همزاد
یکدیگرند،
که به معنای
وجود دو
نسخه از
تابع است.
با این
گزینه،
انواع پایه
و کامل به
thunkهایی
تبدیل
میشوند که
یک
پیادهسازی
مشترک را
فراخوانی
میکنند.
توسط -Os فعال میشود.
- -fdelete-null-pointer-checks
- فرض میکند
برنامهها
نمیتوانند
با اطمینان
اشارهگرهای
تهی (null) را
ارجاعزدایی
کنند، و هیچ
کد یا عنصر
دادهای در
آدرس صفر
قرار ندارد.
این گزینه
بهینهسازیهای
سادهٔ
ادغام
مقادیر
ثابت (constant folding) را
در تمام
سطوح
بهینهسازی
فعال
میکند.
علاوه بر
این، سایر
مراحل
بهینهسازی
در GCC از این
پرچم برای
کنترل
تحلیلهای
سراسری
جریان داده
استفاده
میکنند که
بررسیهای
بیهوده
برای
اشارهگرهای
تهی را حذف
میکنند؛
این مراحل
فرض
میکنند
دسترسی
حافظه به
آدرس صفر
همیشه منجر
به یک تله (trap)
میشود،
بهطوری که
اگر
اشارهگری
پس از
ارجاعزدایی
شدن بررسی
شود،
نمیتواند
تهی باشد.
با این حال توجه داشته باشید که در برخی محیطها این فرض درست نیست. برای برنامههایی که به چنین رفتاری وابستهاند، از -fno-delete-null-pointer-checks برای غیرفعال کردن این بهینهسازی استفاده کنید.
این گزینه بهطور پیشفرض در اکثر معماریهای مقصد فعال است. روی AVR و MSP430، این گزینه کاملاً غیرفعال است.
مراحلی که از اطلاعات جریان داده استفاده میکنند، بهطور مستقل در سطوح بهینهسازی مختلف فعال میشوند.
- -fdevirtualize
- تلاش برای تبدیل فراخوانی توابع مجازی به فراخوانیهای مستقیم. این کار هم در درون یک رویه و هم بین رویهها (interprocedurally) بهعنوان بخشی از جایگذاری غیرمستقیم (-findirect-inlining) و انتشار مقادیر ثابت بینرویهای (-fipa-cp) انجام میشود. در سطوح -O2، -O3 و -Os فعال میشود.
- -fdevirtualize-speculatively
- تلاش برای تبدیل فراخوانی توابع مجازی به فراخوانیهای مستقیم حدسی (speculative). بر اساس تحلیل گراف وراثت نوعها، برای یک فراخوانی مشخص مجموعهای از مقصدهای احتمالی تعیین میشود. اگر این مجموعه کوچک باشد، ترجیحاً با اندازهٔ ۱، فراخوانی به یک عبارت شرطی تبدیل میشود که بین فراخوانی مستقیم و غیرمستقیم تصمیمگیری میکند. فراخوانیهای حدسی بهینهسازیهای بیشتری مانند درونخطیسازی (inlining) را امکانپذیر میسازند. چنانچه پس از بهینهسازیهای بیشتر بیفایده به نظر برسند، دوباره به شکل اولیه برگردانده میشوند.
- -fdevirtualize-at-ltrans
- ارسال جریان دادههای اضافی مورد نیاز برای غیرمجازیسازی تهاجمی هنگام اجرای بهینهساز زمان پیوند در حالت تبدیل محلی (local transformation mode). این گزینه غیرمجازیسازیهای بیشتری را امکانپذیر میکند اما اندازهٔ دادههای ارسالشده را بهطور چشمگیری افزایش میدهد. به همین دلیل بهطور پیشفرض غیرفعال است.
- -fexpensive-optimizations
- انجام
تعدادی از
بهینهسازیهای
جزئی که از
نظر
محاسباتی
نسبتاً
هزینهبر
هستند.
در سطوح -O2، -O3 و -Os فعال میشود.
- -free
- تلاش برای
حذف
دستورالعملهای
گسترش (extension)
زائد. این
قابلیت
بهویژه
برای
معماری x86-64
مفید است که
پس از نوشتن
در نیمهٔ ۳۲
بیتی
پایینی
ثباتهای
۶۴ بیتی،
بهطور
ضمنی گسترش
با صفر (zero-extend)
انجام
میدهد.
برای معماریهای Alpha، AArch64، LoongArch، PowerPC، RISC-V، SPARC، h83000 و x86 در سطوح -O2، -O3 و -Os فعال است.
- -fno-lifetime-dse
- در C++ مقدار یک شیء تنها تحت تأثیر تغییراتی است که درون دورهٔ حیات آن رخ میدهد: هنگامی که سازنده آغاز میشود، شیء دارای مقداری نامعین است و هرگونه تغییر در طول حیات شیء، با تخریب آن مرده (بیاثر) محسوب میشود. بهطور معمول حذف ذخیرهسازیهای مرده (DSE) از این ویژگی بهره میبرد؛ اگر کد شما به ماندگاری مقدار حافظهٔ شیء فراتر از طول حیات آن متکی است، میتوانید از این پرچم برای غیرفعال کردن این بهینهسازی استفاده کنید. برای حفظ ذخیرهسازیهای قبل از شروع سازنده (برای مثال اگر operator new شما حافظهٔ شیء را پاکسازی میکند) اما همچنان مرده تلقی کردن شیء پس از مخرب، میتوانید از -flifetime-dse=1 استفاده کنید. رفتار پیشفرض را میتوان بهطور صریح با -flifetime-dse=2 مشخص کرد. پرچم -flifetime-dse=0 معادل -fno-lifetime-dse است..IP -flive-range-shrinkage 4 تلاش برای کاهش فشار ثبات از طریق کوچکسازی دامنه حیات ثبات (live range shrinkage). این گزینه برای پردازندههای سریع با مجموعه ثباتهای کوچک یا متوسط مفید است.
- -fira-algorithm=algorithm
- استفاده از الگوریتم رنگآمیزی مشخصشده برای تخصیصدهنده یکپارچه ثبات (IRA). آرگومان algorithm میتواند priority باشد که رنگآمیزی اولویتی Chow را تعیین میکند، یا CB باشد که رنگآمیزی Chaitin-Briggs را مشخص میسازد. رنگآمیزی Chaitin-Briggs برای همه معماریها پیادهسازی نشده است، اما برای اهدافی که از آن پشتیبانی میکنند پیشفرض است، زیرا کد بهتری تولید میکند.
- -fira-region=region
- استفاده از ناحیههای مشخصشده برای تخصیصدهنده یکپارچه ثبات. آرگومان region باید یکی از موارد زیر باشد:
- all
- استفاده از تمام حلقهها به عنوان ناحیههای تخصیص ثبات. این گزینه میتواند بهترین نتایج را برای ماشینهایی با مجموعه ثباتهای کوچک یا نامنظم ارائه دهد.
- mixed
- استفاده از تمام حلقهها به جز حلقههایی با فشار ثبات کم به عنوان ناحیهها. این مقدار معمولاً در اکثر موارد و برای بیشتر معماریها بهترین نتایج را ارائه میدهد و هنگام کامپایل با بهینهسازی برای سرعت (-O، -O2 و...) به طور پیشفرض فعال است.
- one
- استفاده از تمام توابع به عنوان یک ناحیه واحد. این گزینه معمولاً به کوچکترین اندازه کد منجر میشود و به طور پیشفرض برای -Os یا -O0 فعال است.
- -fira-hoist-pressure
- استفاده از
IRA برای
ارزیابی
فشار ثبات
در گذر
بالابردن
کد (code hoisting pass) جهت
تصمیمگیری
برای بالا
بردن
عبارات. این
گزینه
معمولاً
منجر به کد
کوچکتری
میشود،
اما
میتواند
سرعت
کامپایلر
را کاهش
دهد.
این گزینه در سطح -Os برای همه اهداف فعال است.
- -fira-loop-pressure
- استفاده از
IRA برای
ارزیابی
فشار ثبات
در حلقهها
جهت
تصمیمگیری
در مورد
انتقال
عبارات
نامتغیر
حلقه (loop invariants).
این گزینه
معمولاً به
تولید کدی
سریعتر و
کوچکتر در
ماشینهایی
با
فایلهای
ثبات بزرگ
(بزرگتر یا
مساوی ۳۲
ثبات) منجر
میشود،
اما
میتواند
سرعت
کامپایلر
را کاهش
دهد.
این گزینه در سطح -O3 برای برخی اهداف فعال است.
- -fno-ira-share-save-slots
- غیرفعال کردن اشتراکگذاری شکافهای پشته که برای ذخیره ثباتهای سختافزاری call-used زنده در طول یک فراخوانی استفاده میشوند. هر ثبات سختافزاری یک شکاف پشته جداگانه دریافت میکند و در نتیجه فریمهای پشته توابع بزرگتر میشوند.
- -fno-ira-share-spill-slots
- غیرفعال کردن اشتراکگذاری شکافهای پشته تخصیصیافته به شبهثباتها (pseudo-registers). هر شبهثباتی که ثبات سختافزاری دریافت نکند، یک شکاف پشته جداگانه میگیرد و در نتیجه فریمهای پشته توابع بزرگتر میشوند.
- -flra-remat
- فعال کردن
بازتولید
حساس به CFG در
LRA. بهجای
بارگذاری
مقادیر
شبهثباتهای
سرریز شده
(spilled)، LRA در صورت
سودمند
بودن تلاش
میکند تا
مقادیر را
دوباره
بازتولید
(محاسبه
مجدد) کند.
در سطوح -O2، -O3 و -Os فعال است.
- -fdelayed-branch
- در صورت
پشتیبانی
در ماشین
هدف، تلاش
برای
بازآرایی
دستورالعملها
جهت
بهرهبرداری
از
شکافهای
دستورالعمل
موجود پس از
دستورالعملهای
پرش با
تاخیر (delayed branch).
در سطوح -O1، -O2، -O3 و -Os فعال است، اما در -Og فعال نیست.
- -fschedule-insns
- در صورت
پشتیبانی
در ماشین
هدف، تلاش
برای
بازآرایی
دستورالعملها
به منظور
حذف
توقفهای
اجرایی
ناشی از در
دسترس
نبودن
دادههای
مورد نیاز.
این به
ماشینهایی
که
دستورالعملهای
بارگذاری
حافظه یا
ممیز شناور
کُندی
دارند با
صدور سایر
دستورالعملها
تا زمان
آماده شدن
نتیجه
بارگذاری
یا
دستورالعمل
ممیز شناور
کمک میکند.
بهطور سنتی در سطوح بهینهسازی -O2 و -O3 فعال است. با این حال، بسیاری از اهداف این رفتار را لغو میکنند. برای مثال، در x86 در تمام سطوح غیرفعال است، در حالی که در AArch64 تنها در -O3 فعال است.
- -fschedule-insns2
- مشابه با
-fschedule-insns، اما
درخواست یک
گذر اضافی
برای
زمانبندی
دستورالعملها
پس از انجام
تخصیص ثبات
را میدهد.
این گزینه
بهویژه در
ماشینهایی
با تعداد
نسبتاً کمی
ثبات و در
شرایطی که
دستورالعملهای
بارگذاری
حافظه بیش
از یک چرخه
زمان
میبرند،
مفید است.
در سطوح -O2، -O3 و -Os فعال است.
- -fno-sched-interblock
- غیرفعال کردن زمانبندی دستورالعملها در میان بلوکهای پایه (basic blocks)، که معمولاً هنگام زمانبندی پیش از تخصیص ثبات (یعنی با -fschedule-insns یا در سطح -O2 یا بالاتر) فعال است.
- -fno-sched-spec
- غیرفعال کردن جابهجایی گمانهزنانه (speculative motion) دستورالعملهای غیربارگذاری، که معمولاً هنگام زمانبندی پیش از تخصیص ثبات (یعنی با -fschedule-insns یا در سطح -O2 یا بالاتر) فعال است.
- -fsched-pressure
- فعال کردن زمانبندی دستورالعملها با در نظر گرفتن فشار ثبات قبل از تخصیص ثبات. این گزینه تنها زمانی کاربرد دارد که زمانبندی قبل از تخصیص ثبات فعال باشد، یعنی با -fschedule-insns یا در -O2 یا بالاتر. استفاده از این گزینه میتواند با جلوگیری از افزایش فشار ثبات به بیش از تعداد ثباتهای سختافزاری موجود و جلوگیری از سرریزهای بعدی در تخصیص ثبات، کد تولیدشده را بهبود بخشیده و اندازه آن را کاهش دهد.
- -fsched-spec-load
- اجازه دادن به جابهجایی گمانهزنانه برخی از دستورالعملهای بارگذاری. این گزینه تنها زمانی کاربرد دارد که زمانبندی پیش از تخصیص ثبات فعال باشد، یعنی با -fschedule-insns یا در -O2 یا بالاتر.
- -fsched-spec-load-dangerous
- اجازه دادن به جابهجایی گمانهزنانه دستورالعملهای بارگذاری بیشتر. این گزینه تنها زمانی کاربرد دارد که زمانبندی پیش از تخصیص ثبات فعال باشد، یعنی با -fschedule-insns یا در -O2 یا بالاتر.
- -fsched-stalled-insns
- -fsched-stalled-insns=n
- تعیین این که چه تعداد دستورالعمل (در صورت وجود) میتوانند در طول گذر دوم زمانبندی، پیش از موعد از صف دستورالعملهای متوقفشده به فهرست آماده منتقل شوند. -fno-sched-stalled-insns به این معنی است که هیچ دستورالعملی پیش از موعد جابهجا نمیشود، و -fsched-stalled-insns=0 به این معنی است که هیچ محدودیتی برای انتقال زودهنگام دستورالعملهای صفبندیشده وجود ندارد. -fsched-stalled-insns بدون مقدار معادل با -fsched-stalled-insns=1 است.
- -fsched-stalled-insns-dep
- -fsched-stalled-insns-dep=n
- تعیین این که چند گروه دستورالعمل (چرخه) برای بررسی وابستگی به دستورالعمل متوقفشدهای که نامزد حذف زودهنگام از صف دستورالعملهای متوقفشده است، ارزیابی شوند. این گزینه فقط در گذر دوم زمانبندی و تنها در صورتی که -fsched-stalled-insns استفاده شده باشد مؤثر است. -fno-sched-stalled-insns-dep معادل با -fsched-stalled-insns-dep=0 است. -fsched-stalled-insns-dep بدون مقدار معادل با -fsched-stalled-insns-dep=1 است.
- -fsched2-use-superblocks
- هنگام
زمانبندی
پس از تخصیص
ثبات، از
زمانبندی
سوپربلوک
(superblock) استفاده
میکند. این
کار
جابهجایی
در میان
مرزهای
بلوک پایه
را مجاز
میسازد و
به
زمانبندیهای
سریعتری
منجر
میشود. این
گزینه
آزمایشی
است، زیرا
همه
توصیفهای
ماشین مورد
استفاده در
GCC پردازنده
را به
اندازه
کافی دقیق
مدلسازی
نمیکنند
تا از نتایج
نامطمئن
الگوریتم
جلوگیری
شود.
این گزینه تنها زمانی معنادار است که زمانبندی پس از تخصیص ثبات فعال باشد، یعنی با -fschedule-insns2 یا در -O2 یا بالاتر.
- -fsched-group-heuristic
- فعالسازی روش اکتشافی گروهی در زمانبند. این روش اکتشافی به دستورالعملی که به یک گروه زمانبندی تعلق دارد اولویت میدهد. این گزینه به طور پیشفرض هنگام فعال بودن زمانبندی، یعنی با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر، فعال است.
- -fsched-critical-path-heuristic
- فعالسازی روش اکتشافی مسیر بحرانی در زمانبند. این روش اکتشافی به دستورالعملهای روی مسیر بحرانی اولویت میدهد. این گزینه به طور پیشفرض هنگام فعال بودن زمانبندی، یعنی با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر، فعال است.
- -fsched-spec-insn-heuristic
- فعالسازی روش اکتشافی دستورالعملهای گمانهزنانه در زمانبند. این روش اکتشافی به دستورالعملهای گمانهزنانه با ضعف وابستگی بیشتر اولویت میدهد. این گزینه به طور پیشفرض هنگام فعال بودن زمانبندی، یعنی با -fschedule-insns یا -fschedule-insns2 یا در -O2 یا بالاتر، فعال است..IP -fsched-rank-heuristic 4 روش ابتکاری رتبه (rank heuristic) را در زمانبند فعال میکند. این روش ابتکاری دستوری را ترجیح میدهد که به یک بلوک پایه (basic block) با اندازه یا بسامد بزرگتر تعلق دارد. این گزینه بهطور پیشفرض با فعال بودن زمانبندی (یعنی همراه با -fschedule-insns یا -fschedule-insns2 یا در سطح -O2 یا بالاتر) فعال است.
- -fsched-last-insn-heuristic
- روش ابتکاری آخرین دستورالعمل (last-instruction heuristic) را در زمانبند فعال میکند. این روش ابتکاری دستوری را ترجیح میدهد که وابستگی کمتری به آخرین دستور زمانبندیشده داشته باشد. این گزینه بهطور پیشفرض با فعال بودن زمانبندی (یعنی با -fschedule-insns یا -fschedule-insns2 یا در سطح -O2 یا بالاتر) فعال است.
- -fsched-dep-count-heuristic
- روش ابتکاری تعداد وابستگیها (dependent-count heuristic) را در زمانبند فعال میکند. این روش ابتکاری دستوری را ترجیح میدهد که دستورالعملهای بیشتری به آن وابسته باشند. این گزینه بهطور پیشفرض با فعال بودن زمانبندی (یعنی با -fschedule-insns یا -fschedule-insns2 یا در سطح -O2 یا بالاتر) فعال است.
- -freschedule-modulo-scheduled-loops
- زمانبندی پیمانهای (modulo scheduling) پیش از زمانبندی سنتی انجام میشود. اگر حلقهای بهصورت پیمانهای زمانبندی شود، گذرهای بعدی زمانبندی ممکن است زمانبندی آن را تغییر دهند. از این گزینه برای کنترل این رفتار استفاده کنید.
- -fselective-scheduling
- دستورالعملها را با استفاده از الگوریتم زمانبندی انتخابی (selective scheduling) زمانبندی میکند. زمانبندی انتخابی بهجای اولین گذر زمانبند اجرا میشود.
- -fselective-scheduling2
- دستورالعملها را با استفاده از الگوریتم زمانبندی انتخابی زمانبندی میکند. زمانبندی انتخابی بهجای دومین گذر زمانبند اجرا میشود.
- -fsel-sched-pipelining
- خطلولهسازی نرمافزاری (software pipelining) درونیترین حلقهها را در حین زمانبندی انتخابی فعال میکند. این گزینه هیچ اثری ندارد مگر اینکه یکی از گزینههای -fselective-scheduling یا -fselective-scheduling2 فعال باشد.
- -fsel-sched-pipelining-outer-loops
- هنگام خطلولهسازی حلقهها در زمانبندی انتخابی، حلقههای بیرونی را نیز خطلولهسازی میکند. این گزینه هیچ اثری ندارد مگر اینکه -fsel-sched-pipelining فعال باشد.
- -fsemantic-interposition
- برخی از قالبهای اشیاء، مانند ELF، اجازهٔ بازتعریف یا مداخله در نمادها (interposing of symbols) را توسط پیونددهندهٔ پویا میدهند. این بدان معناست که برای نمادهای صادرشده از DSO، کامپایلر نمیتواند انتشار بینرویهای (interprocedural propagation)، درونخطیسازی (inlining) و سایر بهینهسازیها را با این فرض انجام دهد که ممکن است تابع یا متغیر مربوطه تغییر کند. هرچند این ویژگی مفید است (بهعنوان مثال برای بازنویسی توابع تخصیص حافظه توسط پیادهسازی عیبیابی)، اما از نظر کیفیت کد پرهزینه است. با -fno-semantic-interposition کامپایلر فرض میکند در صورتی که مداخلهای برای توابع رخ دهد، تابع بازنویسیکننده دقیقاً همان معناشناسی (و اثرات جانبی) را خواهد داشت. به همین ترتیب، اگر مداخله برای متغیرها رخ دهد، سازندهٔ (constructor) متغیر یکسان خواهد بود. این پرچم روی توابعی که صراحتاً بهصورت inline اعلام شدهاند (که در آنها مداخله هرگز مجاز به تغییر معناشناسی نیست) و برای نمادهایی که صراحتاً بهصورت weak اعلام شدهاند، هیچ اثری ندارد.
- -fshrink-wrap
- مقدمهٔ توابع (prologues) را فقط قبل از بخشهایی از تابع که به آن نیاز دارند درج میکند، نه در ابتدای تابع. این پرچم بهطور پیشفرض در سطوح -O و بالاتر فعال است.
- -fshrink-wrap-separate
- بخشهای مجزای مقدمه (prologue) و مؤخره (epilogue) را بهطور جداگانه بستهبندی انقباضی (shrink-wrap) میکند، بهگونهای که آن بخشها تنها در صورت نیاز اجرا شوند. این گزینه بهطور پیشفرض فعال است، اما هیچ اثری ندارد مگر اینکه -fshrink-wrap نیز فعال باشد و معماری مقصد از آن پشتیبانی کند.
- -fcaller-saves
- تخصیص
مقادیر به
ثباتهایی
(registers) که با
فراخوانی
توابع
بازنویسی
میشوند (clobbered)
را با درج
دستورالعملهای
اضافه برای
ذخیره و
بازیابی
ثباتها در
اطراف چنین
فراخوانیهایی
فعال
میکند.
چنین
تخصیصی
تنها زمانی
انجام
میشود که
به نظر برسد
به تولید کد
بهتری منجر
خواهد شد.
این گزینه در برخی ماشینها بهطور پیشفرض همواره فعال است؛ معمولاً آنهایی که ثباتهای حفظشده در فراخوانی (call-preserved registers) برای استفادهٔ جایگزین ندارند.
در سطوح -O2، -O3 و -Os فعال است.
- -fcombine-stack-adjustments
- تعدیلهای
پشته (pushها و
popها) و
ارجاعات
حافظهٔ
پشته را
ردیابی
کرده و سپس
تلاش
میکند
راههایی
برای ترکیب
آنها
بیابد.
بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-ra
- از
ثباتهای
caller-save برای
تخصیص
استفاده
میکند، در
صورتی که آن
ثباتها
توسط
هیچیک از
توابع
فراخوانیشده
استفاده
نشده باشند.
در این صورت
نیازی به
ذخیره و
بازیابی
آنها در
اطراف
فراخوانیها
نیست. این
کار تنها در
صورتی
امکانپذیر
است که
توابع
فراخوانیشده
بخشی از
همان واحد
ترجمه (compilation unit)
تابع جاری
بوده و پیش
از آن
کامپایل
شده باشند.
در سطوح -O2، -O3 و -Os فعال است، با این حال اگر کد تولیدشده برای پروفایلسازی نشانهگذاری (instrument) شود (-p یا -pg) یا اگر میزان استفادهٔ تابع فراخوانیشده (callee) از ثباتها دقیقاً مشخص نباشد (این مورد در مقصدهایی رخ میدهد که مقدمهها و مؤخرهها را در RTL آشکار نمیکنند)، این گزینه غیرفعال میشود.
- -fconserve-stack
- تلاش برای کمینهسازی مصرف پشته. کامپایلر تلاش میکند از فضای پشتهٔ کمتری استفاده کند، حتی اگر این کار باعث کندتر شدن برنامه شود. این گزینه به معنی تنظیم پارامتر large-stack-frame روی 100 و پارامتر large-stack-frame-growth روی 400 است.
- -ftree-reassoc
- انجام بازپیوستهسازی (reassociation) روی درختها. این پرچم بهطور پیشفرض در سطوح -O1 و بالاتر فعال است.
- -fcode-hoisting
- انجام بالاکشی کد (code hoisting). بالاکشی کد تلاش میکند ارزیابی عبارتهایی را که در تمام مسیرهای منتهی به خروج تابع اجرا میشوند، در اولین فرصت ممکن انجام دهد. این بهینهسازی بهویژه برای کاهش اندازهٔ کد مفید است، اما اغلب به سرعت اجرای کد نیز کمک میکند. این پرچم بهطور پیشفرض در سطوح -O2 و بالاتر فعال است.
- -ftree-pre
- انجام حذف حشو جزئی (PRE) روی درختها. این پرچم بهطور پیشفرض در سطوح -O2 و -O3 فعال است.
- -ftree-partial-pre
- تهاجمیتر کردن فرایند حذف حشو جزئی (PRE). این پرچم بهطور پیشفرض در -O3 فعال است.
- -ftree-forwprop
- انجام انتشار روبهجلو (forward propagation) روی درختها. این پرچم بهطور پیشفرض در سطوح -O1 و بالاتر فعال است.
- -ftree-fre
- انجام حذف حشو کامل (FRE) روی درختها. تفاوت بین FRE و PRE در این است که FRE تنها عبارتهایی را در نظر میگیرد که در تمام مسیرهای منتهی به محاسبهٔ حشو، محاسبه میشوند. این تحلیل سریعتر از PRE است، هرچند حشوهای کمتری را کشف میکند. این پرچم بهطور پیشفرض در سطوح -O1 و بالاتر فعال است.
- -ftree-phiprop
- انجام بالاکشی بارگذاریها (loads) از اشارهگرهای شرطی روی درختها. این گذر بهطور پیشفرض در سطوح -O1 و بالاتر فعال است.
- -fhoist-adjacent-loads
- بالاکشی گمانهزنانهٔ بارگذاریها از هر دو شاخهٔ یک ساختار if-then-else در صورتی که بارگذاریها از مکانهای مجاور در یک ساختار مشترک باشند و معماری مقصد دارای دستور انتقال شرطی (conditional move) باشد. این پرچم بهطور پیشفرض در سطوح -O2 و بالاتر فعال است.
- -ftree-copy-prop
- انجام انتشار کپی (copy propagation) روی درختها. این گذر عملیات کپی غیرضروری را حذف میکند. این پرچم بهطور پیشفرض در سطوح -O1 و بالاتر فعال است.
- -fipa-pure-const
- شناسایی اینکه کدام توابع سره (pure) یا ثابت (constant) هستند. بهطور پیشفرض در سطوح -O1 و بالاتر فعال است.
- -fipa-reference
- شناسایی متغیرهای ایستایی (static) که از واحد ترجمه (compilation unit) خارج نمیشوند. بهطور پیشفرض در سطوح -O1 و بالاتر فعال است.
- -fipa-reference-addressable
- شناسایی متغیرهای ایستای (static) فقطخواندنی، فقطنوشتنی و غیرقابلآدرسدهی. بهطور پیشفرض در سطوح -O1 و بالاتر فعال است.
- -fipa-reorder-for-locality
- دستهبندی زنجیرههای فراخوانی نزدیک به یکدیگر در چیدمان فایل دودویی (binary layout) به منظور بهبود محلیسازی کد و کمینهسازی فواصل پرش بین توابعی که مکرراً فراخوانی میشوند. برخلاف -freorder-functions، این گذر زنجیرههای فراخوانی بین توابع را در نظر گرفته و آنها را گروهبندی میکند، بهجای اینکه تمام توابع داغ/عادی/سرد/هرگز اجرا نشده را در بخشهای جداگانه قرار دهد. برخلاف -fprofile-reorder-functions، این گزینه بهبود محلیسازی کد در کل زمان اجرای برنامه را هدف قرار میدهد نه اینکه تنها بر راهاندازی برنامه تمرکز کند. این گزینه با مشخص کردن صریح گزینهٔ -flto-partition= ناسازگار است، زیرا یک طرح پارتیشنبندی سفارشی را تحمیل میکند. در صورت استفاده از این گزینه، استفاده از بازخورد پروفایل (profile feedback) نیز توصیه میشود، اما در غیر این صورت این گزینه بهطور پیشفرض فعال نیست.
- -fipa-stack-alignment
- کاهش تراز پشته (stack alignment) در محلهای فراخوانی در صورت امکان. بهطور پیشفرض فعال است..IP -fipa-pta 4 تحلیل اشارهگر بینپرویهای و تحلیل تغییر و ارجاع بینپرویهای را انجام میدهد. این گزینه میتواند در واحدهای ترجمه بزرگ باعث مصرف بیش از حد حافظه و زمان کامپایل شود. این گزینه بهطور پیشفرض در هیچ سطح بهینهسازی فعال نیست.
- -fipa-profile
- انتشار پروفایل بینپرویهای را انجام میدهد. توابعی که فقط از توابع سرد (cold) فراخوانی میشوند به عنوان سرد علامتگذاری میشوند. همچنین توابعی که یک بار اجرا میشوند (مانند "cold"، "noreturn"، سازندهها یا ویرانکنندههای ایستا) شناسایی میشوند. سپس توابع سرد و بخشهای بدون حلقه از توابعی که یک بار اجرا میشوند برای اندازه بهینهسازی میشوند. بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-modref
- تحلیل mod/ref بینپرویهای را انجام میدهد. این بهینهسازی اثرات جانبی توابع (مکانهایی از حافظه که تغییر یافته یا به آنها ارجاع شده است) را تحلیل کرده و بهینهسازی بهتری را در مرز فراخوانی توابع ممکن میسازد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fipa-cp
- انتشار ثوابت بینپرویهای را انجام میدهد. این بهینهسازی برنامه را تحلیل میکند تا مشخص شود چه زمانی مقادیر ارسالشده به توابع ثابت هستند و سپس بر این اساس بهینهسازی میکند. اگر برنامه مقادیر ثابتی داشته باشد که به توابع ارسال میشوند، این بهینهسازی میتواند کارایی را بهطور چشمگیری افزایش دهد. این پرچم بهطور پیشفرض در -O2، -Os و -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile نیز فعال میشود.
- -fipa-cp-clone
- همتاسازی تابع (function cloning) را برای قویتر کردن انتشار ثوابت بینپرویهای انجام میدهد. در صورت فعال بودن، زمانی که یک تابعِ از نظر بیرونی قابل مشاهده بتواند با آرگومانهای ثابت فراخوانی شود، انتشار ثوابت بینپرویهای همتاسازی تابع را انجام میدهد. از آنجا که این بهینهسازی میتواند چندین رونوشت از توابع ایجاد کند، ممکن است اندازه کد را بهطور چشمگیری افزایش دهد (ببینید --param ipa-cp-unit-growth=value). این پرچم بهطور پیشفرض در -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile نیز فعال میشود.
- -fipa-bit-cp
- در صورت فعال بودن، انتشار ثوابت بیتی بینپرویهای را انجام میدهد. این پرچم بهطور پیشفرض در -O2 و توسط -fprofile-use و -fauto-profile فعال میشود. این پرچم مستلزم فعال بودن -fipa-cp است.
- -fipa-vrp
- در صورت فعال بودن، انتشار بینپرویهای محدودههای مقادیر را انجام میدهد. این پرچم بهطور پیشفرض در -O2 فعال است. مستلزم این است که -fipa-cp فعال باشد.
- -fipa-icf
- ادغام
کدهای
همسان (Identical Code Folding)
را برای
توابع و
متغیرهای
فقطخواندنی
انجام
میدهد. این
بهینهسازی
اندازه کد
را کاهش
میدهد و
ممکن است با
جایگزین
کردن یک
تابع با
تابعی
معادل با
نامی
متفاوت،
پشتههای
بازپیچی (unwind stacks)
را مختل
کند. این
بهینهسازی
در صورت
فعال بودن
بهینهسازی
زمان پیوند
با اثربخشی
بیشتری کار
میکند.
اگرچه این رفتار مشابه بهینهسازی ICF در پیونددهنده Gold است، اما ICF در GCC در سطوح متفاوتی کار میکند و بنابراین این بهینهسازیها یکسان نیستند - همارزیهایی وجود دارند که فقط توسط GCC یافت میشوند و همارزیهایی که فقط توسط Gold پیدا میشوند.
این پرچم بهطور پیشفرض در -O2 و -Os فعال است.
- -flate-combine-instructions
- دو گذر
ترکیب
دستورالعمل
را که
نسبتاً در
اواخر
فرایند
کامپایل
اجرا
میشوند،
فعال
میکند. یکی
از گذرها
پیش از
تخصیص ثبات
و دیگری پس
از تخصیص
ثبات اجرا
میشود. هدف
اصلی این
گذرها،
جایگزین
کردن
تعاریف در
تمام موارد
استفاده
است.
بیشتر اهداف این پرچم را بهطور پیشفرض در -O2 و -Os فعال میکنند.
- -flive-patching=level
- بهینهسازیهای
GCC را برای
تولید
خروجی
مناسب
وصلهزنی
زنده (live-patching)
کنترل
میکند.
اگر بهینهسازی کامپایلر از بدنه یک تابع یا اطلاعات استخراجشده از بدنه آن برای بهینهسازی/تغییر تابعی دیگر استفاده کند، تابع دوم یک تابع تحت تأثیر از تابع اول نامیده میشود. اگر تابعی وصله شود، توابع تحت تأثیر آن نیز باید وصله شوند.
توابع تحت تأثیر توسط بهینهسازیهای بینپرویهای کامپایلر تعیین میشوند. برای مثال، هنگامی که تابعی درون فراخوانندهاش جایگذاری درونخطی میشود، تابعی همتاسازی میشود و فراخوانندهاش برای فراخوانی این رونوشتِ همتا تغییر مییابد، یا اطلاعات خلوص/ثابت بودن (pureness/constness) یک تابع برای بهینهسازی فراخوانندههای مستقیم یا غیرمستقیم آن استخراج میشود و غیره، فراخواننده تحت تأثیر قرار میگیرد.
معمولاً هر چه بهینهسازیهای IPA بیشتری فعال باشند، تعداد توابع تحت تأثیر برای هر تابع بیشتر میشود. بهمنظور کنترل تعداد توابع تحت تأثیر و محاسبه آسانتر فهرست توابع تحت تأثیر، بهینهسازیهای IPA را میتوان تا حدی در دو سطح مختلف فعال کرد.
آرگومان level باید یکی از موارد زیر باشد:
- inline-clone
- فقط
بهینهسازیهای
جایگذاری
درونخطی و
همتاسازی
را فعال
میکند که
شامل
درونخطیسازی،
همتاسازی،
جایگزینی
اسکالر
تجمعی
بینپرویهای
و
درونخطیسازی
جزئی است.
در نتیجه،
هنگام
وصلهزنی
یک تابع،
تمام
فراخوانندههای
آن و
فراخوانندههای
همتاهای آن
تحت تأثیر
قرار
میگیرند و
بنابراین
باید آنها
نیز وصله
شوند.
-flive-patching=inline-clone پرچمهای بهینهسازی زیر را غیرفعال میکند: -fwhole-program -fipa-pta -fipa-reference -fipa-ra -fipa-icf -fipa-icf-functions -fipa-icf-variables -fipa-bit-cp -fipa-vrp -fipa-pure-const -fipa-reference-addressable -fipa-stack-alignment -fipa-modref
- inline-only-static
- فقط
جایگذاری
درونخطی
توابع
ایستا (static) را
فعال
میکند. در
نتیجه،
هنگام
وصلهزنی
یک تابع
ایستا،
تمام
فراخوانندههای
آن تحت
تأثیر قرار
میگیرند و
بنابراین
باید آنها
نیز وصله
شوند.
علاوه بر تمام پرچمهایی که توسط -flive-patching=inline-clone غیرفعال میشوند، -flive-patching=inline-only-static این پرچمهای بهینهسازی اضافی را نیز غیرفعال میکند: -fipa-cp-clone -fipa-sra -fpartial-inlining -fipa-cp
زمانی که -flive-patching بدون مقدار مشخص شود، مقدار پیشفرض inline-clone است.
این پرچم بهطور پیشفرض غیرفعال است.
توجه داشته باشید که -flive-patching به همراه بهینهسازی زمان پیوند (-flto) پشتیبانی نمیشود.
- -fisolate-erroneous-paths-dereference
- مسیرهایی را شناسایی میکند که به دلیل ارجاعزدایی از یک اشارهگر تهی (null pointer)، رفتاری نادرست یا تعریفنشده ایجاد میکنند. آن مسیرها را از جریان اصلی کنترل جدا کرده و دستور دارای رفتار نادرست یا تعریفنشده را به یک تله (trap) تبدیل میکند. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است و به فعال بودن -fdelete-null-pointer-checks نیز وابسته است.
- -fisolate-erroneous-paths-attribute
- مسیرهایی را شناسایی میکند که به دلیل استفاده از یک مقدار تهی به شیوهای که توسط یک صفت "returns_nonnull" یا "nonnull" منع شده است، رفتاری نادرست یا تعریفنشده ایجاد میکنند. آن مسیرها را از جریان اصلی کنترل جدا کرده و دستور دارای رفتار نادرست یا تعریفنشده را به یک تله تبدیل میکند. این گزینه در حال حاضر فعال نیست، اما ممکن است در آینده توسط -O2 فعال شود.
- -ftree-sink
- انتقال رو به جلوی ذخیرهسازی (forward store motion) را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-bit-ccp
- انتشار ثوابت بیتی شرطی تنک را روی درختها انجام داده و اطلاعات تراز اشارهگر را منتشر میکند. این گذر تنها روی متغیرهای اسکالر محلی عمل میکند و بهطور پیشفرض در -O1 و بالاتر، به جز -Og، فعال است. مستلزم این است که -ftree-ccp فعال باشد.
- -ftree-ccp
- انتشار ثوابت شرطی تنک (CCP) را روی درختها انجام میدهد. این گذر تنها روی متغیرهای اسکالر محلی عمل میکند و بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fssa-backprop
- اطلاعات مربوط به موارد استفاده یک مقدار را به بالای زنجیره تعریف منتشر میکند تا تعاریف سادهسازی شوند. برای مثال، اگر علامت یک مقدار هرگز اهمیتی نداشته باشد، این گذر عملیات علامت را حذف میکند. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fssa-phiopt
- تطبیق الگو را روی گرههای PHI در SSA انجام میدهد تا کد شرطی بهینهسازی شود. این گذر بهطور پیشفرض در -O1 و بالاتر، به جز -Og، فعال است.
- -ftree-switch-conversion
- تبدیل مقداردهیهای اولیه ساده در یک دستور switch را به مقداردهیهای اولیه از یک آرایه اسکالر انجام میدهد. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است.
- -ftree-tail-merge
- به دنبال توالیهای کد همسان میگردد. در صورت یافت شدن، یکی را با پرشی به دیگری جایگزین میکند. این بهینهسازی به ادغام دم (tail merging) یا پرش متقاطع (cross jumping) معروف است. این پرچم بهطور پیشفرض در -O2 و بالاتر فعال است. زمان کامپایل در این گذر را میتوان با استفاده از پارامتر max-tail-merge-comparisons و پارامتر max-tail-merge-iterations محدود کرد..IP -ftree-cselim 4 حذف ذخیرهسازی شرطی (conditional store elimination) را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر روی مقصدهایی که دارای دستورالعملهای انتقال شرطی هستند فعال است.
- -ftree-dce
- حذف کد مرده (DCE) را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-builtin-call-dce
- حذف کد مردهٔ (DCE) شرطی را برای فراخوانیهای توابع توکار (built-in) که ممکن است "errno" را مقداردهی کنند ولی در غیر این صورت فاقد اثر جانبی هستند، انجام میدهد. این پرچم بهطور پیشفرض در -O2 و بالاتر، در صورتی که -Os نیز مشخص نشده باشد، فعال است.
- -ffinite-loops
- فرض میکند
حلقهای که
دارای خروج
است،
سرانجام از
حلقه خارج
خواهد شد و
تا ابد
تکرار
نمیشود.
این به
کامپایلر
اجازه
میدهد
حلقههایی
را که در
غیر این
صورت هیچ
اثر جانبی
ندارند حذف
کند، بدون
آنکه حلقه
زدن
بیپایان
احتمالی را
اثر جانبی
تلقی کند.
این گزینه بهطور پیشفرض در -O2 برای ++C با -std=c++11 یا بالاتر فعال است.
- -ftree-dominator-opts
- انواع پاکسازیهای سادهٔ اسکالر (انتشار ثابت/کپی، حذف افزونگی، انتشار بازه و سادهسازی عبارت) را بر پایهٔ پیمایش درخت تسلط (dominator tree) انجام میدهد. همچنین ریسهبندی پرش (jump threading) را برای کاهش پرش به پرشها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-dse
- حذف ذخیرهسازی مرده (DSE) را روی درختها انجام میدهد. ذخیرهسازی مرده، ذخیرهسازی در مکانی از حافظه است که بعداً بدون هیچ بارگذاری مداخلهگری، با یک ذخیرهسازی دیگر بازنویسی میشود. در این حالت میتوان ذخیرهسازی اولیه را حذف کرد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-ch
- کپی سرآیند حلقه (loop header copying) را روی درختها انجام میدهد. این کار سودمند است چرا که اثربخشی بهینهسازیهای انتقال کد را افزایش میدهد. همچنین باعث صرفهجویی در یک پرش میشود. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است. برای -Os فعال نیست، زیرا معمولاً اندازهٔ کد را افزایش میدهد.
- -ftree-loop-optimize
- بهینهسازیهای حلقه را روی درختها انجام میدهد. این پرچم بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-loop-linear
- -floop-strip-mine
- -floop-block
- بهینهسازیهای حلقههای تو در تو را انجام میدهد. همانند -floop-nest-optimize است. برای استفاده از این تبدیل کد، GCC باید با --with-isl پیکربندی شده باشد تا زیرساخت تبدیل حلقهٔ Graphite فعال شود.
- -fgraphite-identity
- تبدیل همانی را برای graphite فعال میکند. برای هر SCoP نمایش چندوجهی (polyhedral representation) تولید شده و دوباره به gimple تبدیل میشود. با استفاده از -fgraphite-identity میتوان هزینهها یا مزایای تبدیل GIMPLE -> GRAPHITE -> GIMPLE را بررسی کرد. همچنین برخی بهینهسازیهای حداقلی توسط تولیدکنندهٔ کد isl انجام میشود، مانند تفکیک نمایه و حذف کد مرده در حلقهها.
- -floop-nest-optimize
- بهینهساز حلقههای تو در تو مبتنی بر isl را فعال میکند. این یک بهینهساز عمومی حلقههای تو در تو بر پایهٔ الگوریتمهای بهینهسازی Pluto است. ساختار حلقهای را محاسبه میکند که برای محلیسازی داده و موازیسازی بهینهسازی شده باشد. این گزینه آزمایشی است.
- -floop-parallelize-all
- از تحلیل وابستگی دادهٔ Graphite برای شناسایی حلقههای قابل موازیسازی استفاده میکند. تمام حلقههایی را که پس از تحلیل مشخص شود فاقد وابستگیهای بینتکراری هستند موازی میکند، بدون آنکه سودمند بودن موازیسازی حلقهها را بررسی کند.
- -ftree-coalesce-vars
- هنگام تبدیل برنامه به خارج از نمایش SSA، تلاش میکند تا بهجای متغیرهای موقت کامپایلر، با ادغام (coalescing) نسخههای مختلف متغیرهای تعریفشده توسط کاربر کپیبرداری را کاهش دهد. این کار ممکن است توانایی اشکالزدایی برنامهای بهینهشده را که با -fno-var-tracking-assignments کامپایل شده است بهشدت محدود کند. در حالت نقیض، این پرچم از ادغام متغیرهای کاربر در SSA جلوگیری میکند. این گزینه در صورت فعال بودن بهینهسازی، بهطور پیشفرض فعال است و در غیر این صورت کار چندانی انجام نمیدهد.
- -ftree-loop-if-convert
- تلاش میکند پرشهای شرطی را در درونیترین حلقهها به معادلهای بدون انشعاب تبدیل کند. هدف، حذف جریان کنترل از درونیترین حلقهها به منظور بهبود توانایی گذر بردارسازی (vectorization pass) در رسیدگی به این حلقهها است. این گزینه در صورت فعال بودن بردارسازی، بهطور پیشفرض فعال است.
- -ftree-loop-distribution
- توزیع حلقه
(loop distribution) را
انجام
میدهد. این
پرچم
میتواند
کارایی
حافظهٔ
نهان (cache) را
روی بدنهٔ
حلقههای
بزرگ بهبود
بخشیده و
امکان
انجام
بهینهسازیهای
بیشتر
حلقه،
مانند
موازیسازی
یا
بردارسازی
را فراهم
کند. برای
نمونه،
حلقهٔ
DO I = 1, N A(I) = B(I) + C D(I) = E(I) * F ENDDO
به این صورت تبدیل میشود:
DO I = 1, N A(I) = B(I) + C ENDDO DO I = 1, N D(I) = E(I) * F ENDDO
این پرچم بهطور پیشفرض در -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile نیز فعال میشود.
- -ftree-loop-distribute-patterns
- توزیع حلقه
را روی
الگوهایی
انجام
میدهد که
تولید کد
آنها
میتواند
با
فراخوانیهایی
به یک
کتابخانه
انجام شود.
این پرچم
بهطور
پیشفرض در
-O2 و
بالاتر، و
همچنین
توسط -fprofile-use و
-fauto-profile فعال
میشود.
این گذر حلقههای مقداردهی اولیه را توزیع کرده و فراخوانی به memset با مقدار صفر تولید میکند. برای نمونه، حلقهٔ
DO I = 1, N A(I) = 0 B(I) = A(I) + I ENDDO
به این صورت تبدیل شده:
DO I = 1, N A(I) = 0 ENDDO DO I = 1, N B(I) = A(I) + I ENDDO
و حلقهٔ مقداردهی اولیه به فراخوانی به memset با صفر تبدیل میشود.
- -floop-interchange
- جابهجایی
حلقه (loop interchange) را
بیرون از graphite
انجام
میدهد. این
پرچم
میتواند
کارایی
حافظهٔ
نهان را روی
حلقههای
تو در تو
بهبود
بخشیده و
امکان
انجام
بهینهسازیهای
بیشتر
حلقه،
مانند
بردارسازی
را فراهم
کند. برای
نمونه،
حلقهٔ
for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) for (int k = 0; k < N; k++) c[i][j] = c[i][j] + a[i][k]*b[k][j];به این صورت تبدیل میشود:
for (int i = 0; i < N; i++) for (int k = 0; k < N; k++) for (int j = 0; j < N; j++) c[i][j] = c[i][j] + a[i][k]*b[k][j];این پرچم بهطور پیشفرض در -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile نیز فعال میشود.
- -floop-unroll-and-jam
- تبدیلهای باز کردن و ادغام حلقه (unroll and jam) را روی حلقههای مناسب اعمال میکند. در یک حلقهٔ تو در تو، این کار حلقهٔ بیرونی را با یک ضریب مشخص باز کرده و حلقههای درونی حاصل را با یکدیگر ترکیب میکند. این پرچم بهطور پیشفرض در -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile نیز فعال میشود.
- -ftree-loop-im
- انتقال نامتغیرهای حلقه (loop invariant motion) را روی درختها انجام میدهد. این گذر تنها نامتغیرهایی را منتقل میکند که رسیدگی به آنها در سطح RTL دشوار است (فراخوانی توابع، عملیاتی که به توالیهای غیربدیهی از دستورالعملها بسط مییابند). با -funswitch-loops همچنین عملوندهای شرایطی را که نامتغیر هستند به خارج از حلقه منتقل میکند تا بتوان صرفاً از تحلیل سادهٔ نامتغیر بودن در جابهجایی شرط حلقه (loop unswitching) استفاده کرد. این گذر انتقال ذخیرهسازی را نیز شامل میشود..IP -ftree-loop-ivcanon 4 ایجاد یک شمارنده کانونیکال برای تعداد تکرارها در حلقههایی که تعیین تعداد تکرار آنها نیازمند تحلیل پیچیده است. بهینهسازیهای بعدی پس از آن میتوانند این تعداد را به سادگی تعیین کنند. این گزینه بهویژه در ارتباط با باز کردن حلقه (unrolling) سودمند است.
- -ftree-scev-cprop
- انجام جایگزینی مقدار نهایی. اگر متغیری در یک حلقه به گونهای تغییر یابد که مقدار آن هنگام خروج از حلقه تنها با استفاده از مقدار اولیه و تعداد تکرارهای حلقه قابل تعیین باشد، استفادهها از مقدار نهایی را با چنین محاسباتی جایگزین میکند، مشروط بر اینکه هزینه محاسباتی آن به اندازه کافی کم باشد. این کار وابستگیهای دادهای را کاهش داده و ممکن است امکان سادهسازیهای بیشتری را فراهم آورد. این گزینه بهطور پیشفرض در -O1 و بالاتر فعال است.
- -fivopts
- انجام بهینهسازیهای متغیر القایی (کاهش توان محاسباتی [strength reduction]، ادغام متغیر القایی و حذف متغیر القایی) روی درختها. این گزینه بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-parallelize-loops=n
- موازیسازی حلقهها؛ یعنی تقسیم فضای تکرار آنها برای اجرا در n ریسه (thread). این امر تنها برای حلقههایی امکانپذیر است که تکرارهای آنها مستقل از یکدیگر بوده و بتوان آنها را بدون ترتیب خاصی بازآرایی کرد. این بهینهسازی تنها روی ماشینهای چندپردازندهای و برای حلقههایی با بار پردازشی سنگین (CPU-intensive) سودمند است، نه حلقههایی که به عنوان مثال به دلیل پهنای باند حافظه محدود شدهاند. این گزینه مستلزم -pthread است و بنابراین تنها روی مقصدهایی که از -pthread پشتیبانی میکنند کارایی دارد.
- -ftree-pta
- انجام تحلیل محلی-تابعِ اشارهگرها (points-to analysis) روی درختها. این پرچم بهطور پیشفرض در -O1 و بالاتر، به استثنای -Og، فعال است.
- -ftree-sra
- انجام جایگزینی اسکالر مجموعهها (aggregates). این گذر ارجاعات به ساختارها را با مقادیر اسکالر جایگزین میکند تا از ارسال زودهنگام ساختارها به حافظه جلوگیری کند. این پرچم بهطور پیشفرض در -O1 و بالاتر، به استثنای -Og، فعال است.
- -fstore-merging
- انجام ادغام ذخیرهسازیهای باریک در آدرسهای متوالی حافظه. این گذر، ذخیرهسازیهای متوالی مقادیر بیواسطه که باریکتر از یک کلمه (word) هستند را در ذخیرهسازیهای عریضتر و با تعداد کمتر ادغام میکند تا تعداد دستورالعملها کاهش یابد. این گزینه بهطور پیشفرض در -O2 و بالاتر و همچنین در -Os فعال است.
- -ftree-ter
- انجام جایگزینی عبارت موقت در طول فاز SSA->normal. متغیرهای موقت تکاستفاده/تکتعریف در محل استفادهشان با عبارت تعریفکننده خود جایگزین میشوند. این کار منجر به تولید کدی غیر از GIMPLE میشود، اما درختهای بسیار پیچیدهتری را در اختیار بسطدهندهها قرار میدهد که به تولید RTL بهتری میانجامد. این گزینه بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-slsr
- انجام کاهش توان محاسباتی مستقیم (straight-line strength reduction) روی درختها. این گزینه عبارتهای مرتبطِ حاوی عمل ضرب را شناسایی کرده و در صورت امکان آنها را با محاسباتی کمهزینهتر جایگزین میکند. این گزینه بهطور پیشفرض در -O1 و بالاتر فعال است.
- -ftree-vectorize
- انجام برداریسازی روی درختها. این پرچم در صورت عدم تعیین صریح، گزینههای -ftree-loop-vectorize و -ftree-slp-vectorize را فعال میکند.
- -ftree-loop-vectorize
- انجام برداریسازی حلقه روی درختها. این پرچم بهطور پیشفرض در -O2 و توسط -ftree-vectorize، -fprofile-use و -fauto-profile فعال میشود.
- -ftree-slp-vectorize
- انجام برداریسازی بلوک پایه روی درختها. این پرچم بهطور پیشفرض در -O2 و توسط -ftree-vectorize، -fprofile-use و -fauto-profile فعال میشود.
- -ftrivial-auto-var-init=choice
- مقداردهی
اولیه
متغیرهای
خودکار با
یک الگو یا
با صفر جهت
افزایش
امنیت و
پیشبینیپذیری
برنامه از
طریق
جلوگیری از
افشا و
استفاده از
حافظه
مقداردهینشده.
کامپایلر GCC
همچنان
متغیر
خودکاری را
که
مقداردهی
صریح ندارد
مقداردهینشده
در نظر
میگیرد؛
گزینههای
-Wuninitialized و
-Wanalyzer-use-of-uninitialized-value
همچنان
پیامهای
هشدار را
روی چنین
متغیرهایی
گزارش
میدهند و
کامپایلر
بهینهسازی
را طوری
انجام
میدهد که
گویی متغیر
مقداردهی
نشده است.
با
فعالسازی
این گزینه،
GCC همچنین
لایهبندیها
(padding) متغیرهای
خودکاری را
که از انواع
ساختار یا
اجتماع
هستند با
صفر
مقداردهی
اولیه
میکند. با
این وجود،
پیادهسازی
فعلی
نمیتواند
متغیرهای
خودکاری را
که بین
عبارت
کنترلی و
اولین مورد
(case) در یک
دستور
"switch"
تعریف
شدهاند
مقداردهی
کند. از -Wtrivial-auto-var-init
برای گزارش
تمام چنین
مواردی
استفاده
کنید.
سه مقدار ممکن برای choice عبارتند از:
- uninitialized هیچیک از متغیرهای خودکار را مقداردهی اولیه نمیکند. این رفتار پیشفرض در زبانهای C و C++ است.
- pattern متغیرهای خودکار را با مقادیری مقداردهی میکند که احتمالاً باگهای منطقی را در ادامه مسیر به کرش تبدیل میکنند، در گزارشهای کرش (crash dump) به راحتی قابل شناسایی هستند و مقادیری نیستند که برنامهنویسان بتوانند برای عملکرد معنادار برنامه به آنها تکیه کنند. مقدار فعلی یک الگوی تکرارشونده بایتی با بایت «0xFE» است. مقادیر مورد استفاده برای مقداردهی اولیه الگو ممکن است در آینده تغییر کنند.
- zero متغیرهای خودکار را با صفر مقداردهی اولیه میکند.
پیشفرض uninitialized است.
توجه داشته باشید که مقادیر آغازگر، چه zero و چه pattern، به بازنمایی داده (در حافظه یا ثباتهای ماشین) اشاره دارند تا تفسیر آنها به عنوان مقادیر عددی. این تمایز ممکن است در زبانهایی که از انواع دارای اریب (biases) یا ضرایب پنهان پشتیبانی میکنند و همچنین با افزونههایی نظیر hardbool حائز اهمیت باشد. به عنوان مثال، متغیری که از ۸ بیت برای نمایش کمیتهای (اریبدار) در بازه "range 160..400" استفاده میکند، بسته به choice با الگوهای بیتی 0x00 یا 0xFE مقداردهی میشود، فارغ از اینکه این بازنماییها نشاندهنده مقادیری در آن بازه باشند یا خیر؛ و حتی اگر باشند، تفسیر مقدار موجود در متغیر به مقدار اریب بستگی خواهد داشت. یک متغیر hardbool که فرضا از "0X5A" و 0xA5 به ترتیب برای "false" و "true" استفاده میکند، با هر دو حالت choice برای مقداردهی اولیه ناچیز به تله (trap) منجر میشود؛ یعنی مقداردهی اولیه با zero به بازنمایی معادل برای "false" تبدیل نمیشود، حتی اگر برای یک متغیر "static" از همان نوع چنین تبدیلی رخ میداد. این بدان معناست که الگوی آغازگر عموماً به نوع متغیرِ مقداردهیشده وابسته نیست. یک استثنای بارز این است که متغیرهای بولی (غیرمقاومسازیشده) که در ثباتها جای میگیرند، حتی در صورت درخواست pattern، با "false" (صفر) مقداردهی میشوند.
میتوانید این رفتار را برای یک متغیر خاص با استفاده از ویژگی متغیر "uninitialized" کنترل کنید.
- -fvect-cost-model=model
- تغییر مدل
هزینه مورد
استفاده
برای
برداریسازی.
آرگومان model
باید یکی از
مقادیر unlimited،
dynamic، cheap یا very-cheap
باشد. در
مدل unlimited فرض
بر این است
که مسیر کد
برداریشده
همواره
سودمند
است، در
حالی که در
مدل dynamic یک
بررسی در
زمان اجرا
از مسیر کد
برداریشده
محافظت
میکند تا
آن را تنها
برای تعداد
تکرارهایی
فعال سازد
که اجرای
آنها
محتملاً
سریعتر از
اجرای حلقه
اسکالر
اصلی خواهد
بود. مدل cheap
برداریسازی
حلقههایی
را غیرفعال
میکند که
انجام آن به
عنوان مثال
به دلیل
نیاز به
بررسیهای
زمان اجرا
برای
وابستگی
داده یا
تراز بودن،
هزینهای
بسیار
سنگین
داشته
باشد، اما
در غیر این
صورت
همارز با
مدل dynamic است.
مدل very-cheap
برداریسازی
حلقهها را
در صورتی که
به هرگونه
بررسی زمان
اجرا برای
وابستگی
داده یا
تراز بودن
نیاز باشد
غیرفعال
میکند؛
همچنین
برداریسازی
حلقههای
فرود
پایانی (epilogue)
را نیز
غیرفعال
میسازد،
اما در سایر
موارد
معادل با
مدل cheap است.
مدل هزینه پیشفرض به سایر پرچمهای بهینهسازی بستگی دارد و یکی از مقادیر dynamic یا cheap است.
- -fsimd-cost-model=model
- تغییر مدل هزینه مورد استفاده برای برداریسازی حلقههای مشخصشده با دستور OpenMP simd. آرگومان model باید یکی از مقادیر unlimited، dynamic یا cheap باشد. تمام مقادیر model دارای همان معانی ذکرشده در -fvect-cost-model هستند و بهطور پیشفرض مدل هزینه تعیینشده با -fvect-cost-model مورد استفاده قرار میگیرد.
- -ftree-vrp
- انجام انتشار محدوده مقادیر (Value Range Propagation) روی درختها. این گذر مشابه با گذر انتشار مقادیر ثابت است، اما به جای مقادیر، محدودهای از مقادیر منتشر میشوند. این امر به بهینهسازها اجازه میدهد تا بررسیهای غیرضروری محدوده مانند بررسی مرزهای آرایه و بررسی اشارهگر تهی (null pointer) را حذف کنند. این گزینه بهطور پیشفرض در -O2 و بالاتر فعال است. حذف بررسی اشارهگر تهی تنها در صورتی انجام میشود که -fdelete-null-pointer-checks فعال باشد.
- -fsplit-paths
- جداسازی مسیرهای منتهی به یالهای بازگشتی حلقه (loop backedges). این کار میتواند حذف کدهای مرده و حذف عبارات فرعی مشترک را بهبود بخشد. این گزینه بهطور پیشفرض در -O3 و بالاتر فعال است.
- -fsplit-ivs-in-unroller
- بیان
مقادیر
متغیرهای
القایی در
تکرارهای
بعدی حلقه
بازشده با
استفاده از
مقدار
موجود در
تکرار اول
را فعال
میکند. این
کار
زنجیرههای
طولانی
وابستگی را
میشکند و
در نتیجه
کارایی
گذرهای
زمانبندی
را بهبود
میبخشد.
ترکیبی از -fweb و CSE اغلب برای دستیابی به همین نتیجه کافی است. با این حال، این کار در مواردی که بدنه حلقه پیچیدهتر از یک بلوک پایه منفرد باشد قابل اطمینان نیست. همچنین در برخی معماریها به دلیل محدودیتهای موجود در گذر CSE اصلاً عمل نمیکند.
این بهینهسازی بهطور پیشفرض فعال است..IP -fvariable-expansion-in-unroller 4 با این گزینه، کامپایلر هنگام باز کردن حلقه (loop unrolling)، چندین رونوشت از برخی متغیرهای محلی ایجاد میکند که میتواند به کُد بهتری منجر شود.
این بهینهسازی به طور پیشفرض برای اهداف PowerPC فعال است، اما در غیر این صورت به طور پیشفرض غیرفعال است.
- -fpartial-inlining
- درونریزی
بخشهایی
از توابع.
این گزینه
تنها زمانی
اثرگذار
است که خودِ
درونریزی
با
گزینههای
-finline-functions یا -finline-small-functions
فعال شده
باشد.
در سطوح -O2، -O3 و -Os فعال است.
- -fpredictive-commoning
- بهینهسازی
اشتراکگذاری
پیشگویانه
(predictive commoning) را
انجام
میدهد،
یعنی
استفادهٔ
مجدد از
محاسبات
(بهویژه
بارگذاریها
و
ذخیرهسازیهای
حافظه)
انجام شده
در
تکرارهای
قبلی
حلقهها.
این گزینه در سطح -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile نیز فعال میشود.
- -fprefetch-loop-arrays
- در صورت
پشتیبانی
ماشین
مقصد،
دستورالعملهایی
برای
پیشواکشی
(prefetch) حافظه
جهت بهبود
کارایی
حلقههایی
که به
آرایههای
بزرگ
دسترسی
دارند
تولید
میکند.
این گزینه ممکن است کُد بهتر یا بدتری تولید کند؛ نتایج بهشدت به ساختار حلقهها در کُد منبع وابسته است.
در سطح -Os غیرفعال است.
- -fno-printf-return-value
- مقادیر
ثابت را به
جای مقدار
بازگشتی
شناختهشدهٔ
توابع
خروجی
قالببندیشده
مانند
"sprintf"،
"snprintf"،
"vsprintf" و
"vsnprintf" (اما
نه "printf"
یا "fprintf")
جایگزین
نکن. این
تبدیل به GCC
اجازه
میدهد تا
شاخهها را
بر اساس
مقدار
بازگشتی
شناختهشدهٔ
این توابع
هنگامی که
با
آرگومانهای
ثابت یا
مقادیری در
بازهای
مشخص
فراخوانی
میشوند که
تعیین
مقدار
بازگشتی
دقیق را
ممکن
میسازد،
بهینهسازی
کرده یا حتی
حذف کند.
برای
نمونه،
هنگامی که
-fprintf-return-value فعال
است، هم
شاخه و هم
بدنهٔ
دستور
"if" (اما
نه
فراخوانی
"snprintf") را
میتوان در
صورتی که
"i" یک
عدد صحیح ۳۲
بیتی یا
کوچکتر
باشد، حذف و
بهینهسازی
کرد؛ چرا که
تضمین
میشود
مقدار
بازگشتی
حداکثر ۸
است.
char buf[9]; if (snprintf (buf, "%08x", i) >= sizeof buf) ...
گزینهٔ -fprintf-return-value به بهینهسازیهای دیگر وابسته است و با -O2 و بالاتر بهترین نتیجه را به همراه دارد. این گزینه همگام با گزینههای -Wformat-overflow و -Wformat-truncation عمل میکند. گزینهٔ -fprintf-return-value به طور پیشفرض فعال است.
- -fno-peephole
- -fno-peephole2
- هرگونه
بهینهسازی
روزنهای
(peephole) مختص
ماشین را
غیرفعال کن.
تفاوت بین
-fno-peephole و -fno-peephole2 در
نحوه
پیادهسازی
آنها در
کامپایلر
است؛ برخی
از اهداف از
یکی، برخی
از دیگری و
تعداد
اندکی از هر
دو استفاده
میکنند.
-fpeephole به طور پیشفرض فعال است. -fpeephole2 در سطوح -O2، -O3 و -Os فعال است.
- -fno-guess-branch-probability
- احتمال
شاخهها را
با استفاده
از روشهای
ابتکاری (heuristics)
حدس نزن.
در صورتی که احتمالات شاخه از طریق بازخورد پروفایلسازی (-fprofile-arcs) ارائه نشده باشد، GCC از روشهای ابتکاری برای حدس زدن آنها استفاده میکند. این روشهای ابتکاری بر پایه نمودار جریان کنترل (control flow graph) هستند. اگر برخی از احتمالات شاخه توسط "__builtin_expect" مشخص شده باشند، روشهای ابتکاری با در نظر گرفتن اطلاعات "__builtin_expect"، برای حدس زدن احتمالات بقیهٔ نمودار جریان کنترل به کار گرفته میشوند. برهمکنشهای میان روشهای ابتکاری و "__builtin_expect" میتواند پیچیده باشد و در برخی موارد، غیرفعال کردن روشهای ابتکاری ممکن است مفید باشد تا اثرات "__builtin_expect" آسانتر درک شود.
همچنین میتوان با تابع توکار "__builtin_expect_with_probability" احتمال مورد انتظار عبارت را مشخص کرد.
پیشفرض در سطوح -O، -O2، -O3 و -Os گزینهٔ -fguess-branch-probability است.
- -freorder-blocks
- بلاکهای
پایه (basic blocks) را
در تابع
کامپایلشده
مرتبسازی
مجدد
میکند تا
تعداد
شاخههای
طیشده
کاهش یافته
و محلی بودن
کُد (code locality)
بهبود یابد.
در سطوح -O1، -O2، -O3 و -Os فعال است.
- -freorder-blocks-algorithm=algorithm
- از
الگوریتم
مشخصشده
برای
مرتبسازی
مجدد
بلاکهای
پایه
استفاده
میکند.
آرگومان algorithm
میتواند
simple باشد که
اندازه کُد
را افزایش
نمیدهد
(مگر گاهی
به دلیل
اثرات
جانبی
مانند
ترازسازی)،
یا stc،
الگوریتم
"software trace cache"، که
تلاش
میکند
تمام
کُدهای
پرتکرار را
در کنار
یکدیگر
قرار دهد و
با ایجاد
رونوشتهای
اضافی از
کُد، تعداد
شاخههای
اجراشده را
به حداقل
برساند.
پیشفرض در سطوح -O1 و -Os مقدار simple، و در سطوح -O2 و -O3 مقدار stc است.
- -freorder-blocks-and-partition
- علاوه بر
مرتبسازی
مجدد
بلاکهای
پایه در
تابع
کامپایلشده
به منظور
کاهش تعداد
شاخههای
طیشده،
بلاکهای
پایه داغ (hot) و
سرد (cold) را در
بخشهای
جداگانهای
از
فایلهای
اسمبلی و .o
افرازش (partition)
میکند تا
کارایی
صفحهبندی
(paging) و محلی
بودن حافظه
پنهان (cache locality) را
بهبود بخشد.
این بهینهسازی به طور خودکار در حضور مدیریت استثنا یا جدولهای unwind (در اهدافی که از setjump/longjump یا طرحهای مختص هدف استفاده میکنند)، برای بخشهای linkonce، برای توابعی با صفت بخش تعریفشده توسط کاربر (user-defined section attribute) و در هر معماری که از بخشهای نامگذاریشده پشتیبانی نمیکند، غیرفعال میشود. هنگامی که -fsplit-stack استفاده میشود، این گزینه به طور پیشفرض فعال نیست (برای جلوگیری از خطاهای پیونددهنده)، اما میتوان آن را به طور صریح فعال کرد (در صورت استفاده از یک پیونددهنده کارآمد).
برای x86 در سطوح -O2، -O3 و -Os فعال است.
- -freorder-functions
- توابع را در
فایل هدف (object file)
به منظور
بهبود محلی
بودن کُد
مرتبسازی
مجدد
میکند. بر
خلاف -fipa-reorder-for-locality،
این گزینه
گروهبندی
تمام توابع
در یک
دستهبندی
خاص (hot/normal/cold/never-executed) را
در اولویت
قرار
میدهد. این
کار با
استفاده از
زیربخشهای
ویژهٔ
".text.hot"
برای
پرتکرارترین
توابع
اجراشده و
".text.unlikely"
برای
توابعی که
اجرای
آنها بعید
است
پیادهسازی
شده است.
مرتبسازی
مجدد توسط
پیونددهنده
انجام
میشود،
بنابراین
قالب فایل
هدف باید از
بخشهای
نامگذاریشده
پشتیبانی
کند و
پیونددهنده
باید آنها
را به شکلی
معقول قرار
دهد.
این گزینه مؤثر نخواهد بود مگر اینکه بازخورد پروفایلسازی ارائه دهید (برای جزئیات به -fprofile-arcs مراجعه کنید) یا توابع را دستی با صفتهای "hot" یا "cold" مشخص نمایید.
در سطوح -O2، -O3 و -Os فعال است.
- -fstrict-aliasing
- به
کامپایلر
اجازه
میدهد تا
سختگیرانهترین
قواعد نام
مستعار (aliasing)
متناسب با
زبان در حال
کامپایل را
فرض کند.
برای C (و ++C)،
این گزینه
بهینهسازیها
را بر اساس
نوع
عبارتها
فعال
میسازد. به
طور خاص،
فرض میشود
شیئی از یک
نوع، هرگز
در همان
آدرس شیئی
از نوع دیگر
قرار
ندارد، مگر
اینکه
انواع
تقریباً
یکسان
باشند. برای
مثال، یک
"unsigned int"
میتواند
نام مستعار
یک "int"
باشد، اما
نمیتواند
برای "void*"
یا یک
"double"
چنین باشد.
یک نوع
نویسهای
(character type)
میتواند
نام مستعار
هر نوع
دیگری باشد.
به کُدهایی شبیه به این توجه ویژه داشته باشید:
union a_union { int i; double d; }; int f() { union a_union t; t.d = 3.0; return t.i; }رویکرد خواندن از عضوی از union متفاوت با عضوی که اخیراً در آن نوشته شده است (به نام "type-punning") رایج است. حتی با -fstrict-aliasing نیز type-punning مجاز است، به شرطی که دسترسی به حافظه از طریق نوعِ union انجام شود؛ بنابراین، کُد بالا طبق انتظار کار میکند. با این حال، کُد زیر ممکن است چنین نباشد:
int f() { union a_union t; int* ip; t.d = 3.0; ip = &t.i; return *ip; }به طور مشابه، دسترسی با گرفتن آدرس، تبدیل نوع (cast) اشارهگر حاصل و ارجاعزدایی (dereference) نتیجه، دارای رفتار تعریفنشده (undefined behavior) است، حتی اگر تبدیل نوع از نوعِ یک union استفاده کند، مانند: int f() { double d = 3.0; return ((union a_union *) &d)->i; }
گزینهٔ -fstrict-aliasing در سطوح -O2، -O3 و -Os فعال است.
- -fipa-strict-aliasing
- کنترل
میکند که
آیا قواعد
-fstrict-aliasing در
سراسر
مرزهای
توابع
اعمال شوند
یا خیر.
توجه داشته
باشید که
اگر چند
تابع در یک
تابع
درونخطی (inline)
شوند،
دسترسیهای
حافظه دیگر
به عنوان
عبور از مرز
تابع در نظر
گرفته
نمیشوند.
گزینهٔ -fipa-strict-aliasing بهطور پیشفرض فعال است و تنها در ترکیب با -fstrict-aliasing اثرگذار خواهد بود.
- -falign-functions
- -falign-functions=n
- -falign-functions=n:m
- -falign-functions=n:m:n2
- -falign-functions=n:m:n2:m2
- شروع توابع
را با
نادیده
گرفتن
حداکثر m-1
بایت، به
توان دو
بعدی
بزرگتر یا
مساوی با n
تراز
میکند. این
تضمین
میکند که
دستکم m
بایت نخست
تابع
بتواند
توسط
پردازنده
بدون گذر از
مرز تراز
n-بایتی
واکشی شود.
این یک
بهینهسازی
در کارایی
کد است و
ترازسازی
برای
توابعی که
سرد (cold) در نظر
گرفته
میشوند
نادیده
گرفته
میشود. اگر
ترازسازی
برای همهٔ
توابع نیاز
است، از
-fmin-function-alignment
استفاده
کنید.
اگر m مشخص نشده باشد، مقدار پیشفرض آن n خواهد بود.
مثالها: -falign-functions=32 توابع را با مرز بعدی ۳۲-بایتی تراز میکند، -falign-functions=24 تنها در صورتی با مرز ۳۲-بایتی بعدی تراز میکند که این کار با رد کردن ۲۳ بایت یا کمتر امکانپذیر باشد، و -falign-functions=32:7 تنها در صورتی با مرز ۳۲-بایتی بعدی تراز میکند که این کار با رد کردن ۶ بایت یا کمتر امکانپذیر باشد.
جفت دوم مقادیر n2:m2 به شما امکان میدهد یک ترازسازی ثانویه مشخص کنید: -falign-functions=64:7:32:3 در صورتی که با رد کردن ۶ بایت یا کمتر امکانپذیر باشد با مرز ۶۴-بایتی بعدی تراز میکند؛ در غیر این صورت، اگر با رد کردن ۲ بایت یا کمتر ممکن باشد، با مرز ۳۲-بایتی بعدی تراز میکند. اگر m2 مشخص نشده باشد، مقدار پیشفرض آن n2 خواهد بود.
برخی از اسمبلرها تنها زمانی از این پرچم پشتیبانی میکنند که n توانی از دو باشد؛ در این حالت، مقدار به بالا گرد میشود.
-fno-align-functions و -falign-functions=1 معادل یکدیگر هستند و به این معنیاند که توابع تراز نمیشوند.
اگر n مشخص نشده یا صفر باشد، از یک پیشفرض وابسته به ماشین استفاده میشود. حداکثر مقدار مجاز برای گزینهٔ n برابر با 65536 است.
در سطوح -O2 و -O3 فعال است.
- -flimit-function-alignment
- اگر این گزینه فعال باشد، کامپایلر تلاش میکند از ترازسازی بیش از حد و غیرضروری توابع خودداری کند. این گزینه سعی میکند به اسمبلر دستور دهد به میزان مشخصشده در -falign-functions ترازسازی کند، اما بیشتر از اندازهٔ خود تابع بایت رد نکند.
- -falign-labels
- -falign-labels=n
- -falign-labels=n:m
- -falign-labels=n:m:n2
- -falign-labels=n:m:n2:m2
- تمام
مقصدهای
انشعاب (branch targets)
را به مرز
توان دو
تراز
میکند.
پارامترهای این گزینه مشابه با گزینهٔ -falign-functions هستند. -fno-align-labels و -falign-labels=1 معادل هستند و به این معنیاند که برچسبها تراز نمیشوند.
اگر -falign-loops یا -falign-jumps قابل اعمال بوده و بزرگتر از این مقدار باشند، مقادیر آنها به جای این مقدار استفاده میشوند.
اگر n مشخص نشده یا صفر باشد، از یک مقدار پیشفرض وابسته به ماشین استفاده میشود که به احتمال زیاد 1 خواهد بود، به معنای عدم ترازسازی. حداکثر مقدار مجاز برای گزینهٔ n برابر با 65536 است.
در سطوح -O2 و -O3 فعال است.
- -falign-loops
- -falign-loops=n
- -falign-loops=n:m
- -falign-loops=n:m:n2
- -falign-loops=n:m:n2:m2
- حلقهها را
به یک مرز
توان دو
تراز
میکند. اگر
حلقهها به
دفعات
زیادی اجرا
شوند، این
کار اثر
منفی اجرای
دستورالعملهای
لاییگذاری
ساختگی (dummy padding)
را جبران
میکند. این
یک
بهینهسازی
در کارایی
کد است و
ترازسازی
برای
حلقههایی
که سرد (cold) در
نظر گرفته
میشوند
نادیده
گرفته
میشود.
اگر -falign-labels بزرگتر از این مقدار باشد، مقدار آن به جای این مقدار استفاده خواهد شد.
پارامترهای این گزینه مشابه گزینهٔ -falign-functions هستند. -fno-align-loops و -falign-loops=1 معادل یکدیگر هستند و به این معنیاند که حلقهها تراز نمیشوند. حداکثر مقدار مجاز برای گزینهٔ n برابر با 65536 است.
اگر n مشخص نشده یا صفر باشد، از یک پیشفرض وابسته به ماشین استفاده میشود.
در سطوح -O2 و -O3 فعال است.
- -falign-jumps
- -falign-jumps=n
- -falign-jumps=n:m
- -falign-jumps=n:m:n2
- -falign-jumps=n:m:n2:m2
- مقصدهای
انشعاب را
به یک مرز
توان دو
تراز
میکند؛
برای
مقصدهایی
که تنها از
طریق پرش
میتوان به
آنها رسید.
در این
حالت، هیچ
دستورالعمل
ساختگی
نیازی به
اجرا ندارد.
این یک
بهینهسازی
در کارایی
کد است و
ترازسازی
برای
پرشهایی
که سرد (cold) در
نظر گرفته
میشوند
نادیده
گرفته
میشود.
اگر -falign-labels بزرگتر از این مقدار باشد، مقدار آن به جای این مقدار استفاده خواهد شد.
پارامترهای این گزینه مشابه گزینهٔ -falign-functions هستند. -fno-align-jumps و -falign-jumps=1 معادل یکدیگر هستند و به این معنیاند که پرشها تراز نمیشوند.
اگر n مشخص نشده یا صفر باشد، از یک پیشفرض وابسته به ماشین استفاده میشود. حداکثر مقدار مجاز برای گزینهٔ n برابر با 65536 است.
در سطوح -O2 و -O3 فعال است.
- -fmin-function-alignment
- حداقل همترازی توابع را با توان دو بعدی بزرگتر یا مساوی با n تعیین میکند. برخلاف -falign-functions این همترازی برای تمام توابع (حتی آنهایی که سرد در نظر گرفته شدهاند) اعمال میشود. این همترازی همچنین تحت تأثیر -flimit-function-alignment قرار نمیگیرد.
- -fno-allocation-dce
- تخصیصهای
استفادهنشده
در ++C (با
استفاده از
عملگرهای
"new" و
"delete") را
در حذف
کدهای مرده
(dead code elimination) پاک
نمیکند.
همچنین -fmalloc-dce را ببینید.
- -fallow-store-data-races
- به
کامپایلر
اجازه
میدهد
بهینهسازیهایی
را انجام
دهد که ممکن
است باعث
ایجاد
رقابتهای
دادهای (data races)
جدید در
عملیات
ذخیرهسازی
(stores) شوند،
بدون آنکه
اثبات کند
متغیر
نمیتواند
همزمان
توسط
ریسمانهای
دیگر مورد
دسترسی
قرار گیرد.
بر
بهینهسازی
دادههای
محلی
تأثیری
ندارد.
استفاده از
این گزینه
در صورتی
ایمن است که
مشخص باشد
دادههای
سراسری
توسط چندین
ریسمان
دسترسی
نخواهند شد.
نمونههایی از بهینهسازیهای فعالشده توسط -fallow-store-data-races شامل بالاکشی (hoisting) یا تبدیلهای شرطی (if-conversions) است که ممکن است باعث شوند مقداری که هماکنون در حافظه بوده مجدداً با همان مقدار بازنویسی شود. چنین بازنویسیای در یک زمینهٔ تکریسمانی ایمن است اما ممکن است در یک زمینهٔ چندریسمانی ناامن باشد. توجه داشته باشید که در برخی پردازندهها، تبدیلهای شرطی ممکن است برای فعالسازی برداریسازی (vectorization) الزامی باشند.
در سطح -Ofast فعال است..IP -funit-at-a-time 4 این گزینه به دلایل سازگاری باقی مانده است. -funit-at-a-time هیچ تأثیری ندارد، در حالی که -fno-unit-at-a-time به معنای فعال شدن -fno-toplevel-reorder و -fno-section-anchors است.
بهطور پیشفرض فعال است.
- -fno-toplevel-reorder
- توابع،
متغیرها و
دستورات
"asm" در
سطح بالا (top-level)
را
بازترتیب
نکن. آنها
را با همان
ترتیبی که
در فایل
ورودی ظاهر
شدهاند
خروجی بده.
هنگامی که
این گزینه
استفاده
میشود،
متغیرهای
ایستا (static) که
به آنها
ارجاعی
داده نشده
حذف
نمیشوند.
این گزینه
برای
پشتیبانی
از کدهای
موجود که به
ترتیب خاصی
وابسته
هستند در
نظر گرفته
شده است.
برای کدهای
جدید، بهتر
است در صورت
امکان از
ویژگیها
(attributes) استفاده
شود.
گزینهٔ -ftoplevel-reorder در -O1 و بالاتر، و همچنین در -O0 اگر -fsection-anchors صراحتاً درخواست شده باشد، پیشفرض است. علاوه بر این، -fno-toplevel-reorder مستلزم -fno-section-anchors است.
- -funreachable-traps
- با این
گزینه،
کامپایلر
فراخوانیهای
"__builtin_unreachable" را
به جای
استفاده
برای
بهینهسازی،
به تلهها (traps)
تبدیل
میکند. این
موضوع بر
تمام
اینگونه
فراخوانیها
که به صورت
ضمنی توسط
کامپایلر
تولید
میشوند
نیز تأثیر
میگذارد.
این گزینه همان اثر -fsanitize=unreachable -fsanitize-trap=unreachable را دارد، اما مقادیر آن گزینهها را تغییر نمیدهد. اگر -fsanitize=unreachable فعال باشد، آن گزینه بر این یکی اولویت دارد.
این گزینه بهطور پیشفرض در -O0 و -Og فعال است.
- -fweb
- تارهایی (webs)
ایجاد
میکند که
معمولاً
برای تخصیص
ثباتها
استفاده
میشوند و
به هر تار
یک ثبات
شبهکد (pseudo register)
مجزا تخصیص
میدهد. این
کار به
مرحلهٔ
تخصیص ثبات
اجازه
میدهد تا
مستقیماً
روی pseudoها عمل
کند، اما
چند مرحلهٔ
بهینهسازی
دیگر مانند
CSE،
بهینهساز
حلقه و
حذفکنندهٔ
کدهای
مردهٔ
بدیهی را
نیز تقویت
میکند. با
این حال،
میتواند
اشکالزدایی
را غیرممکن
کند، زیرا
متغیرها
دیگر در یک
«ثبات
خانگی»
باقی
نمیمانند.
بهطور پیشفرض با -funroll-loops فعال است.
- -fwhole-program
- فرض میکند
واحد
کامپایل
فعلی، کل
برنامهای
است که در
حال
کامپایل
است. تمام
توابع و
متغیرهای
عمومی به
استثنای
"main" و
مواردی که
با ویژگی
"externally_visible"
مشخص
شدهاند،
به توابع
ایستا
تبدیل
میشوند و
در عمل با
تهاجم
بیشتری
توسط
بهینهسازهای
بینروالی
بهینهسازی
میگردند.
با -flto این گزینه کاربرد محدودی دارد. در بیشتر موارد، فهرست دقیق نمادهای استفادهشده یا صادرشده از باینری، از طریق اطلاعات تفکیکپذیری که توسط افزونهٔ پیونددهنده به بهینهساز زمان پیوند ارسال میشود، مشخص است. این گزینه همچنان زمانی که هیچ افزونهٔ پیونددهندهای استفاده نمیشود، یا در طول مرحلهٔ پیوند تدریجی هنگام تولید کد نهایی (با -flto -flinker-output=nolto-rel) مفید است.
- -flto[=n]
- این گزینه
بهینهساز
استاندارد
زمان پیوند
(LTO) را اجرا
میکند.
هنگام
فراخوانی
با کد منبع،
نمایش GIMPLE (یکی
از
نمایشهای
داخلی GCC) را
تولید کرده
و آن را در
بخشهای
ویژهٔ ELF در
فایل شیء
مینویسد.
هنگامی که
فایلهای
شیء به
یکدیگر
پیوند داده
میشوند،
تمام بدنهٔ
توابع از
این
بخشهای ELF
خوانده شده
و طوری
نمونهسازی
میشوند که
گویی بخشی
از یک واحد
ترجمهٔ
یکسان
بودهاند.
برای استفاده از بهینهساز زمان پیوند، -flto و گزینههای بهینهسازی باید در زمان کامپایل و در طول پیوند نهایی مشخص شوند. توصیه میشود تمام فایلهای دخیل در یک پیوند را با گزینههای یکسان کامپایل کنید و آن گزینهها را در زمان پیوند نیز مشخص نمایید. برای مثال:
gcc -c -O2 -flto foo.c gcc -c -O2 -flto bar.c gcc -o myprog -flto -O2 foo.o bar.o
دو فراخوانی نخست GCC، یک نمایش بایتکد از GIMPLE را در بخشهای ویژهٔ ELF در درون foo.o و bar.o ذخیره میکنند. فراخوانی نهایی، بایتکد GIMPLE را از foo.o و bar.o میخواند، دو فایل را در یک تصویر داخلی ادغام میکند و نتیجه را مانند معمول کامپایل مینماید. از آنجا که هر دو فایل foo.o و bar.o در یک تصویر واحد ادغام شدهاند، این امر باعث میشود تمام تحلیلها و بهینهسازیهای بینروالی در GCC در سراسر هر دو فایل طوری کار کنند که گویی یک فایل واحد هستند. برای مثال، این بدان معناست که درخطکننده (inliner) میتواند توابع موجود در bar.o را در توابع موجود در foo.o و برعکس، درونخط (inline) کند.
یک روش دیگر (و سادهتر) برای فعالسازی بهینهسازی زمان پیوند عبارت است از:
gcc -o myprog -flto -O2 foo.c bar.c
دستور بالا برای foo.c و bar.c بایتکد تولید میکند، آنها را در یک نمایش GIMPLE واحد ادغام کرده و طبق معمول بهینهسازی میکند تا myprog تولید شود.
نکتهٔ مهمی که باید به خاطر داشت این است که برای فعالسازی بهینهسازیهای زمان پیوند، لازم است از راهانداز GCC برای انجام مرحلهٔ پیوند استفاده کنید. اگر هر یک از اشیاء دخیل با گزینهٔ خط فرمانی -flto کامپایل شده باشند، GCC بهطور خودکار بهینهسازی زمان پیوند را انجام میدهد. شما همیشه میتوانید تصمیم خودکار برای انجام بهینهسازی زمان پیوند را با ارسال -fno-lto به دستور پیوند بازنویسی (override) کنید.
برای اثربخشی بهینهسازی کل برنامه، لازم است فرضیات مشخصی دربارهٔ کل برنامه در نظر گرفته شود. کامپایلر باید بداند چه توابع و متغیرهایی ممکن است توسط کتابخانهها و زماناجرا در خارج از واحد بهینهسازیشده در زمان پیوند مورد دسترسی قرار گیرند. در صورت پشتیبانی توسط پیونددهنده، افزونهٔ پیونددهنده (ببینید: -fuse-linker-plugin) اطلاعات مربوط به نمادهای استفادهشده و نمادهای از بیرون قابل مشاهده را به کامپایلر ارسال میکند. در صورتی که افزونهٔ پیونددهنده در دسترس نباشد، باید از -fwhole-program استفاده شود تا به کامپایلر اجازه دهد این فرضیات را اتخاذ کند، که این امر به تصمیمات بهینهسازی تهاجمیتری منجر میشود.
هنگامی که یک فایل با -flto و بدون -fuse-linker-plugin کامپایل میشود، فایل شیء تولیدشده از یک فایل شیء معمولی بزرگتر است زیرا شامل بایتکدهای GIMPLE و کد نهایی معمول است (ببینید: -ffat-lto-objects). این بدان معناست که فایلهای شیء حاوی اطلاعات LTO را میتوان به عنوان فایلهای شیء عادی پیوند داد؛ اگر -fno-lto به پیونددهنده ارسال شود، هیچ بهینهسازی بینروالی اعمال نمیشود. توجه داشته باشید که با فعال بودن -fno-fat-lto-objects مرحلهٔ کامپایل سریعتر است، اما نمیتوانید یک پیوند معمولی و غیر LTO روی آنها انجام دهید.
هنگام تولید باینری نهایی، GCC بهینهسازیهای زمان پیوند را تنها روی فایلهایی اعمال میکند که حاوی بایتکد هستند. بنابراین، میتوانید فایلهای شیء و کتابخانهها را با بایتکدهای GIMPLE و کدهای شیء نهایی ترکیب کنید. GCC بهطور خودکار انتخاب میکند که کدام فایلها در حالت LTO بهینهسازی شوند و کدام فایلها بدون پردازش بیشتر پیوند داده شوند.
بهطور کلی، گزینههای مشخصشده در زمان پیوند، بر گزینههای تعیینشده در زمان کامپایل اولویت دارند، هرچند در برخی موارد GCC تلاش میکند گزینههای زمان پیوند را از تنظیمات بهکاررفته در کامپایل فایلهای ورودی استنتاج کند.
اگر گزینهٔ سطح بهینهسازی -O را در زمان پیوند مشخص نکنید، GCC از بالاترین سطح بهینهسازی استفادهشده در هنگام کامپایل فایلهای شیء استفاده میکند. توجه داشته باشید که مشخص کردن گزینهٔ سطح بهینهسازی صرفاً در زمان پیوند و نه در زمان کامپایل، عموماً به دو دلیل بیاثر است. نخست، کامپایل بدون بهینهسازی مراحلی از کامپایلر را که اطلاعات لازم برای بهینهسازی مؤثر در زمان پیوند را جمعآوری میکنند، غیرفعال میکند. دوم، برخی از مراحل اولیهٔ بهینهسازی تنها در زمان کامپایل قابل انجام هستند و در زمان پیوند امکانپذیر نیستند.
برخی از پرچمهای تولید کد وجود دارند که GCC هنگام تولید بایتکدها آنها را حفظ میکند، زیرا باید در طول پیوند نهایی استفاده شوند. در حال حاضر، گزینههای زیر و تنظیمات آنها از اولین فایل شیئی که صراحتاً آنها را مشخص کرده باشد گرفته میشوند: -fcommon، -fexceptions، -fnon-call-exceptions، -fgnu-tm و تمام پرچمهای هدف -m.
گزینههای -fPIC، -fpic، -fpie و -fPIE بر اساس طرح زیر ترکیب میشوند:
B<-fPIC> + B<-fpic> = B<-fpic> B<-fPIC> + B<-fno-pic> = B<-fno-pic> B<-fpic/-fPIC> + (no option) = (no option) B<-fPIC> + B<-fPIE> = B<-fPIE> B<-fpic> + B<-fPIE> = B<-fpie> B<-fPIC/-fpic> + B<-fpie> = B<-fpie>
برخی از پرچمهای تغییردهندهٔ ABI باید در تمام واحدهای کامپایل یکسان باشند، و تلاش برای نادیده گرفتن این مورد در زمان پیوند با یک مقدار متناقض، نادیده گرفته میشود. این شامل گزینههایی مانند -freg-struct-return و -fpcc-struct-return است.
گزینههای دیگر مانند -ffp-contract، -fno-strict-overflow، -fwrapv، -fno-trapv یا -fno-strict-aliasing به مرحلهٔ پیوند منتقل شده و برای واحدهای ترجمهٔ متناقض بهطور محافظهکارانهای ادغام میشوند. بهطور مشخص -fno-strict-overflow، -fwrapv و -fno-trapv اولویت دارند؛ و برای مثال -ffp-contract=off بر -ffp-contract=fast اولویت دارد. میتوانید آنها را در زمان پیوند بازنویسی کنید.
گزینههای تشخیصی مانند -Wstringop-overflow به مرحلهٔ پیوند منتقل میشوند و تنظیمات آنها با مرحلهٔ کامپایل در سطح دانهبندی تابع تطابق دارد. توجه داشته باشید که این موضوع فقط برای هشدارهایی که در طول بهینهسازی صادر میشوند اهمیت دارد. دقت کنید که تبدیلات کد مانند درونخطسازی (inlining) میتواند باعث فعال یا غیرفعال شدن هشدارها برای بخشهایی از کد شود، به گونهای که با تنظیمات زمان کامپایل سازگار نباشد.
هنگامی که لازم است گزینهها را از طریق -Wa یا -Xassembler به اسمبلر ارسال کنید، مطمئن شوید که چنین واحدهای ترجمهای را با -fno-lto کامپایل کردهاید یا بهطور یکنواخت از همان گزینههای اسمبلر در تمام واحدهای ترجمه استفاده کنید. به عنوان یک روش جایگزین، میتوانید گزینههای اسمبلر را در زمان پیوند LTO نیز مشخص نمایید.
برای فعالسازی تولید اطلاعات اشکالزدایی، باید -g را در زمان کامپایل ارائه دهید. اگر هر یک از فایلهای ورودی در زمان پیوند با فعال بودن تولید اطلاعات اشکالزدایی ساخته شده باشند، پیوند نیز تولید اطلاعات اشکالزدایی را فعال خواهد کرد. هرگونه تنظیمات پیشرفتهٔ اطلاعات اشکالزدایی مانند سطح dwarf در -gdwarf-5 باید صراحتاً در خط فرمان پیونددهنده تکرار شود و ترکیب تنظیمات مختلف در واحدهای ترجمهٔ گوناگون توصیه نمیشود.
اگر LTO با اشیائی با پیوند C مواجه شود که با انواع ناسازگار در واحدهای ترجمهٔ جداگانه اعلان شدهاند تا به یکدیگر پیوند داده شوند (رفتار تعریفنشده بر اساس ISO C99 6.2.7)، ممکن است یک پیام تشخیصی غیرکشنده صادر شود. رفتار برنامه در زمان اجرا همچنان تعریفنشده باقی میماند. هشدارهای تشخیصی مشابهی ممکن است برای زبانهای دیگر نیز صادر شود.
یکی دیگر از قابلیتهای LTO این است که میتوان بهینهسازیهای بینروالی را روی فایلهایی که با زبانهای متفاوتی نوشته شدهاند اعمال کرد: gcc -c -flto foo.c g++ -c -flto bar.cc gfortran -c -flto baz.f90 g++ -o myprog -flto -O3 foo.o bar.o baz.o -lgfortran
توجه داشته باشید که پیوند نهایی با g++ انجام میشود تا کتابخانههای زمان اجرای ++C دریافت شوند و -lgfortran برای دریافت کتابخانههای زمان اجرای Fortran اضافه شده است. بهطور کلی، هنگام ترکیب زبانها در حالت LTO، باید از همان گزینههای دستور پیوند استفاده کنید که هنگام ترکیب زبانها در یک کامپایل عادی (غیر-LTO) استفاده میکنید.
اگر فایلهای شیء حاوی بایتکد GIMPLE در یک بایگانی کتابخانه، مثلاً libfoo.a، ذخیره شده باشند، در صورتی که از یک پیونددهنده با پشتیبانی از افزونه استفاده کنید، امکان استخراج و استفاده از آنها در پیوند LTO وجود دارد. برای ایجاد کتابخانههای ایستا مناسب برای LTO، از gcc-ar و gcc-ranlib به جای ar و ranlib استفاده کنید؛ برای نمایش نمادهای فایلهای شیء دارای بایتکد GIMPLE، از gcc-nm استفاده کنید. این دستورها نیازمند آن هستند که ar، ranlib و nm با پشتیبانی از افزونه کامپایل شده باشند. در زمان پیوند، از پرچم -fuse-linker-plugin استفاده کنید تا اطمینان حاصل شود که کتابخانه در فرایند بهینهسازی LTO شرکت میکند:
gcc -o myprog -O2 -flto -fuse-linker-plugin a.o b.o -lfoo
با فعال بودن افزونه پیونددهنده، پیونددهنده فایلهای GIMPLE مورد نیاز را از libfoo.a استخراج کرده و آنها را به GCC در حال اجرا تحویل میدهد تا آنها را به بخشی از تصویر تجمیعشده GIMPLE برای بهینهسازی تبدیل کند.
اگر از پیونددهندهای با پشتیبانی از افزونه استفاده نمیکنید و/یا افزونه پیونددهنده را فعال نکردهاید، اشیاء درون libfoo.a طبق روال معمول استخراج و پیوند داده میشوند، اما در فرایند بهینهسازی LTO شرکت نمیکنند. برای اینکه یک کتابخانه ایستا هم برای بهینهسازی LTO و هم پیوند معمول مناسب باشد، فایلهای شیء آن را با -flto -ffat-lto-objects کامپایل کنید.
بهینهسازیهای زمان پیوند برای عمل کردن نیازی به حضور کل برنامه ندارند. اگر برنامه نیازی به برونریزی هیچ نمادی نداشته باشد، میتوان -flto و -fwhole-program را ترکیب کرد تا به بهینهسازهای بینروالی اجازه دهد از فرضیات تهاجمیتری استفاده کنند که ممکن است به فرصتهای بهینهسازی بهتری منجر شود. زمانی که افزونه پیونددهنده فعال است، نیازی به استفاده از -fwhole-program نیست (نگاه کنید به -fuse-linker-plugin).
پیادهسازی فعلی LTO هیچ تلاشی برای تولید بایتکدی که بین انواع مختلف میزبانها قابلحمل باشد نمیکند. فایلهای بایتکد نسخهبندی شدهاند و بررسی دقیق نسخه وجود دارد، بنابراین فایلهای بایتکد تولیدشده در یک نسخه از GCC با نسخه قدیمیتر یا جدیدتر GCC کار نمیکنند.
بهینهسازی زمان پیوند در سیستمهایی به جز آنهایی که از ترکیب ELF و DWARF استفاده میکنند، بهخوبی با تولید اطلاعات اشکالزدایی کار نمیکند.
اگر مقدار اختیاری n را مشخص کنید، بهینهسازی و تولید کد انجامشده در زمان پیوند با استفاده از برنامه نصبشده make و از طریق n کار موازی بهصورت همروند اجرا میشود. متغیر محیطی MAKE میتواند برای لغو و جایگزینی برنامه استفادهشده به کار رود.
همچنین میتوانید -flto=jobserver را برای استفاده از حالت job server مربوط به GNU make جهت تعیین تعداد کارهای موازی مشخص کنید. این مورد زمانی مفید است که Makefile فراخواننده GCC از قبل بهصورت موازی در حال اجرا باشد. برای اینکه این قابلیت کار کند، باید یک + به ابتدای دستور در Makefile والد اضافه کنید. این گزینه احتمالاً تنها در صورتی کار میکند که MAKE همان GNU make باشد. حتی بدون این مقدار گزینه، GCC تلاش میکند بهطور خودکار سرور وظیفه در حال اجرای GNU make را شناسایی کند.
از -flto=auto برای استفاده از job server در GNU make (در صورت در دسترس بودن) استفاده کنید، یا در غیر این صورت به شناسایی خودکار تعداد ریسههای CPU موجود در سیستم شما بازمیگردد.
- -flto-partition=alg
- الگوریتم پارتیشنبندی مورد استفاده توسط بهینهساز زمان پیوند را مشخص میکند. این مقدار میتواند 1to1 برای مشخص کردن پارتیشنبندی متناظر با فایلهای منبع اصلی، یا balanced برای مشخص کردن پارتیشنبندی به تکههایی با اندازه برابر (تا حد امکان)، یا max برای ایجاد پارتیشن جدید برای هر نماد در صورت امکان، یا cache برای متعادل کردن اندازه تکهها در عین نگهداشتن نمادهای مرتبط در کنار هم جهت حافظهنهانسازی بهتر در LTO افزایشی باشد. مشخص کردن none به عنوان الگوریتم، پارتیشنبندی و استریمینگ را بهطور کامل غیرفعال میکند. مقدار پیشفرض balanced است. در حالی که 1to1 میتواند به عنوان یک راهکار موقت برای مشکلات مختلف ترتیب کد استفاده شود، پارتیشنبندی max تنها برای آزمایشهای داخلی در نظر گرفته شده است. مقدار one مشخص میکند که دقیقاً یک پارتیشن باید استفاده شود، در حالی که مقدار none پارتیشنبندی را دور میزند و مرحله بهینهسازی زمان پیوند را مستقیماً از فاز WPA اجرا میکند.
- -flto-incremental=path
- فعالسازی
LTO افزایشی،
با ذخیره
حافظه نهان
آن در
دایرکتوری
موجود
مشخصشده.
این کار
میتواند
چرخههای
ویرایش-کامپایل
را با LTO
بهمیزان
قابلتوجهی
کوتاه کند.
هنگامی که همراه با LTO (-flto) استفاده شود، خروجی واحدهای ترجمه در داخل LTO در حافظه نهان ذخیره میشود. واحدهای ترجمه ذخیرهشده در حافظه نهان هنگام کامپایل مجدد با تغییرات کوچک در کد به احتمال زیاد دوباره استفاده میشوند که به کاهش زمان کامپایل مجدد میانجامد.
چندین نمونه از GCC میتوانند بهطور موازی از یک حافظه نهان یکسان استفاده کنند.
- -flto-incremental-cache-size=n
- تعداد مدخلهای حافظه نهان در LTO افزایشی را مشخص میکند که پس از رسیدن به آن، مدخلهای قدیمی هرس میشوند. این یک حد نرم است و ممکن است موقتاً ورودیهای بیشتری وجود داشته باشد.
- -flto-compression-level=n
- این گزینه سطح فشردهسازی مورد استفاده برای زبان واسط نوشتهشده در فایلهای شیء LTO را مشخص میکند و تنها همراه با حالت LTO (-flto) معنادار است. در حال حاضر GCC از دو الگوریتم فشردهسازی LTO پشتیبانی میکند. برای zstd، مقادیر معتبر از 0 (بدون فشردهسازی) تا 19 (حداکثر فشردهسازی) است، در حالی که zlib از مقادیر 0 تا 9 پشتیبانی میکند. مقادیر خارج از این محدوده به کمینه یا بیشینه مقادیر پشتیبانیشده محدود میشوند. اگر گزینه داده نشود، یک تنظیم فشردهسازی متوازن پیشفرض استفاده میشود.
- -fuse-linker-plugin
- استفاده از
افزونه
پیونددهنده
را در طول
بهینهسازی
زمان پیوند
فعال
میکند. این
گزینه به
پشتیبانی
از افزونه
در
پیونددهنده
متکی است که
در gold یا در GNU ld 2.21
یا جدیدتر
در دسترس
است.
این گزینه استخراج فایلهای شیء حاوی بایتکد GIMPLE را از بایگانیهای کتابخانه فعال میکند. این امر با نمایان ساختن کد بیشتری برای بهینهساز زمان پیوند، کیفیت بهینهسازی را بهبود میبخشد. این اطلاعات مشخص میکند چه نمادهایی میتوانند بهصورت خارجی قابل دسترسی باشند (توسط شیء غیر-LTO یا در طول پیوند پویا). بهبودهای حاصل در کیفیت کد روی باینریها (و کتابخانههای اشتراکی که از دید پنهان استفاده میکنند) مشابه -fwhole-program است. برای توضیحی درباره اثر این پرچم و نحوه استفاده از آن، -flto را ببینید.
این گزینه بهطور پیشفرض فعال است هنگامی که پشتیبانی LTO در GCC فعال باشد و GCC برای استفاده با یک پیونددهنده پشتیبانیکننده از افزونهها (GNU ld 2.21 یا جدیدتر، یا gold) پیکربندی شده باشد.
- -ffat-lto-objects
- اشیاء Fat LTO
فایلهای
شیئی هستند
که هم زبان
واسط و هم
کد شیء را
شامل
میشوند.
این کار
آنها را هم
برای پیوند
LTO و هم پیوند
معمولی
قابل
استفاده
میکند. این
گزینه تنها
در زمان
کامپایل با
-flto مؤثر است
و در زمان
پیوند
نادیده
گرفته
میشود.
گزینه -fno-fat-lto-objects زمان کامپایل را نسبت به LTO ساده بهبود میبخشد، اما نیازمند آن است که کل زنجیره ابزار از LTO آگاه باشد. این گزینه برای عملکرد پایهای به پیونددهندهای با پشتیبانی از افزونه پیونددهنده نیاز دارد. علاوه بر این، nm، ar و ranlib باید از افزونههای پیونددهنده پشتیبانی کنند تا یک محیط ساخت با امکانات کامل (توانا در ساخت کتابخانههای ایستا و غیره) فراهم شود. GCC بستهبندهای gcc-ar، gcc-nm و gcc-ranlib را برای ارسال گزینههای مناسب به این ابزارها فراهم میکند. با LTO غیر حجیم، پروندههای ساخت باید برای استفاده از آنها اصلاح شوند.
توجه داشته باشید که binutils مدرن سازوکار بارگذاری خودکار افزونه را فراهم میکند. نصب افزونه پیونددهنده در $libdir/bfd-plugins اثری مشابه با استفاده از بستهبندهای دستور (gcc-ar، gcc-nm و gcc-ranlib) دارد.
پیشفرض در مقصدهای دارای پشتیبانی از افزونه پیونددهنده، -fno-fat-lto-objects است.
- -fcompare-elim
- پس از تخصیص
ثبات و
تفکیک
دستورالعمل
پس از تخصیص
ثبات،
دستورالعملهای
حسابی را
شناسایی
میکند که
پرچمهای
پردازنده
را مشابه یک
عملیات
مقایسه بر
اساس آن
حساب
محاسبه
میکنند. در
صورت
امکان،
عملیات
مقایسه
صریح را حذف
میکند.
این گذر فقط برای مقصدهای خاصی اعمال میشود که نمیتوانند عملیات مقایسه را پیش از اتمام تخصیص ثبات بهصورت صریح نمایش دهند.
در سطوح -O1، -O2، -O3، -Os فعال میشود.
- -ffold-mem-offsets
- -fno-fold-mem-offsets
- تلاش
میکند
دستورالعملهای
add را با
ادغام
آنها در
بارگذاریها/ذخیرهسازیهای
حافظه حذف
کند.
در سطوح -O2، -O3 فعال میشود.
- -fcprop-registers
- پس از تخصیص
ثبات و
تفکیک
دستورالعمل
پس از تخصیص
ثبات، یک
گذر انتشار
رونوشت را
اجرا
میکند تا
وابستگیهای
زمانبندی
را کاهش
داده و در
مواردی
رونوشت را
حذف کند.
در سطوح -O1، -O2، -O3، -Os فعال میشود..IP -fprofile-correction 4 پروفایلهای جمعآوریشده با استفاده از دودویی سنجششده (instrumented binary) برای برنامههای چندنخی ممکن است به دلیل بهروزرسانیهای از دسترفتهٔ شمارنده، ناهمگون باشند. هنگامی که این گزینه مشخص شود، GCC از روشهای اکتشافی برای تصحیح یا هموارسازی چنین ناهمگونیهایی استفاده میکند. بهطور پیشفرض، GCC در صورت تشخیص یک پروفایل ناهمگون، یک پیام خطا صادر میکند.
این گزینه توسط -fauto-profile فعال میشود.
- -fprofile-partial-training
- با "-fprofile-use" تمام بخشهایی از برنامه که در طول اجرای آموزشی اجرا نشدهاند، بهشدت به جای سرعت، برای اندازه بهینهسازی میشوند. در برخی موارد آموزش تمام مسیرهای داغ (hot paths) ممکن در برنامه امکانپذیر نیست. (به عنوان مثال، ممکن است برنامه شامل توابعی مخصوص یک سختافزار خاص باشد و آموزش نتواند تمام پیکربندیهای سختافزاری که برنامه روی آنها اجرا میشود را پوشش دهد.) با "-fprofile-partial-training" بازخورد پروفایل برای تمام توابعی که در طول اجرای آموزشی اجرا نشدهاند نادیده گرفته میشود، که باعث میشود به گونهای بهینهسازی شوند که گویی بدون بازخورد پروفایل کامپایل شدهاند. این امر زمانی که اجرای آموزشی نمایندهٔ واقعی برنامه نباشد به عملکرد بهتر، اما به کدی با حجم به مراتب بزرگتر منجر میشود.
- -fprofile-use
- -fprofile-use=path
- فعالسازی
بهینهسازیهای
هدایتشده
با بازخورد
پروفایل، و
بهینهسازیهای
زیر که
بسیاری از
آنها
عموماً
تنها با در
دسترس بودن
بازخورد
پروفایل
سودمند
هستند:
-fbranch-probabilities -fprofile-values -funroll-loops -fpeel-loops -ftracer -fvpt -finline-functions -fipa-cp -fipa-cp-clone -fipa-bit-cp -fpredictive-commoning -fsplit-loops -funswitch-loops -fgcse-after-reload -ftree-loop-vectorize -ftree-slp-vectorize -fvect-cost-model=dynamic -ftree-loop-distribute-patterns -fprofile-reorder-functions
پیش از آنکه بتوانید از این گزینه استفاده کنید، ابتدا باید اطلاعات پروفایلسازی را تولید کرده باشید.
بهطور پیشفرض، اگر پروفایلهای بازخورد با کد منبع همخوانی نداشته باشند، GCC یک پیام خطا صادر میکند. این خطا میتواند با استفاده از -Wno-error=coverage-mismatch به یک هشدار تبدیل شود. توجه داشته باشید که این کار ممکن است به کدی با بهینهسازی ضعیف بینجامد. علاوهبر این، بهطور پیشفرض، در صورتی که پروفایلهای بازخورد وجود نداشته باشند نیز GCC یک پیام هشدار صادر میکند (نگاه کنید به -Wmissing-profile).
اگر path مشخص شده باشد، GCC به path برای یافتن فایلهای دادهٔ بازخورد پروفایل نگاه میکند. نگاه کنید به -fprofile-dir.
- -fauto-profile
- -fauto-profile=path
- فعالسازی
بهینهسازیهای
هدایتشده
با بازخورد
مبتنی بر
نمونهبرداری،
و
بهینهسازیهای
زیر که
بسیاری از
آنها
عموماً
تنها با در
دسترس بودن
بازخورد
پروفایل
سودمند
هستند:
-fbranch-probabilities -fprofile-values -funroll-loops -fpeel-loops -ftracer -fvpt -finline-functions -fipa-cp -fipa-cp-clone -fipa-bit-cp -fpredictive-commoning -fsplit-loops -funswitch-loops -fgcse-after-reload -ftree-loop-vectorize -ftree-slp-vectorize -fvect-cost-model=dynamic -ftree-loop-distribute-patterns -fprofile-correction
path نام فایلی حاوی اطلاعات پروفایل AutoFDO است. در صورت حذف شدن، مقدار پیشفرض آن fbdata.afdo در دایرکتوری جاری خواهد بود.
تولید یک فایل دادهٔ پروفایل AutoFDO نیازمند اجرای برنامهٔ شما با ابزار perf بر روی یک سیستم مقصد گنو/لینوکس پشتیبانیشده است. برای اطلاعات بیشتر، https://perf.wiki.kernel.org را ببینید.
برای مثال:
perf record -e br_inst_retired:near_taken -b -o perf.data \ -- your_programسپس از ابزار create_gcov برای تبدیل دادههای خام پروفایل به قالبی که برای GCC قابل استفاده باشد، استفاده کنید. همچنین باید باینریِ نمادزدایینشده (unstripped) برنامهٔ خود را به این ابزار ارائه دهید. https://github.com/google/autofdo را ببینید.
برای مثال:
create_gcov --binary=your_program.unstripped --profile=perf.data \ --gcov=profile.afdo
گزینههای زیر رفتار کامپایلر را در رابطه با محاسبات ممیز شناور کنترل میکنند. این گزینهها میان سرعت و دقت/صحت مصالحه برقرار میکنند. همهٔ آنها باید بهطور صریح فعال شوند.
- -fexcess-precision=style
- این گزینه
امکان
کنترل دقت
مازاد را بر
روی
ماشینهایی
فراهم
میکند که
در آنها
محاسبات
ممیز شناور
در قالبی با
دقت یا
دامنهٔ
بیشتری
نسبت به
استاندارد
IEEE و انواع
ممیز شناور
مبادلهای
انجام
میشوند.
نمونهای
از چنین
مقصدی،
ممیز شناور
x87 در
پردازندههای
x86 است که در
داخل به جای
قالب ۶۴
بیتی IEEE از یک
نمایش ۸۰
بیتی
استفاده
میکند.
برای اغلب
برنامهها،
دقت مازاد
بیضرر
است، اما
برخی
برنامهها
ممکن است به
الزامات
استانداردهای
زبان C یا C++
برای
مدیریت
مقادیر IEEE
وابسته
باشند.
بهطور پیشفرض، -fexcess-precision=fast فعال است؛ این بدان معناست که در صورت تولید کدی سریعتر، ممکن است محاسبات با دقتی فراتر از انواع مشخصشده در کد مبدأ انجام شوند، و زمان گرد کردن مقادیر به انواع مشخصشده در کد مبدأ غیرقابلپیشبینی است. هنگام کامپایل C یا C++، اگر -fexcess-precision=standard مشخص شده باشد، دقت مازاد از قوانین مشخصشده در ISO C99 یا C++ پیروی میکند؛ بهویژه، هم تبدیلهای نوع (casts) و هم انتسابها موجب گرد شدن مقادیر به انواع معنایی آنها میشوند (در حالی که -ffloat-store فقط بر انتسابها اثر میگذارد). این گزینه بهطور پیشفرض برای C یا C++ در صورتی که گزینهای برای انطباق دقیق مانند -std=c99 یا -std=c++17 استفاده شده باشد، فعال است. -ffast-math صرفنظر از اینکه گزینهٔ انطباق دقیق استفاده شده باشد یا خیر، بهطور پیشفرض -fexcess-precision=fast را فعال میکند. اگر -fexcess-precision=16 مشخص شود، مقادیر ثابت و نتایج عبارات با انواع "_Float16" و "__bf16" بدون دقت مازاد محاسبه میشوند.
-fexcess-precision=standard برای زبانهایی غیر از C یا C++ پیادهسازی نشده است. در معماری x86، اگر -mfpmath=sse یا -mfpmath=sse+387 مشخص شده باشد، هیچ اثری ندارد؛ در حالت اول، معناشناسی IEEE بدون دقت مازاد اعمال میشود و در حالت دوم، گرد کردن غیرقابلپیشبینی است.
- -ffloat-store
- متغیرهای ممیز شناور را در ثباتها ذخیره نکنید، و سایر گزینههایی را که ممکن است برداشتن مقدار ممیز شناور از یک ثبات یا حافظه را تغییر دهند مهار کنید. این گزینه عموماً جای خود را به -fexcess-precision=standard داده است که کلیتر میباشد. اگر از -ffloat-store استفاده میکنید، ممکن است نیاز باشد برنامهٔ خود را تغییر دهید تا محاسبات میانی را صریحاً در متغیرهای موقت ذخیره کند، زیرا -ffloat-store گرد کردن به قالب IEEE را فقط روی انتسابها مدیریت میکند، نه تبدیلهای نوع، برخلاف رویکردی که -fexcess-precision=standard در پیش میگیرد.
- -ffast-math
- گزینههای
-fno-math-errno، -funsafe-math-optimizations،
-ffinite-math-only، -fno-rounding-math،
-fno-signaling-nans، -fcx-limited-range و
-fexcess-precision=fast را
تنظیم
میکند.
این گزینه باعث تعریف ماکروی پیشپردازندهٔ "__FAST_MATH__" میشود.
این گزینه به جز -Ofast با هیچ گزینهٔ -O دیگری روشن نمیشود، چرا که میتواند به خروجی نادرست برای برنامههایی بینجامد که به پیادهسازی دقیق قواعد/مشخصات IEEE یا ISO برای توابع ریاضی وابسته هستند. با این حال، ممکن است برای برنامههایی که به ضمانتهای این مشخصات نیازی ندارند، کدی سریعتر تولید کند.
- -fno-math-errno
- پس از
فراخوانی
توابع
ریاضیاتی
که با یک
تکدستورالعمل
اجرا
میشوند
(مانند
"sqrt")،
متغیر
"errno"
تنظیم نشود.
برنامهای
که برای
مدیریت
خطاهای
ریاضی به
استثناهای
IEEE وابسته
است، ممکن
است بخواهد
از این پرچم
برای سرعت
بیشتر ضمن
حفظ
سازگاری
محاسباتی
با IEEE
استفاده
کند.
این گزینه به جز -Ofast با هیچ گزینهٔ -O دیگری فعال نمیشود، زیرا میتواند به خروجی نادرست برای برنامههایی که به پیادهسازی دقیق قواعد/مشخصات IEEE یا ISO برای توابع ریاضی وابسته هستند منجر شود. هرچند ممکن است برای برنامههایی که به تضمینهای این مشخصات نیاز ندارند، کد سریعتری به همراه داشته باشد.
حالت پیشفرض -fmath-errno است.
در سیستمهای Darwin، کتابخانهٔ ریاضی هرگز "errno" را تنظیم نمیکند. بنابراین هیچ دلیلی وجود ندارد که کامپایلر این احتمال را در نظر بگیرد، و -fno-math-errno حالت پیشفرض است.
- -funsafe-math-optimizations
- اجازه
بهینهسازیهایی
برای
محاسبات
ممیز شناور
را میدهد
که (الف) فرض
میکنند
آرگومانها
و نتایج
معتبر
هستند و (ب)
ممکن است
استانداردهای
IEEE یا ANSI را نقض
کنند. در
صورت
استفاده در
زمان
پیوند،
ممکن است
کتابخانهها
یا
فایلهای
راهاندازیای
را شامل شود
که کلمه
کنترلی
پیشفرض FPU
یا سایر
بهینهسازیهای
مشابه را
تغییر
میدهند.
این گزینه به جز -Ofast با هیچ گزینهٔ -O دیگری روشن نمیشود، زیرا میتواند به خروجی نادرست برای برنامههای وابسته به پیادهسازی دقیق قواعد/مشخصات IEEE یا ISO برای توابع ریاضی بینجامد. هرچند ممکن است برای برنامههایی که نیازی به ضمانتهای این مشخصات ندارند کدی سریعتر به دست دهد. این گزینه -fno-signed-zeros، -fno-trapping-math، -fassociative-math و -freciprocal-math را فعال میکند.
حالت پیشفرض -fno-unsafe-math-optimizations است..IP -fassociative-math 4 اجازه شرکتپذیری مجدد (re-association) عملوندها را در دنبالهای از عملیات ممیز شناور میدهد. این کار با احتمال تغییر در نتیجهٔ محاسبات، استانداردهای زبان ISO C و C++ را نقض میکند. نکته: بازآرایی ممکن است علامت صفر را تغییر دهد، مقادیر NaN را نادیده بگیرد و سرریز زیرین (underflow) یا سرریز (overflow) را مهار کرده یا ایجاد کند (و در نتیجه نباید در کدهایی استفاده شود که به رفتار گرد کردن متکی هستند، مانند "(x + 2**52) - 2**52"). همچنین ممکن است مقایسههای ممیز شناور را بازآرایی کند و بنابراین در مواردی که مقایسههای مرتب (ordered comparisons) مورد نیاز است، نباید استفاده شود. این گزینه نیازمند فعال بودن هر دو گزینهٔ -fno-signed-zeros و -fno-trapping-math است. بهعلاوه، استفاده از آن همراه با -frounding-math چندان منطقی نیست. برای Fortran، این گزینه در صورتی که هر دو گزینهٔ -fno-signed-zeros و -fno-trapping-math فعال باشند، بهطور خودکار فعال میشود.
پیشفرض -fno-associative-math است.
- -freciprocal-math
- اجازه
میدهد در
صورتی که
منجر به
بهینهسازی
شود،
بهجای
تقسیم بر یک
مقدار از
معکوس آن
مقدار
استفاده
شود. برای
نمونه، "x
/ y"
میتواند
با "x * (1/y)"
جایگزین
شود؛ این
امر زمانی
مفید است که
"(1/y)"
مشمول حذف
زیرعبارتهای
مشترک (common subexpression
elimination) باشد.
توجه داشته
باشید که
این کار
باعث کاهش
دقت شده و
تعداد
عملیاتهای
ممیز شناور
(flops) روی آن
مقدار را
افزایش
میدهد.
پیشفرض -fno-reciprocal-math است.
- -ffinite-math-only
- بهینهسازیهایی
را برای
محاسبات
ممیز شناور
مجاز
میکند که
فرض
میکنند
آرگومانها
و نتایج،
مقادیر NaN یا
+-Inf نیستند.
این گزینه توسط هیچیک از گزینههای -O بهجز -Ofast فعال نمیشود، زیرا میتواند برای برنامههایی که به پیادهسازی دقیق قواعد/مشخصات IEEE یا ISO برای توابع ریاضی وابسته هستند، به خروجی نادرست منجر شود. با این حال، ممکن است برای برنامههایی که به تضمینهای این مشخصات نیاز ندارند، کد سریعتری تولید کند.
پیشفرض -fno-finite-math-only است.
- -fno-signed-zeros
- بهینهسازیهایی
را برای
محاسبات
ممیز شناور
مجاز
میکند که
علامتدار
بودن صفر را
نادیده
میگیرند.
محاسبات
استاندارد
IEEE رفتار
مقادیر
متمایز +0.0 و -0.0
را مشخص
میکند، که
مانع از
سادهسازی
عباراتی
مانند x+0.0 یا 0.0*x
میشود (حتی
همراه با
-ffinite-math-only). این
گزینه به
این معناست
که علامت
نتیجهٔ صفر
اهمیت
ندارد.
پیشفرض -fsigned-zeros است.
- -fno-trapping-math
- کد را با
این فرض
کامپایل
میکند که
عملیات
ممیز شناور
نمیتوانند
تلههای (traps)
قابل
مشاهده
برای کاربر
تولید کنند.
این تلهها
شامل تقسیم
بر صفر،
سرریز،
سرریز
زیرین،
نتیجهٔ
غیردقیق (inexact result)
و عملیات
نامعتبر
است. این
گزینه
نیازمند
فعال بودن
-fno-signaling-nans است.
تنظیم این
گزینه ممکن
است در صورت
اتکا به
محاسبات
«بدون
توقف» (non-stop)
استاندارد
IEEE، امکان
تولید کد
سریعتر را
فراهم کند.
این گزینه توسط هیچیک از گزینههای -O بهجز -Ofast فعال نمیشود، زیرا میتواند برای برنامههایی که به پیادهسازی دقیق قواعد/مشخصات IEEE یا ISO برای توابع ریاضی وابستهاند، خروجی نادرست تولید کند.
پیشفرض -ftrapping-math است.
نسخههای آیندهٔ GCC ممکن است کنترل دقیقتری روی این تنظیم با استفاده از پراگمای "FENV_ACCESS" در استاندارد C99 ارائه دهند. این گزینهٔ خط فرمان همراه با -frounding-math برای تعیین وضعیت پیشفرض "FENV_ACCESS" به کار خواهد رفت.
- -frounding-math
- تبدیلها و
بهینهسازیهایی
را که رفتار
پیشفرض
گرد کردن
ممیز شناور
(گرد کردن
به
نزدیکترین
یا round-to-nearest) را
فرض
میکنند،
غیرفعال
میکند. این
گزینه باید
برای
برنامههایی
تعیین شود
که حالت گرد
کردن FP را
بهصورت
پویا تغییر
میدهند،
یا ممکن است
با حالتی
غیر از حالت
پیشفرض
گرد کردن
اجرا شوند.
این گزینه
ادغام
ثوابت (constant folding)
عبارات
ممیز شناور
در زمان
کامپایل (که
ممکن است
تحت تأثیر
حالت گرد
کردن قرار
گیرند) و
تبدیلهای
محاسباتی
که در حضور
حالتهای
گرد کردن
وابسته به
علامت
ناامن
هستند را
غیرفعال
میسازد.
پیشفرض -fno-rounding-math است.
این گزینه آزمایشی است و در حال حاضر غیرفعال شدن تمامی بهینهسازیهای GCC را که تحت تأثیر حالت گرد کردن قرار دارند تضمین نمیکند. نسخههای آیندهٔ GCC ممکن است کنترل دقیقتری روی این تنظیم با استفاده از پراگمای "FENV_ACCESS" در استاندارد C99 ارائه دهند. این گزینهٔ خط فرمان همراه با -ftrapping-math برای مشخص کردن وضعیت پیشفرض "FENV_ACCESS" به کار خواهد رفت.
- -fsignaling-nans
- کد را با
این فرض
کامپایل
میکند که
مقادیر IEEE signaling NaNs
ممکن است
حین انجام
عملیات
ممیز
شناور،
تلههای
قابل
مشاهده
برای کاربر
تولید کنند.
فعال کردن
این گزینه،
بهینهسازیهایی
را که ممکن
است تعداد
استثناهای
قابل رؤیت
با signaling NaNها را
تغییر
دهند،
غیرفعال
میکند. این
گزینه
مستلزم
فعال بودن
-ftrapping-math است.
این گزینه باعث تعریف ماکروی پیشپردازندهٔ "__SUPPORT_SNAN__" میشود.
پیشفرض -fno-signaling-nans است.
این گزینه آزمایشی است و در حال حاضر غیرفعال شدن تمام بهینهسازیهای GCC را که بر رفتار signaling NaN اثر میگذارند تضمین نمیکند.
- -fno-fp-int-builtin-inexact
- به توابع
داخلی (built-in)
"ceil"،
"floor"،
"round" و
"trunc"، و
گونههای
"float" و
"long double"
آنها
اجازه
نمیدهد
کدی تولید
کنند که
برای
آرگومانهای
غیرصحیح،
استثنای
ممیز شناور
«inexact»
(غیردقیق)
را صادر
کند.
استانداردهای
ISO C99 و C11 به این
توابع
اجازه
میدهند
استثنای
«inexact» را صادر
نمایند،
اما ISO/IEC TS 18661-1:2014
(پیوندهای C
برای IEEE 754-2008،
آنگونه که
در ISO C23 ادغام
شده است) به
این توابع
چنین
اجازهای
نمیدهد.
پیشفرض -ffp-int-builtin-inexact است که اجازه صدور استثنا را میدهد، مگر اینکه استاندارد C23 یا نسخههای پس از آن انتخاب شده باشد. این گزینه هیچ اثری ندارد مگر اینکه -ftrapping-math فعال باشد.
حتی در صورت استفاده از -fno-fp-int-builtin-inexact، چنانچه توابع، فراخوانی به یک تابع کتابخانهای تولید کنند، در صورتی که پیادهسازی کتابخانه از TS 18661 پیروی نکند ممکن است استثنای «inexact» برانگیخته شود.
- -fsingle-precision-constant
- با ثوابت ممیز شناور بهصورت دقت تکی (single precision) رفتار میکند، بهجای اینکه آنها را بهطور ضمنی به ثوابت با دقت دوگانه (double precision) تبدیل کند.
- -fcx-limited-range
- در صورت
فعال بودن،
این گزینه
بیان
میکند که
هنگام
انجام
تقسیم
اعداد
مختلط، به
مرحلهٔ
کاهش دامنه
(range reduction) نیازی
نیست.
همچنین هیچ
بررسی برای
اینکه آیا
نتیجهٔ ضرب
یا تقسیم
اعداد
مختلط
برابر با
"NaN + I*NaN" است
و تلاشی
برای تصحیح
وضعیت در آن
حالت صورت
نمیگیرد.
پیشفرض
-fno-cx-limited-range است،
اما توسط
-ffast-math فعال
میشود.
این گزینه تنظیم پیشفرض پراگمای "CX_LIMITED_RANGE" در استاندارد ISO C99 را کنترل میکند. با این حال، این گزینه برای تمامی زبانها اعمال میشود.
- -fcx-fortran-rules
- ضرب و تقسیم
اعداد
مختلط از
قوانین Fortran
پیروی
میکنند.
کاهش دامنه
بهعنوان
بخشی از
تقسیم
مختلط
انجام
میشود،
اما هیچ
بررسی برای
اینکه آیا
نتیجهٔ ضرب
یا تقسیم
اعداد
مختلط
برابر با
"NaN + I*NaN" است
و تلاشی
برای بهبود
وضعیت در آن
صورت
نمیگیرد.
پیشفرض -fno-cx-fortran-rules است.
گزینههای زیر بهینهسازیهایی را کنترل میکنند که ممکن است کارایی را بهبود بخشند، اما توسط هیچیک از گزینههای -O فعال نمیشوند. این بخش شامل گزینههای آزمایشی است که ممکن است کدهای معیوب تولید کنند.
- -fbranch-probabilities
- پس از اجرای
برنامهای
که با -fprofile-arcs
کامپایل
شده است،
میتوانید
آن را برای
بار دوم با
استفاده از
-fbranch-probabilities
کامپایل
کنید تا
بهینهسازیها
بر اساس
تعداد
دفعاتی که
هر شاخه
اجرا شده
است بهبود
یابد.
هنگامی که
برنامهای
که با -fprofile-arcs
کامپایل
شده است
خاتمه
مییابد،
شمارشهای
اجرای کمان
را برای هر
فایل منبع
در فایلی به
نام sourcename.gcda
ذخیره
میکند.
اطلاعات
موجود در
این فایل
داده بسیار
وابسته به
ساختار کد
تولید شده
است،
بنابراین
باید برای
هر دو
کامپایل از
کد منبع
یکسان و
گزینههای
بهینهسازی
یکسانی
استفاده
کنید.
جزئیات
مربوط به
نامگذاری
فایل را در
-fprofile-arcs مشاهده
کنید.
با گزینهٔ -fbranch-probabilities، کامپایلر GCC یک یادداشت REG_BR_PROB روی هر JUMP_INSN و CALL_INSN قرار میدهد. این موارد میتوانند برای بهبود بهینهسازی استفاده شوند. در حال حاضر، آنها فقط در یک جا استفاده میشوند: در reorg.cc، بهجای حدس زدن اینکه کدام مسیر توسط یک شاخه محتملتر است، از مقادیر REG_BR_PROB برای تعیین دقیق مسیری که دفعات بیشتری طی شده است استفاده میشود.
توسط -fprofile-use و -fauto-profile فعال میشود.
- -fprofile-values
- در صورت
ترکیب با
-fprofile-arcs، کدی
اضافه
میکند تا
دادههایی
دربارهٔ
مقادیر
عبارات
درون
برنامه
جمعآوری
شوند.
همراه با -fbranch-probabilities، دادههای جمعآوریشده از تحلیل مقادیر عبارات را جهت استفاده در بهینهسازیها بازخوانی میکند.
توسط -fprofile-generate، -fprofile-use و -fauto-profile فعال میشود.
- -fprofile-reorder-functions
- بازآرایی
توابع بر
اساس سنجش
پروفایل (profile
instrumentation)، نخستین
زمان اجرای
یک تابع را
جمعآوری
کرده و این
توابع را به
ترتیب
صعودی مرتب
میکند، با
این هدف که
راهاندازی
برنامه از
طریق
بارگذاری
کارآمدتر
بخشهای
متنی (text segments)
بهینهسازی
شود.
با -fprofile-use فعال میشود..IP -fvpt 4 در صورت ترکیب با -fprofile-arcs، این گزینه به کامپایلر دستور میدهد تا کدی برای جمعآوری اطلاعات درباره مقادیر عبارتها اضافه کند.
به همراه -fbranch-probabilities، دادههای جمعآوریشده را بازخوانی کرده و بهینهسازیها را بر اساس آنها اعمال میکند. در حال حاضر، این بهینهسازیها شامل تخصیص ویژه عملیات تقسیم با استفاده از آگاهی درباره مقدار مخرج است.
با -fprofile-use و -fauto-profile فعال میشود.
- -frename-registers
- تلاش برای
جلوگیری از
وابستگیهای
کاذب در کد
زمانبندیشده
از طریق
بهرهگیری
از
ثباتهای
باقیمانده
پس از تخصیص
ثبات. این
بهینهسازی
بیشترین
سود را برای
پردازندههای
دارای
ثباتهای
زیاد دارد.
با این حال،
بسته به
قالب
اطلاعات
اشکالزدایی
اتخاذشده
توسط هدف،
میتواند
اشکالزدایی
را غیرممکن
کند، زیرا
متغیرها
دیگر در یک
«ثبات
اصلی» باقی
نمیمانند.
بهطور پیشفرض با -funroll-loops فعال میشود.
- -fschedule-fusion
- یک گذر
وابسته به
معماری
مقصد را روی
جریان
دستورالعملها
انجام
میدهد تا
دستورالعملهای
همنوع را
در کنار
یکدیگر
زمانبندی
کند، زیرا
ماشین مقصد
در صورتی که
این
دستورات در
جریان
دستورالعملها
در مجاورت
هم باشند
میتواند
آنها را با
کارایی
بیشتری
اجرا کند.
در سطوح -O2، -O3 و -Os فعال میشود.
- -ftracer
- برای
افزایش
اندازه
اَبَربلوک
(superblock)، تکثیر
دُم (tail duplication) را
انجام
میدهد. این
دگرگونی،
جریان
کنترل تابع
را سادهتر
کرده و به
سایر
بهینهسازیها
امکان
میدهد
عملکرد
بهتری
داشته
باشند.
توسط -fprofile-use و -fauto-profile فعال میشود.
- -funroll-loops
- حلقههایی
را که تعداد
تکرارهای
آنها در
زمان
کامپایل یا
هنگام ورود
به حلقه
قابل تعیین
است، باز (unroll)
میکند.
گزینه -funroll-loops
به طور ضمنی
شامل -frerun-cse-after-loop،
-fweb و -frename-registers است.
همچنین
لایهبرداری
کامل حلقه
(یعنی حذف
کامل
حلقههایی
با تعداد
تکرار ثابت
و کم) را
فعال
میکند. این
گزینه
اندازه کد
را افزایش
میدهد و
ممکن است
سرعت اجرای
آن را بیشتر
کند یا
نکند.
توسط -fprofile-use و -fauto-profile فعال میشود.
- -funroll-all-loops
- تمامی حلقهها را باز میکند، حتی اگر تعداد تکرارهای آنها هنگام ورود به حلقه نامشخص باشد. این کار معمولاً اجرای برنامهها را کندتر میکند. -funroll-all-loops به طور ضمنی شامل همان گزینههای -funroll-loops است.
- -fpeel-loops
- حلقههایی
را که بر
اساس
بازخورد
پروفایلینگ
یا تحلیل
ایستا
اطلاعات
کافی مبنی
بر کم بودن
تکرار
آنها وجود
دارد،
لایهبرداری
(peel) میکند.
همچنین
لایهبرداری
کامل حلقه
(یعنی حذف
کامل
حلقههایی
با تعداد
تکرار ثابت
و کم) را
فعال
میسازد.
توسط -O3، -fprofile-use و -fauto-profile فعال میشود.
- -fmalloc-dce
- کنترل
میکند که
آیا
فراخوانیهای
"malloc" (و
گونههای
آن مانند
"calloc" یا
"strdup")، به
شرطی که
مقدار
بازگشتی
آنها فقط
به عنوان
آرگومان
فراخوانی
"free"
استفاده
شده یا با
"NULL"
مقایسه
شود،
میتوانند
از طریق
بهینهسازی
حذف شوند یا
خیر. اگر از
-fmalloc-dce=1
استفاده
شود، فقط
فراخوانیهای
"free" مجاز
هستند، در
حالی که با
-fmalloc-dce=2
مقایسهها
با
اشارهگر
"NULL" نیز
برای حذف
ایمن در نظر
گرفته
میشوند.
پیشفرض -fmalloc-dce=2 است. همچنین نگاه کنید به -fallocation-dce.
- -fmove-loop-invariants
- گذر انتقال مقادیر پایای حلقه (loop invariant motion) را در بهینهساز حلقه RTL فعال میکند. در سطح -O1 و بالاتر، به جز -Og فعال است.
- -fmove-loop-stores
- گذر انتقال ذخیرهسازیهای حلقه (loop store motion) را در بهینهساز حلقه GIMPLE فعال میکند. این کار ذخیرهسازیهای پایا را به بعد از پایان حلقه منتقل کرده و در عوض مقدار ذخیرهشده را در طول تکرارها درون یک ثبات نگه میدارد. توجه داشته باشید که برای اثرگذاری این گزینه، -ftree-loop-im نیز باید فعال باشد. در سطح -O1 و بالاتر، به جز -Og فعال است.
- -fsplit-loops
- اگر
حلقهای
شامل شرطی
باشد که
برای یک بخش
از فضای
تکرار
همیشه درست
و برای بخش
دیگر
نادرست
است، آن را
به دو حلقه
تقسیم
میکند.
توسط -fprofile-use و -fauto-profile فعال میشود.
- -funswitch-loops
- شاخههای
دارای
شرایط
پایای حلقه
را به بیرون
حلقه منتقل
میکند،
همراه با
نسخههای
تکراری از
حلقه در هر
دو شاخه (که
بر اساس
نتیجه شرط
تغییر
یافتهاند).
توسط -fprofile-use و -fauto-profile فعال میشود.
- -fversion-loops-for-strides
- اگر یک حلقه
روی
آرایهای
با گام (stride)
متغیر
تکرار شود،
نسخه دیگری
از حلقه
ایجاد
میکند که
فرض میکند
گام همیشه
یک است.
برای مثال:
for (int i = 0; i < n; ++i) x[i * stride] = ...;
تبدیل میشود به:
if (stride == 1) for (int i = 0; i < n; ++i) x[i] = ...; else for (int i = 0; i < n; ++i) x[i * stride] = ...;این گزینه به ویژه برای آرایههای assumed-shape در فرترن مفید است که در آنجا (برای نمونه) با فرض دسترسیهای پیوسته، برداریسازی بهتری را امکانپذیر میسازد. این پرچم بهطور پیشفرض در -O3 فعال است. همچنین توسط -fprofile-use و -fauto-profile نیز فعال میشود.
- -ffunction-sections
- -fdata-sections
- اگر معماری
مقصد از
بخشهای (sections)
دلخواه
پشتیبانی
کند، هر
تابع یا
مورد داده
را در بخش
اختصاصی
خود در فایل
خروجی قرار
میدهد. نام
تابع یا نام
مورد داده،
نام بخش
مربوطه را
در فایل
خروجی
تعیین
میکند.
از این گزینهها در سیستمهایی استفاده کنید که پیونددهنده (linker) میتواند بهینهسازیهایی را برای بهبود محلیبودن ارجاع در فضای دستورالعمل انجام دهد. بیشتر سیستمهایی که از قالب شیء ELF استفاده میکنند پیونددهندههایی با چنین بهینهسازیهایی دارند. در AIX، پیونددهنده بخشها (CSECTها) را بر اساس گراف فراخوانی بازآرایی میکند. تأثیر آن بر کارایی متفاوت است.
همراه با جمعآوری زباله پیونددهنده (گزینه --gc-sections در پیونددهنده)، این گزینهها میتوانند منجر به فایلهای اجرایی پیوندایستای کوچکتر (پس از strip کردن) شوند.
در سیستمهای ELF/DWARF این گزینهها کیفیت اطلاعات اشکالزدایی را کاهش نمیدهند. با این حال ممکن است در سایر قالبهای فایل شیء/اطلاعات اشکالزدایی مشکلاتی وجود داشته باشد.
تنها زمانی از این گزینهها استفاده کنید که مزایای قابلتوجهی از انجام آن حاصل شود. هنگام مشخص کردن این گزینهها، اسمبلر و پیونددهنده فایلهای شیء و اجرایی بزرگتری ایجاد میکنند و کندتر نیز خواهند بود. این گزینهها روی تولید کد تأثیر میگذارند. آنها از بهینهسازیهایی توسط کامپایلر و اسمبلر که از مکانهای نسبی داخل یک واحد ترجمه استفاده میکنند جلوگیری به عمل میآورند، زیرا مکانها تا زمان پیوند ناشناخته هستند. نمونهای از این بهینهسازیها، تبدیل فراخوانیها به دستورالعملهای فراخوانی کوتاه است.
- -fstdarg-opt
- پیشدرآمد توابع با آرگومانهای متغیر (variadic) را با توجه به نحوه استفاده از آن آرگومانها بهینهسازی میکند.
- -fsection-anchors
- تلاش
میکند تا
با استفاده
از نمادهای
لنگرگاه
مشترک برای
آدرسدهی
اشیای
نزدیک به
هم، تعداد
محاسبات
آدرس
نمادین را
کاهش دهد.
این
دگرگونی
میتواند
به کاهش
تعداد
مدخلهای GOT
و
دسترسیهای
GOT در برخی
معماریهای
مقصد کمک
کند.
برای مثال، پیادهسازی تابع زیر با نام "foo":
static int a, b, c; int foo (void) { return a + b + c; }معمولاً آدرسهای هر سه متغیر را محاسبه میکند، اما اگر آن را با -fsection-anchors کامپایل کنید، در عوض از طریق یک نقطه لنگرگاه مشترک به متغیرها دسترسی مییابد. اثر آن مشابه شبهکد زیر است (که کد معتبر C نیست):
int foo (void) { register int *xr = &x; return xr[&a - &x] + xr[&b - &x] + xr[&c - &x]; }همه اهداف از این گزینه پشتیبانی نمیکنند..IP -fzero-call-used-regs=choice 4 صفر کردن ثباتهای استفادهشده در فراخوانی (call-used registers) هنگام بازگشت از تابع جهت افزایش امنیت برنامه، چه از طریق کاهش اثر حملات «برنامهنویسی مبتنی بر بازگشت» (Return-Oriented Programming یا ROP) و چه از طریق جلوگیری از نشت اطلاعات از طریق ثباتها.
مقادیر ممکن برای choice همانند مقادیر مشخصهٔ "zero_call_used_regs" است. پیشفرض skip است.
میتوانید این رفتار را برای یک تابع خاص با استفاده از مشخصهٔ تابع "zero_call_used_regs" کنترل کنید.
- --param name=value
- در برخی
موارد، GCC از
ثابتهای
گوناگونی
برای کنترل
میزان
بهینهسازی
انجامشده
استفاده
میکند.
برای مثال،
GCC توابعی را
که بیش از
تعداد
مشخصی
دستورالعمل
دارند
درونخطی (inline)
نمیکند.
شما
میتوانید
برخی از این
ثابتها را
در خط فرمان
با استفاده
از گزینهٔ
--param کنترل
کنید.
نامهای پارامترهای خاص و معنای مقادیر به ساختار درونی کامپایلر وابسته هستند و ممکن است در نسخههای بعدی بدون اطلاع قبلی تغییر کنند.
برای بهدست آوردن مقادیر کمینه، بیشینه و پیشفرض یک پارامتر، از گزینههای --help=param -Q استفاده کنید.
در هر حالت، value یک عدد صحیح است. انتخابهای زیر برای name برای تمامی اهداف (targets) شناختهشده هستند:
- phiopt-factor-max-stmts-live
- هنگام فاکتورگیری عبارات از if/then/else، این بیشینهٔ تعداد دستورات پس از دستور تعریفکننده است که اجازه دارند طول عمر یک نام را افزایش دهند.
- predictable-branch-outcome
- هنگامی که پیشبینی میشود یک شاخه با احتمالی کمتر از این آستانه (به درصد) انتخاب شود (taken)، آنگاه به عنوان شاخهای با پیشبینیپذیری مناسب در نظر گرفته میشود.
- max-rtl-if-conversion-insns
- تبدیل شرطی RTL سعی میکند شاخههای شرطی پیرامون یک بلوک را حذف کرده و آنها را با دستورالعملهای دارای اجرای شرطی جایگزین کند. این پارامتر بیشینهٔ تعداد دستورالعملها در یک بلوک را مشخص میکند که باید برای تبدیل شرطی بررسی شوند. کامپایلر همچنین از سایر روشهای ابتکاری (heuristics) برای تصمیمگیری دربارهٔ سودمند بودن احتمالی تبدیل شرطی استفاده خواهد کرد.
- file-cache-files
- بیشینهٔ تعداد فایلها در حافظهٔ پنهان فایل (file cache). حافظهٔ پنهان فایل برای چاپ خطوط منبع در پیامهای تشخیصی و انجام برخی بررسیهای کد منبع مانند -Wmisleading-indentation استفاده میشود.
- file-cache-lines
- بیشینهٔ تعداد خطوط برای نمایهسازی در حافظهٔ پنهان فایل. مقدار 0 اندازه را بهطور خودکار تعیین میکند. حافظهٔ پنهان فایل برای چاپ خطوط منبع در پیامهای تشخیصی و انجام برخی بررسیهای کد منبع مانند -Wmisleading-indentation استفاده میشود.
- max-rtl-if-conversion-predictable-cost
- تبدیل شرطی RTL تلاش میکند تا شاخههای شرطی پیرامون یک بلوک را حذف کرده و آنها را با دستورالعملهای دارای اجرای شرطی جایگزین کند. این پارامترها بیشینهٔ هزینهٔ مجاز را برای توالی تولیدشده توسط تبدیل شرطی، بسته به اینکه شاخه به صورت ایستا پیشبینیپذیر تشخیص داده شده باشد یا خیر، تعیین میکنند. واحد این پارامتر همانند معیار درونی seq_cost در GCC است. کامپایلر تلاش خواهد کرد با استفاده از ماکروی هدف BRANCH_COST یک پیشفرض منطقی برای این پارامتر فراهم کند.
- max-crossjump-edges
- بیشینهٔ تعداد یالهای ورودی جهت بررسی برای پرش متقاطع (cross-jumping). الگوریتم مورد استفاده توسط -fcrossjumping بر حسب تعداد یالهای ورودی به هر بلوک از مرتبهٔ O(N^2) است. مقادیر بزرگتر به معنای بهینهسازی تهاجمیتر هستند که زمان کامپایل را با بهبود احتمالاً اندک در اندازهٔ فایل اجرایی افزایش میدهد.
- min-crossjump-insns
- کمینهٔ تعداد دستورالعملهایی که باید در انتهای دو بلوک مطابقت داشته باشند تا پرش متقاطع روی آنها انجام شود. در حالتی که تمام دستورالعملهای بلوکی که پرش متقاطع از آن انجام میشود منطبق باشند، این مقدار نادیده گرفته میشود.
- max-grow-copy-bb-insns
- بیشینهٔ ضریب گسترش اندازهٔ کد هنگام کپی کردن بلوکهای پایه (basic blocks) به جای پرش. این گسترش نسبت به یک دستورالعمل پرش سنجیده میشود.
- max-goto-duplication-insns
- بیشینهٔ تعداد دستورالعملها برای تکثیر در بلوکی که به یک goto محاسبهشده (computed goto) میپرد. برای جلوگیری از رفتار O(N^2) در چندین گذر، GCC دستورات goto محاسبهشده را در مراحل اولیهٔ فرآیند کامپایل فاکتورگیری میکند و تا حد امکان دیر آنها را از حالت فاکتور خارج میسازد. تنها پرشهای محاسبهشده در انتهای بلوکهای پایهای که بیش از max-goto-duplication-insns دستورالعمل ندارند از حالت فاکتور خارج میشوند.
- max-delay-slot-insn-search
- بیشینهٔ تعداد دستورالعملها برای بررسی هنگام جستجوی دستورالعملی جهت پر کردن شکاف تأخیر (delay slot). اگر بیش از این تعداد دلخواه از دستورالعملها جستجو شوند، صرفهجویی زمانی حاصل از پر کردن شکاف تأخیر بسیار ناچیز خواهد بود، بنابراین جستجو متوقف میشود. مقادیر بزرگتر به معنای بهینهسازی تهاجمیتر هستند که زمان کامپایل را با بهبود احتمالاً ناچیز در زمان اجرا افزایش میدهد.
- max-delay-slot-live-search
- هنگام تلاش برای پر کردن شکافهای تأخیر، بیشینهٔ تعداد دستورالعملها برای بررسی هنگام جستجوی بلوکی با اطلاعات ثباتهای زندهٔ (live register) معتبر. افزایش این مقدار دلخواه به معنای بهینهسازی تهاجمیتر بوده و زمان کامپایل را افزایش میدهد. هنگامی که کد شکاف تأخیر برای نگهداری گراف جریان کنترل بازنویسی شود، این پارامتر باید حذف گردد.
- max-gcse-memory
- میزان تقریبی بیشینهٔ حافظه به "kB" که میتواند برای انجام بهینهسازی «حذف سراسری عبارتهای فرعی مشترک» (global common subexpression elimination) تخصیص یابد. اگر حافظهای بیش از مقدار مشخصشده نیاز باشد، این بهینهسازی انجام نمیشود.
- max-gcse-insertion-ratio
- اگر نسبت درج عبارات به حذف آنها برای هر عبارتی بزرگتر از این مقدار باشد، آنگاه RTL PRE عبارت را درج یا حذف میکند و بدین ترتیب محاسبات تا حدی تکراری را در جریان دستورالعملها باقی میگذارد.
- max-pending-list-length
- بیشینهٔ تعداد وابستگیهای معلقی که زمانبندی (scheduling) پیش از تخلیهٔ وضعیت فعلی و شروع دوباره مجاز میداند. توابع بزرگ با انشعابها یا فراخوانیهای اندک میتوانند فهرستهای بسیار بزرگی ایجاد کنند که بیدلیل حافظه و منابع را مصرف میکنند.
- max-modulo-backtrack-attempts
- بیشینهٔ تعداد تلاشها برای پسگرد (backtrack) که زمانبند هنگام زمانبندی پیمانهای (modulo scheduling) یک حلقه باید انجام دهد. مقادیر بزرگتر میتوانند زمان کامپایل را بهطور نمایی افزایش دهند.
- max-inline-functions-called-once-loop-depth
- بیشینهٔ عمق حلقهٔ یک فراخوانی که توسط روشهای ابتکاری درونخطیسازی (که سعی در درونخطی کردن تمامی توابع با یکبار فراخوانی دارند) در نظر گرفته میشود.
- max-inline-functions-called-once-insns
- بیشینهٔ اندازهٔ تخمینی توابع تولیدشده هنگام درونخطی کردن توابعی که تنها یک بار فراخوانی شدهاند.
- max-inline-insns-single
- چندین پارامتر، مؤلفهٔ tree inliner مورد استفاده در GCC را کنترل میکنند. این عدد بیشینهٔ تعداد دستورالعملها (شمارششده در نمایش درونی GCC) در یک تکتابع را تعیین میکند که tree inliner برای درونخطیسازی در نظر میگیرد. این مورد تنها بر توابع اعلانشده به صورت inline و متدهایی که در اعلان کلاس (C++) پیادهسازی شدهاند تأثیر میگذارد.
- max-inline-insns-auto
- هنگامی که از -finline-functions (گنجاندهشده در -O3) استفاده میکنید، توابع فراوانی که در غیر این صورت برای درونخطیسازی توسط کامپایلر بررسی نمیشدند، ارزیابی میشوند. برای این توابع، میتوان حد متفاوتی (محدودکنندهتر) در مقایسه با توابع اعلانشده به صورت inline اعمال کرد (--param max-inline-insns-auto).
- max-inline-insns-small
- این کرانی است که بر فراخوانیهای در نظر گرفتهشده به عنوان مرتبط با -finline-small-functions اعمال میشود.
- max-inline-insns-size
- این کرانی است که بر فراخوانیهای بهینهسازیشده برای اندازه اعمال میشود. رشد اندک اندازه ممکن است برای پیشبینی فرصتهای بهینهسازی که توسط درونخطیسازی پدیدار میشوند، مطلوب باشد.
- uninlined-function-insns
- تعداد دستورالعملهایی که درونخطیساز برای سربار تابع مانند مقدمه (prologue) و مؤخره (epilogue) تابع به حساب میآورد.
- uninlined-function-time
- زمان اضافهای که درونخطیساز برای سربار تابع، مانند زمان لازم برای اجرای مقدمه و مؤخرهٔ تابع، به حساب میآورد.
- inline-heuristics-hint-percent
- مقیاس (به درصد) اعمالشده به inline-insns-single، inline-insns-single-O2 و inline-insns-auto هنگامی که روشهای ابتکاری درونخطی اشاره میکنند که درونخطیسازی بسیار سودمند است (بهینهسازیهای بعدی را ممکن میسازد).
- uninlined-thunk-insns
- uninlined-thunk-time
- مشابه --param uninlined-function-insns و --param uninlined-function-time اما برای thunkهای تابع اعمال میشود..IP inline-min-speedup 4 هنگامی که بهبود تخمینی کارایی در زمان اجرای فراخواننده (caller) + فراخواندهشده (callee) از این آستانه (به درصد) فراتر رود، تابع میتواند صرفنظر از محدودیت روی --param max-inline-insns-single و --param max-inline-insns-auto درونخطی شود.
- large-function-insns
- حد تعیینکنندهٔ توابع واقعاً بزرگ. برای توابعی که پس از درونخطیسازی بزرگتر از این حد باشند، درونخطیسازی توسط --param large-function-growth محدود میشود. این پارامتر عمدتاً برای جلوگیری از زمان کامپایل بیش از حد ناشی از الگوریتمهای غیرخطی مورد استفاده در بخش پشتی (back end) مفید است.
- large-function-growth
- بیشینهٔ رشد توابع بزرگ ناشی از درونخطیسازی را بر حسب درصد مشخص میکند. برای مثال، مقدار پارامتر 100 رشد تابع بزرگ را به 2.0 برابر اندازهٔ اصلی محدود میکند.
- large-unit-insns
- حد تعیینکنندهٔ واحد ترجمه (translation unit) بزرگ. رشد ناشی از درونخطیسازی واحدهایی که از این حد بزرگتر هستند، توسط --param inline-unit-growth محدود میشود. برای واحدهای کوچک ممکن است این محدودیت بیش از حد سختگیرانه باشد. برای مثال، واحدی متشکل از تابع A که درونخطی است و تابع B که صرفاً ۳ بار A را فراخوانی میکند در نظر بگیرید. اگر B نسبت به A کوچک باشد، رشد واحد 300\% خواهد بود و با این وجود چنین درونخطیسازی بسیار معقول است. با این حال، برای واحدهای بسیار بزرگ متشکل از توابع کوچکِ قابل درونخطی، محدودیت کلی رشد واحد برای جلوگیری از انفجار نمایی اندازهٔ کد الزامی است. بنابراین برای واحدهای کوچکتر، اندازه قبل از اعمال --param inline-unit-growth تا --param large-unit-insns افزایش داده میشود.
- lazy-modules
- بیشینهٔ تعداد فایلهای ماژول C++ که در بارگذاری تنبل (lazy loading) میتوانند بهطور همزمان باز باشند.
- inline-unit-growth
- بیشینهٔ رشد کلی واحد کامپایل ناشی از درونخطیسازی را مشخص میکند. برای مثال، مقدار پارامتر 20 رشد واحد را به 1.2 برابر اندازهٔ اصلی محدود میکند. توابع سرد (cold) (که یا از طریق یک صفت یا توسط بازخورد پروفایل علامتگذاری شدهاند) در اندازهٔ واحد به حساب نمیآیند.
- ipa-cp-unit-growth
- بیشینهٔ رشد کلی واحد کامپایل ناشی از انتشار ثابتهای بینروالی (interprocedural constant propagation) را مشخص میکند. برای مثال، مقدار پارامتر 10 رشد واحد را به 1.1 برابر اندازهٔ اصلی محدود میکند.
- ipa-cp-large-unit-insns
- اندازهٔ واحد ترجمهای که گذر IPA-CP آن را بزرگ در نظر میگیرد.
- large-stack-frame
- حد تعیینکنندهٔ فریمهای پشتهٔ بزرگ. در حین درونخطیسازی، الگوریتم تلاش میکند بیش از حد فراتر از این حد رشد نکند.
- large-stack-frame-growth
- بیشینهٔ رشد فریمهای پشتهٔ بزرگ ناشی از درونخطیسازی را بر حسب درصد مشخص میکند. برای مثال، مقدار پارامتر 1000 رشد فریم پشتهٔ بزرگ را به 11 برابر اندازهٔ اصلی محدود میکند.
- max-inline-insns-recursive
- max-inline-insns-recursive-auto
- بیشینهٔ
تعداد
دستورالعملهایی
را تعیین
میکند که
یک نسخهٔ
خارج از خط
(out-of-line) از یک
تابع
درونخطی
بازگشتی به
خود،
میتواند
با انجام
درونخطیسازی
بازگشتی به
آن اندازه
رشد کند.
--param max-inline-insns-recursive برای توابعی که به عنوان inline اعلام شدهاند اعمال میشود. برای توابعی که inline اعلام نشدهاند، درونخطیسازی بازگشتی تنها زمانی اتفاق میافتد که -finline-functions (گنجاندهشده در -O3) فعال باشد؛ در این حالت به جای آن --param max-inline-insns-recursive-auto اعمال میشود.
- max-inline-recursive-depth
- max-inline-recursive-depth-auto
- بیشینهٔ
عمق بازگشت
مورد
استفاده
برای
درونخطیسازی
بازگشتی را
مشخص
میکند.
--param max-inline-recursive-depth برای توابعی که به صورت inline تعریف شدهاند اعمال میشود. برای توابعی که به صورت inline تعریف نشدهاند، درونخطیسازی بازگشتی تنها زمانی انجام میشود که -finline-functions (موجود در -O3) فعال باشد؛ در این حالت به جای آن --param max-inline-recursive-depth-auto اعمال میشود.
- min-inline-recursive-probability
- درونخطیسازی
بازگشتی
تنها برای
توابعی
سودمند است
که به طور
میانگین
بازگشت
عمیقی
دارند، و
میتواند
با افزایش
اندازهٔ
پیشدرآمد
(prologue) یا
پیچیدگی
بدنهٔ تابع
برای سایر
بهینهسازها،
به توابعی
با عمق
بازگشت کم
آسیب
برساند.
هنگامی که بازخورد پروفایل در دسترس است (به -fprofile-generate مراجعه کنید)، عمق واقعی بازگشت را میتوان از روی احتمال بازگشت تابع از طریق یک عبارت فراخوانی معین تخمین زد. این پارامتر درونخطیسازی را فقط به عبارتهای فراخوانی محدود میکند که احتمال آنها از آستانهٔ مشخصشده (به درصد) فراتر رود.
- early-inlining-insns
- میزان رشدی را مشخص میکند که درونخطیساز زودهنگام (early inliner) میتواند ایجاد کند. در عمل، این پارامتر میزان درونخطیسازی را برای کدهایی که جریمهٔ انتزاع (abstraction penalty) زیادی دارند، افزایش میدهد.
- max-early-inliner-iterations
- محدودیت تکرارهای درونخطیساز زودهنگام. این پارامتر اساساً تعداد فراخوانیهای غیرمستقیم تو در تو را که درونخطیساز زودهنگام میتواند برطرف کند، محدود میسازد. زنجیرههای عمیقتر همچنان توسط درونخطیسازی دیرهنگام (late inlining) مدیریت میشوند.
- comdat-sharing-probability
- احتمال (به درصد) اینکه توابع درونخطی C++ با دیداریِ comdat در میان چندین واحد کامپایل به اشتراک گذاشته شوند.
- modref-max-bases
- modref-max-refs
- modref-max-accesses
- بیشینهٔ تعداد اشارهگرهای پایه، ارجاعها و دسترسیهای ذخیرهشده برای یک تابع منفرد توسط تحلیل mod/ref را مشخص میکند.
- modref-max-tests
- بیشینهٔ تعداد آزمونهایی را که اوراکل نام مستعار (alias oracle) میتواند برای رفع ابهام مکانهای حافظه با استفاده از اطلاعات mod/ref انجام دهد مشخص میکند. این پارامتر باید بزرگتر از --param modref-max-bases و --param modref-max-refs باشد.
- modref-max-depth
- بیشینهٔ عمق پیمایش DFS مورد استفاده توسط تحلیل گریز (escape analysis) در modref را مشخص میکند. مقدار 0 این تحلیل را بهطور کامل غیرفعال میکند.
- modref-max-escape-points
- بیشینهٔ تعداد نقاط گریز ردگیریشده توسط modref به ازای هر SSA-name را مشخص میکند.
- modref-max-adjustments
- بیشینهٔ دفعاتی را مشخص میکند که محدودهٔ دسترسی در طول تحلیل جریان دادهٔ modref گسترش مییابد.
- profile-func-internal-id
- پارامتری برای کنترل استفاده از شناسهٔ داخلی تابع در جستجوی پایگاه دادهٔ پروفایل. اگر مقدار 0 باشد، کامپایلر از شناسهای استفاده میکند که مبتنی بر نام اسمبلی تابع و نام فایل است، که باعث میشود دادههای قدیمی پروفایل در برابر تغییرات سورس مانند تغییر ترتیب توابع و غیره سازگارتر باشند.
- min-vect-loop-bound
- حداقل تعداد تکرارهایی که در صورت کمتر بودن از آن، هنگام استفاده از -ftree-vectorize حلقهها برداریسازی نمیشوند. تعداد تکرارها پس از برداریسازی باید بزرگتر از مقدار تعیینشده توسط این گزینه باشد تا برداریسازی مجاز شود.
- gcse-cost-distance-ratio
- ضریب مقیاسبندی در محاسبهٔ بیشینهٔ مسافتی که یک عبارت میتواند توسط بهینهسازیهای GCSE جابجا شود. این مورد در حال حاضر فقط در گذر برافراشتن کد (code hoisting pass) پشتیبانی میشود. هرچه نسبت بزرگتر باشد، برافراشتن کد در مواجهه با عبارتهای ساده، یعنی عبارتهایی که هزینهای کمتر از gcse-unrestricted-cost دارند، تهاجمیتر خواهد بود. تعیین مقدار 0 برافراشتن عبارتهای ساده را غیرفعال میکند.
- gcse-unrestricted-cost
- هزینهای که به طور تقریبی به اندازهٔ هزینهٔ یک تکدستورالعمل ماشین معمولی برآورد میشود، و در آن بهینهسازیهای GCSE مسافتی را که یک عبارت میتواند طی کند محدود نمیکنند. این ویژگی در حال حاضر تنها در گذر برافراشتن کد پشتیبانی میشود. هرچه هزینه کمتر باشد، برافراشتن کد تهاجمیتر است. تعیین مقدار 0 به همهٔ عبارتها اجازه میدهد تا فواصل نامحدود را طی کنند.
- max-hoist-depth
- عمق جستجو در درخت تسلط (dominator tree) برای عبارتهایی که باید برافراشته شوند. این پارامتر برای جلوگیری از رفتار درجه دوم در الگوریتم برافراشتن استفاده میشود. مقدار 0 جستجو را محدود نمیکند، اما ممکن است کامپایل توابع بسیار بزرگ را کُند سازد.
- max-tail-merge-comparisons
- بیشینهٔ تعداد bbsهای مشابه برای مقایسهٔ یک bb با آنها. این پارامتر برای جلوگیری از رفتار درجه دوم در ادغام دم در درخت (tree tail merging) به کار میرود.
- max-tail-merge-iterations
- بیشینهٔ تعداد تکرارهای گذر روی تابع. این پارامتر برای محدود کردن زمان کامپایل در ادغام دم در درخت استفاده میشود.
- store-merging-allow-unaligned
- به گذر ادغام ذخیرهسازی (store merging) اجازه میدهد تا در صورت مجاز بودن، ذخیرهسازیهای ناتراز (unaligned stores) ایجاد کند..IP max-stores-to-merge 4 بیشینهٔ تعداد ذخیرهسازیها جهت تلاش برای ادغام در ذخیرهسازیهای عریضتر در گذر ادغام ذخیرهسازی (store merging pass).
- max-store-chains-to-track
- بیشینهٔ تعداد زنجیرههای ذخیرهسازی برای ردگیری همزمان در هنگام تلاش برای ادغام آنها در ذخیرهسازیهای عریضتر در گذر ادغام ذخیرهسازی.
- max-stores-to-track
- بیشینهٔ تعداد ذخیرهسازیها برای ردگیری همزمان در هنگام تلاش برای ادغام آنها در ذخیرهسازیهای عریضتر در گذر ادغام ذخیرهسازی.
- max-unrolled-insns
- بیشینهٔ تعداد دستورالعملهایی که یک حلقه میتواند داشته باشد تا باز شود (unrolled). اگر حلقهای باز شود، این پارامتر همچنین تعیین میکند که کد حلقه چند بار باز شود.
- max-average-unrolled-insns
- بیشینهٔ تعداد دستورالعملها، وزندهیشده بر اساس احتمال اجرای آنها، که یک حلقه میتواند داشته باشد تا باز شود. اگر حلقهای باز شود، این پارامتر همچنین تعیین میکند که کد حلقه چند بار باز شود.
- max-unroll-times
- بیشینهٔ دفعات باز کردن (unrolling) یک حلقهٔ منفرد.
- max-peeled-insns
- بیشینهٔ تعداد دستورالعملهایی که یک حلقه میتواند داشته باشد تا پوستهکنی (peeled) شود. اگر حلقهای پوستهکنی شود، این پارامتر همچنین تعیین میکند که کد حلقه چند بار پوستهکنی شود.
- max-peel-times
- بیشینهٔ دفعات پوستهکنی (peeling) یک حلقهٔ منفرد.
- max-peel-branches
- بیشینهٔ تعداد شاخهها در مسیر داغ (hot path) در امتداد توالی پوستهکنیشده.
- max-completely-peeled-insns
- بیشینهٔ تعداد دستورالعملهای یک حلقهٔ کاملاً پوستهکنیشده.
- max-completely-peel-times
- بیشینهٔ تعداد تکرارهای یک حلقه برای اینکه مناسب پوستهکنی کامل باشد.
- max-completely-peel-loop-nest-depth
- بیشینهٔ عمق یک آشیانهٔ حلقه که برای پوستهکنی کامل مناسب است.
- max-unswitch-insns
- بیشینهٔ تعداد دستورالعملهای یک حلقهٔ برونبریشده از شرط (unswitched loop).
- max-unswitch-depth
- بیشینهٔ عمق یک آشیانهٔ حلقه جهت برونبری شرط (unswitch).
- lim-expensive
- کمینهٔ هزینهٔ یک عبارت گرانقیمت در انتقال عبارات نامتغیر حلقه (loop invariant motion).
- min-loop-cond-split-prob
- هنگامی که اطلاعات پروفایل FDO در دسترس باشد، min-loop-cond-split-prob کمینهٔ آستانهٔ احتمال را برای یک دستور شرطی شبهنامتغیر جهت راهاندازی شکافتن حلقه (loop split) مشخص میکند.
- iv-consider-all-candidates-bound
- حد آستانه برای تعداد نامزدهای متغیرهای استقرایی (induction variables)، که زیر آن همهٔ نامزدها برای هر مورد استفاده در بهینهسازیهای متغیر استقرایی در نظر گرفته میشوند. اگر تعداد نامزدها بیشتر از این مقدار باشد، برای جلوگیری از پیچیدگی زمانی درجه دو، تنها مرتبطترین آنها در نظر گرفته میشوند.
- iv-max-considered-uses
- بهینهسازیهای متغیر استقرایی از بررسی حلقههایی که تعداد کاربردهای متغیر استقرایی در آنها بیشتر از این باشد، صرفنظر میکنند.
- iv-always-prune-cand-set-bound
- اگر تعداد نامزدها در مجموعه کمتر از این مقدار باشد، هنگام افزودن یک متغیر استقرایی جدید، همیشه تلاش میشود تا موارد غیرضروری از مجموعه هرس (prune) شوند.
- avg-loop-niter
- میانگین تعداد تکرارهای یک حلقه.
- dse-max-object-size
- بیشینهٔ اندازه (به بایت) اشیائی که بهصورت بایتی توسط حذف ذخیرهسازی مرده (dead store elimination) ردگیری میشوند. مقادیر بزرگتر ممکن است به زمانهای کامپایل طولانیتر منجر شوند.
- dse-max-alias-queries-per-store
- بیشینهٔ تعداد پرسوجوها از پیشگوی نام مستعار (alias oracle) به ازای هر ذخیرهسازی. مقادیر بزرگتر باعث افزایش زمان کامپایل شده و ممکن است به حذف ذخیرهسازیهای مردهٔ بیشتری بیانجامد.
- scev-max-expr-size
- حد آستانه برای اندازهٔ عبارتهای مورد استفاده در تحلیلگر تکامل نردهای (scalar evolutions analyzer). عبارتهای بزرگ سرعت تحلیلگر را کاهش میدهند.
- scev-max-expr-complexity
- حد آستانه برای پیچیدگی عبارتها در تحلیلگر تکامل نردهای. عبارتهای پیچیده سرعت تحلیلگر را کاهش میدهند.
- max-tree-if-conversion-phi-args
- بیشینهٔ تعداد آرگومانها در یک PHI که توسط تبدیلِ if در درخت (TREE if conversion) پشتیبانی میشود، مگر اینکه حلقه با عملگر pragmaی simd مشخص شده باشد.
- vect-max-layout-candidates
- بیشینهٔ تعداد چیدمانهای برداری ممکن (مانند جایگشتها) جهت بررسی هنگام بهینهسازی کدهای آمادهٔ برداریسازی.
- vect-max-version-for-alignment-checks
- بیشینهٔ تعداد بررسیهای زمان اجرا که میتوان هنگام نسخهبندی حلقه برای همترازی در برداریساز (vectorizer) انجام داد.
- vect-max-version-for-alias-checks
- بیشینهٔ تعداد بررسیهای زمان اجرا که میتوان هنگام نسخهبندی حلقه برای نام مستعار (alias) در برداریساز انجام داد.
- vect-max-peeling-for-alignment
- بیشینهٔ دفعات پوستهکنی حلقه برای بهبود همترازی دسترسی در برداریساز. مقدار -1 به معنای نبود محدودیت است.
- max-iterations-to-track
- بیشینهٔ تعداد تکرارهای یک حلقه که الگوریتم جستجوی جامع (brute-force) برای تحلیل تعداد تکرارهای حلقه تلاش میکند آن را ارزیابی کند.
- hot-bb-count-fraction
- مخرج n از کسر 1/n بیشینهٔ تعداد اجرای یک بلوک پایه در کل برنامه که یک بلوک پایه حداقل باید داشته باشد تا داغ (hot) در نظر گرفته شود. مقدار پیشفرض 10000 است، به این معنی که اگر تعداد اجرای یک بلوک پایه بیشتر از 1/10000 بیشینهٔ تعداد اجرا باشد، داغ تلقی میشود. 0 به این معنی است که هرگز داغ در نظر گرفته نمیشود. در حالت غیر LTO استفاده میشود.
- hot-bb-count-ws-permille
- تعداد درهزار پراجراترین، در محدودهٔ 0 تا 1000، از اجرای پروفایلشدهٔ کل برنامه که تعداد اجرای یک بلوک پایه باید بخشی از آن باشد تا داغ در نظر گرفته شود. مقدار پیشفرض 990 است، به این معنی که اگر تعداد اجرای یک بلوک پایه در بالاترین 990 درهزار، یا 99.0% از اجرای پروفایلشدهٔ کل برنامه سهم داشته باشد، داغ محسوب میشود. 0 به این معنی است که هرگز داغ در نظر گرفته نمیشود. در حالت LTO استفاده میشود.
- hot-bb-frequency-fraction
- مخرج n از کسر 1/n بسامد اجرای بلوک ورودی یک تابع که یک بلوک پایه از این تابع باید حداقل داشته باشد تا داغ در نظر گرفته شود. مقدار پیشفرض 1000 است، به این معنی که اگر یک بلوک پایه در یک تابع با بسامدی بیشتر از 1/1000 بسامد بلوک ورودی تابع اجرا شود، داغ تلقی میشود. 0 به این معنی است که هرگز داغ در نظر گرفته نمیشود.
- unlikely-bb-count-fraction
- مخرج n از کسر 1/n تعداد اجراهای پروفایلشدهٔ کل برنامه که تعداد اجرای یک بلوک پایه باید کمتر از آن باشد تا اجرای آن بلوک پایه کماحتمال (unlikely executed) تلقی شود. مقدار پیشفرض 20 است، به این معنی که اگر یک بلوک پایه در کمتر از 1/20، یا 5% از اجراهای برنامه اجرا شود، کماحتمال برای اجرا در نظر گرفته میشود. 0 به این معنی است که همیشه اجرای آن کماحتمال تلقی میشود.
- max-predicted-iterations
- بیشینهٔ تعداد تکرارهای حلقه که بهصورت ایستا پیشبینی میکنیم. این ویژگی در مواردی مفید است که یک تابع شامل یک حلقه با کران مشخص و حلقهٔ دیگری با کران نامشخص باشد. تعداد تکرارهای مشخص بهدرستی پیشبینی میشود، در حالی که میانگین تعداد تکرارهای نامشخص تقریباً 10 تخمین زده میشود. این بدان معناست که حلقهٔ بدون کران در مقایسه با دیگری بهطور مصنوعی سرد به نظر میرسد.
- builtin-expect-probability
- کنترل احتمال اینکه عبارت دارای مقدار مشخصشده باشد. این پارامتر یک درصد (یعنی 0 ... 100) را به عنوان ورودی دریافت میکند.
- builtin-string-cmp-inline-length
- بیشینهٔ طول یک رشتهٔ ثابت برای فراخوانیِ توکار cmp رشته که واجد شرایط جایگذاری درونخطی (inlining) است.
- align-threshold
- انتخاب کسری از بیشینهٔ بسامد اجراهای یک بلوک پایه در یک تابع جهت همتراز کردن بلوک پایه.
- align-loop-iterations
- حلقهای که انتظار میرود حداقل به تعداد تکرارهای انتخابی تکرار شود، همتراز میگردد.
- tracer-dynamic-coverage
- tracer-dynamic-coverage-feedback
- این مقدار
برای محدود
کردن تشکیل
اَبَربلوک
(superblock) پس از
پوششدهی
درصد
مشخصشدهای
از
دستورالعملهای
اجراشده
استفاده
میشود. این
کار گسترش
غیرضروری
اندازه کد
را محدود
میکند.
پارامتر tracer-dynamic-coverage-feedback تنها زمانی استفاده میشود که بازخورد پروفایل (profile feedback) در دسترس باشد. پروفایلهای واقعی (برخلاف موارد تخمینزدهشده به صورت ایستا) توازن بسیار کمتری دارند که اجازه میدهد آستانه مقدار بزرگتری داشته باشد.
- tracer-max-code-growth
- تکثیر دنباله (tail duplication) را به محض اینکه رشد کد به درصد مشخصشده رسید متوقف میکند. این یک محدودیت تا حدی مصنوعی است، چرا که بیشتر نسخههای تکراری بعداً در جهش متقاطع (cross jumping) حذف میشوند، بنابراین ممکن است روی مقادیر بسیار بالاتری نسبت به رشد کد مورد نظر تنظیم شود.
- tracer-min-branch-ratio
- هنگامی که احتمال معکوسِ بهترین یال کمتر از این آستانه (به درصد) باشد، رشد معکوس را متوقف میکند.
- tracer-min-branch-probability
- tracer-min-branch-probability-feedback
- رشد
روبهجلو
را در صورتی
که بهترین
یال
احتمالی
کمتر از این
آستانه
داشته باشد
متوقف
میکند.
مشابه tracer-dynamic-coverage دو پارامتر ارائه شده است. tracer-min-branch-probability-feedback برای کامپایل با بازخورد پروفایل، و tracer-min-branch-probability برای کامپایل بدون آن استفاده میشود. مقدار برای کامپایل با بازخورد پروفایل باید محافظهکارانهتر (بزرگتر) باشد تا ردیاب (tracer) مؤثر واقع شود.
- stack-clash-protection-guard-size
- اندازه محافظ پشته (stack guard) ارائهشده توسط سیستمعامل را بر مبنای ۲ به توان num بایت مشخص میکند. مقادیر بالاتر ممکن است تعداد کاوشهای (probes) صریح را کاهش دهند، اما مقداری بزرگتر از محافظ ارائهشده توسط سیستمعامل، کد را در برابر حملات نوع برخورد پشته (stack clash) آسیبپذیر میگذارد.
- stack-clash-protection-probe-interval
- محافظت از برخورد پشته شامل کاوش فضای پشته همزمان با تخصیص آن است. این پارامتر حداکثر فاصله بین کاوشها در پشته را به صورت ۲ به توان num بایت کنترل میکند. مقادیر بالاتر ممکن است تعداد کاوشهای صریح را کاهش دهند، اما مقداری بزرگتر از محافظ ارائهشده توسط سیستمعامل، کد را در برابر حملات نوع برخورد پشته آسیبپذیر میگذارد.
- max-cse-path-length
- حداکثر تعداد بلوکهای پایهای در مسیری که CSE در نظر میگیرد.
- max-cse-insns
- حداکثر تعداد دستورالعملهایی که CSE قبل از تخلیه (flushing) پردازش میکند.
- ggc-min-expand
- کامپایلر GCC
از یک
زبالهروب
(garbage collector) برای
مدیریت
تخصیص
حافظه خود
استفاده
میکند. این
پارامتر
حداقل
درصدی را
مشخص
میکند که
هِیپ (heap)
زبالهروب
مجاز است در
بین دو
جمعآوری
زباله
منبسط شود.
تنظیم این
گزینه ممکن
است سرعت
کامپایل را
بهبود
بخشد؛ اما
هیچ تاثیری
بر تولید کد
ندارد.
مقدار پیشفرض 30% + 70% * (RAM/1GB) با کران بالای 100% هنگام RAM >= 1GB است. اگر "getrlimit" در دسترس باشد، مفهوم «RAM» برابر با کوچکترین مقدار از میان RAM واقعی و "RLIMIT_DATA" یا "RLIMIT_AS" است. اگر GCC قادر به محاسبه RAM در یک پلتفرم خاص نباشد، کران پایین 30% استفاده میشود. تنظیم این پارامتر و ggc-min-heapsize روی صفر باعث میشود که در هر فرصت ممکن، یک جمعآوری کامل زباله رخ دهد. این کار بسیار کند است، اما میتواند برای اشکالزدایی مفید باشد.
- ggc-min-heapsize
- حداقل
اندازه
هِیپ
زبالهروب
پیش از آنکه
شروع به
جمعآوری
زباله کند.
اولین
جمعآوری
پس از آن رخ
میدهد که
هیپ به
اندازه ggc-min-expand%
بیش از ggc-min-heapsize
منبسط شود.
باز هم،
تنظیم این
مقدار ممکن
است سرعت
کامپایل را
بهبود
بخشد، و هیچ
تاثیری بر
تولید کد
ندارد.
مقدار پیشفرض، کوچکترین مقدار از میان RAM/8، RLIMIT_RSS یا محدودیتی است که سعی میکند اطمینان حاصل کند از RLIMIT_DATA یا RLIMIT_AS تجاوز نشود، اما با کران پایین 4096 (چهار مگابایت) و کران بالای 131072 (128 مگابایت). اگر GCC قادر به محاسبه RAM روی یک پلتفرم خاص نباشد، از کران پایین استفاده میشود. تنظیم بسیار بزرگ این پارامتر عملاً زبالهروبی را غیرفعال میکند. تنظیم این پارامتر و ggc-min-expand روی صفر باعث میشود که در هر فرصت یک جمعآوری کامل رخ دهد.
- max-reload-search-insns
- حداکثر تعداد دستورالعملهایی که بازبارگذاری (reload) باید برای یافتن ثبات معادل به عقب جستجو کند. افزایش مقادیر به معنای بهینهسازی تهاجمیتر است که زمان کامپایل را با احتمال بهبود اندک در کارایی افزایش میدهد.
- max-cselib-memory-locations
- حداکثر تعداد مکانهای حافظهای که cselib باید در نظر بگیرد. افزایش مقادیر به معنای بهینهسازی تهاجمیتر است که زمان کامپایل را با احتمال بهبود اندک در کارایی افزایش میدهد.
- max-sched-ready-insns
- حداکثر تعداد دستورالعملهای آماده صدور که زمانبند باید در هر زمان مشخص در طول اولین گذر زمانبندی در نظر بگیرد. مقادیر بالاتر به معنای جستجوهای دقیقتر است که زمان کامپایل را با سودی احتمالاً ناچیز افزایش میدهد.
- max-sched-region-blocks
- حداکثر تعداد بلوکها در یک ناحیه (region) که برای زمانبندی بینبلوکی در نظر گرفته میشوند.
- max-pipeline-region-blocks
- حداکثر تعداد بلوکها در یک ناحیه که برای خطلولهایسازی (pipelining) در زمانبند انتخابی (selective scheduler) در نظر گرفته میشوند.
- max-sched-region-insns
- حداکثر تعداد دستورالعملها (insns) در یک ناحیه که برای زمانبندی بینبلوکی در نظر گرفته میشوند.
- max-pipeline-region-insns
- حداکثر تعداد دستورالعملها (insns) در یک ناحیه که برای خطلولهایسازی در زمانبند انتخابی در نظر گرفته میشوند.
- min-spec-prob
- حداقل احتمال (به درصد) برای رسیدن به یک بلوک مبدا برای زمانبندی گمانهزنانه (speculative scheduling) بینبلوکی.
- max-sched-extend-regions-iters
- حداکثر تعداد تکرارها در CFG برای گسترش ناحیهها. مقدار 0 گسترش ناحیهها را غیرفعال میکند.
- max-sched-insn-conflict-delay
- حداکثر تاخیر تداخل برای یک دستورالعمل (insn) جهت در نظر گرفتن آن برای جابهجایی گمانهزنانه.
- sched-spec-prob-cutoff
- حداقل احتمال موفقیت گمانهزنی (به درصد)، به گونهای که دستورالعملهای گمانهزنانه زمانبندی شوند.
- sched-state-edge-prob-cutoff
- حداقل احتمالی که یک یال باید داشته باشد تا زمانبند وضعیت خود را در امتداد آن ذخیره کند.
- sched-mem-true-dep-cost
- حداقل فاصله (بر حسب چرخههای CPU) میان store و load که مکانهای حافظه یکسانی را هدف قرار میدهند.
- selsched-max-lookahead
- حداکثر اندازه پنجره پیشنگری (lookahead window) در زمانبندی انتخابی. این مقدار، عمق جستجو برای دستورالعملهای در دسترس است.
- selsched-max-sched-times
- حداکثر دفعاتی که یک دستورالعمل در طول زمانبندی انتخابی زمانبندی میشود. این حد بر تعداد تکرارهایی است که دستورالعمل ممکن است در آنها به صورت خطلولهای اجرا شود.
- selsched-insns-to-rename
- حداکثر تعداد بهترین دستورالعملها در لیست آماده (ready list) که برای تغییر نام در زمانبند انتخابی در نظر گرفته میشوند.
- sms-min-sc
- حداقل مقدار تعداد مراحل (stage count) که زمانبند پیمانهای نوسانی (swing modulo scheduler) تولید میکند.
- max-last-value-rtl
- حداکثر اندازه اندازهگیریشده بر حسب تعداد RTLهایی که میتوانند در یک عبارت در ترکیبکننده (combiner) برای یک شبهثبات (pseudo register) به عنوان آخرین مقدار شناختهشده آن ثبات ثبت شوند.
- max-combine-insns
- حداکثر تعداد دستورالعملهایی که ترکیبکننده RTL سعی میکند با هم ترکیب کند.
- max-combine-search-insns
- حداکثر
تعداد
دستورالعملهایی
که
ترکیبکننده
RTL برای
یافتن
استفاده
بعدی از یک
تعریف ثبات
مشخص جستجو
میکند. اگر
این
محدودیت
بدون یافتن
چنین
استفادهای
حاصل شود،
ترکیبکننده
تلاش برای
بهینهسازی
تعریف را
متوقف
خواهد کرد.
در حال حاضر این محدودیت فقط پس از برخی تلاشهای موفق برای ترکیب اعمال میشود، اما میتواند در آینده به موارد دیگر نیز گسترش یابد.
- integer-share-limit
- ثابتهای صحیح کوچک میتوانند از یک ساختار داده مشترک استفاده کنند که مصرف حافظه کامپایلر را کاهش داده و سرعت آن را افزایش میدهد. این گزینه حداکثر مقدار یک ثابت صحیح مشترک را تنظیم میکند.
- ssp-buffer-size
- حداقل اندازه بافرها (یعنی آرایهها) که هنگام استفاده از -fstack-protector محافظت در برابر خرد شدن پشته (stack smashing) را دریافت میکنند..IP min-size-for-stack-sharing 4 حداقل اندازه متغیرهایی که هنگام عدم بهینهسازی در اشتراکگذاری شیار پشته (stack slot sharing) شرکت میکنند.
- max-jump-thread-duplication-stmts
- حداکثر تعداد دستورهای مجاز در یک بلوک که هنگام نخبندی پرشها (jump threading) نیاز به تکثیر دارد.
- max-jump-thread-paths
- حداکثر تعداد مسیرهایی که هنگام جستجو برای فرصتهای نخبندی پرش در نظر گرفته میشوند. هنگام رسیدن به یک بلوک، یالهای ورودی تنها در صورتی بررسی میشوند که حاصلضرب تعداد مسیرهای جستجو شده تا کنون در تعداد یالهای ورودی، از حداکثر تعداد مسیرهای مشخصشده فراتر نرود.
- max-fields-for-field-sensitive
- حداکثر تعداد فیلدها در یک ساختار که در طول تحلیل اشارهگرها به صورت حساس به فیلد (field-sensitive) با آنها برخورد میشود.
- prefetch-latency
- تخمین میانگین تعداد دستورالعملهایی که پیش از پایان پیشواکشی (prefetch) اجرا میشوند. فاصله پیشواکشی رو به جلو با این مقدار ثابت متناسب است. افزایش این مقدار ممکن است به پیشواکشی جریانهای کمتری نیز منجر شود (گزینه simultaneous-prefetches را ببینید).
- simultaneous-prefetches
- حداکثر تعداد پیشواکشیهایی که میتوانند به طور همزمان اجرا شوند.
- l1-cache-line-size
- اندازه خط حافظه نهان در حافظه نهان داده L1، به بایت.
- l1-cache-size
- اندازه حافظه نهان داده L1، به کیلوبایت.
- l2-cache-size
- اندازه حافظه نهان داده L2، به کیلوبایت.
- prefetch-dynamic-strides
- مشخص
میکند که
آیا مرحله
پیشواکشی
آرایه در
حلقه باید
راهنماییهای
پیشواکشی
نرمافزاری
را برای
گامهای (strides)
غیرثابت
صادر کند یا
خیر. در
برخی موارد
این کار
ممکن است
سودمند
باشد،
هرچند
غیرثابت
بودن گام
ممکن است
پیشبینی
زمان
سودمندی
قطعی صدور
این
راهنماییها
را دشوار
کند.
اگر راهنماییهای پیشواکشی باید برای گامهای غیرثابت صادر شوند، مقدار را 1 قرار دهید. اگر راهنماییهای پیشواکشی فقط باید برای گامهایی صادر شوند که ثابت شناخته شده و کمتر از prefetch-minimum-stride هستند، آن را برابر 0 قرار دهید.
- prefetch-minimum-stride
- حداقل گام
ثابت، به
بایت، برای
شروع
استفاده از
راهنماییهای
پیشواکشی.
اگر گام
کمتر از این
آستانه
باشد،
راهنماییهای
پیشواکشی
صادر
نخواهند شد.
این تنظیم برای پردازندههای دارای پیشواکِشهای سختافزاری مفید است؛ در چنین حالتی ممکن است تداخلاتی بین پیشواکِشهای سختافزاری و پیشواکِشهای نرمافزاری به وجود آید. اگر پیشواکِشهای سختافزاری حداکثر گام قابل مدیریتی دارند، باید در اینجا استفاده شود تا بهرهوری از پیشواکِشهای نرمافزاری بهبود یابد.
مقدار -1 به این معنی است که آستانهای وجود ندارد و بنابراین راهنماییهای پیشواکشی میتوانند برای هر گام ثابتی صادر شوند.
این تنظیم تنها برای گامهایی که شناختهشده و ثابت هستند کاربرد دارد.
- destructive-interference-size
- constructive-interference-size
- مقادیر
مربوط به
متغیرهای C++17
به نامهای
"std::hardware_destructive_interference_size"
و
"std::hardware_constructive_interference_size".
اندازه
تداخل
مخرب،
حداقل آفست
توصیهشده
بین دو شیء
مستقل است
که به صورت
همروند
مورد
دسترسی
قرار
میگیرند؛
اندازه
تداخل
سازنده،
حداکثر
اندازه
توصیهشده
از حافظه
پیوسته است
که با هم
مورد
دسترسی
قرار
میگیرند.
به طور
معمول هر دو
برابر با
اندازه یک
خط حافظه
نهان L1
معماری
مقصد، به
بایت،
خواهند بود.
برای یک
مقصد عمومی
که
دامنهای
از
اندازههای
خط حافظه
نهان L1 را
پوشش
میدهد،
اندازه
تداخل
سازنده
معمولاً در
انتهای
کوچک دامنه
و اندازه
تداخل مخرب
در انتهای
بزرگ دامنه
خواهد بود.
اندازه تداخل مخرب برای استفاده در چینش (layout) در نظر گرفته شده است و بنابراین بر ABI تأثیر میگذارد. انتظار نمیرود مقدار پیشفرض پایدار باشد، و در برخی مقاصد با -mtune تغییر میکند؛ بنابراین استفاده از این متغیر در زمینهای که پایداری ABI مهم است (مانند رابط عمومی یک کتابخانه) اکیداً منع میشود؛ در صورت استفاده در چنین زمینهای، کاربران میتوانند با این گزینه مقدار را تثبیت کنند.
اندازه تداخل سازنده حساسیت کمتری دارد، زیرا معمولاً تنها در یک static_assert برای اطمینان از جا شدن یک نوع در یک خط حافظه نهان به کار میرود.
همچنین -Winterference-size را ببینید.
- loop-interchange-max-num-stmts
- حداکثر تعداد دستورها در حلقهای که قرار است جابهجا (interchange) شود.
- loop-interchange-stride-ratio
- حداقل نسبت بین گامهای دو حلقه برای این که جابهجایی حلقهها سودمند باشد.
- min-insn-to-prefetch-ratio
- حداقل نسبت بین تعداد دستورالعملها و تعداد پیشواکشیها برای فعالسازی پیشواکشی در یک حلقه.
- prefetch-min-insn-to-mem-ratio
- حداقل نسبت بین تعداد دستورالعملها و تعداد ارجاعات حافظه برای فعالسازی پیشواکشی در یک حلقه.
- use-canonical-types
- مشخص میکند که آیا کامپایلر باید از سیستم انواع «قانونمند» (canonical) استفاده کند یا خیر. مقدار این گزینه باید همواره 1 باشد که از یک سازوکار داخلی کارآمدتر برای مقایسه انواع در C++ و Objective-C++ استفاده میکند. با این حال، اگر اشکالات موجود در سیستم انواع قانونمند موجب شکست کامپایل میشود، این مقدار را 0 قرار دهید تا انواع قانونمند غیرفعال شوند.
- switch-conversion-max-branch-ratio
- تبدیل مقداردهی اولیه switch از ایجاد آرایههایی که بزرگتر از حاصلضرب switch-conversion-max-branch-ratio در تعداد شاخههای switch باشند، خودداری میکند.
- switch-lower-slow-alg-max-cases
- حداکثر تعداد موارد (cases) مجاز برای استفاده از الگوریتمهای کند کاهش سطح (lowering) ساختار switch.
- max-partial-antic-length
- حداکثر طول مجموعه antic جزئی محاسبهشده در طول بهینهسازی حذف افزونگی جزئی درختی (-ftree-pre) هنگام بهینهسازی در سطح -O3 و بالاتر. برای برخی انواع کدهای منبع، بهینهسازی پیشرفته حذف افزونگی جزئی ممکن است از کنترل خارج شده و تمام حافظه در دسترس سیستم میزبان را مصرف کند. این پارامتر محدودیتی روی طول مجموعههای محاسبهشده قرار میدهد که مانع از این رفتار مهارگسیخته میشود. تنظیم مقدار 0 برای این پارامتر اجازه طول نامحدود را به مجموعه میدهد.
- rpo-vn-max-loop-depth
- حداکثر عمق حلقهای که به صورت خوشبینانه شمارهگذاری مقدار (value numbering) میشود. وقتی به این حد برسد، درونیترین rpo-vn-max-loop-depth حلقه و بیرونیترین حلقه در آشیانه حلقه (loop nest) به صورت خوشبینانه شمارهگذاری مقدار میشوند و باقی حلقهها به این شکل پردازش نمیشوند.
- sccvn-max-alias-queries-per-access
- حداکثر تعداد پرسوجوهای alias-oracle که هنگام جستجوی افزونگیها برای بارگذاریها (loads) و ذخیرهسازیها (stores) انجام میدهیم. اگر این محدودیت پر شود، جستجو لغو شده و بارگذاری یا ذخیرهسازی مذکور افزونه در نظر گرفته نمیشود. تعداد پرسوجوها از نظر الگوریتمی به تعداد ذخیرهسازیها در تمامی مسیرها از بارگذاری تا نقطه ورود تابع محدود است.
- ira-max-loops-num
- IRA به طور پیشفرض از تخصیص ثبات ناحیهای (regional register allocation) استفاده میکند. اگر یک تابع شامل حلقههای بیشتری از تعداد مشخصشده با این پارامتر باشد، حداکثر به همان تعداد مشخصشده از حلقههای با بیشترین بسامد اجرا، نواحی مربوط به تخصیص ثبات ناحیهای را تشکیل میدهند.
- ira-max-conflict-table-size
- اگرچه IRA از الگوریتمی پیشرفته برای فشردهسازی جدول تداخل استفاده میکند، این جدول همچنان میتواند مقادیر زیادی حافظه را برای توابع عظیم مصرف کند. اگر اندازه جدول تداخل برای یک تابع بتواند بیشتر از مقدار به مگابایت ارائهشده با این پارامتر باشد، تخصیصدهنده ثبات در عوض از یک الگوریتم سریعتر، سادهتر و با کیفیت پایینتر استفاده میکند که نیازی به ساخت جدول تداخل شبهثباتها (pseudo-register) ندارد.
- ira-loop-reserved-regs
- میتوان از IRA برای ارزیابی دقیقتر فشار ثباتها در حلقهها جهت تصمیمگیری درباره جابهجایی مقادیر ناوردا در حلقه (loop invariants) استفاده کرد (گزینه -O3 را ببینید). تعداد ثباتهای در دسترسی که برای اهداف دیگر رزرو شدهاند با این پارامتر تعیین میشود. مقدار پیشفرض این پارامتر بهترین مقدار بهدستآمده از آزمایشهای متعدد است.
- ira-consider-dup-in-all-alts
- موجب میشود IRA محدودیت تطابق (شماره عملوند تکراری) را در تمام جایگزینهای موجود برای کلاس ثبات ترجیحی بهطور جدی در نظر بگیرد. اگر روی صفر تنظیم شود، به این معنی است که IRA محدودیت تطابق را تنها زمانی رعایت میکند که در تنها جایگزین در دسترس با یک کلاس ثبات مناسب باشد. در غیر این صورت، بدین معناست که IRA تمام جایگزینهای موجود برای کلاس ثبات ترجیحی را بررسی خواهد کرد حتی اگر گزینهای با کلاس ثبات مناسب پیدا کرده باشد، و محدودیت تطابق واجد شرایط یافتهشده را رعایت میکند.
- ira-simple-lra-insn-threshold
- تعداد تقریبی دستورالعملهای تابع در واحدهای 1K که تخصیص ثبات محلی ساده (simple local RA) را فعال میکند.
- lra-inheritance-ebb-probability-cutoff
- LRA تلاش میکند مقادیر بازبارگذاریشده در ثباتها را در دستورالعملهای بعدی دوباره استفاده کند. این بهینهسازی وراثت (inheritance) نامیده میشود. از EBB به عنوان ناحیهای برای انجام این بهینهسازی استفاده میشود. این پارامتر حداقل احتمال یال پیوستهگذر (fall-through edge) را بر حسب درصد تعیین میکند که برای افزودن BB به EBB وراثت در LRA استفاده میشود. مقدار پیشفرض بر اساس اجراهای متعدد SPEC2000 روی x86-64 انتخاب شده است..IP loop-invariant-max-bbs-in-loop 4 انتقال ناورداهای حلقه (Loop invariant motion) میتواند برای حلقههای بسیار بزرگ، هم از نظر زمان کامپایل و هم از نظر میزان حافظهٔ مورد نیاز در زمان کامپایل بسیار پرهزینه باشد. برای حلقههایی با تعداد بلوکهای پایهای بیش از این پارامتر، بهینهسازی انتقال ناوردای حلقه انجام نخواهد شد.
- loop-max-datarefs-for-datadeps
- ایجاد وابستگیهای داده برای حلقههای بسیار بزرگ پرهزینه است. این پارامتر تعداد ارجاعات داده در حلقهها را که برای تحلیل وابستگی داده در نظر گرفته میشوند محدود میکند. چنین حلقههای بزرگی توسط بهینهسازیهایی که از وابستگیهای دادهٔ حلقه استفاده میکنند، پردازش نمیشوند.
- max-vartrack-size
- حداکثر تعداد خانههای جدول درهمسازی را برای استفاده در طول تحلیل جریان دادهٔ ردیابی متغیرها در هر تابع تنظیم میکند. اگر این حد با فعال بودن ردیابی متغیرها در انتسابها نقض شود، تحلیل برای آن تابع پس از حذف تمام دستورالعملهای اشکالزدایی (debug insns) از تابع، بدون آن دوباره امتحان میشود. اگر این حد حتی بدون دستورالعملهای اشکالزدایی نیز نقض شود، تحلیل ردیابی متغیرها برای آن تابع بهطور کامل غیرفعال میگردد. تنظیم این پارامتر روی صفر آن را نامحدود میکند.
- max-vartrack-expr-depth
- حداکثر تعداد سطوح بازگشت را هنگام تلاش برای نگاشت نام متغیرها یا متغیرهای موقت اشکالزدایی به عبارات مقداری تعیین میکند. این کار زمان کامپایل را با اطلاعات اشکالزدایی کاملتر مبادله میکند. اگر این مقدار بیش از حد کم تنظیم شود، عبارات مقداری که در دسترس هستند و میتوانستند در اطلاعات اشکالزدایی نشان داده شوند ممکن است در نهایت استفاده نشوند؛ تنظیم این مقدار روی عددی بزرگتر ممکن است کامپایلر را قادر سازد تا عبارات اشکالزدایی پیچیدهتری پیدا کند، اما زمان کامپایل و مصرف حافظه ممکن است افزایش یابد.
- max-debug-marker-count
- آستانهای برای تعداد نشانگرهای اشکالزدایی (مانند نشانگرهای شروع عبارت) تعیین میکند تا از انفجار پیچیدگی هنگام درونخطیسازی (inlining) یا گسترش به RTL جلوگیری شود. اگر تابعی تعداد عبارات gimple بیشتری از حد تعیینشده داشته باشد، چنین عباراتی از نسخهٔ درونخطیشدهٔ تابع و از گسترش RTL آن حذف خواهند شد.
- min-nondebug-insn-uid
- از uidهایی که از این پارامتر شروع میشوند برای دستورالعملهای غیر اشکالزدایی (nondebug insns) استفاده میکند. محدودهٔ زیر این پارامتر منحصراً برای دستورالعملهای اشکالزدایی ایجادشده توسط -fvar-tracking-assignments رزرو شده است، اما در صورت تمام شدن محدودهٔ رزروشده، دستورالعملهای اشکالزدایی ممکن است uidهای بالاتر از آن (بدون همپوشانی) دریافت کنند.
- ipa-sra-deref-prob-threshold
- بهینهسازی IPA-SRA اشارهگری را که مشخص است NULL نیست، تنها زمانی با یک یا چند پارامتر جدید جایگزین میکند که احتمال (بر حسب درصد، نسبت به ورودی تابع) ارجاعزدایی شدن آن بیشتر از این پارامتر باشد.
- ipa-sra-ptr-growth-factor
- بهینهسازی IPA-SRA اشارهگر به یک دادهٔ تجمیعی (aggregate) را با یک یا چند پارامتر جدید تنها زمانی جایگزین میکند که اندازهٔ تجمیعی آنها کمتر یا مساوی با ipa-sra-ptr-growth-factor برابرِ اندازهٔ پارامتر اشارهگر اصلی باشد.
- ipa-sra-ptrwrap-growth-factor
- حداکثر رشد مجاز اضافی اندازهٔ کل پارامترهای جدیدی که ipa-sra یک اشارهگر به یک دادهٔ تجمیعی را با آنها جایگزین میکند، در صورتی که به یک متغیر محلی اشاره کند که فراخواننده فقط در آن مینویسد و آن را به عنوان آرگومان به توابع دیگر ارسال میکند.
- ipa-sra-max-replacements
- حداکثر بخشهایی از یک دادهٔ تجمیعی که IPA-SRA ردیابی میکند. در نتیجه، این مقدار حداکثر تعداد جایگزینیهای یک پارامتر صوری (formal parameter) نیز هست.
- sra-max-scalarization-size-Ospeed
- sra-max-scalarization-size-Osize
- دو گذر کاهش اسکالر تجمیعها (SRA و IPA-SRA) با هدف جایگزینی بخشهای اسکالر تجمیعها با استفاده از متغیرهای اسکالر مستقل عمل میکنند. این پارامترها حداکثر اندازه (بر حسب واحدهای ذخیرهسازی) دادهٔ تجمیعی را که برای جایگزینی هنگام کامپایل برای سرعت (sra-max-scalarization-size-Ospeed) یا اندازه (sra-max-scalarization-size-Osize) در نظر گرفته میشود، کنترل میکنند.
- sra-max-propagations
- حداکثر تعداد دسترسیهای ساختگی که بهینهسازی جایگزینی اسکالر تجمیعها (SRA) به ازای هر متغیر محلی به منظور تسهیل انتشار کپی (copy propagation) ردیابی میکند.
- tm-max-aggregate-size
- هنگام کپی کردن متغیرهای محلی نخ (thread-local) در یک تراکنش، این پارامتر اندازهای را بر حسب بایت مشخص میکند که متغیرها فراتر از آن، برخلاف جفتهای توالی کد ذخیره/بازیابی، با استفاده از توابع ثبت وقایع (logging) ذخیره میشوند. این گزینه فقط هنگام استفاده از -fgnu-tm اعمال میشود.
- graphite-max-nb-scop-params
- برای جلوگیری از اثرات نمایی در تبدیلات حلقهٔ Graphite، تعداد پارامترها در یک بخش کنترل ایستا (SCoP) محدود شده است. مقدار صفر میتواند برای برداشتن این محدودیت استفاده شود. متغیری که مقدار آن در زمان کامپایل ناشناخته بوده و خارج از یک SCoP تعریف شده باشد، یک پارامترِ آن SCoP محسوب میشود.
- hardcfr-max-blocks
- غیرفعال کردن -fharden-control-flow-redundancy برای توابعی که تعداد بلوکهای آنها بیشتر از مقدار مشخصشده است. مقدار صفر هرگونه محدودیتی را برمیدارد.
- hardcfr-max-inline-blocks
- اجبار -fharden-control-flow-redundancy به استفاده از بررسی برونخطی (out-of-line) برای توابعی با تعداد بلوکهای پایهای بیشتر از مقدار مشخصشده.
- loop-block-tile-size
- تبدیلات بلوکبندی حلقه (Loop blocking) یا نواریسازی (strip mining)، که با -floop-block یا -floop-strip-mine فعال میشوند، هر حلقه در یک آشیانهٔ حلقه را بر اساس تعداد تکرار مشخصی نواریسازی میکنند. طول نوار را میتوان با استفاده از پارامتر loop-block-tile-size تغییر داد.
- ipa-jump-function-lookups
- تعداد دستورهایی را مشخص میکند که در طول کشف آفست تابع پرش (jump function offset discovery) بررسی میشوند.
- ipa-cp-value-list-size
- تحلیل IPA-CP سعی میکند تمام مقادیر و انواع ممکن را که به پارامتر یک تابع ارسال میشوند ردیابی کند تا آنها را منتشر کرده و مجازیزدایی (devirtualization) را انجام دهد. ipa-cp-value-list-size حداکثر تعداد مقادیر و انواعی است که به ازای هر پارامتر صوری یک تابع ذخیره میکند.
- ipa-cp-eval-threshold
- تحلیل IPA-CP امتیاز ابتکاری سودمندی همزادسازی (cloning profitability) خود را محاسبه کرده و آن دسته از فرصتهای همزادسازی را اجرا میکند که امتیاز آنها از ipa-cp-eval-threshold فراتر رود.
- ipa-cp-max-recursive-depth
- حداکثر عمق همزادسازی بازگشتی برای توابع خودبازگشتی (self-recursive).
- ipa-cp-min-recursive-probability
- انجام همزادسازی بازگشتی تنها زمانی که احتمال اجرای فراخوانی بیش از این پارامتر باشد.
- ipa-cp-profile-count-base
- هنگام استفاده از گزینهٔ -fprofile-use، تحلیل IPA-CP تعداد اجرای اندازهگیریشدهٔ یک یال در گراف فراخوانی را در این موقعیت درصدی در بافتنگار (histogram) آنها به عنوان پایهای برای محاسبات ابتکاری خود در نظر میگیرد.
- ipa-cp-recursive-freq-factor
- تعداد دفعاتی که انتشار کپی بینروالی (interprocedural copy propagation) انتظار دارد توابع بازگشتی خود را فراخوانی کنند.
- ipa-cp-recursion-penalty
- جریمهٔ درصدی که توابع بازگشتی هنگام ارزیابی برای همزادسازی دریافت میکنند.
- ipa-cp-single-call-penalty
- جریمهٔ درصدی که توابع حاوی یک فراخوانی منفرد به تابعی دیگر، هنگام ارزیابی برای همزادسازی دریافت خواهند کرد.
- ipa-max-agg-items
- تحلیل IPA-CP همچنین قادر است تعدادی از مقادیر اسکالر ارسالشده در یک دادهٔ تجمیعی را منتشر کند. پارامتر ipa-max-agg-items حداکثر تعداد چنین مقادیری را به ازای هر پارامتر کنترل میکند.
- ipa-cp-loop-hint-bonus
- هنگامی که IPA-CP تعیین کند که یک نامزد همزادسازی باعث مشخص شدن تعداد تکرارهای یک حلقه میشود، پاداشی به اندازهٔ ipa-cp-loop-hint-bonus به امتیاز سودمندی آن نامزد اضافه میکند.
- ipa-max-loop-predicates
- حداکثر تعداد گزارههای (predicates) متفاوتی که IPA برای توصیف زمان داشتن ویژگیهای مشخص توسط حلقهها در یک تابع، استفاده خواهد کرد.
- ipa-max-aa-steps
- در طول تحلیل بدنهٔ توابع، IPA-CP از تحلیل نام مستعار (alias analysis) به منظور ردیابی مقادیری که توسط پارامترهای تابع به آنها اشاره میشود، بهره میگیرد. برای اینکه زمان بیش از حدی صرف تحلیل توابع عظیم نشود، پس از بررسی ipa-max-aa-steps عبارت تغییردهندهٔ حافظه، کار را متوقف کرده و تمام حافظه را رونویسیشده (clobbered) فرض میکند.
- ipa-max-switch-predicate-bounds
- حداکثر تعداد نقاط پایانی مرزی دامنههای case در دستور switch. برای دستورات switch فراتر از این حد، IPA-CP گزارهٔ هزینهٔ همزادسازی را (که برای تخمین سودمندی همزادسازی به کار میرود) برای حالت پیشفرض (default) دستور switch ایجاد نخواهد کرد..IP ipa-max-param-expr-ops 4 بخش IPA-CP عبارتهای شرطی را که به پارامتری از یک تابع ارجاع میدهند تحلیل میکند تا سود حاصل از همزادسازی (cloning) بر اساس مقداری ثابت را تخمین بزند. اما اگر تعداد عملیات در یک عبارت پارامتر از ipa-max-param-expr-ops فراتر رود، عبارت پیچیده در نظر گرفته شده و توسط تحلیل IPA پردازش نمیشود.
- lto-partitions
- تعداد افرازهای (partitions) مطلوب ایجاد شده در طول کامپایل WHOPR را مشخص میکند. تعداد افرازها باید بیشتر از تعداد پردازندههای مورد استفاده برای کامپایل باشد.
- lto-min-partition
- اندازهٔ کمینهٔ افراز برای WHOPR (بر حسب دستورالعملهای تخمینی). این کار از هزینههای ناشی از تقسیم برنامههای بسیار کوچک به افرازهای بیش از حد جلوگیری میکند.
- lto-max-partition
- اندازهٔ بیشینهٔ افراز برای WHOPR (بر حسب دستورالعملهای تخمینی)، به منظور تعیین یک حد بالا برای اندازهٔ هر افراز بهصورت مجزا. این گزینه تنها برای استفاده با افرازبندی متعادل در نظر گرفته شده است.
- lto-partition-locality-frequency-cutoff
- مخرج n از کسر 1/n بسامد اجرای تابع فراخواندهشده (callee) جهت همزادسازی برای یک فراخوانندهٔ (caller) خاص. مقدار ویژهٔ 0 تعیین میکند که همزادسازی همواره و بدون نقطهٔ برش (cut-off) انجام شود.
- lto-partition-locality-size-cutoff
- نقطهٔ برش اندازه برای تابع فراخواندهشده، شامل فراخوانیهای درونخطیشده (inlined)، جهت همزادسازی برای یک فراخوانندهٔ خاص.
- lto-max-locality-partition
- بیشینهٔ اندازهٔ یک افراز محلی برای LTO (بر حسب دستورالعملهای تخمینی). مقدار 0 باعث استفاده از مقدار پیشفرض میشود.
- lto-max-streaming-parallelism
- بیشینهٔ تعداد فرآیندهای موازی مورد استفاده برای جریانسازی (streaming) در LTO.
- cxx-max-namespaces-for-diagnostic-help
- بیشینهٔ تعداد فضاهای نام (namespaces) برای بررسی جهت ارائهٔ پیشنهاد هنگامی که جستجوی نام (name lookup) در ++C برای یک شناسه با شکست مواجه میشود.
- sink-frequency-threshold
- بیشینهٔ بسامد نسبی اجرای بلوک مقصد (به درصد) نسبت به بلوک اصلی یک عبارت، جهت مجاز شمردن پایینکشی عبارت (statement sinking). مقادیر بزرگتر منجر به پایینکشی تهاجمیتر عبارات میشوند. یک تنظیم مثبت کوچک برای عبارات دارای عملوندهای حافظه اعمال میشود، زیرا پایین کشیدن آنها حتی سودمندتر است.
- max-stores-to-sink
- بیشینهٔ تعداد جفتهای ذخیرهسازی شرطی که میتوانند پایین کشیده شوند. در صورتی که برداریسازی (-ftree-vectorize) یا تبدیل شرطی (-ftree-loop-if-convert) غیرفعال باشد، روی 0 تنظیم میشود.
- case-values-threshold
- کوچکترین تعداد مقادیر متفاوتی که برای آن، استفاده از جدول پرش (jump-table) بهجای درختی از شاخههای شرطی بهینهتر است. اگر مقدار 0 باشد، از پیشفرض ماشین استفاده میشود.
- jump-table-max-growth-ratio-for-size
- بیشینهٔ نسبت رشد اندازهٔ کد هنگام بسط به یک جدول پرش (به درصد). این پارامتر هنگام بهینهسازی برای اندازه استفاده میشود.
- jump-table-max-growth-ratio-for-speed
- بیشینهٔ نسبت رشد اندازهٔ کد هنگام بسط به یک جدول پرش (به درصد). این پارامتر هنگام بهینهسازی برای سرعت استفاده میشود.
- tree-reassoc-width
- بیشینهٔ تعداد دستورالعملهایی را که به صورت موازی در درخت بازپیوندشده (reassociated tree) اجرا میشوند تنظیم میکند. این پارامتر در صورت داشتن مقداری غیرصفر، قواعد تجربی (heuristics) وابسته به هدف را که به طور پیشفرض استفاده میشوند بازنویسی میکند.
- sched-pressure-algorithm
- انتخاب بین
دو
پیادهسازی
موجود برای
-fsched-pressure.
الگوریتم ۱
پیادهسازی
اصلی است و
احتمال
بیشتری
دارد که از
بازآرایی
دستورالعملها
جلوگیری
کند.
الگوریتم ۲
به عنوان
سازشی بین
رویکرد
نسبتاً
محافظهکارانهٔ
الگوریتم ۱
و رویکرد
نسبتاً
تهاجمی
زمانبند
پیشفرض
طراحی شده
است. این
الگوریتم
اتکای
بیشتری بر
داشتن
مجموعهثباتهای
(register file) منظم و
ردههای
دقیق فشار
ثبات دارد.
برای
جزئیات
بیشتر به
haifa-sched.cc در
منابع GCC
مراجعه
کنید.
انتخاب پیشفرض به هدف بستگی دارد.
- max-slsr-cand-scan
- بیشینهٔ تعداد کاندیداهای موجود را که هنگام جستجوی یک پایه برای کاندیدای جدید کاهش توان خط مستقیم (straight-line strength reduction) بررسی میشوند، تعیین میکند.
- asan-globals
- تشخیص سرریز بافر را برای اشیاء سراسری (global) فعال میکند. این نوع محافظت در صورت استفاده از گزینهٔ -fsanitize=address به طور پیشفرض فعال است. برای غیرفعالسازی محافظت از اشیاء سراسری از --param asan-globals=0 استفاده کنید.
- asan-stack
- تشخیص سرریز بافر را برای اشیاء پشته (stack) فعال میکند. این نوع محافظت هنگام استفاده از -fsanitize=address به طور پیشفرض فعال است. برای غیرفعال کردن محافظت از پشته از گزینهٔ --param asan-stack=0 استفاده کنید.
- asan-instrument-reads
- تشخیص سرریز بافر را برای خواندنهای حافظه فعال میکند. این نوع محافظت هنگام استفاده از -fsanitize=address به طور پیشفرض فعال است. برای غیرفعال کردن محافظت از خواندنهای حافظه از --param asan-instrument-reads=0 استفاده کنید.
- asan-instrument-writes
- تشخیص سرریز بافر را برای نوشتنهای حافظه فعال میکند. این نوع محافظت هنگام استفاده از -fsanitize=address به طور پیشفرض فعال است. برای غیرفعال کردن محافظت از نوشتنهای حافظه از گزینهٔ --param asan-instrument-writes=0 استفاده کنید.
- asan-memintrin
- تشخیص را برای توابع درونی (built-in) فعال میکند. این نوع محافظت هنگام استفاده از -fsanitize=address به طور پیشفرض فعال است. برای غیرفعال کردن محافظت از توابع درونی از --param asan-memintrin=0 استفاده کنید.
- asan-use-after-return
- تشخیص
استفاده پس
از بازگشت
(use-after-return) را فعال
میکند. این
نوع محافظت
هنگام
استفاده از
گزینهٔ -fsanitize=address
به طور
پیشفرض
فعال است.
برای
غیرفعال
کردن آن از
--param asan-use-after-return=0
استفاده
کنید.
نکته: این بررسی به طور پیشفرض در زمان اجرا غیرفعال است. برای فعال کردن آن، "detect_stack_use_after_return=1" را به متغیر محیطی ASAN_OPTIONS اضافه کنید.
- asan-instrumentation-with-call-threshold
- اگر تعداد دسترسیها به حافظه در تابعی که ابزارگذاری میشود بزرگتر یا مساوی این عدد باشد، به جای بررسیهای درونخطی از فراخوانیهای بازگشتی (callbacks) استفاده میشود. برای مثال، جهت غیرفعال کردن کد درونخطی از --param asan-instrumentation-with-call-threshold=0 استفاده کنید.
- asan-kernel-mem-intrinsic-prefix
- در صورت غیرصفر بودن، پیشوند فراخوانیهای "memcpy"، "memset" و "memmove" را به ترتیب برای -fsanitize=kernel-address یا -fsanitize=kernel-hwaddress با __asan_ یا __hwasan_ قرار میدهد.
- hwasan-instrument-stack
- ابزارگذاری hwasan را برای متغیرهای تخصیصیافته در پشته با اندازهٔ ایستا فعال میکند. این نوع ابزارگذاری هنگام استفاده از -fsanitize=hwaddress به طور پیشفرض فعال و هنگام استفاده از -fsanitize=kernel-hwaddress به طور پیشفرض غیرفعال است. برای غیرفعال کردن ابزارگذاری پشته از --param hwasan-instrument-stack=0 و برای فعال کردن آن از --param hwasan-instrument-stack=1 استفاده کنید.
- hwasan-random-frame-tag
- هنگام استفاده از ابزارگذاری پشته، برچسبهای متغیرهای پشته را با استفاده از دنبالهای معین (deterministic) که برای هر فریم با یک برچسب تصادفی آغاز میشود تعیین میکند. در صورت عدم تنظیم این پارامتر، برچسبها با استفاده از همان دنباله ولی با شروع از ۱ انتخاب میشوند. این ویژگی به طور پیشفرض برای -fsanitize=hwaddress فعال بوده و برای -fsanitize=kernel-hwaddress در دسترس نیست. برای غیرفعال کردن آن از --param hwasan-random-frame-tag=0 استفاده کنید.
- hwasan-instrument-allocas
- ابزارگذاری hwasan را برای متغیرهای تخصیصیافته در پشته با اندازهٔ پویا فعال میکند. این نوع ابزارگذاری هنگام استفاده از -fsanitize=hwaddress به طور پیشفرض فعال و هنگام استفاده از -fsanitize=kernel-hwaddress به طور پیشفرض غیرفعال است. برای غیرفعال کردن ابزارگذاری چنین متغیرهایی از --param hwasan-instrument-allocas=0 و برای فعال کردن آن از --param hwasan-instrument-allocas=1 استفاده کنید.
- hwasan-instrument-reads
- بررسیهای hwasan را بر روی خواندنهای حافظه فعال میکند. ابزارگذاری خواندنها به طور پیشفرض هم برای -fsanitize=hwaddress و هم برای -fsanitize=kernel-hwaddress فعال است. برای غیرفعال کردن بررسی خواندنهای حافظه از --param hwasan-instrument-reads=0 استفاده کنید.
- hwasan-instrument-writes
- بررسیهای hwasan را بر روی نوشتنهای حافظه فعال میکند. ابزارگذاری نوشتنها به طور پیشفرض هم برای -fsanitize=hwaddress و هم برای -fsanitize=kernel-hwaddress فعال است. برای غیرفعال کردن بررسی نوشتنهای حافظه از --param hwasan-instrument-writes=0 استفاده کنید.
- hwasan-instrument-mem-intrinsics
- ابزارگذاری hwasan را برای توابع درونی فعال میکند. ابزارگذاری این توابع درونی به طور پیشفرض هم برای -fsanitize=hwaddress و هم برای -fsanitize=kernel-hwaddress فعال است. برای غیرفعال کردن ابزارگذاری توابع درونی از --param hwasan-instrument-mem-intrinsics=0 استفاده کنید..IP use-after-scope-direct-emission-threshold 4 اگر اندازه یک متغیر محلی بر حسب بایت، کوچکتر یا مساوی این عدد باشد، بهجای استفاده از فراخوانیهای بازگشتی زمان اجرا (run-time callbacks)، حافظه سایه (shadow memory) را مستقیماً آلوده (یا پاکسازی) میکند.
- tsan-distinguish-volatile
- تولید ابزاردقیقسازی (instrumentation) ویژه برای دسترسیها به متغیرهای فرّار (volatiles).
- tsan-instrument-func-entry-exit
- تولید فراخوانیهای ابزاردقیقسازی به __tsan_func_entry() و __tsan_func_exit().
- max-fsm-thread-path-insns
- حداکثر تعداد دستورالعملها برای کپی هنگام تکثیر بلوکها در یک مسیر رشته پرش اتوماتای حالت متناهی (FSM jump thread path).
- threader-debug
- threader-debug=[none|all] خروجی مفصل تحلیلگر threader را فعال میکند.
- parloops-chunk-size
- اندازه تکه (chunk size) در زمانبندی omp برای حلقههای موازیشده توسط parloops.
- parloops-schedule
- نوع زمانبندی در برنامه زمانبندی omp برای حلقههای موازیشده توسط parloops (شامل static، dynamic، guided، auto و runtime).
- parloops-min-per-thread
- حداقل تعداد تکرارهای به ازای هر ریسه از درونیترین حلقه موازیشده که برای آن، حالت موازیشده بر حالت تکریسهای ترجیح داده میشود. توجه داشته باشید که برای یک آشیانه حلقه (loop nest) موازیشده، حداقل تعداد تکرارهای بیرونیترین حلقه به ازای هر ریسه دو است.
- max-ssa-name-query-depth
- حداکثر عمق بازگشت هنگام پرسوجوی ویژگیهای نامهای SSA در مواردی مانند روالهای fold. یک سطح از بازگشت معادل پیمایش یک زنجیره use-def است.
- max-speculative-devirt-maydefs
- حداکثر تعداد may-defهایی که هنگام جستجو برای یک must-def جهت تعیین نوع پویای شیئی که یک فراخوانی مجازی (virtual call) را فرا میخواند تحلیل میشوند، تا بتوان آن را بهصورت حدسی مجازیزدایی (speculatively devirtualize) کرد.
- ranger-debug
- نوع خروجی اشکالزدایی صادر شده برای محدودهها (ranges) را مشخص میکند.
- unroll-jam-min-percent
- حداقل درصد ارجاعات به حافظه که باید بهینهسازی و حذف شوند تا تبدیل unroll-and-jam سودمند در نظر گرفته شود.
- unroll-jam-max-unroll
- حداکثر دفعاتی که حلقه بیرونی باید توسط تبدیل unroll-and-jam باز شود (unroll شود).
- max-rtl-if-conversion-unpredictable-cost
- حداکثر هزینه مجاز برای توالی تولیدشده توسط گذرگاه if-conversion در RTL برای شاخهای که غیرقابلپیشبینی در نظر گرفته شده است.
- max-variable-expansions-in-unroller
- در صورت استفاده از -fvariable-expansion-in-unroller، حداکثر دفعاتی که یک متغیر منفرد در حین باز کردن حلقه (loop unrolling) گسترش مییابد.
- partial-inlining-entry-probability
- حداکثر احتمال بلوک پایه ورودی (entry BB) ناحیه تقسیمشده (به درصد نسبت به BB ورودی تابع) برای انجام درونخطیسازی جزئی (partial inlining).
- max-tracked-strlens
- حداکثر تعداد رشتههایی که گذرگاه بهینهسازی strlen طول آنها را ردگیری میکند.
- gcse-after-reload-partial-fraction
- نسبت آستانه برای انجام حذف افزونگی جزئی (partial redundancy elimination) پس از reload.
- gcse-after-reload-critical-fraction
- نسبت آستانه تعداد دفعات اجرای یالهای بحرانی (critical edges) که اجازه انجام حذف افزونگی پس از reload را میدهد.
- max-loop-header-insns
- حداکثر تعداد دستورالعملها (insns) در سرآیند حلقه که توسط گذرگاه کپی سرآیند حلقه تکثیر میشوند.
- vect-epilogues-nomask
- فعالسازی برداریسازی پسگفتار حلقه با استفاده از اندازه بردار کوچکتر.
- vect-partial-vector-usage
- کنترل میکند که برداریساز حلقه چه زمانی استفاده از بارگذاریها و ذخیرهسازیهای برداری جزئی را به عنوان جایگزینی برای پسروی به کد اسکالر در نظر بگیرد. مقدار 0 مانع از استفاده برداریساز از بارگذاریها و ذخیرهسازیهای برداری جزئی میشود. مقدار 1 به بارگذاریها و ذخیرهسازیهای برداری جزئی اجازه میدهد در صورتی که برداریسازی نیاز به تکرار کد را برطرف کند. مقدار 2 استفاده از بارگذاریها و ذخیرهسازیهای برداری جزئی را در تمام حلقهها مجاز میکند. این پارامتر تنها روی مقصدهایی اثر دارد که از بارگذاریها و ذخیرهسازیهای برداری جزئی پشتیبانی میکنند.
- vect-inner-loop-cost-factor
- حداکثر ضریبی که برداریساز حلقه برای هزینه عبارات در یک حلقه داخلی نسبت به حلقه در حال برداریسازی اعمال میکند. ضریب اعمالشده بیشینه تعداد تکرارهای تخمینی حلقه داخلی و این پارامتر است. مقدار پیشفرض این پارامتر 50 است.
- vect-induction-float
- فعالسازی برداریسازی حلقه برای متغیرهای استقرایی ممیز شناور.
- vect-force-slp
- اجبار به استفاده از SLP هنگام برداریسازی؛ در صورت عدم امکان، با شکست مواجه میشود.
- vrp-block-limit
- حداکثر تعداد بلوکهای پایه قبل از اینکه VRP به الگوریتمی با مصرف حافظه کمتر تغییر حالت دهد.
- vrp-sparse-threshold
- حداکثر تعداد بلوکهای پایه قبل از اینکه VRP از یک حافظه موقت نگاشتبیتی خلوت (sparse bitmap cache) استفاده کند.
- vrp-switch-limit
- حداکثر تعداد یالهای خروجی در یک switch پیش از اینکه VRP از پردازش آن صرفنظر کند.
- vrp-vector-threshold
- حداکثر تعداد بلوکهای پایه برای اینکه VRP از یک بردار حافظه موقت پایه استفاده کند.
- avoid-fma-max-bits
- حداکثر تعداد بیتهایی که برای آنها از ایجاد FMAها اجتناب میشود.
- fully-pipelined-fma
- مشخص میکند که آیا مقصد بهطور کامل دستورالعملهای FMA را خطلولهای (pipeline) میکند یا خیر. اگر غیرصفر باشد، بازهمبستگی (reassociation) با فرض اینکه FMUL و FMA از همان واحدهایی استفاده میکنند که میتوانند FADD را نیز انجام دهند، مزیت موازیسازی بخش ضرب و بخش جمع FMA را در نظر میگیرد.
- sms-loop-average-count-threshold
- یک مقدار آستانه برای میانگین تعداد تکرارهای حلقه که توسط swing modulo scheduler در نظر گرفته میشود.
- sms-dfa-history
- تعداد دورهایی که swing modulo scheduler هنگام بررسی تعارضها با استفاده از DFA در نظر میگیرد.
- graphite-allow-codegen-errors
- مشخص میکند که آیا خطاهای تولید کد (codegen) در صورت فعال بودن -fchecking باید خطاهای کامپایلر داخلی (ICE) در نظر گرفته شوند یا خیر.
- sms-max-ii-factor
- ضریبی برای تنظیم حد بالای فاصله شروع (initiation interval) که swing modulo scheduler جهت زمانبندی یک حلقه استفاده میکند.
- lra-max-considered-reload-pseudos
- حداکثر تعداد شبهثباتهای reload که هنگام سرریز کردن (spilling) یک شبهثبات غیر reload در نظر گرفته میشوند.
- max-pow-sqrt-depth
- حداکثر عمق زنجیرههای sqrt جهت استفاده هنگام ترکیب توانرسانی با یک ثابت حقیقی.
- max-dse-active-local-stores
- حداکثر تعداد ذخیرهسازیهای محلی فعال در حذف ذخیرهسازیهای مرده (dead store elimination) در سطح RTL.
- asan-instrument-allocas
- فعالسازی حفاظت allocaها و VLAها در asan.
- max-iterations-computation-cost
- کران هزینه یک عبارت جهت محاسبه تعداد تکرارها.
- max-isl-operations
- حداکثر تعداد عملیاتهای isl؛ مقدار 0 به معنای نامحدود است.
- graphite-max-arrays-per-scop
- حداکثر تعداد آرایهها به ازای هر scop.
- max-vartrack-reverse-op-size
- حداکثر اندازه loc list که باید برای آن عملیاتهای معکوس افزوده شوند.
- fsm-scale-path-stmts
- ضریب مقیاسی که باید بر تعداد دستورهای یک مسیر threading عبورکننده از یال بازگشتی حلقه (loop backedge) هنگام مقایسه با --param=max-jump-thread-duplication-stmts اعمال شود.
- uninit-control-dep-attempts
- حداکثر تعداد فراخوانیهای تودرتو برای جستجوی وابستگیهای کنترلی در طول تحلیل متغیرهای مقداردهینشده.
- uninit-max-chain-len
- حداکثر تعداد محمولهایی که برای هر محمولِ با عملگر OR، در زنجیره محمولهای نرمالشده با عملگر AND ترکیب میشوند.
- uninit-max-num-chains
- حداکثر تعداد محمولهایی که در زنجیره محمولهای نرمالشده با عملگر OR ترکیب میشوند..IP uninit-max-prune-work 4 حداکثر حجم کاری که برای هرس کردن مسیرهایی که متغیر در آنها همواره مقداردهی اولیه شده است، انجام میشود.
- sched-autopref-queue-depth
- پرچم کنترلی مدل زمانبند واکشی پیشدستانهٔ سختافزاری (autoprefetcher). تعداد چرخههای نگاه به آینده (lookahead) که مدل بررسی میکند؛ در ' ' فقط روش ابتکاری مرتبسازی دستورالعملها فعال میشود.
- loop-versioning-max-inner-insns
- حداکثر تعداد دستورالعملهایی که یک حلقهٔ درونی میتواند داشته باشد، پیش از آنکه گذر نسخهبندی حلقه آن را برای رونوشتبرداری بیش از حد بزرگ بداند.
- loop-versioning-max-outer-insns
- حداکثر تعداد دستورالعملهایی که یک حلقهٔ بیرونی میتواند داشته باشد، پیش از آنکه گذر نسخهبندی حلقه آن را برای رونوشتبرداری بیش از حد بزرگ بداند، بدون احتساب هرگونه دستورالعمل در حلقههای درونی که مستقیماً از نسخهبندی بهرهمند میشوند.
- ssa-name-def-chain-limit
- حداکثر تعداد انتسابهای SSA_NAME برای دنبال کردن جهت تعیین یک ویژگی متغیر مانند مقدار آن. این گزینه تعداد تکرارها یا فراخوانیهای بازگشتی انجامشده توسط GCC را هنگام بهینهسازی برخی عبارات یا هنگام تعیین اعتبار آنها پیش از صدور پیامهای تشخیصی محدود میکند.
- store-merging-max-size
- حداکثر اندازهٔ یک ناحیهٔ ادغام ذخیرهسازی (store merging) بر حسب بایت.
- store-forwarding-max-distance
- حداکثر فاصله بر حسب تعداد دستورالعمل که ارسال یک ذخیرهسازی کوچک (store) به یک بارگذاری (load) بزرگتر ممکن است باعث توقف (stall) شود. مقدار '0' بررسیهای هزینه را برای گذر avoid-store-forwarding غیرفعال میکند.
- hash-table-verification-limit
- تعداد عنصرهایی که برای هر عنصر جستجوشده، اعتبارسنجی جدول درهمسازی برای آنها انجام میشود.
- max-find-base-term-values
- حداکثر تعداد VALUEهایی که در طول یک فراخوانی find_base_term پردازش میشوند.
- analyzer-max-enodes-per-program-point
- حداکثر تعداد گرههای گسترده (exploded nodes) در هر نقطه از برنامه در تحلیلگر، پیش از پایان دادن به تحلیل آن نقطه.
- analyzer-max-constraints
- حداکثر تعداد قیدها به ازای هر وضعیت (state).
- analyzer-min-snodes-for-call-summary
- حداقل تعداد ابرگرهها (supernodes) در یک تابع تا تحلیلگر خلاصهسازی اثرات آن را در نقاط فراخوانی (call sites) در نظر بگیرد.
- analyzer-max-enodes-for-full-dump
- حداکثر عمق گرههای گسترده که باید در یک رونوشت dot ظاهر شوند، پیش از تغییر حالت به قالبی با پرگویی کمتر.
- analyzer-max-recursion-depth
- حداکثر تعداد دفعاتی که یک نقطهٔ فراخوانی میتواند در پشتهٔ فراخوانی در تحلیلگر ظاهر شود، پیش از پایان دادن به تحلیل فراخوانیای که بازگشت عمیقتری ایجاد کند.
- analyzer-max-svalue-depth
- حداکثر عمق یک مقدار نمادین (symbolic value)، پیش از تخمین زدن آن مقدار به عنوان مقدار ناشناخته.
- analyzer-max-infeasible-edges
- حداکثر تعداد یالهای غیرممکنی (infeasible edges) که باید رد شوند پیش از آنکه یک مورد تشخیصی به عنوان غیرممکن اعلام شود.
- gimple-fe-computed-hot-bb-threshold
- تعداد دفعات اجرای یک بلوک پایه (basic block) که داغ (hot) در نظر گرفته میشود. این پارامتر فقط در GIMPLE FE استفاده میشود.
- analyzer-bb-explosion-factor
- حداکثر تعداد گرههای گستردهٔ 'after supernode' در تحلیلگر به ازای هر ابرگره، پیش از پایان دادن به تحلیل.
- analyzer-text-art-string-ellipsis-threshold
- تعداد بایتهایی که در آن لیترالهای رشتهای در نمودارهای هنر متنی (text art) تحلیلگر خلاصه (...) میشوند.
- analyzer-text-art-ideal-canvas-width
- عرض ایدهآل نمودارهای هنر متنی تولیدشده توسط تحلیلگر بر حسب نویسه.
- analyzer-text-art-string-ellipsis-head-len
- تعداد بایتهای لیترالی که هنگام خلاصه کردن یک لیترال رشتهای در هنر متنی، در ابتدای آن نمایش داده میشوند.
- analyzer-text-art-string-ellipsis-tail-len
- تعداد بایتهای لیترالی که هنگام خلاصه کردن یک لیترال رشتهای در هنر متنی، در انتهای آن نمایش داده میشوند.
- ranger-logical-depth
- حداکثر عمق ارزیابی عبارات منطقی که ranger هنگام ارزیابی محدودههای یالهای خروجی بررسی خواهد کرد.
- ranger-recompute-depth
- حداکثر عمق زنجیرههای دستورالعمل برای در نظر گرفتن جهت محاسبهٔ مجدد در محاسبهگر محدودهٔ خروجی.
- relation-block-limit
- حداکثر تعداد رابطههایی که اوراکل در یک بلوک پایه ثبت خواهد کرد.
- transitive-relations-work-bound
- محدودهٔ کاری هنگام کشف رابطههای تعدیپذیر از رابطههای موجود.
- min-pagesize
- حداقل اندازهٔ صفحه برای اهداف هشدار و برداریسازی با خروج زودهنگام (early break).
- openacc-kernels
- تعیین حالت رسیدگی به سازههای `kernels' در OpenACC. با --param=openacc-kernels=decompose، سازههای `kernels' در OpenACC به بخشهایی تجزیه میشوند، توالیای از سازههای محاسباتی، که سپس هر یک به صورت جداگانه رسیدگی میشوند. این ویژگی در حال توسعه است. با --param=openacc-kernels=parloops، سازههای `kernels' در OpenACC به صورت یکجا توسط گذر parloops رسیدگی میشوند. این مقدار پیشفرض فعلی است.
- openacc-privatization
- کنترل اینکه آیا گزینههای -fopt-info-omp-note و -fdump-tree-*-details مربوطه پیامهای تشخیصی خصوصیسازی OpenACC را صادر کنند یا خیر. با --param=openacc-privatization=quiet، پیامی صادر نمیشود. این مقدار پیشفرض فعلی است. با --param=openacc-privatization=noisy، پیامهای تشخیصی صادر میشوند.
- cycle-accurate-model
- مشخص میکند که آیا GCC باید فرض کند شرح زمانبندی در غیاب خطاهای حافظهٔ نهان (cache misses)، تا حد زیادی یک مدل دقیق بر حسب چرخه (cycle-accurate) از پردازندهٔ مقصد است که کد برای اجرا بر روی آن در نظر گرفته شده است یا خیر. مقادیر غیرصفر به این معنی است که مدل زمانبندیِ انتخابشده دقیق بوده و احتمالاً یک پردازندهٔ با اجرای ترتیبی (in-order) را توصیف میکند، و اینکه زمانبندی باید برای پر کردن حبابهای خط لوله (pipeline bubbles) به صورت تهاجمی متغیرها را به حافظه سرریز کند (spill). این مقدار پیشفرض فعلی است. مقدار صفر به این معنی است که شرح زمانبندی ممکن است در دسترس نبوده یا دقیق نباشد و یا شاید اصلاً قابل اعمال نباشد، مانند پردازندههای مدرن با اجرای غیرترتیبی (out-of-order).
انتخابهای زیر برای name بر روی مقصدهای AArch64 در دسترس هستند:
- aarch64-vect-compare-costs
- هنگام برداریسازی، استفاده از چندین روش مختلف را در نظر میگیرد و از مدل هزینه برای انتخاب ارزانترین روش استفاده میکند. این شامل موارد زیر است:
- آزمودن هر دو روش SVE و Advanced SIMD، زمانی که SVE در دسترس باشد.
- تلاش برای استفاده از بردارهای ۶۴ بیتی Advanced SIMD برای کوچکترین عناصر داده، به جای استفاده از بردارهای ۱۲۸ بیتی برای همه چیز.
- تلاش برای استفاده از بردارهای "unpacked" در SVE برای عناصر کوچکتر. این شامل ذخیره کردن عناصر کوچکتر در ظرفهای بزرگتر و دسترسی به عناصر با بارگذاریهای گسترشدهنده (extending loads) و ذخیرهسازیهای برشدهنده (truncating stores) میشود.
- aarch64-float-recp-precision
- تعداد تکرارهای نیوتن برای محاسبهٔ معکوس در نوع float. دقت تقسیم متناسب با این پارامتر است زمانی که تقریب تقسیم فعال باشد. مقدار پیشفرض ۱ است.
- aarch64-double-recp-precision
- تعداد تکرارهای نیوتن برای محاسبهٔ معکوس در نوع double. دقت تقسیم متناسب با این پارامتر است زمانی که تقریب تقسیم فعال باشد. مقدار پیشفرض ۲ است.
- aarch64-autovec-preference
- تحمیل یک راهبرد انتخاب ISA برای برداریسازی خودکار (auto-vectorization).
- default
- استفاده از روشهای ابتکاری پیشفرض.
- asimd-only
- فقط استفاده از Advanced SIMD برای برداریسازی خودکار.
- sve-only
- فقط استفاده از SVE برای برداریسازی خودکار.
- prefer-asimd
- استفاده از هر دو Advanced SIMD و SVE. ترجیح دادن Advanced SIMD زمانی که هزینهها برابر تشخیص داده شوند..IP prefer-sve 4 استفاده از هر دو Advanced SIMD و SVE. هنگامی که هزینهها برابر در نظر گرفته شوند، SVE ترجیح داده میشود.
- aarch64-ldp-policy
- سیاست دقیق (ریزدانه) برای جفتهای بارگذاری (load pairs). با --param=aarch64-ldp-policy=default، از سیاست ساختار تنظیم استفاده میکند. این مقدار، پیشفرض فعلی است. با --param=aarch64-ldp-policy=always، صرفنظر از تراز بودن، دستور ldp را تولید میکند. با --param=aarch64-ldp-policy=never، دستور ldp را تولید نمیکند. با --param=aarch64-ldp-policy=aligned، دستور ldp را تنها در صورتی تولید میکند که اشارهگر مبدا حداقل به اندازه دو برابر تراز نوع مربوطه، تراز شده باشد.
- aarch64-stp-policy
- سیاست دقیق (ریزدانه) برای جفتهای ذخیرهسازی (store pairs). با --param=aarch64-stp-policy=default، از سیاست ساختار تنظیم استفاده میکند. این مقدار، پیشفرض فعلی است. با --param=aarch64-stp-policy=always، صرفنظر از تراز بودن، دستور stp را تولید میکند. با --param=aarch64-stp-policy=never، دستور stp را تولید نمیکند. با --param=aarch64-stp-policy=aligned، دستور stp را تنها در صورتی تولید میکند که اشارهگر مبدا حداقل به اندازه دو برابر تراز نوع مربوطه، تراز شده باشد.
- aarch64-ldp-alias-check-limit
- محدودیت تعداد بررسیهای نام مستعار (alias checks) که توسط گام ادغام جفتهای بارگذاری/ذخیرهسازی در AArch64 هنگام تلاش برای تشکیل یک ldp/stp انجام میشود. مقادیر بالاتر باعث میشوند که این گذر در بازآرایی بارگذاریها نسبت به ذخیرهسازیها تهاجمیتر عمل کند، به بهای افزایش زمان کامپایل.
- aarch64-ldp-writeback
- پارامتری برای کنترل اینکه کدام فرصتهای پسنویسی (writeback) در گام ادغام جفتهای بارگذاری/ذخیرهسازی AArch64 مدیریت شوند. مقدار صفر، مدیریت writeback را غیرفعال میکند. مقدار یک به این معنی است که در صورت امکان تلاش میشود جفتهایی شامل یک یا چند دسترسی writeback منفردِ موجود تشکیل شوند. مقدار دو بدین معناست که علاوه بر این، تلاش میشود با ادغام بهروزرسانیهای تخریبیِ پسین در ثبات پایه (base register) مورد استفاده توسط یک جفت، فرصتهای writeback به صورت بهینهجویانه ایجاد شوند.
- aarch64-loop-vect-issue-rate-niters
- تنظیمات (tuning) برخی از پردازندههای AArch64 هنگام تصمیمگیری درباره اینکه یک حلقه باید با استفاده از SVE برداریسازی شود، یا با Advanced SIMD برداریسازی شود، یا اصلاً برداریسازی نشود، تلاش میکند هم تاخیرها (latencies) و هم نرخ صدور دستورالعملها (issue rates) را در نظر بگیرد. اگر این پارامتر روی n تنظیم شود، GCC از این روش مکاشفهای برای حلقههایی که مشخص است در کمتر از n تکرار Advanced SIMD اجرا میشوند، استفاده نخواهد کرد.
- aarch64-vect-unroll-limit
- برداریساز از اطلاعات تنظیم موجود برای تعیین اینکه آیا باز کردن (unroll) حلقهٔ برداریشدهٔ اصلی سودمند خواهد بود و تا چه اندازه، استفاده میکند. این پارامتر، حد بالای میزان باز کردن حلقهٔ اصلی توسط برداریساز را مشخص میکند. مقدار پیشفرض برابر چهار است.
گزینههای زیر برای name در هدفهای GCN در دسترس هستند:
- gcn-preferred-vectorization-factor
- ضریب برداریسازی ترجیحی: default، 32، 64.
گزینههای زیر برای name در هدفهای i386 و x86_64 در دسترس هستند:
- x86-stlf-window-ninsns
- تعداد دستورالعملهایی که فراتر از آن، جریمهٔ توقف ناشی از STFL قابل جبران است.
- x86-stv-max-visits
- حداکثر تعداد پیمایشهای use و def هنگام کشف یک زنجیرهٔ STV پیش از آنکه فرآیند کشف لغو شود.
گزینههای ابزارسازی برنامه (Program Instrumentation Options)
کامپایلر GCC از چندین گزینهٔ خط فرمان پشتیبانی میکند که افزودن ابزارسازی زمان اجرا (run-time instrumentation) به کدی را که معمولاً تولید میکند، کنترل مینمایند. برای نمونه، یکی از اهداف ابزارسازی، گردآوری آمارهای پروفایلسازی (profiling) برای استفاده در یافتن نقاط داغ برنامه (hot spots)، تحلیل پوشش کد، یا بهینهسازیهای هدایتشده با پروفایل است. دستهٔ دیگری از ابزارسازی برنامه، افزودن بررسیهای زمان اجرا برای تشخیص خطاهای برنامهنویسی نظیر ارجاعهای نامعتبر اشارهگر یا دسترسیهای خارج از محدودهٔ آرایه، و نیز حملات عمدی خصمانه مانند درهمشکستن پشته (stack smashing) یا سرقت vtable در C++ است. همچنین یک قلاب (hook) عمومی وجود دارد که میتواند برای پیادهسازی شکلهای دیگر ردیابی (tracing) یا ابزارسازی در سطح تابع، برای اهداف اشکالزدایی یا تحلیل برنامه استفاده شود.
- -p
- -pg
- تولید کد
اضافی برای
نوشتن
اطلاعات
پروفایل
مناسب برای
برنامهٔ
تحلیل prof
(برای -p) یا gprof
(برای -pg). شما
باید هنگام
کامپایل
فایلهای
منبعی که
مایل به
دریافت
اطلاعات
دربارهٔ
آنها
هستید از
این گزینه
استفاده
کنید، و
همچنین
باید هنگام
پیوند دادن
(linking) نیز آن را
به کار
ببرید.
میتوانید از صفت تابع با نام "no_instrument_function" برای جلوگیری از پروفایلسازی توابع خاص هنگام کامپایل با این گزینهها استفاده کنید.
- -fprofile-arcs
- افزودن کد
تا
کمانهای
(arcs) جریان
برنامه
ابزارسازی
شوند. در
طول اجرا،
برنامه ثبت
میکند که
هر انشعاب و
فراخوانی
چند بار
اجرا شده و
چند بار
منشعب شده
یا بازگشته
است. در
هدفهایی
که از
سازندهها
با اولویت
پشتیبانی
میکنند،
پروفایلسازی
به درستی
سازندهها،
نابودکنندهها
و
سازندههای
کلاسهای C++
(و
نابودکنندهها)
را که به
عنوان نوعی
از یک متغیر
سراسری
استفاده
شدهاند،
مدیریت
میکند.
هنگامی که برنامهٔ کامپایلشده خارج میشود، این دادهها را در فایلی به نام auxname.gcda برای هر فایل منبع ذخیره میکند. این دادهها میتوانند برای بهینهسازیهای هدایتشده با پروفایل (-fbranch-probabilities)، یا برای تحلیل پوشش آزمون (-ftest-coverage) استفاده شوند. نام auxname برای هر فایل شیء، در صورتی که به صراحت مشخص شده باشد و فایل اجرایی نهایی نباشد، از نام فایل خروجی تولید میشود، در غیر این صورت نام پایه (basename) فایل منبع خواهد بود. در هر دو حالت، هرگونه پسوند حذف میشود (به عنوان مثال foo.gcda برای فایل ورودی dir/foo.c، یا dir/foo.gcda برای فایل خروجی مشخصشده به صورت -o dir/foo.o).
توجه داشته باشید که اگر خط فرمان مستقیماً فایلهای منبع را پیوند دهد، فایلهای .gcda مربوطه پیشوندی از نام بدون پسوندِ فایل خروجی خواهند داشت؛ برای مثال، دستور "gcc a.c b.c -o binary" فایلهای binary-a.gcda و binary-b.gcda را تولید میکند.
- -fcondition-coverage
- افزودن کد تا شرایط برنامه ابزارسازی شوند. در طول اجرا، برنامه ثبت میکند که چه عبارتهایی در یک شرط در تصمیمگیری نقش داشتهاند، که میتوان از آن برای تایید اینکه همهٔ عبارتها در یک تابع بولی آزمایش شدهاند و اثری مستقل بر نتیجهٔ یک تصمیم دارند، استفاده کرد. نتیجه را میتوان با "gcov --conditions" خواند.
- -fpath-coverage
- افزودن کد تا مسیرهای طیشده ردیابی شوند. در طول اجرا، برنامه مسیرهای اول (prime paths) طیشده را ثبت میکند. تعداد مسیرها با افزایش پیچیدگی بسیار سریع رشد میکند، و برای جلوگیری از انفجار زمانهای کامپایل، اگر تعداد تقریبی مسیرها از حد کنترلشده توسط -fpath-coverage-limit فراتر رود، GCC از ابزارسازی صرفنظر خواهد کرد. نتیجه را میتوان با "gcov --prime-paths --prime-paths-lines --prime-paths-source" خواند.
- -fpath-coverage-limit=limit
- آستانهای که در آن نقطه -fpath-coverage از ابزارسازی یک تابع صرفنظر میکند. این حد تقریبی و محتاطانه است، زیرا GCC از یک روش مکاشفهای بدبینانه استفاده میکند که تعداد جاری مسیرها را کمی بیشتر میشمارد، و اگر این آستانه پیش از یافتن همهٔ مسیرها فرا برسد، متوقف میشود. این گزینه برای کنترل دقیق و ریزدانه روی اینکه کدام توابع ابزارسازی شوند نیست - بلکه هدف آن محدود کردن اثر انفجار مسیر و منطقی نگه داشتن زمان کامپایل است. مقدار پیشفرض 250000 است.
- --coverage
- این گزینه برای کامپایل و پیوند دادن کدهای ابزارسازیشده به منظور تحلیل پوشش استفاده میشود. این گزینه معادل -fprofile-arcs -ftest-coverage (هنگام کامپایل) و -lgcov (هنگام پیوند دادن) است. برای جزئیات بیشتر به مستندات آن گزینهها مراجعه کنید.
- فایلهای منبع را با -fprofile-arcs به همراه گزینههای بهینهسازی و تولید کد کامپایل کنید. برای تحلیل پوشش آزمون، از گزینهٔ اضافی -ftest-coverage استفاده کنید. نیازی نیست همهٔ فایلهای منبع موجود در یک برنامه را پروفایلسازی کنید.
- فایلهای منبع را همچنین با -fprofile-abs-path کامپایل کنید تا نام مسیرهای مطلق در فایلهای .gcno ایجاد شوند. این کار به gcov اجازه میدهد تا در پروژههایی که کامپایل با دایرکتوریهای کاری متفاوتی انجام میشود، منابع درست را بیابد.
- فایلهای شیء خود را با -lgcov یا -fprofile-arcs پیوند دهید (مورد دوم مستلزم مورد اول است).
- برنامه را
با یک بار
کاری نمونه
اجرا کنید
تا اطلاعات
پروفایل
کمان تولید
شود. این
کار را
میتوان به
هر تعداد
بار تکرار
کرد.
میتوانید
نمونههای
همروند از
برنامهٔ
خود را اجرا
کنید، و تا
زمانی که
فایل سیستم
از
قفلگذاری
پشتیبانی
کند،
فایلهای
داده به
درستی
بهروزرسانی
خواهند شد.
فراخوانیهای
"fork"
شناسایی
شده و بدون
شمارش
دوباره به
درستی
مدیریت
میشوند،
مگر اینکه
گزینهٔ
گویش اکید ISO C
فعال باشد.
علاوه بر این، یک فایل شیء میتواند چندین بار بازکامپایل شود و تا زمانی که فایل منبع و گزینههای کامپایلر بدون تغییر باقی بمانند، فایل .gcda مربوطه ادغام میگردد..IP * 4 برای بهینهسازیهای هدایتشده با نمایه (profile-directed optimizations)، فایلهای مبدأ را دوباره با همان گزینههای بهینهسازی و تولید کد به همراه -fbranch-probabilities کامپایل کنید.
- برای تحلیل پوشش آزمون، از gcov برای تولید اطلاعات خوانا برای انسان از فایلهای .gcno و .gcda استفاده کنید. برای اطلاعات بیشتر به مستندات gcov مراجعه کنید.
با -fprofile-arcs، کامپایلر GCC برای هر تابع برنامه شما یک گراف جریان برنامه ایجاد کرده، سپس یک درخت پوشا (spanning tree) برای گراف پیدا میکند. تنها یالهایی که روی درخت پوشا نیستند نیاز به ابزارگذاری (instrumentation) دارند: کامپایلر کدی برای شمارش تعداد دفعات اجرای این یالها اضافه میکند. هنگامی که یک یال تنها خروجی یا تنها ورودی به یک بلوک باشد، کد ابزارگذاری میتواند به همان بلوک اضافه شود؛ در غیر این صورت، برای نگهداری کد ابزارگذاری باید یک بلوک پایهای جدید ایجاد شود.
با -fcondition-coverage، کامپایلر GCC برای هر شرط در برنامه شما یک مجموعه بیتی ایجاد کرده و مقادیر بولی آزمایششدهای را که تأثیری مستقل بر نتیجه آن عبارت دارند، ثبت میکند.
با -fpath-coverage، کامپایلر GCC مسیرهای اول (prime paths) طیشده هر تابع را پیدا، شمارش و ثبت میکند، مگر اینکه تعداد مسیرها از حد کنترلشده توسط -fpath-coverage-limit فراتر رود. اگر از این حد فراتر رود، تابع ابزارگذاری نمیشود؛ درست مانند اینکه از -fpath-coverage استفاده نشده باشد. یک مسیر اول طولانیترین توالی از بلوکهای یکتا است (بهجز احتمالاً بلوک اول و آخر) که زیرمسیر هیچ مسیر دیگری نباشد.
- -ftest-coverage
- یک فایل یادداشت تولید میکند که ابزار پوشش کد gcov میتواند از آن برای نمایش پوشش برنامه استفاده کند. فایل یادداشت هر فایل مبدأ auxname.gcno نامیده میشود. برای توضیحات مربوط به auxname و دستورالعملهای نحوه تولید دادههای پوشش آزمون، به گزینه -fprofile-arcs در بالا مراجعه کنید. اگر بهینهسازی انجام ندهید، دادههای پوشش با دقت بیشتری با فایلهای مبدأ مطابقت خواهند داشت.
- -fprofile-abs-path
- بهطور خودکار نام فایلهای مبدأ نسبی را به نام مسیرهای مطلق در فایلهای .gcno تبدیل میکند. این به gcov اجازه میدهد تا در پروژههایی که کامپایلها در دایرکتوریهای کاری متفاوتی انجام میشوند، فایلهای مبدأ درست را پیدا کند.
- -fprofile-dir=path
- دایرکتوری
جستجو برای
فایلهای
داده نمایه
را روی path
تنظیم
میکند. این
گزینه فقط
بر
دادههای
نمایهای
تأثیر
میگذارد
که توسط
-fprofile-generate، -ftest-coverage،
-fprofile-arcs تولید
شده و توسط
-fprofile-use و -fbranch-probabilities و
گزینههای
مرتبط با آن
استفاده
میشوند. هم
مسیرهای
مطلق و هم
نسبی قابل
استفاده
هستند.
بهطور
پیشفرض، GCC
از
دایرکتوری
فعلی به
عنوان path
استفاده
میکند،
بنابراین
فایل داده
نمایه در
همان
دایرکتوری
فایل شیء (object file)
ظاهر
میشود. به
منظور
جلوگیری از
تداخل نام
فایلها،
اگر نام
فایل شیء یک
مسیر مطلق
نباشد،
مسیر مطلق
فایل sourcename.gcda
درهمریخته
(mangle) شده و به
عنوان نام
فایل یک
فایل .gcda
استفاده
میشود.
جزئیات
نامگذاری
فایل را در
-fprofile-arcs ببینید.
گزینه
مشابه -fprofile-note
را نیز
ببینید.
هنگامی که یک فایل اجرایی در یک محیط موازی گسترده اجرا میشود، توصیه میشود نمایه در پوشههای مختلف ذخیره شود. این کار را میتوان با متغیرهایی در path انجام داد که در زمان اجرا صادر (export) میشوند:
- %p
- شناسه فرایند (process ID).
- %q{VAR}
- مقدار متغیر محیطی VAR
- -fprofile-generate
- -fprofile-generate=path
- گزینههایی
را فعال
میکند که
معمولاً
برای
ابزارگذاری
برنامه به
منظور
تولید
نمایهای
که برای
کامپایل
مجدد بعدی
همراه با
بهینهسازی
مبتنی بر
بازخورد
نمایه مفید
است،
استفاده
میشوند.
شما باید از
-fprofile-generate هم
هنگام
کامپایل و
هم هنگام
پیوند زدن (link)
برنامه خود
استفاده
کنید.
گزینههای زیر فعال میشوند: -fprofile-arcs، -fprofile-values، -finline-functions و -fipa-bit-cp.
اگر path مشخص شده باشد، GCC برای یافتن فایلهای داده بازخورد نمایه، مسیر path را بررسی میکند. گزینه -fprofile-dir را ببینید.
برای بهینهسازی برنامه بر اساس اطلاعات نمایه جمعآوریشده، از -fprofile-use استفاده کنید.
- -fprofile-info-section
- -fprofile-info-section=name
- اطلاعات
نمایه را به
جای
استفاده از
سازنده/تخریبکننده
(constructor/destructor) در بخش
(section) مشخصشده
ثبت میکند.
نام بخش در
صورت مشخص
شدن name است،
در غیر این
صورت نام
بخش بهطور
پیشفرض
".gcov_info"
خواهد بود.
یک
اشارهگر
به اطلاعات
نمایه
تولیدشده
توسط -fprofile-arcs
برای هر
واحد ترجمه
در بخش
مشخصشده
قرار
میگیرد.
این گزینه
ثبت
اطلاعات
نمایه از
طریق constructor و
پردازش
اطلاعات
نمایه از
طریق destructor را
غیرفعال
میکند. این
گزینه برای
استفاده در
محیطهای
میزبانیشده
(hosted) مانند GNU/Linux
در نظر
گرفته نشده
است. این
گزینه
محیطهای
مستقل (freestanding
مانند
سامانههای
تعبیهشده)
با منابع
محدود را
هدف قرار
میدهد که
از constructors/destructors یا
ورودی/خروجی
فایل
کتابخانه C
پشتیبانی
نمیکنند.
پیونددهنده (linker) میتواند بخشهای ورودی را در یک بلوک حافظه پیوسته جمعآوری کرده و نمادهای آغاز و پایان را تعریف کند. یک نمونه اسکریپت پیونددهنده گنو (GNU linker script) که یک بخش خروجی پیونددهنده را تعریف میکند به صورت زیر است:
.gcov_info : { PROVIDE (__gcov_info_start = .); KEEP (*(.gcov_info)) PROVIDE (__gcov_info_end = .); }برنامه میتواند اطلاعات نمایهسازی ثبتشده در این مجموعه پیونددهنده را برای نمونه به این شکل تخلیه (dump) کند:
#include <gcov.h> #include <stdio.h> #include <stdlib.h> extern const struct gcov_info *const __gcov_info_start[]; extern const struct gcov_info *const __gcov_info_end[]; static void dump (const void *d, unsigned n, void *arg) { const unsigned char *c = d; for (unsigned i = 0; i < n; ++i) printf ("%02x", c[i]); } static void filename (const char *f, void *arg) { __gcov_filename_to_gcfn (f, dump, arg ); } static void * allocate (unsigned length, void *arg) { return malloc (length); } static void dump_gcov_info (void) { const struct gcov_info *const *info = __gcov_info_start; const struct gcov_info *const *end = __gcov_info_end; /* Obfuscate variable to prevent compiler optimizations. */ __asm__ ("" : "+r" (info)); while (info != end) { void *arg = NULL; __gcov_info_to_gcda (*info, filename, dump, allocate, arg); putchar ('\n'); ++info; } } int main (void) { dump_gcov_info (); return 0; }از زیرفرمان merge-stream در gcov-tool میتوان برای واسریالسازی جریان داده تولیدشده توسط توابع "__gcov_filename_to_gcfn" و "__gcov_info_to_gcda" و ادغام اطلاعات نمایه در فایلهای .gcda روی سیستمفایل میزبان استفاده کرد..IP -fprofile-note=path 4 اگر path مشخص شود، GCC فایل .gcno را در مکان path ذخیره میکند. در صورت استفادهٔ همزمان از این گزینه با چندین فایل مبدأ، فایل .gcno بازنویسی خواهد شد.
- -fprofile-prefix-path=path
- این گزینه میتواند در ترکیب با profile-generate=profile_dir و profile-use=profile_dir استفاده شود تا به GCC اطلاع دهد دایرکتوری پایهٔ درخت مبدأ ساختهشده کجاست. بهطور پیشفرض، profile_dir حاوی فایلهایی با مسیرهای مطلق درهمریختهشدهٔ (mangled) تمام فایلهای شیء پروژهٔ ساختهشده خواهد بود. این حالت زمانی که دایرکتوری استفادهشده برای ساخت دودوییِ ابزارگذاریشده (instrumented) با دایرکتوری استفادهشده برای ساخت باینریِ بهینهشده با بازخورد پروفایل تفاوت داشته باشد، مطلوب نیست؛ چرا که دادههای پروفایل در طول ساخت بهینهشده یافت نخواهند شد. در چنین شرایطی، -fprofile-prefix-path=path در حالی که path به دایرکتوری پایهٔ ساخت اشاره میکند، میتواند برای حذف بخش نامربوط مسیر و نسبی نگهداشتن تمامی نامهای فایل نسبت به دایرکتوری اصلی ساخت استفاده شود.
- -fprofile-prefix-map=old=new
- هنگام کامپایل فایلهای واقع در دایرکتوری old، اطلاعات پروفایلسازی (با --coverage) را طوری ثبت میکند که گویی این فایلها در دایرکتوری new قرار دارند. همچنین نگاه کنید به -ffile-prefix-map و -fcanon-prefix-map.
- -fprofile-update=method
- روش
بهروزرسانی
را برای
برنامهای
که جهت
بهینهسازی
بر پایهٔ
بازخورد
پروفایل
ابزارگذاری
شده است
تغییر
میدهد.
آرگومان method
باید یکی از
مقادیر single،
atomic یا prefer-atomic
باشد. مقدار
نخست برای
برنامههای
تکرشتهای
مفید است،
در حالی که
مقدار دوم
با تولید کد
امن از نظر
رشته (thread-safe)، از
خراب شدن
پروفایل
جلوگیری
میکند.
هشدار: زمانی که یک برنامه تمام رشتهها را بهدرستی الحاق (join) نکند (یا یک رشتهٔ منفصل/detached ایجاد کند)، فایل پروفایل همچنان ممکن است مخدوش شود.
استفاده از prefer-atomic در صورت پشتیبانی توسط پلتفرم مقصد به atomic و در غیر این صورت به single تبدیل میشود. راهانداز GCC هنگامی که -pthread در خط فرمان وجود داشته باشد، بهطور خودکار prefer-atomic را انتخاب میکند، در غیر این صورت روش پیشفرض single است.
اگر atomic انتخاب شود، اطلاعات پروفایل با استفاده از عملیات اتمی بر پایهٔ بیشترین تلاش ممکن (best-effort) بهروزرسانی میشوند. در حالت ایدهآل، اطلاعات پروفایل از طریق عملیات اتمی در سختافزار بهروزرسانی میشوند. با این حال، اگر پلتفرم مقصد از عملیات اتمی مورد نیاز در سختافزار پشتیبانی نکند ولی libatomic در دسترس باشد، اطلاعات پروفایل از طریق فراخوانیهای libatomic بهروزرسانی خواهند شد. اگر پلتفرم مقصد نه از عملیات اتمی در سختافزار و نه از libatomic پشتیبانی کند، اطلاعات پروفایل بهصورت اتمی بهروزرسانی نمیشوند و یک هشدار صادر میشود. در این حالت، اطلاعات پروفایلسازی بهدستآمده ممکن است برای برنامههای چندرشتهای مخدوش باشد.
به دلایل کارایی، اگر از شمارندههای ۶۴ بیتی برای اطلاعات پروفایلسازی استفاده شود و پلتفرم مقصد تنها از عملیات اتمی ۳۲ بیتی در سختافزار پشتیبانی کند، بهروزرسانیهای حساس به کاراییِ پروفایل با استفاده از دو عملیات اتمی ۳۲ بیتی برای بهروزرسانی هر شمارنده انجام میشوند. اگر سیگنالی این دو عملیات بهروزرسانیِ یک شمارنده را قطع کند، اطلاعات پروفایلسازی ممکن است در وضعیتی متناقض و ناپایدار قرار گیرند.
- -fprofile-filter-files=regex
- تنها
توابعی از
فایلها را
ابزارگذاری
میکند که
نام آنها
با هر یک از
عبارات
باقاعده (که
با
نقطه-ویرگول
از هم جدا
شدهاند)
مطابقت
داشته باشد.
برای مثال، -fprofile-filter-files=main\.c;module.*\.c تنها main.c و تمام فایلهای C را که با 'module' آغاز میشوند ابزارگذاری خواهد کرد.
- -fprofile-exclude-files=regex
- تنها
توابعی از
فایلها را
ابزارگذاری
میکند که
نام آنها
با هیچیک
از عبارات
باقاعده (که
با
نقطه-ویرگول
از هم جدا
شدهاند)
مطابقت
نداشته
باشد.
برای مثال، -fprofile-exclude-files=/usr/.* از ابزارگذاری تمام فایلهایی که در پوشهٔ /usr/ قرار دارند جلوگیری میکند.
- -fprofile-reproducible=[multithreaded|parallel-runs|serial]
- سطح
تکرارپذیری
پروفایل
جمعآوریشده
توسط
"-fprofile-generate" را
کنترل
میکند. این
امر امکان
بازسازی
برنامه با
نتیجهای
یکسان را
فراهم
میسازد که
بهعنوان
مثال برای
بستههای
توزیع مفید
است.
با -fprofile-reproducible=serial، پروفایل جمعآوریشده توسط -fprofile-generate تکرارپذیر خواهد بود، به شرطی که برنامهٔ آموزشدادهشده در هر بار اجرای مرحلهٔ آموزش رفتاری یکسان داشته باشد، چندرشتهای نباشد و ارسال جریانیِ دادههای پروفایل همواره به همان ترتیب انجام شود. توجه داشته باشید که ارسال جریانی دادههای پروفایل در پایان اجرای برنامه و همچنین پیش از فراخوانی تابع "fork" رخ میدهد.
توجه داشته باشید که بسیار متداول است تعداد دفعات اجرای برخی بخشهای برنامه، برای نمونه به طول نام فایلهای موقت یا تصادفیسازی فضای حافظه (که ممکن است بر نرخ برخورد در جدول هش تأثیر بگذارد) وابسته باشد. چنین بخشهای غیرتکرارپذیری از برنامه را میتوان با صفتِ تابع "no_instrument_function" مشخص کرد. از gcov-dump همراه با -l میتوان برای تخلیهٔ دادههای جمعآوریشده و بررسی اینکه آیا واقعاً تکرارپذیر هستند استفاده کرد.
با -fprofile-reproducible=parallel-runs، پروفایل جمعآوریشده بدون در نظر گرفتن ترتیب ارسال جریانی دادهها به فایلهای gcda تکرارپذیر میماند. این تنظیم امکان اجرای چندین نمونه از برنامهٔ ابزارگذاریشده را بهطور موازی (مانند استفاده از "make -j") فراهم میکند. این امر کیفیت دادههای جمعآوریشده را، بهویژه در پروفایلسازی فراخوانیهای غیرمستقیم، کاهش میدهد.
- -fsanitize=address
- فعالسازی
AddressSanitizer، یک
شناساگر
سریع
خطاهای
حافظه.
دستورالعملهای
دسترسی به
حافظه برای
تشخیص
باگهای
خارج از
محدوده (out-of-bounds) و
استفاده پس
از
آزادسازی
(use-after-free)
ابزارگذاری
میشوند.
این گزینه
-fsanitize-address-use-after-scope را
فعال
میکند.
برای
جزئیات
بیشتر به
https://github.com/google/sanitizers/wiki/AddressSanitizer
مراجعه
کنید. رفتار
زمان اجرا
را میتوان
با استفاده
از متغیر
محیطی ASAN_OPTIONS
کنترل کرد.
در صورت
مقداردهی
به "help=1"،
گزینههای
موجود در
زمان
راهاندازی
برنامهٔ
ابزارگذاریشده
نمایش داده
میشوند.
برای
فهرستی از
گزینههای
پشتیبانیشده،
https://github.com/google/sanitizers/wiki/AddressSanitizerFlags#run-time-flags
را ببینید.
این گزینه
نمیتواند
با -fsanitize=thread یا
-fsanitize=hwaddress ترکیب
شود. توجه
داشته
باشید تنها
مقاصدی که
-fsanitize=hwaddress در حال
حاضر روی
آنها
پشتیبانی
میشود x86-64
(تنها با
گزینههای
"-mlam=u48" یا
"-mlam=u57") و AArch64
هستند، و در
هر دو مورد
تنها در
ABIهایی با
اشارهگرهای
۶۴ بیتی.
هنگام کامپایل با -fsanitize=address، باید از -g نیز استفاده کنید تا خروجیِ معنادارتری ایجاد شود. برای بهدست آوردن ردپای پشتهٔ (stack trace) دقیقتر، میتوان از گزینههایی مانند -O0، -O1 یا -Og (که برای نمونه، از درونخطیسازی اکثر توابع جلوگیری میکنند)، -fno-optimize-sibling-calls (که از بهینهسازی فراخوانیهای همسطح و بازگشتی انتهایی جلوگیری میکند؛ این گزینه بهطور ضمنی برای -O0، -O1 یا -Og فعال است)، یا -fno-ipa-icf (که تاشدگی کدهای یکسان برای توابع را غیرفعال میکند) استفاده کرد. استفاده از -fno-omit-frame-pointer نیز ردپای پشته را بهبود میبخشد. از آنجا که اجراهای مکرر برنامه ممکن است به دلیل ASLR (تصادفیسازی چیدمان فضای آدرس) ردپاهایی با آدرسهای متفاوت تولید کنند، ممکن است خاموش کردن ASLR مطلوب باشد. در لینوکس، این کار با setarch `uname -m` -R ./prog قابل دستیابی است.
- -fsanitize=kernel-address
- فعالسازی AddressSanitizer برای هستهٔ لینوکس. برای جزئیات بیشتر به https://github.com/google/kernel-sanitizers مراجعه کنید.
- -fsanitize=hwaddress
- فعالسازی AddressSanitizer به کمک سختافزار، که از قابلیت سختافزاری نادیده گرفتن بایت بالای یک اشارهگر استفاده میکند تا امکان تشخیص خطاهای حافظه با سربار حافظهٔ اندک فراهم شود. دستورالعملهای دسترسی به حافظه برای تشخیص خطاهای خارج از محدوده و استفاده پس از آزادسازی ابزارگذاری میشوند. این گزینه -fsanitize-address-use-after-scope را فعال میکند. برای جزئیات بیشتر به https://clang.llvm.org/docs/HardwareAssistedAddressSanitizerDesign.html مراجعه کنید. رفتار زمان اجرا را میتوان با استفاده از متغیر محیطی HWASAN_OPTIONS تحت تأثیر قرار داد. در صورت مقداردهی به "help=1"، گزینههای موجود در زمان راهاندازی برنامهٔ ابزارگذاریشده نشان داده میشوند. این گزینه نمیتواند با -fsanitize=thread یا -fsanitize=address ترکیب شود، و در حال حاضر تنها روی AArch64 در دسترس است.
- -fsanitize=kernel-hwaddress
- فعالسازی
AddressSanitizer به کمک
سختافزار
برای
کامپایل
هستهٔ
لینوکس.
مشابه -fsanitize=kernel-address
اما با
استفاده از
یک روش
ابزارگذاری
جایگزین، و
مشابه -fsanitize=hwaddress
اما با
تفاوتهای
ابزارگذاری
لازم برای
کامپایل
هستهٔ
لینوکس. این
تفاوتها
برای
جلوگیری از
فراخوانیهای
مقداردهی
اولیهٔ
کتابخانهٔ
hwasan و در نظر
گرفتن این
نکته است که
اشارهگر
پشته در
بایت
بالایی خود
مقدار
متفاوتی
دارد.
نکته: این گزینه مقادیر پیشفرض متفاوتی نسبت به -fsanitize=hwaddress دارد. ابزارگذاری پشته و فراخوانیهای alloca بهطور پیشفرض فعال نیستند، اما همچنان با مشخص کردن گزینههای خط فرمانِ --param hwasan-instrument-stack=1 و --param hwasan-instrument-allocas=1 بهترتیب ممکن هستند. استفاده از برچسب فریم تصادفی برای ابزارگذاری هسته پیادهسازی نشده است.
- -fsanitize=pointer-compare
- عملیات مقایسه (<، <=، >، >=) با عملوندهای اشارهگر را ابزارگذاری میکند. این گزینه باید با یکی از گزینههای -fsanitize=kernel-address یا -fsanitize=address ترکیب شود. این گزینه نمیتواند با -fsanitize=thread ترکیب شود. نکته: بهطور پیشفرض این بررسی در زمان اجرا غیرفعال است. برای فعالسازی آن، "detect_invalid_pointer_pairs=2" را به متغیر محیطی ASAN_OPTIONS اضافه کنید. استفاده از "detect_invalid_pointer_pairs=1" تنها زمانی عملیات نامعتبر را تشخیص میدهد که هر دو اشارهگر غیرتهی (non-null) باشند.
- -fsanitize=pointer-subtract
- تفریق با
عملوندهای
اشارهگر
را
ابزارگذاری
میکند. این
گزینه باید
با یکی از
گزینههای
-fsanitize=kernel-address یا
-fsanitize=address ترکیب
شود. این
گزینه
نمیتواند
با -fsanitize=thread
ترکیب شود.
نکته:
بهطور
پیشفرض
این بررسی
در زمان
اجرا
غیرفعال
است. برای
فعالسازی
آن،
"detect_invalid_pointer_pairs=2"
را به متغیر
محیطی ASAN_OPTIONS
اضافه کنید.
استفاده از
"detect_invalid_pointer_pairs=1"
تنها زمانی
عملیات
نامعتبر را
تشخیص
میدهد که
هر دو
اشارهگر
غیرتهی (non-null)
باشند..IP
-fsanitize=shadow-call-stack 4
سازوکار ShadowCallStack
را فعال
میکند؛ یک
سازوکار
امنیتی
برای
محافظت از
برنامهها
در برابر
رونویسی
آدرس
بازگشت
(مانند
سرریزهای
بافر پشته).
این
سازوکار با
ذخیره آدرس
بازگشت
تابع در یک
پشته
فراخوانی
سایه با
تخصیص
جداگانه در
مقدمه تابع
(function prologue) و
بازیابی
مجدد آدرس
بازگشت از
پشته
فراخوانی
سایه در
مؤخره تابع
(function epilogue) کار
میکند.
ابزار
دقیقسازی
(Instrumentation) تنها در
توابعی رخ
میدهد که
نیاز به
ذخیره آدرس
بازگشت در
پشته دارند.
در حال حاضر این ویژگی فقط از بستر aarch64 پشتیبانی میکند. این سازوکار بهطور خاص برای هستههای لینوکسی طراحی شده که گزینه CONFIG_SHADOW_CALL_STACK را فعال کردهاند. برای برنامههای فضای کاربری، در حال حاضر پشتیبانی زمان اجرا در libc و libgcc ارائه نشده است. کاربرانی که میخواهند از این ویژگی در فضای کاربری استفاده کنند، باید پشتیبانی زمان اجرای خودشان را فراهم کنند. باید توجه داشت که این کار ممکن است منجر به نقض قوانین ABI شود.
در aarch64، ابزار دقیقسازی از ثبات پلتفرم "x18" استفاده میکند. این امر بهطور کلی بدین معنی است که هر کدی که ممکن است بر روی همان ریسه کدهای کامپایلشده با ShadowCallStack اجرا شود، باید با پرچم -ffixed-x18 کامپایل شود؛ در غیر این صورت، توابعی که بدون -ffixed-x18 کامپایل شدهاند ممکن است ثبات "x18" را مخدوش (clobber) کرده و بدینترتیب اشارهگر پشته سایه را تخریب کنند.
همچنین، از آنجا که هیچ پشتیبانی زمان اجرایی در فضای کاربری وجود ندارد، کدهای کامپایلشده با ShadowCallStack نمیتوانند از مدیریت استثنا استفاده کنند. برای غیرفعال کردن استثناها از -fno-exceptions استفاده کنید.
برای جزئیات بیشتر به https://clang.llvm.org/docs/ShadowCallStack.html مراجعه کنید.
- -fsanitize=thread
- قابلیت ThreadSanitizer
را فعال
میکند که
یک
تشخیصدهنده
سریع رقابت
داده (data race) است.
دستورالعملهای
دسترسی به
حافظه برای
تشخیص
باگهای
رقابت داده
ابزار
دقیقسازی
میشوند.
برای
جزئیات
بیشتر به
https://github.com/google/sanitizers/wiki#threadsanitizer
مراجعه
کنید. رفتار
زمان اجرا
را میتوان
با استفاده
از متغیر
محیطی TSAN_OPTIONS
تحت تأثیر
قرار داد؛
برای دیدن
فهرست
گزینههای
پشتیبانیشده
به
https://github.com/google/sanitizers/wiki/ThreadSanitizerFlags
مراجعه
کنید. این
گزینه
نمیتواند
با -fsanitize=address و -fsanitize=leak
ترکیب شود.
هنگام کامپایل با -fsanitize=thread، بهتر است از -g نیز استفاده کنید تا خروجی مفهومیتری تولید شود.
توجه داشته باشید که توابع توکار اتمیِ ابزار دقیقسازیشده، هنگام کار روی آدرسهای نامعتبر حافظه به همراه استثناهای غیرفراخوانی (-fnon-call-exceptions)، نمیتوانند استثنا پرتاب کنند.
- -fsanitize=leak
- قابلیت LeakSanitizer را فعال میکند که یک تشخیصدهنده نشت حافظه است. این گزینه تنها برای پیوند دادن (linking) فایلهای اجرایی اهمیت دارد. فایل اجرایی در برابر کتابخانهای پیوند میخورد که "malloc" و سایر توابع تخصیص حافظه را بازنویسی (override) میکند. برای جزئیات بیشتر به https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer مراجعه کنید. رفتار زمان اجرا را میتوان با استفاده از متغیر محیطی LSAN_OPTIONS تحت تأثیر قرار داد. این گزینه نمیتواند با -fsanitize=thread ترکیب شود.
- -fsanitize=undefined
- قابلیت UndefinedBehaviorSanitizer را فعال میکند که یک تشخیصدهنده سریع رفتار تعریفنشده (undefined behavior) است. محاسبات گوناگون برای تشخیص رفتار تعریفنشده در زمان اجرا ابزار دقیقسازی میشوند. برای جزئیات بیشتر به https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html مراجعه کنید. رفتار زمان اجرا را میتوان با استفاده از متغیر محیطی UBSAN_OPTIONS تحت تأثیر قرار داد. زیرگزینههای فعلی عبارتند از:
- -fsanitize=shift
- این گزینه بررسی تعریفنشده نبودن نتیجه عملیات شیفت را فعال میکند. توجه داشته باشید که تعریف دقیق رفتار تعریفنشده بین C و ++C و همچنین بین استاندارد ISO C90 و C99 و غیره کمی متفاوت است. این گزینه دارای دو زیرگزینه است: -fsanitize=shift-base و -fsanitize=shift-exponent.
- -fsanitize=shift-exponent
- این گزینه بررسی منفی نبودن آرگومان دوم یک عملیات شیفت و کوچکتر بودن آن از دقتِ آرگومان اولِ ارتقایافته (promoted) را فعال میکند.
- -fsanitize=shift-base
- اگر آرگومان دوم عملیات شیفت در محدوده مجاز باشد، بررسی میکند که نتیجه عملیات شیفت تعریفنشده نباشد. توجه داشته باشید که آنچه دقیقاً تعریفنشده در نظر گرفته میشود بین C و ++C و همچنین بین ISO C90 و C99 و غیره کمی متفاوت است.
- -fsanitize=integer-divide-by-zero
- تقسیم عدد صحیح بر صفر را تشخیص میدهد.
- -fsanitize=unreachable
- با این گزینه، کامپایلر فراخوانی "__builtin_unreachable" را به یک فراخوانی پیام تشخیصی تبدیل میکند. هنگام رسیدن به فراخوانی "__builtin_unreachable"، رفتار برنامه تعریفنشده است.
- -fsanitize=vla-bound
- این گزینه به کامپایلر دستور میدهد تا مثبت بودن اندازه آرایههای با طول متغیر (variable length array) را بررسی کند.
- -fsanitize=null
- این گزینه بررسی اشارهگرها را فعال میکند. بهویژه، برنامهای که با این گزینه ساخته شده باشد، در صورتی که بخواهد یک اشارهگر NULL را ارجاعزدایی (dereference) کند، یا اگر یک ارجاع (احتمالاً ارجاع rvalue) به یک اشارهگر NULL متصل شود، یا اگر متدی روی شیئی که توسط یک اشارهگر NULL اشاره شده فراخوانی گردد، یک پیام خطا صادر میکند.
- -fsanitize=return
- این گزینه بررسی عبارت return را فعال میکند. برنامههایی که با این گزینه ساخته شده باشند، هنگامی که به پایان یک تابع غیر void برسند بدون آنکه مقداری را برگردانند، پیام خطایی صادر خواهند کرد. این گزینه فقط در ++C کار میکند.
- -fsanitize=signed-integer-overflow
- این گزینه
بررسی
سرریز
اعداد صحیح
علامتدار
را فعال
میکند.
بررسی
میشود که
نتیجه
عملیات
"+"،
"*"، و هر
دو عملگر
"-"
یکانی و
دودویی در
محاسبات
علامتدار
سرریز نکند.
این گزینه
همچنین
تقسیم
علامتدار
"INT_MIN / -1" را
تشخیص
میدهد.
توجه داشته
باشید که
قواعد
ارتقای
اعداد صحیح
باید در نظر
گرفته
شوند؛ یعنی
مورد زیر یک
سرریز به
شمار
نمیرود:
signed char a = SCHAR_MAX; a++;
- -fsanitize=bounds
- این گزینه ابزار دقیقسازی حدود آرایهها را فعال میکند. دسترسیهای گوناگون به خارج از محدوده تشخیص داده میشوند. اعضای آرایه انعطافپذیر (flexible array members)، آرایههای شبیه عضو آرایه انعطافپذیر، و مقداردهندههای متغیرهایی با فضای ذخیرهسازی ایستا (static storage) ابزار دقیقسازی نمیشوند؛ به استثنای آرایههای شبیه عضو آرایه انعطافپذیر که گزینههای "-fstrict-flex-arrays" یا "-fstrict-flex-arrays=" یا مشخصههای "strict_flex_array" تعیین کنند نباید مانند آرایههای شبیه عضو آرایه انعطافپذیر با آنها رفتار شود.
- -fsanitize=bounds-strict
- این گزینه ابزار دقیقسازی سختگیرانه حدود آرایهها را فعال میکند. بیشتر دسترسیهای خارج از محدوده تشخیص داده میشوند، از جمله آرایههای شبیه عضو آرایه انعطافپذیر. مقداردهندههای متغیرها با ذخیرهسازی ایستا ابزار دقیقسازی نمیشوند.
- -fsanitize=alignment
- این گزینه بررسی ترازسازی (alignment) اشارهگرها را هنگام ارجاعزدایی از آنها، یا هنگامی که یک ارجاع به هدفی با تراز ناکافی متصل میشود، یا زمانی که متد یا سازندهای روی شیئی با تراز ناکافی فراخوانی میگردد، فعال میکند.
- -fsanitize=object-size
- این گزینه ابزار دقیقسازی ارجاعات حافظه را با استفاده از تابع "__builtin_dynamic_object_size" فعال میکند. دسترسیهای گوناگونِ خارج از محدوده اشارهگر تشخیص داده میشوند.
- -fsanitize=float-divide-by-zero
- تقسیم ممیز شناور بر صفر را تشخیص میدهد. برخلاف سایر گزینههای مشابه، -fsanitize=float-divide-by-zero توسط -fsanitize=undefined فعال نمیشود، زیرا تقسیم ممیز شناور بر صفر میتواند روشی مجاز برای بهدست آوردن بینهایتها (infinities) و NaNها باشد.
- -fsanitize=float-cast-overflow
- این گزینه بررسی تبدیل نوع ممیز شناور به عدد صحیح را فعال میکند. بررسی میشود که نتیجه تبدیل سرریز نکند. برخلاف گزینههای مشابه دیگر، -fsanitize=float-cast-overflow توسط -fsanitize=undefined فعال نمیشود. این گزینه با فعال بودن استثناهای "FE_INVALID" بهخوبی کار نمیکند.
- -fsanitize=nonnull-attribute
- این گزینه ابزار دقیقسازی فراخوانیها را فعال میکند، و بررسی میکند که مقادیر null به آرگومانهایی که با مشخصه تابع "nonnull" به عنوان نیازمند مقدار غیر null علامتگذاری شدهاند، پاس داده نشوند.
- -fsanitize=returns-nonnull-attribute
- این گزینه ابزار دقیقسازی عبارات return را در توابعی که با مشخصه تابع "returns_nonnull" علامتگذاری شدهاند فعال میکند، تا بازگرداندن مقادیر null از چنین توابعی تشخیص داده شود.
- -fsanitize=bool
- این گزینه ابزار دقیقسازی بارگذاریها از نوع bool را فعال میکند. اگر مقداری غیر از 0 یا 1 بارگذاری شود، یک خطای زمان اجرا صادر میگردد.
- -fsanitize=enum
- این گزینه ابزار دقیقسازی بارگذاریها از یک نوع enum را فعال میکند. اگر مقداری خارج از محدوده مقادیر معتبر نوع enum بارگذاری شود، یک خطای زمان اجرا صادر میگردد.
- -fsanitize=vptr
- این گزینه ابزار دقیقسازی فراخوانی توابع عضو ++C، دسترسیهای به عضو و برخی تبدیلها میان اشارهگرهای کلاسهای پایه و مشتقشده را فعال میکند، تا بررسی شود که شیء ارجاعشده دارای نوع پویای (dynamic type) صحیحی است..IP -fsanitize=pointer-overflow 4 این گزینه ابزارگذاری محاسبات اشارهگر را فعال میکند. اگر در محاسبات اشارهگر سرریزی رخ دهد، یک خطای زمان اجرا صادر میشود.
- -fsanitize=builtin
- این گزینه ابزارگذاری آرگومانهای توابع توکار (builtin) منتخب را فعال میکند. اگر مقدار نامعتبری به چنین آرگومانهایی ارسال شود، یک خطای زمان اجرا صادر میشود. برای نمونه ارسال مقدار 0 بهعنوان آرگومان به "__builtin_ctz" یا "__builtin_clz" رفتار تعریفنشده (undefined behavior) ایجاد میکند و توسط این گزینه تشخیص داده میشود.
توجه داشته باشید که سنیتایزرها تمایل دارند نرخ هشدارهای مثبت کاذب را افزایش دهند، بهویژه هشدارهای مربوط به -Wmaybe-uninitialized. توصیه میکنیم از ترکیب -Werror و [استفاده از] سنیتایزرها خودداری کنید.
در حالی که -ftrapv باعث صدور تلهها (traps) برای سرریزهای علامتدار میشود، -fsanitize=undefined یک پیام تشخیصی صادر میکند. این قابلیت در حال حاضر تنها برای خانواده زبانهای C کار میکند.
- -fno-sanitize=all
- این گزینه تمام سنیتایزرهایی را که پیشتر فعال شدهاند، غیرفعال میکند. گزینهٔ -fsanitize=all مجاز نیست، چرا که برخی از سنیتایزرها را نمیتوان همزمان با یکدیگر استفاده کرد.
- -fasan-shadow-offset=number
- این گزینه GCC را وادار میکند تا از آفست سایه (shadow offset) سفارشی در بررسیهای AddressSanitizer استفاده کند. این گزینه برای آزمایش طرحبندیهای مختلف حافظه سایه در Kernel AddressSanitizer کاربردی است.
- -fsanitize-sections=s1,s2,...
- متغیرهای سراسری را در بخشهای (sections) سفارشی انتخابشده پالایش میکند. si ممکن است شامل نویسههای عام (wildcards) باشد.
- -fsanitize-recover[=opts]
- گزینهٔ
-fsanitize-recover= حالت
بازیابی از
خطا را برای
سنیتایزرهای
ذکرشده در
فهرستِ
جداشده با
ویرگولِ opts
کنترل
میکند.
فعالسازی
این گزینه
برای یک جزء
سنیتایزر
سبب میشود
تا برنامه
تلاش کند به
اجرای خود
ادامه دهد،
گویی هیچ
خطایی رخ
نداده است.
این بدان
معناست که
در یک بار
اجرای
برنامه،
چندین خطای
زمان اجرا
میتوانند
گزارش
شوند، و کد
خروج
برنامه حتی
با وجود
گزارش
خطاها ممکن
است
نشاندهنده
موفقیت
باشد.
گزینهٔ
-fno-sanitize-recover=
میتواند
برای تغییر
این رفتار
استفاده
شود: فقط
نخستین
خطای
شناساییشده
گزارش
میشود و
سپس برنامه
با یک کد
خروج
غیرصفر
خارج
میگردد.
در حال حاضر این ویژگی فقط برای -fsanitize=undefined (و زیرگزینههای آن بهجز -fsanitize=unreachable و -fsanitize=return)، -fsanitize=float-cast-overflow، -fsanitize=float-divide-by-zero، -fsanitize=bounds-strict، -fsanitize=kernel-address و -fsanitize=address کار میکند. برای این سنیتایزرها بازیابی از خطا بهطور پیشفرض فعال است، بهجز -fsanitize=address که این ویژگی برای آن آزمایشی است. گزینههای -fsanitize-recover=all و -fno-sanitize-recover=all نیز پذیرفته میشوند؛ اولی بازیابی را برای همه سنیتایزرهای پشتیبانیکننده فعال میکند، و دومی بازیابی را برای تمام سنیتایزرهای پشتیبانیکننده غیرفعال میسازد.
حتی اگر حالت بازیابی در سمت کامپایلر فعال باشد، باید در سمت کتابخانه زمان اجرا نیز فعال شده باشد، در غیر این صورت شکستها همچنان مهلک (fatal) خواهند بود. پیشفرض کتابخانه زمان اجرا برای ThreadSanitizer و UndefinedBehaviorSanitizer برابر با "halt_on_error=0" است، در حالی که مقدار پیشفرض برای AddressSanitizer برابر با "halt_on_error=1" میباشد. این مقدار را میتوان با تنظیم پرچم "halt_on_error" در متغیر محیطی متناظر بازنویسی کرد.
نحو بدون پارامتر صریح opts منسوخ شده است. این معادل مشخص کردن فهرستی از opts به این صورت است:
undefined,float-cast-overflow,float-divide-by-zero,bounds-strict
- -fsanitize-address-use-after-scope
- پالایش متغیرهای محلی را برای تشخیص باگهای استفاده پس از پایان حوزه (use-after-scope) فعال میکند. این گزینه -fstack-reuse را روی none تنظیم میکند.
- -fsanitize-trap[=opts]
- گزینهٔ -fsanitize-trap=
به
کامپایلر
دستور
میدهد تا
برای
سنیتایزرهای
ذکرشده در
فهرست
جداشده با
ویرگولِ
opts، رفتار
تعریفنشده
را به جای
یک روال
کتابخانهٔ
"libubsan"، با
استفاده از
"__builtin_trap"
گزارش کند.
اگر این
گزینه برای
سنیتایزر
خاصی فعال
باشد، بر
-fsanitizer-recover= برای
آن
سنیتایزر
اولویت
دارد؛
"__builtin_trap"
تولید
خواهد شد و
صرفنظر از
اینکه
بازیابی با
-fsanitize-recover= فعال
یا غیرفعال
باشد، مهلک
خواهد بود.
مزیت این روش آن است که به کتابخانهٔ "libubsan" نیازی نیست و پیوند داده نمیشود، بنابراین حتی در محیطهای مستقل (freestanding) نیز قابل استفاده است.
در حال حاضر این ویژگی با -fsanitize=undefined (و زیرگزینههای آن بهجز -fsanitize=vptr)، -fsanitize=float-cast-overflow، -fsanitize=float-divide-by-zero و -fsanitize=bounds-strict کار میکند. مقدار "-fsanitize-trap=all" را نیز میتوان مشخص کرد، که آن را برای زیرگزینههای "undefined"، -fsanitize=float-cast-overflow، -fsanitize=float-divide-by-zero و -fsanitize=bounds-strict فعال میکند. اگر "-fsanitize-trap=undefined" یا "-fsanitize-trap=all" استفاده شود و "-fsanitize=vptr" در خط فرمان فعال باشد، ابزارگذاری در سکوت نادیده گرفته میشود چرا که این ابزارگذاری همواره به پشتیبانی "libubsan" نیاز دارد؛ گزینهٔ -fsanitize-trap=vptr مجاز نیست.
- -fsanitize-undefined-trap-on-error
- گزینهٔ -fsanitize-undefined-trap-on-error معادلِ منسوخشدهٔ -fsanitize-trap=all است.
- -fsanitize-coverage=trace-pc
- ابزارگذاری کد برای آزمون تصادفی هدایتشده با پوشش (coverage-guided fuzzing) را فعال میکند. یک فراخوانی به "__sanitizer_cov_trace_pc" را درون هر بلوک پایه درج میکند.
- -fsanitize-coverage=trace-cmp
- ابزارگذاری کد برای آزمون تصادفی هدایتشده با جریان داده (dataflow guided fuzzing) را فعال میکند. یک فراخوانی به "__sanitizer_cov_trace_cmp1"، "__sanitizer_cov_trace_cmp2"، "__sanitizer_cov_trace_cmp4" یا "__sanitizer_cov_trace_cmp8" برای مقایسهٔ اعداد صحیح با هر دو عملوند متغیر؛ یا "__sanitizer_cov_trace_const_cmp1"، "__sanitizer_cov_trace_const_cmp2"، "__sanitizer_cov_trace_const_cmp4" یا "__sanitizer_cov_trace_const_cmp8" برای مقایسهٔ اعداد صحیح با یک عملوند ثابت؛ "__sanitizer_cov_trace_cmpf" یا "__sanitizer_cov_trace_cmpd" برای مقایسههای float یا double؛ و "__sanitizer_cov_trace_switch" برای عبارتهای switch درج میکند.
- -fcf-protection=[full|branch|return|none|check]
- -fcf-protection
- ابزارگذاری
کد را برای
افزایش
امنیت
برنامه از
طریق بررسی
معتبر بودن
آدرسهای
مقصد
دستورالعملهای
انتقال
جریان
کنترل
(مانند
فراخوانی
غیرمستقیم
تابع،
بازگشت از
تابع، و پرش
غیرمستقیم)
فعال
میکند. این
کار مانع از
انحراف
جریان
کنترل به یک
مقصد
غیرمنتظره
میشود و
هدف آن
محافظت در
برابر
تهدیداتی
چون
برنامهنویسی
مبتنی بر
بازگشت (ROP) و
بهطور
مشابه
برنامهنویسی
مبتنی بر call/jmp
(یا همان COP/JOP)
است.
کلمات کلیدی -fcf-protection= به صورت زیر تفسیر میشوند.
مقدار "branch" به کامپایلر دستور میدهد تا بررسی اعتبار انتقال جریان کنترل را در نقطهٔ دستورالعملهای انشعاب غیرمستقیم، یعنی دستورالعملهای call/jmp پیادهسازی کند.
مقدار "return" بررسی اعتبار را در نقطهٔ بازگشت از یک تابع پیادهسازی میکند.
مقدار "full" نام مستعاری برای مشخص کردن همزمان هر دو مقدار "branch" و "return" است.
مقدار "check" برای پیوند نهایی به همراه بهینهسازی زمان پیوند (LTO) استفاده میشود. اگر فایلهای شیء LTO با مقادیر مختلف -fcf-protection کامپایل شده باشند، یک خطا صادر میشود. مقدار "check" در زمان کامپایل نادیده گرفته میشود.
مقدار "none" ابزارگذاری را غیرفعال میکند.
گزینهٔ -fcf-protection نام مستعاری برای -fcf-protection=full است. برای لغو و بازنویسی گزینهٔ قبلی -fcf-protection در خط فرمان، ابتدا -fcf-protection=none و سپس -fcf-protection=kind را اضافه کنید.
ماکروی "__CET__" هنگامی که -fcf-protection استفاده میشود تعریف میگردد. بیت اول "__CET__" برای مقدار "branch" روی 1 تنظیم میشود و بیت دوم "__CET__" برای مقدار "return" روی 1 تنظیم میگردد.
همچنین میتوانید از مشخصهٔ "nocf_check" برای تعیین توابع و فراخوانیهایی که باید از ابزارگذاری مستثنی شوند، استفاده کنید.
در حال حاضر مقصد x86 GNU/Linux پیادهسازی مبتنی بر Intel Control-flow Enforcement Technology (CET) را ارائه میدهد که برای پردازندههای i686 یا جدیدتر کار میکند.
- -fharden-compares
- برای هر آزمون منطقی که از بهینهسازیهای gimple باقی میماند و شرطی در یک انشعاب شرطی نیست (برای نمونه، شرطهای بررسیشده برای جابهجاییهای شرطی، یا برای ذخیره در متغیرهای دودویی/بولی)، کد اضافهای برای محاسبه و راستیآزمایی شرط معکوس صادر میکند، و در صورت عدم تطابق نتایج، "__builtin_trap" را فراخوانی مینماید. برای پوشش تمام عبارات شرطی، همراه با -fharden-conditional-branches استفاده شود..IP -fharden-conditional-branches 4 برای هر شاخه شرطی غیربرداری که از بهینهسازیهای gimple باقی میماند، کد اضافی برای محاسبه و اعتبارسنجی شرط معکوس درج میکند، و اگر نتیجه غیرمنتظره باشد، "__builtin_trap" را فراخوانی میکند. برای پوشش تمام عبارات شرطی، همراه با -fharden-compares استفاده کنید.
- -fharden-control-flow-redundancy
- کد اضافی
برای تنظیم
مقادیر
بولی هنگام
ورود به
بلوکهای
پایه، و
بررسی و
تلهگذاری
(trap) در
خروجیهای
تابع در
صورتی که
مقادیر
بولی مسیر
اجرایی
سازگاری با
گراف جریان
کنترل
تشکیل
ندهند،
تولید
میکند.
اعتبارسنجی قبل از بازگشتها، قبل از فراخوانیهای پایانی اجباری (زیر را ببینید) و به صورت اختیاری، قبل از خروج استثناها با -fhardcfr-check-exceptions، قبل از فراخوانیهای بازگشتی با -fhardcfr-check-returning-calls و قبل از فراخوانیهای noreturn با -fhardcfr-check-noreturn-calls انجام میشود. گزینههای تنظیم --param hardcfr-max-blocks و --param hardcfr-max-inline-blocks در دسترس هستند.
بهینهسازی فراخوانی پایانی بسیار دیر رخ میدهد و نمیتواند بر افزونگی جریان کنترل اثر بگذارد، اما فراخوانیهایی که توسط فرانتاند زبان به عنوان فراخوانی پایانی اجباری نشانهگذاری شدهاند، و هر فراخوانی که به اندازه کافی زود به عنوان فراخوانی پایانی بالقوه مشخص شده باشد نیز اعتبارسنجی را پیش از فراخوانی صادر خواهند کرد؛ البته این احتمالات صرفاً جنبه نظری دارند، چرا که این شرایط تنها هنگام استفاده از پلاگینهای سفارشی کامپایلر ممکن است برآورده شوند.
- -fhardcfr-skip-leaf
- غیرفعال کردن -fharden-control-flow-redundancy در توابع برگی (leaf functions).
- -fhardcfr-check-exceptions
- هنگامی که -fharden-control-flow-redundancy فعال باشد، مسیر اجرای ثبتشده را در نقاط فرار استثنا در برابر گراف جریان کنترل بررسی میکند؛ گویی بدنه تابع درون یک گرداننده پاکسازی (cleanup handler) قرار گرفته که بررسی را انجام داده و استثنا را مجدداً پرتاب کرده است. این گزینه بهطور پیشفرض فعال است؛ برای غیرفعال کردن آن از -fno-hardcfr-check-exceptions استفاده کنید.
- -fhardcfr-check-returning-calls
- هنگامی که
-fharden-control-flow-redundancy فعال
باشد، مسیر
اجرای
ثبتشده را
در برابر
گراف جریان
کنترل، قبل
از هر
فراخوانی
تابعی که
بلافاصله
با بازگشت
نتیجهاش
(در صورت
وجود) دنبال
میشود،
بررسی
میکند تا
مانع
بهینهسازی
فراخوانی
پایانی
نشود،
صرفنظر از
اینکه در
نهایت به
فراخوانی
پایانی
بهینهسازی
شود یا خیر.
این گزینه بهطور پیشفرض در هر زمانی که بهینهسازیهای فراخوانی همزاد (sibling call) فعال باشند فعال است (گزینه -foptimize-sibling-calls را ببینید)، اما میتوان آن را صراحتاً، مستقل از بهینهسازیها، فعال (یا با شکل نفیشدهاش، غیرفعال) کرد.
- -fhardcfr-check-noreturn-calls=[always|no-xthrow|nothrow|never]
- هنگامی که
-fharden-control-flow-redundancy فعال
باشد، مسیر
اجرای
ثبتشده را
در برابر
گراف جریان
کنترل قبل
از
فراخوانیهای
"noreturn"
بررسی
میکند؛ یا
برای همه
آنها (always)،
یا مواردی
که انتظار
نمیرود
کنترل را از
طریق
استثنا به
فراخواننده
بازگردانند
(no-xthrow،
پیشفرض)،
یا مواردی
که ممکن است
کنترل را از
طریق
استثنا نیز
به
فراخواننده
بازنگردانند
(nothrow)، یا
هیچیک از
آنها (never).
بررسی پیش از یک تابع "noreturn" که ممکن است کنترل را از طریق استثنا به فراخواننده بازگرداند، در صورتی که استثنا در فراخواننده گرفته شود (چه با گرداننده یا با پاکسازی)، ممکن است باعث بیش از یک بار انجام شدن بررسی شود. هنگامی که -fhardcfr-check-exceptions نیز فعال باشد، کامپایلر از پیوند دادن فراخوانی "noreturn" با گرداننده پاکسازی افزودهشده به صورت ضمنی خودداری میکند، زیرا با بررسی انجامشده قبل از فراخوانی افزونه و زائد خواهد بود؛ اما گردانندهها یا پاکسازیهای دیگر در تابع، در صورت فعال شدن، مسیر اجرای ثبتشده را تغییر داده و با رسیدن به نقطه بازرسی دیگر مجدداً آن را بررسی میکنند. این نقطه بازرسی حتی ممکن است فراخوانی "noreturn" دیگری باشد، بنابراین بررسی ممکن است چند باره انجام شود.
بهینهسازهای گوناگون ممکن است سبب شوند فراخوانیها، حتی در صورت نبود ویژگیهای متناظر، با "noreturn" و/یا "nothrow" نشانهگذاری شوند، که این امر میتواند بر جایگذاری بررسیها پیش از فراخوانی و افزودن گردانندههای پاکسازی ضمنی برای آنها اثر بگذارد. این غیرقابلپیشبینی بودن، در کنار این واقعیت که پرتاب و پرتاب مجدد مکرر استثناها عملاً به مثابه فراخوانی ضمنی توابع "noreturn" است، no-xthrow را به مقدار پیشفرض این گزینه تبدیل کرده است: این گزینه از سازوکار "noreturn" تنها توابع داخلی مربوط به پرتاب (مجدد) استثناها را که تحت تأثیر این بهینهسازیها نیستند مستثنی میکند.
- -fhardened
- مجموعهای
از پرچمها
را برای C و C++
فعال
میکند که
امنیت کد
تولیدشده
را بدون
تأثیر بر ABI
آن ارتقا
میدهند.
پرچمهای
مشخصاً
فعالشده
ممکن است
بین
نسخههای
اصلی GCC
تغییر
کنند، اما
در حال حاضر
عبارتند از:
-D_FORTIFY_SOURCE=3 -D_GLIBCXX_ASSERTIONS -ftrivial-auto-var-init=zero -fPIE -pie -Wl,-z,relro,-z,now -fstack-protector-strong -fstack-clash-protection -fcf-protection=full (تنها در x86 GNU/Linux)
فهرست گزینههای فعالشده به دست -fhardened را میتوان با استفاده از گزینه --help=hardened به دست آورد.
هنگامی که glibc سیستم قدیمیتر از نسخه 2.35 باشد، بهجای آن از -D_FORTIFY_SOURCE=2 استفاده میشود.
این گزینه برای استفاده در ساختهای توزیع نهایی (production) در نظر گرفته شده است، نه صرفاً در ساختهای اشکالزدایی (debug).
در حال حاضر، -fhardened تنها بر روی مقصدهای GNU/Linux پشتیبانی میشود.
-fhardened تنها گزینهای را فعال میکند که پیشتر در خط فرمان تعیین نشده باشد. برای نمونه، -fhardened -fstack-protector فقط -fstack-protector را فعال خواهد کرد، نه -fstack-protector-strong را.
- -fstack-protector
- کد اضافی برای بررسی سرریزهای بافر، مانند حملات تخریب پشته (stack smashing) صادر میکند. این عمل با افزودن یک متغیر نگهبان (guard variable) به توابعی با اشیاء آسیبپذیر انجام میپذیرد. این توابع شامل مواردی هستند که "alloca" را فرامیخوانند، و توابعی با بافرهای بزرگتر یا مساوی ۸ بایت. متغیرهای نگهبان هنگام ورود به تابع مقداردهی اولیه شده و هنگام خروج از آن بررسی میشوند. اگر بررسی نگهبان ناموفق باشد، پیامی چاپ شده و برنامه خاتمه مییابد. تنها متغیرهایی در نظر گرفته میشوند که واقعاً بر روی پشته تخصیص یافته باشند؛ متغیرهای حذفشده از طریق بهینهسازی یا متغیرهای تخصیصیافته در ثباتها به حساب نمیآیند.
- -fstack-protector-all
- مشابه -fstack-protector، با این تفاوت که تمام توابع محافظت میشوند.
- -fstack-protector-strong
- مشابه -fstack-protector، اما توابع بیشتری را برای محافظت دربرمیگیرد --- توابعی که دارای تعاریف آرایه محلی هستند، یا ارجاعاتی به آدرسهای فریم محلی دارند. تنها متغیرهایی که واقعاً روی پشته تخصیص یافتهاند در نظر گرفته میشوند؛ متغیرهای بهینهسازیشده یا متغیرهای تخصیصیافته در ثباتها محاسبه نمیشوند.
- -fstack-protector-explicit
- مشابه -fstack-protector، اما تنها از توابعی محافظت میکند که ویژگی "stack_protect" را دارند.
- -fstack-check
- کدی برای
حصول
اطمینان از
فراتر
نرفتن از
مرز پشته
تولید
میکند. در
صورتی که در
محیطی با
چندین رشته
(multithreaded) اجرا
میشوید،
باید این
پرچم را
تعیین
کنید؛ اما
در یک محیط
تکرشتهای
به ندرت به
مشخص کردن
آن نیاز
خواهید
داشت، چرا
که سرریز
پشته در
صورت وجود
تنها یک
پشته
تقریباً در
تمامی
سیستمها
به صورت
خودکار
شناسایی
میشود.
توجه داشته باشید که این سوییچ در عمل باعث انجام بررسی نمیشود؛ سیستمعامل یا زماناجرای (runtime) زبان باید این کار را انجام دهد. این سوییچ کدی تولید میکند تا اطمینان یابد که آنها گسترش پشته را میبینند.
میتوانید علاوه بر این یک پارامتر رشتهای نیز مشخص کنید: no به معنای عدم بررسی، generic به معنای اجبار به استفاده از بررسی سبک قدیمی، و specific به معنای استفاده از بهترین شیوه بررسی و معادل استفاده از -fstack-check خالی است.
بررسی سبک قدیمی سازوکاری عمومی است که نیازی به پشتیبانی مقصد خاصی در کامپایلر ندارد، اما معایب زیر را به همراه دارد:
- 1.
- راهبرد تخصیص تغییریافته برای اشیاء بزرگ: در صورتی که اندازه آنها از یک آستانه ثابت فراتر رود، همواره به صورت پویا تخصیص مییابند. توجه داشته باشید که این امر ممکن است معناشناسی برخی کدها را تغییر دهد.
- 2.
- محدودیت ثابت در اندازه فریم ایستای توابع: وقتی فریم تابعی خاص از این حد فراتر رود، بررسی پشته دیگر قابل اعتماد نیست و هشداری توسط کامپایلر صادر میشود.
- 3.
- ناکارآمدی: هم به دلیل راهبرد تخصیص تغییریافته و هم به دلیل پیادهسازی عمومی، کارایی کد دچار افت میشود.
توجه داشته باشید که بررسی سبک قدیمی پشته، در صورتی که هیچ پشتیبانی مقصدی در کامپایلر تعریف نشده باشد، به عنوان روش پشتیبان (fallback) برای specific عمل میکند.
-fstack-check= برای برآوردن نیازهای زبان Ada جهت تشخیص بازگشتهای بینهایت و سرریزهای پشته طراحی شده است. گزینه specific انتخابی عالی هنگام کامپایل کدهای Ada به شمار میرود. این گزینه عموماً برای محافظت در برابر حملات stack-clash کافی نیست. جهت محافظت در برابر این دسته از حملات، باید از -fstack-clash-protection استفاده کنید.
- -fstack-clash-protection
- کدی برای
پیشگیری از
حملات سبک
برخورد
پشته (stack clash)
تولید
میکند. با
فعالسازی
این گزینه،
کامپایلر
در هر لحظه
تنها یک
صفحه از
فضای پشته
را تخصیص
میدهد و هر
صفحه
بلافاصله
پس از تخصیص
مورد
دسترسی
قرار
میگیرد. در
نتیجه، از
پرش
تخصیصها
روی هرگونه
صفحه محافظ
پشته (guard page)
ارائهشده
از سوی
سیستمعامل
جلوگیری
میشود.
بیشتر مقصدهای کامپایل از حفاظت در برابر برخورد پشته به طور کامل پشتیبانی نمیکنند. با این حال، در این مقاصد نیز -fstack-clash-protection از تخصیصهای پویای پشته محافظت خواهد کرد. همچنین در صورتی که مقصد از -fstack-check=specific پشتیبانی کند، -fstack-clash-protection ممکن است حفاظت محدودی برای تخصیصهای ایستای پشته نیز ارائه دهد..IP -fstack-limit-register=reg 4
- -fstack-limit-symbol=sym
- -fno-stack-limit
- کدی تولید
میکند تا
اطمینان
حاصل شود
پشته فراتر
از یک مقدار
معین، خواه
مقدار یک
ثبات باشد
یا نشانی یک
نماد، رشد
نکند. اگر
به پشتهٔ
بزرگتری
نیاز باشد،
یک سیگنال
در زمان
اجرا
برانگیخته
میشود.
برای بیشتر
معماریهای
هدف، این
سیگنال پیش
از تجاوز
پشته از مرز
ارسال
میشود؛
بنابراین
امکان
گرفتن
سیگنال
بدون اتخاذ
تمهیدات
ویژه وجود
دارد.
به عنوان مثال، اگر پشته از نشانی مطلق 0x80000000 آغاز شده و رو به پایین رشد کند، میتوانید از پرچمهای -fstack-limit-symbol=__stack_limit و -Wl,--defsym,__stack_limit=0x7ffe0000 برای اعمال محدودیت پشتهٔ ۱۲۸ کیلوبایتی استفاده کنید. توجه داشته باشید که این کار ممکن است تنها با پیونددهنده گنو (GNU linker) کار کند.
میتوانید بررسی محدودیت پشته را بهطور محلی با استفاده از مشخصهٔ تابع "no_stack_limit" نادیده بگیرید.
- -fsplit-stack
- کدی تولید
میکند تا
پیش از
سرریز شدن،
پشته را
بهطور
خودکار
تقسیم کند.
برنامهٔ
حاصل دارای
پشتهای
ناپیوسته
خواهد بود
که تنها در
صورتی ممکن
است سرریز
شود که
برنامه
دیگر قادر
به تخصیص
حافظه
نباشد. این
گزینه
هنگام
اجرای
برنامههای
چندنخی (threaded)
بسیار مفید
است، زیرا
دیگر نیازی
به محاسبه
اندازهٔ
مناسب پشته
برای هر نخ
نخواهد بود.
این قابلیت
در حال حاضر
تنها برای
معماریهای
x86 که
گنو/لینوکس
را اجرا
میکنند
پیادهسازی
شده است.
هنگامی که کد کامپایلشده با -fsplit-stack کدی را فراخوانی میکند که بدون -fsplit-stack کامپایل شده است، ممکن است فضای پشتهٔ چندانی برای اجرای کد دوم در دسترس نباشد. اگر کامپایل تمام کدها، از جمله کد کتابخانهها، با -fsplit-stack مقدور نباشد، پیونددهنده میتواند این فراخوانیها را بهگونهای اصلاح کند تا کدی که بدون -fsplit-stack کامپایل شده همواره پشتهٔ بزرگی در اختیار داشته باشد. پشتیبانی از این قابلیت در پیونددهنده gold در نسخه 2.21 و نسخههای بعدی GNU binutils پیادهسازی شده است.
- -fstrub=disable
- پاکسازی پشته (stack scrubbing) را بهطور کامل غیرفعال کرده و هرگونه مشخصهٔ "strub" را نادیده میگیرد. ببینید:
- -fstrub=strict
- توابع بهطور پیشفرض در حالت "disabled" برای "strub" قرار میگیرند، و این محدودیت را بهطور سختگیرانه اعمال میکند که تنها توابع مرتبط با حالتهای "callable" در "strub" (شامل "at-calls"، "callable" و "always_inline" "internal") توسط توابعی با حالتهای فعالشدهٔ "strub" ("at-calls" و "internal") فراخوانیپذیر ("callable") باشند.
- -fstrub=relaxed
- تنظیمات پیشفرض پاکسازی پشته ("strub") را بازمیگرداند؛ بدین معنا که "strub" تنها در صورتی فعال میشود که توسط مشخصههای "strub" مرتبط با توابع و انواع داده درخواست شده باشد. حالت آسانگیر ("Relaxed") بدان معناست که بافتهای strub تنها از فراخوانی توابعی بازداشته میشوند که صریحاً با حالت "strub" از نوع "disabled" مرتبط شدهاند. این گزینه تنها برای بازنویسی و بیاثر کردن سایر گزینههای -fstrub=* که پیش از آن در خط فرمان آمدهاند مفید است.
- -fstrub=at-calls
- حالت "at-calls" را برای "strub" در صورت امکانپذیر بودن فعال میکند. کاربرد اصلی این گزینه برای آزمایش است. این گزینه سازوکار "strub" را در سناریوهایی که کاملاً محلی در یک واحد ترجمه (translation unit) هستند به کار میگیرد. این حالت "strub" رابطهای توابع را تغییر میدهد، بنابراین هر تابعی که برای سایر واحدهای ترجمه مرئی باشد، یا نشانی آن گرفته شده باشد، تحت تأثیر این گزینه قرار نخواهد گرفت. گزینههای بهینهسازی نیز ممکن است بر امکانپذیری تأثیر بگذارند. برای جزئیات مربوط به نیازمندیهای امکانپذیری و شرایط لازم، به مستندات مشخصهٔ "strub" مراجعه کنید.
- -fstrub=internal
- حالت "internal" را برای "strub" در صورت امکانپذیر بودن فعال میکند. کاربرد اصلی این گزینه برای آزمایش است. هدف این گزینه آزمودن دقیق بخشهایی از سازوکار "strub" است که حالت کمبازدهتر اما حفظکنندهٔ رابط (interface-preserving) "strub" را پیادهسازی میکنند. توابعی که تحت تأثیر این گزینه قرار نگیرند بسیار نادر هستند.
- -fstrub=all
- یکی از حالتهای "strub" را در صورت امکانپذیر بودن فعال میکند. هنگامی که هر دو حالت strub امکانپذیر باشند، "at-calls" ترجیح داده میشود. گزینهٔ -fdump-ipa-strubm مشخصههای تابعی را اضافه میکند که مشخص میسازد کدام حالت برای هر تابع انتخاب شده است. کاربرد اصلی این گزینه برای مقاصد آزمایشی و ارزیابی همهجانبهٔ سازوکار "strub" است.
- -fvtable-verify=[std|preinit|none]
- این گزینه
تنها هنگام
کامپایل کد
++C در دسترس
است. این
گزینه
ویژگی
امنیتیای
را فعال (یا
با استفاده
از -fvtable-verify=none
غیرفعال)
میکند که
در زمان
اجرا، برای
هر
فراخوانی
مجازی (virtual call)،
بررسی
میکند
اشارهگر vtable
که
فراخوانی
از طریق آن
انجام
میشود
برای نوع
شیء معتبر
بوده و
دستکاری یا
بازنویسی
نشده باشد.
اگر یک
اشارهگر vtable
نامعتبر در
زمان اجرا
شناسایی
شود، خطایی
گزارش شده و
اجرای
برنامه
بلافاصله
متوقف
میشود.
این گزینه باعث میشود که ساختارهای دادهٔ زمان اجرا در هنگام شروع برنامه ساخته شوند، که برای اعتبارسنجی اشارهگرهای vtable استفاده میشوند. گزینههای std و preinit زمان ساخته شدن این ساختارهای داده را کنترل میکنند. در هر دو حالت، ساختارهای داده پیش از رسیدن اجرا به "main" ساخته میشوند. استفاده از -fvtable-verify=std باعث میشود ساختارهای داده پس از بارگذاری و مقداردهی اولیهٔ کتابخانههای مشترک ساخته شوند. -fvtable-verify=preinit باعث میشود آنها پیش از بارگذاری و مقداردهی اولیهٔ کتابخانههای مشترک ساخته شوند.
اگر این گزینه چندین بار در خط فرمان با مقادیر متفاوتی مشخص شود، none بالاترین اولویت را نسبت به هر دو مقدار std و preinit دارد؛ و preinit بر std اولویت خواهد داشت.
- -fvtv-debug
- هنگامی که
همراه با
-fvtable-verify=std یا -fvtable-verify=preinit
استفاده
شود، باعث
فراخوانی
نسخههای
اشکالزدایی
توابع زمان
اجرا برای
قابلیت
اعتبارسنجی
vtable میشود.
این پرچم
همچنین
باعث
میشود
کامپایلر
اطلاعات
مربوط به
اشارهگرهای
vtable کشفشده
برای هر
کلاس را ثبت
کند. این
اطلاعات در
فایلی به
نام vtv_set_ptr_data.log در
دایرکتوری
مشخصشده
توسط متغیر
محیطی VTV_LOGS_DIR
(در صورت
تعریف شدن)
یا در غیر
این صورت در
دایرکتوری
کاری فعلی
نوشته
میشود.
نکته: این ویژگی دادهها را به فایل گزارش الحاق میکند (append). اگر به یک فایل گزارش تازه نیاز دارید، حتماً فایلهای موجود را حذف کنید.
- -fvtv-counts
- این یک پرچم
اشکالزدایی
است. هنگامی
که همراه با
-fvtable-verify=std یا -fvtable-verify=preinit
استفاده
شود، باعث
میشود
کامپایلر
تعداد کل
فراخوانیهای
مجازی که با
آنها
مواجه
میشود و
تعداد
اعتبارسنجیهایی
را که درج
میکند
پیگیری کند.
همچنین
تعداد
فراخوانیهای
توابع خاص
کتابخانه
زمان اجرا
را که درج
میکند
میشمارد و
این
اطلاعات را
برای هر
واحد
کامپایل
ثبت میکند.
کامپایلر
این
اطلاعات را
در فایلی به
نام vtv_count_data.log در
دایرکتوری
مشخصشده
توسط متغیر
محیطی VTV_LOGS_DIR
(در صورت
تعریف شدن)
یا در غیر
این صورت در
دایرکتوری
کاری فعلی
مینویسد.
این گزینه
همچنین
اندازهٔ
مجموعههای
اشارهگر vtable
را برای هر
کلاس شمارش
کرده و این
اطلاعات را
در vtv_class_set_sizes.log در
همان
دایرکتوری
ثبت میکند.
نکته: این ویژگی دادهها را به فایلهای گزارش الحاق میکند. برای داشتن فایلهای گزارش تازه، حتماً فایلهای موجود را حذف کنید.
- -finstrument-functions
- فراخوانیهای
سنجش کد (instrumentation)
را برای
ورود و خروج
به توابع
تولید
میکند.
دقیقاً پس
از ورود به
تابع و درست
پیش از خروج
از آن،
توابع
پروفایلسازی
زیر با
نشانی تابع
فعلی و محل
فراخوانی (call
site) آن
فراخوانی
میشوند.
(در برخی
پلتفرمها،
"__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);آرگومان اول، نشانی آغاز تابع فعلی است که میتوان دقیقاً آن را در جدول نمادها جستجو کرد.
این سنجش کد همچنین برای توابعی که بهصورت درونخطی (inline) در توابع دیگر گسترش یافتهاند نیز انجام میشود. فراخوانیهای پروفایلسازی از نظر مفهومی نشان میدهند که تابع درونخطی در چه نقطهای وارد و خارج شده است. این بدان معناست که نسخههای آدرسپذیر از چنین توابعی باید در دسترس باشند. اگر تمام استفادههای شما از یک تابع بهصورت درونخطی گسترش یابد، این امر ممکن است منجر به افزایش اندازهٔ کد شود. اگر در کد C خود از "extern inline" استفاده کنید، باید یک نسخهٔ آدرسپذیر از چنین توابعی ارائه شود. (در هر صورت معمولاً وضعیت همینگونه است، اما اگر خوششانس باشید و بهینهساز همیشه توابع را درونخطی گسترش دهد، ممکن است بدون ارائه نسخههای ایستا هم مشکلی پیش نیامده باشد.)
میتوان مشخصهٔ "no_instrument_function" را به یک تابع اختصاص داد که در این صورت این سنجش کد برای آن انجام نمیشود. این کار میتواند برای مثال برای توابع پروفایلسازی ذکرشده در بالا، روالهای وقفه با اولویت بالا، و هر تابعی که توابع پروفایلسازی را نمیتوان بهطور ایمن از درون آن فراخوانی کرد (احتمالاً گردانندههای سیگنال، در صورتی که روالهای پروفایلسازی خروجی تولید کرده یا حافظه تخصیص دهند)، استفاده شود.
- -finstrument-functions-once
- این گزینه
مشابه -finstrument-functions
است، اما
توابع
پروفایلسازی
تنها یک بار
برای هر
تابع
سنجیدهشده
فراخوانی
میشوند؛
بدین معنا
که اولین
تابع
پروفایلسازی
پس از
نخستین
ورود به
تابع
سنجیدهشده
فراخوانی
میشود و
دومین تابع
پروفایلسازی
پیش از خروج
متناظر با
این اولین
ورود،
فراخوانی
میشود.
تعریف «یکبار» ("once") برای هدف این گزینه کمی مبهم است زیرا پیادهسازی در برابر رقابت دادهای (data race) محافظت نشده است. در نتیجه، پیادهسازی تنها تضمین میکند که توابع پروفایلسازی حداقل یک بار برای هر فرآیند و حداکثر یک بار برای هر نخ فراخوانی شوند، اما این فراخوانیها همواره جفت هستند؛ بدین معنا که اگر نخی تابع اول را فراخوانی کند، تابع دوم را نیز فراخوانی خواهد کرد، مگر اینکه هرگز به نقطهٔ خروج از تابع سنجیدهشده نرسد..IP -finstrument-functions-exclude-file-list=file,file,... 4 فهرست توابعی را که از ابزارگذاری (instrumentation) مستثنی میشوند، تعیین میکند (توضیحات -finstrument-functions را ببینید). اگر فایلی که شامل تعریف یک تابع است با یکی از fileها مطابقت داشته باشد، آن تابع ابزارگذاری نمیشود. تطبیق بر روی زیررشتهها انجام میشود: اگر پارامتر file زیررشتهای از نام فایل باشد، تطابق در نظر گرفته میشود.
برای مثال:
-finstrument-functions-exclude-file-list=/bits/stl,include/sys
هر تابع درونخطی (inline) تعریفشده در فایلهایی را که مسیر آنها شامل /bits/stl یا include/sys باشد، مستثنی میکند.
اگر به هر دلیلی میخواهید نویسهٔ , را در یکی از symها بگنجانید، , را بنویسید. برای مثال، -finstrument-functions-exclude-file-list=',,tmp' (به علامت نقلقول تکی در اطراف گزینه دقت کنید).
- -finstrument-functions-exclude-function-list=sym,sym,...
- این گزینه مشابه -finstrument-functions-exclude-file-list است، اما فهرست نامهای توابعی را که باید از ابزارگذاری مستثنی شوند تعیین میکند. نام تابعی که باید تطبیق داده شود، نام قابل مشاهده برای کاربر است، مانند "vector<int> blah(const vector<int> &)"، نه نام درهمپیچیدهٔ داخلی (مانند "_Z4blahRSt6vectorIiSaIiEE"). تطبیق بر روی زیررشتهها انجام میشود: اگر پارامتر sym زیررشتهای از نام تابع باشد، تطابق در نظر گرفته میشود. برای شناسههای گسترشیافتهٔ C99 و C++، نام تابع باید در قالب UTF-8 ارائه شود، نه با استفاده از نامهای نویسهٔ فراگیر (universal character names).
- -fpatchable-function-entry=N[,M]
- تعداد N
دستور NOP را
درست در
ابتدای هر
تابع تولید
میکند،
بهطوری که
نقطهٔ ورود
تابع پیش از
Mاُمین NOP
قرار
میگیرد.
اگر M حذف
شود، مقدار
پیشفرض آن
0 خواهد
بود تا
نقطهٔ ورود
تابع
دقیقاً به
آدرس
نخستین NOP
اشاره کند.
دستورهای NOP
فضای
اضافهای
را رزرو
میکنند که
در صورت
قابل نوشتن
بودن قطعه
کد (code segment)،
میتواند
برای
وصلهزدن
هرگونه
ابزارگذاری
دلخواه در
زمان اجرا
استفاده
شود. مقدار
فضا بهطور
غیرمستقیم
از طریق
تعداد NOPها
قابل کنترل
است؛ دستور
NOP
استفادهشده
با دستور
تولیدشده
توسط رابط
باطنی
داخلی GCC به
نام "gen_nop"
مطابقت
دارد. این
رفتار مختص
مقصد (target-specific)
است و ممکن
است به
گونهٔ
معماری و/یا
سایر
گزینههای
کامپایل
نیز وابسته
باشد.
برای شناسایی در زمان اجرا، آدرسهای آغازین این ناحیهها که با ورودیهای توابع مربوطه منهای M مطابقت دارند، علاوه بر این در بخش "__patchable_function_entries" از باینری حاصل جمعآوری میشوند.
توجه داشته باشید که مقدار "__attribute__ ((patchable_function_entry (N,M)))" نسبت به گزینهٔ خط فرمان -fpatchable-function-entry=N,M اولویت دارد. از این ویژگی میتوان برای افزایش اندازهٔ ناحیه یا حذف کامل آن در یک تابع منفرد استفاده کرد. اگر "N=0" باشد، هیچ مکان لایهگذاری (pad location) ثبت نمیشود.
دستورهای NOP در آدرس ورود تابع - و شاید بسته به M پیش از آن - حتی قبل از پیشدرآمد (prologue) درج میشوند. در PowerPC با ELFv2 ABI، برای تابعی با نقاط ورود دوگانه، نقطهٔ ورود محلی بهطور پیشفرض همان آدرس ورود تابع است. برای تغییر این حالت، گزینهٔ -msplit-patch-nops را ببینید.
بیشینهٔ مقدار N و M برابر ۶۵۵۳۵ است. در PowerPC با ELFv2 ABI، برای تابعی با نقاط ورود دوگانه، مقادیر پشتیبانیشده برای M در صورت عدم استفاده از -msplit-patch-nops برابر ۰، ۲، ۶ و ۱۴ هستند.
گزینههای کنترل پیشپردازنده (Options Controlling the Preprocessor)
این گزینهها پیشپردازندهٔ C را که پیش از کامپایل واقعی روی هر فایل مبدأ C اجرا میشود، کنترل میکنند.
اگر از گزینهٔ -E استفاده کنید، هیچ کاری بهجز پیشپردازش انجام نمیشود. برخی از این گزینهها تنها در کنار -E معنا دارند، چرا که باعث میشوند خروجی پیشپردازنده برای کامپایل واقعی نامناسب باشد.
علاوه بر گزینههای فهرستشده در اینجا، تعدادی گزینه برای کنترل مسیرهای جستجوی فایلهای include وجود دارد که در بخش Directory Options مستند شدهاند. گزینههای کنترل هشدارهای پیشپردازنده در بخش Warning Options فهرست شدهاند.
- -D name
- نام name را بهعنوان یک ماکرو با تعریف 1 از پیش تعریف میکند.
- -D name=definition
- محتوای definition
نشانهگذاری
(tokenize) شده و
طوری
پردازش
میشود که
گویی در فاز
سوم ترجمه
در یک دستور
#define ظاهر شده
است.
بهویژه،
تعریف با
نویسههای
خطجدیدِ
تعبیهشده
بریده (truncate)
میشود.
اگر پیشپردازنده را از یک شل یا برنامهای شبیه شل فراخوانی میکنید، ممکن است لازم باشد از نحو نقلقول شل برای محافظت از نویسههایی مانند فاصله که در نحو شل معنای خاصی دارند، استفاده کنید.
اگر میخواهید یک ماکروی تابعگونه (function-like) را در خط فرمان تعریف کنید، فهرست آرگومانهای آن را درون پرانتز پیش از علامت مساوی (در صورت وجود) بنویسید. پرانتزها برای اکثر شلها دارای معنی هستند، بنابراین باید گزینه را نقلقول کنید. در sh و csh، ساختار -D'name(args...)=definition' کار میکند.
گزینههای -D و -U به ترتیبی که در خط فرمان داده شدهاند پردازش میشوند. تمام گزینههای -imacros file و -include file پس از همهٔ گزینههای -D و -U پردازش میشوند.
- -U name
- هرگونه تعریف پیشین از name را، چه توکار باشد و چه با گزینهٔ -D ارائه شده باشد، لغو میکند.
- -include file
- فایل file را
بهگونهای
پردازش
میکند که
گویی "#include
"file"" در
نخستین خط
فایل مبدأ
اصلی آمده
است. با این
حال،
نخستین
دایرکتوری
مورد جستجو
برای یافتن
file،
بهجای
دایرکتوری
حاوی فایل
مبدأ اصلی،
دایرکتوری
کاری
پیشپردازنده
است. اگر در
آنجا یافت
نشود، طبق
معمول در
ادامهٔ
زنجیرهٔ
جستجوی
"#include "...""
جستجو
میشود.
اگر چندین گزینهٔ -include داده شود، فایلها به همان ترتیبی که در خط فرمان آمدهاند گنجانده (include) میشوند.
- -imacros file
- دقیقاً
مانند -include
است، با این
تفاوت که هر
خروجی حاصل
از پویش file
دور ریخته
میشود.
ماکروهایی
که تعریف
میکند
همچنان
تعریفشده
باقی
میمانند.
این امر به
شما امکان
میدهد تا
تمام
ماکروهای
یک سرآیند
را بدون
پردازش
اعلانهای
آن به دست
آورید.
تمام فایلهای مشخصشده با -imacros پیش از همهٔ فایلهای مشخصشده با -include پردازش میشوند.
- -undef
- هیچیک از ماکروهای مخصوص سیستم یا مخصوص GCC را از پیش تعریف نمیکند. ماکروهای استانداردِ از پیش تعریفشده، همچنان تعریفشده باقی میمانند.
- -pthread
- ماکروهای اضافی مورد نیاز برای استفاده از کتابخانهٔ ریسههای پازیکس (POSIX threads) را تعریف میکند. باید از این گزینه بهطور پیوسته هم برای کامپایل و هم برای پیوند (linking) استفاده کنید. این گزینه در مقصدهای GNU/Linux، بیشتر مشتقات دیگر یونیکس و همچنین در مقصدهای Cygwin و MinGW برای معماری x86 پشتیبانی میشود.
- -M
- بهجای
خروجی دادن
نتیجهٔ
پیشپردازش،
قاعدهای
مناسب برای
make خروجی
میدهد که
وابستگیهای
فایل مبدأ
اصلی را
توصیف
میکند.
پیشپردازنده
یک قاعدهٔ
make شامل نام
فایل شیء (object file)
برای آن
فایل مبدأ،
یک دونقطه و
نام تمام
فایلهای
گنجاندهشده
(از جمله
مواردی که
از
گزینههای
خط فرمان -include
یا -imacros
میآیند)
تولید
میکند.
مگر اینکه صراحتاً (با -MT یا -MQ) مشخص شده باشد، نام فایل شیء متشکل از نام فایل مبدأ است که پسوند آن با پسوند فایل شیء جایگزین شده و هرگونه بخشهای دایرکتوری ابتدایی آن حذف شده است. اگر فایلهای گنجاندهشدهٔ زیادی وجود داشته باشد، قاعده با استفاده از \-خطجدید به چندین خط تقسیم میشود. این قاعده فاقد دستور اجرایی است.
این گزینه خروجی اشکالزدایی پیشپردازنده، مانند -dM را غیرفعال نمیکند. برای جلوگیری از تداخل چنین خروجی اشکالزدایی با قواعد وابستگی، باید فایل خروجی وابستگی را صراحتاً با -MF مشخص کنید، یا از یک متغیر محیطی مانند DEPENDENCIES_OUTPUT استفاده نمایید. خروجی اشکالزدایی همچنان طبق معمول به جریان خروجی عادی فرستاده میشود.
ارسال -M به درایور مستلزم -E است و با یک -w ضمنی، هشدارها را فرو مینشاند (غیرفعال میکند).
- -MM
- مانند -M
است، اما از
ذکر
فایلهای
سرآیندی که
در
دایرکتوریهای
سرآیند
سیستم یافت
میشوند و
نیز
فایلهای
سرآیندی که
بهطور
مستقیم یا
غیرمستقیم
از چنین
سرآیندی
گنجانده
شدهاند،
خودداری
میکند.
این بدان معناست که انتخاب قلابها (قوسکها) یا نقلقول دوتایی در یک دستور #include بهخودیخود تعیین نمیکند که آیا آن سرآیند در خروجی وابستگی -MM ظاهر میشود یا خیر.
- -MF file
- هنگامی که
همراه با -M
یا -MM
استفاده
شود، فایلی
را برای
نوشتن
وابستگیها
در آن مشخص
میکند. اگر
هیچ سوئیچ
-MF داده
نشود،
پیشپردازنده
قواعد را به
همان جایی
ارسال
میکند که
خروجی
پیشپردازششده
را ارسال
میکرد.
هنگامی که با گزینههای درایور -MD یا -MMD استفاده شود، -MF فایل پیشفرض خروجی وابستگی را بازنویسی (override) میکند.
اگر file برابر - باشد، وابستگیها در stdout نوشته میشوند..IP -MG 4 در ترکیب با گزینهای مانند -M که درخواست ایجاد وابستگی دارد، -MG فرض میکند فایلهای هدر یافتنشده، فایلهای تولیدشده هستند و آنها را بدون ایجاد خطا به فهرست وابستگیها اضافه میکند. نام فایل وابستگی مستقیماً از دستورالعمل "#include" بدون افزودن هیچ مسیری به ابتدای آن برداشته میشود. -MG همچنین خروجی پیشپردازششده را متوقف میکند، زیرا نبود یک فایل هدر آن را بیفایده میسازد.
این ویژگی در بهروزرسانی خودکار makefileها استفاده میشود.
- -Mno-modules
- غیرفعالسازی ایجاد وابستگی برای رابطهای ماژول کامپایلشده.
- -MP
- این گزینه
به CPP دستور
میدهد تا
برای هر
وابستگی
غیر از فایل
اصلی، یک
هدف ساختگی
(phony target) اضافه
کند که باعث
میشود هر
کدام به
هیچچیز
وابسته
نباشند. این
قواعد
ساختگی
خطاهایی را
دور
میزنند که
make در صورت
حذف
فایلهای
هدر بدون
بهروزرسانی
متناظر در
Makefile صادر
میکند.
این یک نمونه خروجی معمول است:
test.o: test.c test.h test.h:
- -MT target
- تغییر هدف
قاعدهای
که در ایجاد
وابستگی
تولید
میشود.
بهطور
پیشفرض CPP
نام فایل
ورودی اصلی
را
میگیرد،
هرگونه بخش
دایرکتوری
و پسوند
فایل مانند
.c را حذف
میکند، و
پسوند شیء (object)
معمول
پلتفرم را
الحاق
مینماید.
نتیجه، هدف
نهایی
خواهد بود.
گزینهٔ -MT هدف را دقیقاً همان رشتهای قرار میدهد که مشخص میکنید. اگر چندین هدف میخواهید، میتوانید آنها را بهعنوان یک آرگومان واحد به -MT بدهید، یا از چند گزینهٔ -MT استفاده کنید.
برای مثال، -MT '$(objpfx)foo.o' ممکن است چنین خروجی دهد:
$(objpfx)foo.o: foo.c
- -MQ target
- مشابه -MT
است، اما هر
نویسهای
را که برای Make
ویژه باشد
نقلقول (quote)
میکند.
-MQ '$(objpfx)foo.o' این
خروجی را
میدهد:
$$(objpfx)foo.o: foo.c
هدف پیشفرض بهطور خودکار نقلقول میشود، گویی با -MQ مشخص شده باشد.
- -MD
- گزینهٔ -MD
معادل -M -MF file
است، با این
تفاوت که -E
بهطور
ضمنی فعال
نمیشود.
گرداننده
بر این اساس
که آیا
گزینهٔ -o
داده شده
است یا خیر،
مقدار file را
تعیین
میکند. اگر
داده شده
باشد،
گرداننده
از آرگومان
آن اما با
پسوند .d
استفاده
میکند؛ در
غیر این
صورت نام
فایل ورودی
را گرفته،
مؤلفههای
دایرکتوری
و پسوند را
حذف کرده، و
پسوند .d را
اعمال
میکند.
اگر -MD در ترکیب با -E استفاده شود، هر سوییچ -o برای تعیین فایل خروجی وابستگی در نظر گرفته میشود، اما اگر بدون -E استفاده شود، هر -o به عنوان مشخصکنندهٔ فایل شیء هدف شناخته میشود.
از آنجا که -E ضمنی نیست، -MD میتواند برای تولید یک فایل خروجی وابستگی بهعنوان یک اثر جانبی از فرایند کامپایل استفاده شود.
- -MMD
- مانند -MD است، با این تفاوت که فقط فایلهای هدر کاربر را ذکر میکند، نه فایلهای هدر سیستم را.
- -fpreprocessed
- به
پیشپردازنده
اعلام
میکند که
فایل ورودی
قبلاً
پیشپردازش
شده است.
این گزینه
مواردی
مانند بسط
ماکروها،
تبدیل trigraph،
الحاق خطوط
جدید فرار
دادهشده،
و پردازش
اکثر
دستورالعملها
را متوقف
میکند.
پیشپردازنده
همچنان
توضیحها
(کامنتها)
را شناسایی
و حذف
میکند، به
طوری که
میتوانید
فایلی را که
با -C
پیشپردازش
شده است
بدون مشکل
به
کامپایلر
ارسال کنید.
در این
حالت،
پیشپردازندهٔ
یکپارچه
چیزی فراتر
از یک
توکنساز
(tokenizer) برای
بخشهای
جلویی (front ends)
نیست.
در صورتی که فایل ورودی یکی از پسوندهای .i، .ii یا .mi را داشته باشد، -fpreprocessed بهطور ضمنی فعال است. اینها همان پسوندهایی هستند که GCC برای فایلهای پیشپردازششده حاصل از -save-temps استفاده میکند.
- -fdirectives-only
- هنگام
پیشپردازش،
دستورالعملها
را پردازش
میکند،
اما
ماکروها را
بسط
نمیدهد.
رفتار این گزینه به گزینههای -E و -fpreprocessed بستگی دارد.
با -E، پیشپردازش به پردازش دستورالعملهایی مانند "#define"، "#ifdef" و "#error" محدود میشود. سایر عملیاتهای پیشپردازنده مانند بسط ماکرو و تبدیل trigraph انجام نمیشوند. علاوه بر این، گزینهٔ -dD بهطور ضمنی فعال میشود.
با -fpreprocessed، تعریف پیشفرض ماکروهای خط فرمان و اکثر ماکروهای توکار (builtin) غیرفعال میشود. ماکروهایی مانند "__LINE__" که وابسته به متن هستند، بهطور معمول پردازش میشوند. این امر کامپایل فایلهایی را ممکن میسازد که قبلاً با "-E -fdirectives-only" پیشپردازش شدهاند.
با فعال بودن هر دو گزینهٔ -E و -fpreprocessed، قواعد مربوط به -fpreprocessed اولویت دارند. این کار پیشپردازش کامل فایلهایی را فراهم میکند که پیشتر با "-E -fdirectives-only" پیشپردازش شدهاند.
- -fdollars-in-identifiers
- پذیرش $ در شناسهها.
- -fextended-identifiers
- پذیرش نامهای نویسهٔ فراگیر (universal character names) و نویسههای گسترشیافته در شناسهها. این گزینه بهطور پیشفرض برای C99 (و نسخههای بعدی استاندارد C) و ++C فعال است.
- -fno-canonical-system-headers
- هنگام پیشپردازش، مسیرهای هدر سیستم را با متعارفسازی (canonicalization) کوتاه نکن.
- -fmax-include-depth=depth
- تعیین حداکثر عمق دستورهای تو در توی #include. مقدار پیشفرض ۲۰۰ است.
- -fsearch-include-path[=kind]
- جستجوی
فایلهای
ورودی در
مسیر #include، نه
فقط در
دایرکتوری
جاری. این
بهویژه با
ماژولهای
C++20 کاربردی
است، که در
آنها هر دو
واحد هدر و
واحد رابط
ماژول باید
مستقیماً
کامپایل
شوند:
g++ -c -std=c++20 -fmodules -fsearch-include-path bits/stdc++.h bits/std.cc
مقدار پیشفرض kind برابر user است که مسیر جستجوی #include "..." را بررسی میکند؛ همچنین میتوانید برای مسیر جستجوی "#include <...>" صراحتاً system را مشخص کنید.
- -ftabstop=width
- تعیین فاصلهٔ بین ایستگاههای تب (tab stops). این امر به پیشپردازنده کمک میکند تا شماره ستونهای صحیح را در هشدارها یا خطاها گزارش کند، حتی اگر تبها در خط وجود داشته باشند. اگر مقدار کمتر از ۱ یا بیشتر از ۱۰۰ باشد، این گزینه نادیده گرفته میشود. مقدار پیشفرض ۸ است.
- -ftrack-macro-expansion[=level]
- ردیابی
مکانهای
توکنها در
طول
بسطهای
ماکرو. این
امر به
کامپایلر
اجازه
میدهد در
صورت بروز
خطای
کامپایل
درون یک بسط
ماکرو،
اطلاعات
تشخیصی
مربوط به
پشتهٔ فعلی
بسط ماکرو
را گزارش
کند.
استفاده از
این گزینه
باعث مصرف
حافظهٔ
بیشتر توسط
پیشپردازنده
و کامپایلر
میشود.
پارامتر level
میتواند
برای
انتخاب سطح
دقت ردیابی
مکان توکن
استفاده
شود و در
صورت نیاز
مصرف حافظه
را کاهش
دهد. مقدار
0 برای level
این گزینه
را غیرفعال
میکند.
مقدار 1
مکانهای
توکنها را
در حالتی
تقلیلیافته
برای
دستیابی به
کمترین
سربار
حافظه
ردیابی
میکند. در
این حالت،
تمام
توکنهای
حاصل از بسط
یک آرگومان
از یک
ماکروی
شبهتابع
دارای مکان
یکسانی
هستند.
مقدار 2
مکانهای
توکنها را
بهطور
کامل
ردیابی
میکند. این
مقدار
بیشترین
مصرف حافظه
را دارد.
هنگامی که
این گزینه
بدون
آرگومان
داده شود،
مقدار
پیشفرض
پارامتر 2
است.
توجه داشته باشید که "-ftrack-macro-expansion=2" بهطور پیشفرض فعال است.
- -fmacro-prefix-map=old=new
- هنگام پیشپردازش فایلهای واقع در دایرکتوری old، ماکروهای "__FILE__" و "__BASE_FILE__" را طوری بسط میدهد که گویی فایلها در دایرکتوری new قرار دارند. این گزینه میتواند با استفاده از . برای new جهت تغییر یک مسیر مطلق به یک مسیر نسبی استفاده شود، که میتواند به ساختهای بازتولیدپذیرتر (reproducible builds) و مستقل از مکان منجر شود. این گزینه همچنین بر "__builtin_FILE()" در حین کامپایل اثر میگذارد. همچنین نگاه کنید به -ffile-prefix-map و -fcanon-prefix-map.
- -fexec-charset=charset
- تنظیم مجموعه نویسهٔ اجرایی، مورد استفاده برای ثابتهای رشتهای و نویسهای. مقدار پیشفرض UTF-8 است. charset میتواند هر کدگذاری پشتیبانیشده توسط تابع کتابخانهای "iconv" سیستم باشد.
- -fwide-exec-charset=charset
- تنظیم مجموعه نویسهٔ اجرایی عریض، مورد استفاده برای ثابتهای رشتهای و نویسهای عریض. مقدار پیشفرض یکی از گزینههای UTF-32BE، UTF-32LE، UTF-16BE یا UTF-16LE است، هرکدام که با عرض "wchar_t" و ترتیب بایت big-endian یا little-endian مورد استفاده در تولید کد مطابقت داشته باشد. همانند -fexec-charset، charset میتواند هر کدگذاری پشتیبانیشده توسط تابع کتابخانهای "iconv" سیستم باشد؛ با این حال، با کدگذاریهایی که دقیقاً در "wchar_t" جا نمیشوند، دچار مشکل خواهید شد..IP -finput-charset=charset 4 مجموعه نویسههای ورودی را تنظیم میکند، که برای تبدیل از مجموعه نویسههای فایل ورودی به مجموعه نویسههای مبدأ مورد استفاده توسط GCC به کار میرود. اگر لوکال آن را مشخص نکند، یا GCC نتواند این اطلاعات را از لوکال دریافت کند، پیشفرض UTF-8 است. این مقدار میتواند توسط لوکال یا این گزینهٔ خط فرمان بازنویسی شود. در حال حاضر در صورت وجود تعارض، گزینهٔ خط فرمان اولویت دارد. charset میتواند هر کدگذاری پشتیبانیشده توسط روال کتابخانهای "iconv" سیستم باشد.
- -fpch-deps
- هنگام استفاده از سرآیندهای ازپیشکامپایلشده، این پرچم باعث میشود که پرچمهای خروجیِ وابستگی، فایلهای حاصل از وابستگیهای سرآیند ازپیشکامپایلشده را نیز فهرست کنند. در صورت عدم تعیین، تنها خود سرآیند ازپیشکامپایلشده فهرست میشود و نه فایلهایی که برای ایجاد آن استفاده شدهاند، زیرا در زمان استفاده از یک سرآیند ازپیشکامپایلشده، به آن فایلها رجوع نمیشود.
- -fpch-preprocess
- این گزینه
امکان
استفاده از
سرآیند
ازپیشکامپایلشده
را به همراه
-E فراهم
میکند. این
گزینه یک
"#pragma"
ویژه، "#pragma
GCC pch_preprocess
"filename""
را در خروجی
درج میکند
تا مکانی که
سرآیند
ازپیشکامپایلشده
در آن یافت
شده و filename آن
مشخص شود.
هنگامی که
-fpreprocessed در حال
استفاده
است، GCC این
"#pragma" را
تشخیص داده
و PCH را
بارگذاری
میکند.
این گزینه به طور پیشفرض غیرفعال است، زیرا خروجی پیشپردازششدهٔ حاصل تنها برای ارائه به عنوان ورودی به GCC واقعاً مناسب است. این گزینه توسط -save-temps فعال میشود.
شما نباید این "#pragma" را در کد خود بنویسید، اما در صورتی که فایل PCH در مکان دیگری موجود باشد، ویرایش نام فایل خطری ندارد. نام فایل ممکن است مطلق یا نسبت به دایرکتوری جاری GCC باشد.
- -fworking-directory
- تولید نشانگرهای خط را در خروجی پیشپردازنده فعال میکند که به کامپایلر اجازه میدهد از دایرکتوری کاری جاری در زمان پیشپردازش مطلع شود. هنگامی که این گزینه فعال باشد، پیشپردازنده پس از نشانگر خط اولیه، دومین نشانگر خط را به همراه دایرکتوری کاری جاری و به دنبال آن دو اسلش صادر میکند. GCC از این دایرکتوری، در صورت حضور در ورودی پیشپردازششده، به عنوان دایرکتوری صادرشده برای دایرکتوری کاری جاری در برخی قالبهای اطلاعات اشکالزدایی استفاده میکند. این گزینه در صورت فعال بودن اطلاعات اشکالزدایی به طور ضمنی فعال میشود، اما با فرم نفی آن -fno-working-directory قابل جلوگیری است. اگر پرچم -P در خط فرمان حضور داشته باشد، این گزینه هیچ اثری ندارد، چرا که اساساً هیچ دستورالعمل "#line" صادر نمیشود.
- -A predicate=answer
- یک گزاره (assertion) با محمول predicate و پاسخ answer ایجاد میکند. این فرم بر فرم قدیمیتر -A predicate(answer) ترجیح داده میشود (که هنوز پشتیبانی میشود)، زیرا از نویسههای ویژهٔ پوسته استفاده نمیکند.
- -A -predicate=answer
- یک گزاره با محمول predicate و پاسخ answer را لغو میکند.
- -C
- کامنتها
را حذف نکن.
همهٔ
کامنتها
به فایل
خروجی
منتقل
میشوند،
به جز
کامنتهای
درون
دستورالعملهای
پردازششده،
که همراه با
خود
دستورالعمل
حذف
میشوند.
هنگام استفاده از -C باید آمادهٔ عوارض جانبی باشید؛ این گزینه باعث میشود پیشپردازنده با کامنتها به عنوان نشانهها (توکنها)ی مستقل رفتار کند. برای مثال، کامنتهایی که در ابتدای یک خط دستورالعمل ظاهر میشوند، باعث تبدیل شدن آن خط به یک خط مبدأ معمولی میشوند، زیرا اولین نشانه در خط دیگر # نیست.
- -CC
- کامنتها
را دور
نریز، از
جمله در حین
باز شدن
ماکروها.
این گزینه
مانند -C
است، به جز
اینکه
کامنتهای
درون
ماکروها
نیز به فایل
خروجی در
جایی که
ماکرو
گسترش
مییابد
منتقل
میشوند.
علاوه بر عوارض جانبی گزینهٔ -C، گزینهٔ -CC باعث میشود تمام کامنتهای سبک ++C در درون یک ماکرو به کامنتهای سبک C تبدیل شوند. این کار برای جلوگیری از آن است که استفادهٔ بعدی از آن ماکرو، به طور ناخواسته ادامهٔ خط کد مبدأ را کامنت کند.
گزینهٔ -CC عموماً برای پشتیبانی از کامنتهای lint استفاده میشود.
- -P
- از تولید نشانگرهای خط در خروجی پیشپردازنده جلوگیری میکند. این گزینه ممکن است هنگام اجرای پیشپردازنده بر روی چیزی غیر از کد C، و ارسال آن به برنامهای که ممکن است توسط نشانگرهای خط سردرگم شود، مفید باشد.
- -traditional
- -traditional-cpp
- تلاش
میکند تا
رفتار
پیشپردازندههای
C پیش از
استاندارد
را، بر خلاف
پیشپردازندههای
ISO C، تقلید
کند. برای
جزئیات به
دفترچه
راهنمای GNU CPP
مراجعه
کنید.
توجه داشته باشید که GCC در موارد دیگر تلاشی برای شبیهسازی یک کامپایلر C پیش از استاندارد نمیکند، و این گزینهها تنها با سوئیچ -E، یا هنگام فراخوانی صریح CPP پشتیبانی میشوند.
- -trigraphs
- پشتیبانی
از
سهنگارهها
(trigraphs) در ISO C.
اینها
دنبالههایی
سهنویسهای
هستند که
همگی با ??
آغاز
میشوند و
توسط ISO C برای
نمایش
تکنویسهها
تعریف
شدهاند.
برای مثال،
??/ به جای \
قرار دارد،
بنابراین
'??/n' یک ثابت
نویسهای
برای خط
جدید (newline) است.
نه سهنگاره و جایگزینهای آنها عبارتند از:
Trigraph: ??( ??) ??< ??> ??= ??/ ??' ??! ??- Replacement: [ ] { } # \ ^ | ~به طور پیشفرض، GCC سهنگارهها را نادیده میگیرد، اما در حالتهای منطبق بر استاندارد آنها را تبدیل میکند. گزینههای -std و -ansi را ببینید.
- -remap
- کد ویژهای را برای دور زدن محدودیت سیستمفایلهایی که تنها نامهای بسیار کوتاه فایل را مجاز میدانند (مانند MS-DOS)، فعال میکند.
- -H
- علاوه بر سایر فعالیتهای معمول، نام هر فایل سرآیند استفادهشده را چاپ میکند. هر نام دندانهدار میشود تا عمق آن در پشتهٔ #include نشان داده شود. فایلهای سرآیند ازپیشکامپایلشده نیز چاپ میشوند، حتی اگر نامعتبر تشخیص داده شوند؛ یک فایل سرآیند ازپیشکامپایلشدهٔ نامعتبر با ...x و یک فایل معتبر با ...! چاپ میشود.
- -dletters
- دستور میدهد تا در طول کامپایل، دامپهای اشکالزدایی طبق آنچه توسط letters مشخص شده ایجاد شوند. پرچمهای مستندشده در اینجا مواردی هستند که به پیشپردازنده مربوط میشوند. سایر letters توسط خود کامپایلر تفسیر میشوند یا برای نسخههای بعدی GCC رزرو شدهاند، و بنابراین بدون هشدار نادیده گرفته میشوند. اگر حروفی (letters) را مشخص کنید که رفتار آنها در تعارض باشد، نتیجه تعریفنشده خواهد بود.
- -dM
- به جای
خروجی
معمول،
فهرستی از
دستورالعملهای
#define را برای
تمام
ماکروهای
تعریفشده
در طول
اجرای
پیشپردازنده،
از جمله
ماکروهای
ازپیشتعریفشده،
تولید
میکند. این
امر
راهکاری به
شما میدهد
تا دریابید
چه مواردی
در نسخهٔ
پیشپردازندهٔ
شما از پیش
تعریف
شدهاند. با
فرض اینکه
فایلی به
نام foo.h
ندارید،
دستور
touch foo.h; cpp -dM foo.h
همهٔ ماکروهای ازپیشتعریفشده را نمایش میدهد.
اگر از -dM بدون گزینهٔ -E استفاده کنید، -dM به عنوان مترادفی برای -fdump-rtl-mach تفسیر میشود.
- -dD
- مانند -dM عمل میکند، به جز اینکه هم دستورالعملهای #define و هم نتیجهٔ پیشپردازش را خروجی میدهد. هر دو نوع خروجی به فایل خروجی استاندارد ارسال میشوند.
- -dN
- مانند -dD است، اما تنها نام ماکروها را صادر میکند و نه گسترش (باز شدن) آنها را.
- -dI
- علاوه بر نتیجهٔ پیشپردازش، دستورالعملهای #include را نیز در خروجی درج میکند.
- -dU
- مانند -dD است، به جز اینکه تنها ماکروهایی که گسترش مییابند، یا وضعیت تعریف آنها در دستورالعملهای پیشپردازنده آزمایش میشود، در خروجی قرار میگیرند؛ خروجی تا زمان استفاده یا آزمایش ماکرو به تعویق میافتد؛ و دستورالعملهای #undef نیز برای ماکروهایی که آزمایش شدهاند اما در آن زمان تعریف نشدهاند، خروجی داده میشوند.
- -fdebug-cpp
- این گزینه
تنها برای
اشکالزدایی
GCC مفید است.
هنگامی که
از طریق CPP یا
همراه با -E
استفاده
شود،
اطلاعات
اشکالزدایی
را دربارهٔ
نقشههای
مکان (location maps)
دامپ
میکند. پیش
از هر نشانه
در خروجی،
دامپ
نقشهای که
مکان آن
نشانه به آن
تعلق دارد
قرار
میگیرد.
هنگامی که از طریق GCC بدون -E استفاده شود، این گزینه هیچ اثری ندارد..IP -Wp,option 4 میتوانید از -Wp,option برای دور زدن راهانداز کامپایلر و ارسال مستقیم option به پیشپردازنده استفاده کنید. اگر option شامل کاما باشد، در محل کاماها به چند گزینه تقسیم میشود. با این حال، بسیاری از گزینهها پیش از ارسال به پیشپردازنده توسط راهانداز کامپایلر اصلاح، ترجمه یا تفسیر میشوند و -Wp این مرحله را به اجبار دور میزند. واسط مستقیم پیشپردازنده مستند نشده و در معرض تغییر است؛ بنابراین در صورت امکان باید از استفاده از -Wp خودداری کرده و اجازه دهید راهانداز گزینهها را مدیریت کند.
- -Xpreprocessor option
- گزینهٔ option
را به عنوان
یک گزینه به
پیشپردازنده
ارسال
میکند.
میتوانید
از این مورد
برای
ارائهٔ
گزینههای
پیشپردازندهٔ
مختص سیستم
که GCC آنها
را شناسایی
نمیکند،
استفاده
کنید.
اگر میخواهید گزینهای ارسال کنید که یک آرگومان میگیرد، باید دو بار از -Xpreprocessor استفاده کنید؛ یکبار برای گزینه و یکبار برای آرگومان.
- -no-integrated-cpp
- پیشپردازش را به عنوان یک مرحلهٔ مجزا پیش از کامپایل انجام میدهد. بهطور پیشفرض، GCC پیشپردازش را به عنوان بخشی یکپارچه از نشانهگذاری ورودی و تجزیه (parsing) انجام میدهد. اگر این گزینه مشخص شود، فرانتاند زبان مربوطه (cc1، cc1plus یا cc1obj به ترتیب برای C، C++ و Objective-C) در عوض دو بار فراخوانی میشود؛ یکبار فقط برای پیشپردازش و یکبار برای کامپایل واقعی ورودیِ پیشپردازششده. این گزینه ممکن است همراه با گزینههای -B یا -wrapper برای تعیین یک پیشپردازندهٔ جایگزین یا انجام پردازشهای اضافی روی کد منبع برنامه بین پیشپردازش عادی و کامپایل مفید باشد.
ارسال گزینهها به اسمبلر (Passing Options to the Assembler)
میتوانید گزینهها را به اسمبلر ارسال کنید.
- -Wa,option
- گزینهٔ option را به عنوان یک گزینه به اسمبلر ارسال میکند. اگر option شامل کاما باشد، در محل کاماها به چند گزینه تقسیم میشود.
- -Xassembler option
- گزینهٔ option
را به عنوان
یک گزینه به
اسمبلر
ارسال
میکند.
میتوانید
از این مورد
برای
ارائهٔ
گزینههای
اسمبلر
مختص سیستم
که GCC آنها
را شناسایی
نمیکند،
استفاده
کنید.
اگر میخواهید گزینهای ارسال کنید که یک آرگومان میگیرد، باید دو بار از -Xassembler استفاده کنید؛ یکبار برای گزینه و یکبار برای آرگومان.
گزینههای پیوند (Options for Linking)
این گزینهها زمانی وارد عمل میشوند که کامپایلر فایلهای شیء را به یک فایل خروجی اجرایی پیوند میدهد. در صورتی که کامپایلر مرحلهٔ پیوند را انجام ندهد، این گزینهها بیاثر خواهند بود.
- object-file-name
- نام فایلی که به یک پسوند شناختهشدهٔ خاص ختم نشود، به عنوان یک فایل شیء یا کتابخانه در نظر گرفته میشود. (فایلهای شیء بر اساس محتویات فایل توسط پیونددهنده از کتابخانهها متمایز میشوند.) در صورت انجام پیوند، این فایلهای شیء به عنوان ورودی پیونددهنده استفاده میشوند.
- -c
- -S
- -E
- در صورت استفاده از هر یک از این گزینهها، پیونددهنده اجرا نمیشود و نباید از نام فایلهای شیء به عنوان آرگومان استفاده کرد.
- -flinker-output=type
- این گزینه
تولید کد
بهینهساز
زمان پیوند
را کنترل
میکند.
بهطور
پیشفرض،
خروجی
پیونددهنده
بهطور
خودکار
توسط
افزونهٔ
پیونددهنده
تعیین
میشود.
برای
اشکالزدایی
کامپایلر و
در صورتی که
پیوند
افزایشی با
یک فایل شیء
غیر LTO مد نظر
باشد،
کنترل دستی
نوع خروجی
میتواند
مفید باشد.
اگر type برابر با exec باشد، تولید کد یک باینری ایستا ایجاد میکند. در این حالت -fpic و -fpie هر دو غیرفعال میشوند.
اگر type برابر با dyn باشد، تولید کد یک کتابخانهٔ اشتراکی ایجاد میکند. در این حالت -fpic یا -fPIC حفظ میشود، اما بهطور خودکار فعال نمیگردد. این امر امکان ساخت کتابخانههای اشتراکی بدون کد مستقل از موقعیت را در معماریهایی که این قابلیت را پشتیبانی میکنند (مانند x86) فراهم میسازد.
اگر type برابر با pie باشد، تولید کد یک فایل اجرایی با -fpie ایجاد میکند. این کار به بهینهسازیهایی مشابه با exec منجر میشود، با این تفاوت که اگر -fpie در زمان کامپایل مشخص شده باشد غیرفعال نمیگردد.
اگر type برابر با rel باشد، کامپایلر فرض میکند که پیوند افزایشی در حال انجام است. بخشهای حاوی کد میانی برای بهینهسازی زمان پیوند با یکدیگر ادغام شده، پیشبهینهسازی میشوند و در فایل شیء حاصل خروجی داده میشوند. علاوه بر این، اگر -ffat-lto-objects مشخص شده باشد، کد باینری برای پیوندهای غیر LTO آتی تولید میشود. فایل شیء حاصل از پیوند افزایشی کوچکتر از کتابخانهٔ ایستای تولیدشده از همان فایلهای شیء است. در زمان پیوند، نتیجهٔ پیوند افزایشی در صورتی که بیشتر اشیاء موجود در کتابخانه استفاده شوند، سریعتر از یک کتابخانهٔ ایستا بارگذاری میشود.
در نهایت، nolto-rel کامپایلر را برای پیوند افزایشی به گونهای پیکربندی میکند که تولید کد اجباری شده، یک باینری نهایی تولید میشود و کد میانی برای بهینهسازی زمان پیوند بعدی حذف میگردد. هنگامی که چندین فایل شیء به یکدیگر پیوند داده میشوند، کد حاصل بهتر از حالتی که بهینهسازیهای زمان پیوند غیرفعال است بهینهسازی میشود (برای مثال، درونریزی میانمدولی صورت میگیرد)، اما بیشتر مزایای بهینهسازی کل برنامه از دست میرود.
در طول پیوند افزایشی (توسط -r)، افزونهٔ پیونددهنده بهطور پیشفرض از rel استفاده میکند. با این حال، با واسطهای فعلی GNU Binutils امکان پیوند افزایشی اشیاء LTO و اشیاء غیر LTO در یک فایل شیء واحد و ترکیبی وجود ندارد. اگر هر یک از فایلهای شیء در پیوند افزایشی نتواند برای بهینهسازی زمان پیوند استفاده شود، افزونهٔ پیونددهنده یک هشدار صادر کرده و از nolto-rel استفاده میکند. برای حفظ بهینهسازی کل برنامه، توصیه میشود چنین اشیایی در عوض به یک کتابخانهٔ ایستا پیوند داده شوند. روش دیگر، استفاده از نسخهٔ binutils ارائهشده توسط H.J. Lu با پشتیبانی از اشیاء ترکیبی است.
- -fuse-ld=bfd
- استفاده از پیونددهندهٔ bfd به جای پیونددهندهٔ پیشفرض.
- -fuse-ld=gold
- استفاده از پیونددهندهٔ gold به جای پیونددهندهٔ پیشفرض.
- -fuse-ld=lld
- استفاده از پیونددهندهٔ LLVM lld به جای پیونددهندهٔ پیشفرض.
- -fuse-ld=mold
- استفاده از پیونددهندهٔ مدرن (mold) به جای پیونددهندهٔ پیشفرض.
- -llibrary
- -l library
- جستجوی
کتابخانهای
به نام library
هنگام
پیوند دادن.
(حالت دوم
با قرار
گرفتن نام
کتابخانه
به عنوان یک
آرگومان
جداگانه،
صرفاً برای
سازگاری با
POSIX بوده و
توصیه
نمیشود.)
گزینهٔ -l مستقیماً توسط GCC به پیونددهنده ارسال میشود. برای جزئیات دقیق به مستندات پیونددهندهٔ خود مراجعه کنید. توضیحات کلی زیر در مورد پیونددهندهٔ GNU صدق میکند.
پیونددهنده فهرستی استاندارد از دایرکتوریها را برای یافتن کتابخانه جستجو میکند. دایرکتوریهای جستجوشده شامل چندین دایرکتوری استاندارد سیستم به اضافهٔ هر دایرکتوری مشخصشده با -L هستند.
کتابخانههای ایستا آرشیوهایی از فایلهای شیء هستند و نامهایی مانند liblibrary.a دارند. برخی مقصدها از کتابخانههای اشتراکی نیز پشتیبانی میکنند که معمولاً نامهایی مانند liblibrary.so دارند. اگر هر دو نوع کتابخانهٔ ایستا و اشتراکی یافت شوند، پیونددهنده اولویت را به پیوند با کتابخانهٔ اشتراکی میدهد، مگر اینکه از گزینهٔ -static استفاده شده باشد.
محل قرارگیری این گزینه در دستور اهمیت دارد؛ پیونددهنده کتابخانهها و فایلهای شیء را دقیقاً به همان ترتیبی که مشخص شدهاند جستجو و پردازش میکند. بنابراین، دستور foo.o -lz bar.o کتابخانهٔ z را پس از فایل foo.o اما پیش از bar.o جستجو میکند. اگر bar.o به توابعی در z ارجاع دهد، ممکن است آن توابع بارگذاری نشوند.
- -lobjc
- برای پیوند دادن یک برنامهٔ Objective-C یا Objective-C++ به این حالت خاص از گزینهٔ -l نیاز دارید.
- -nostartfiles
- هنگام پیوند دادن از فایلهای استاندارد راهاندازی سیستم استفاده نمیشود. کتابخانههای استاندارد سیستم بهطور عادی استفاده میشوند، مگر اینکه از گزینههای -nostdlib، -nolibc یا -nodefaultlibs استفاده شود.
- -nodefaultlibs
- هنگام
پیوند دادن
از
کتابخانههای
استاندارد
سیستم
استفاده
نمیشود.
تنها
کتابخانههایی
که مشخص
میکنید به
پیونددهنده
ارسال
میشوند و
گزینههای
تعیینکنندهٔ
پیوند
کتابخانههای
سیستم،
مانند -static-libgcc
یا -shared-libgcc،
نادیده
گرفته
میشوند.
فایلهای
استاندارد
راهاندازی
بهطور
عادی
استفاده
میشوند،
مگر اینکه
از گزینهٔ
-nostartfiles
استفاده
شده باشد.
کامپایلر ممکن است فراخوانیهایی برای "memcmp"، "memset"، "memcpy" و "memmove" تولید کند. این مدخلها معمولاً توسط تعاریف موجود در libc برطرف میشوند. هنگام مشخص کردن این گزینه، این نقاط ورود باید از طریق سازوکار دیگری تأمین شوند..IP -nolibc 4 هنگام پیوند دادن، از کتابخانه C یا کتابخانههای سیستمی وابسته به آن استفاده نکنید. پیوند با فایلهای راهاندازی، libgcc یا کتابخانههای پشتیبانی زبان ارائهشده توسط زنجیره ابزار مانند libgnat، libgfortran یا libstdc++ همچنان انجام میشود، مگر اینکه از گزینههایی که از گنجاندن آنها جلوگیری میکنند نیز استفاده شده باشد. این گزینه معمولاً -lc و همچنین کتابخانههای سیستمی همراه با آن را که در صورت عدم وجود کتابخانه C بیمعنی میشوند (مانند -lpthread یا -lm در برخی پیکربندیها) از خط فرمان پیوند حذف میکند. این گزینه برای مقاصد bare-board در مواردی که واقعاً هیچ کتابخانه C در دسترس نیست در نظر گرفته شده است.
- -nostdlib
- هنگام
پیوند
دادن، از
فایلهای
راهاندازی
یا
کتابخانههای
استاندارد
سیستم
استفاده
نکنید. هیچ
فایل
راهاندازی
ارسال
نمیشود و
تنها
کتابخانههایی
که مشخص
میکنید به
پیونددهنده
ارسال
میشوند؛
همچنین
گزینههای
تعیینکننده
پیوند
کتابخانههای
سیستمی،
مانند -static-libgcc
یا -shared-libgcc،
نادیده
گرفته
میشوند.
کامپایلر ممکن است فراخوانیهایی برای "memcmp"، "memset"، "memcpy" و "memmove" تولید کند. این مدخلها معمولاً توسط مدخلهای درون libc برطرف میشوند. در صورت مشخص شدن این گزینه، این نقاط ورود باید از طریق سازوکار دیگری فراهم گردند.
یکی از کتابخانههای استانداردی که توسط -nostdlib و -nodefaultlibs نادیده گرفته میشود libgcc.a است؛ کتابخانهای از زیرروالهای داخلی که GCC از آن برای غلبه بر کاستیهای ماشینهای خاص یا نیازهای ویژه برخی زبانها استفاده میکند.
در بیشتر موارد، حتی زمانی که میخواهید از سایر کتابخانههای استاندارد اجتناب کنید، به libgcc.a نیاز دارید. به عبارت دیگر، وقتی -nostdlib یا -nodefaultlibs را مشخص میکنید، معمولاً باید -lgcc را نیز مشخص کنید. این کار تضمین میکند که هیچ ارجاع حلنشدهای به زیرروالهای داخلی کتابخانه GCC نخواهید داشت. (نمونهای از چنین زیرروال داخلی، "__main" است که برای اطمینان از فراخوانی سازندههای ++C استفاده میشود.)
- -nostdlib++
- بهطور ضمنی با کتابخانههای استاندارد ++C پیوند داده نشود.
- -e entry
- --entry=entry
- مشخص میکند که نقطه ورود برنامه entry است. این آرگومان توسط پیونددهنده تفسیر میشود؛ پیونددهنده GNU نام یک نماد یا یک آدرس را میپذیرد.
- -pie
- در مقاصدی که پشتیبانی میکنند، یک فایل اجرایی مستقل از موقعیت با پیوند پویا تولید کنید. برای دستیابی به نتایج قابل پیشبینی، هنگام مشخص کردن این گزینه پیونددهنده، باید همان مجموعه گزینههای استفادهشده برای کامپایل (-fpie، -fPIE، یا زیرگزینههای مدل) را نیز مشخص کنید.
- -no-pie
- یک فایل اجرایی مستقل از موقعیت با پیوند پویا تولید نکنید.
- -static-pie
- در مقاصدی که پشتیبانی میکنند، یک فایل اجرایی مستقل از موقعیت ایستا تولید کنید. یک فایل اجرایی مستقل از موقعیت ایستا شبیه به یک فایل اجرایی ایستا است، اما میتواند بدون نیاز به یک پیونددهنده پویا در هر آدرسی بارگذاری شود. برای دستیابی به نتایج قابل پیشبینی، هنگام مشخص کردن این گزینه پیونددهنده، باید همان مجموعه گزینههای استفادهشده برای کامپایل (-fpie، -fPIE، یا زیرگزینههای مدل) را نیز مشخص کنید.
- -pthread
- پیوند با کتابخانه ریسمانهای پازیکس (POSIX threads). این گزینه در مقاصد GNU/Linux، اکثر مشتقات یونیکس دیگر و همچنین مقاصد x86 در Cygwin و MinGW پشتیبانی میشود. در برخی مقاصد این گزینه پرچمهایی را نیز برای پیشپردازنده تنظیم میکند، بنابراین باید به طور هماهنگ هم برای کامپایل و هم برای پیوند استفاده شود.
- -r
- یک شیء بازتعیینپذیر (relocatable object) را به عنوان خروجی تولید کنید. این عمل با عنوان پیوند جزئی نیز شناخته میشود.
- -rdynamic
- در مقاصدی که پشتیبانی میکنند، پرچم -export-dynamic را به پیونددهنده ELF ارسال کنید. این به پیونددهنده دستور میدهد که تمام نمادها، و نه فقط نمادهای استفادهشده را به جدول نمادهای پویا بیفزاید. این گزینه برای برخی از موارد استفاده از "dlopen" یا برای امکان دریافت backtrace از داخل برنامه مورد نیاز است.
- -s
- تمام جدول نمادها و اطلاعات بازتعیین را از فایل اجرایی حذف کنید.
- -static
- در سیستمهایی که از پیوند پویا پشتیبانی میکنند، این گزینه بر -pie اولویت دارد و از پیوند با کتابخانههای اشتراکی جلوگیری میکند. در سایر سیستمها، این گزینه هیچ اثری ندارد.
- یک شیء اشتراکی (shared object) تولید کنید که سپس بتوان آن را با اشیاء دیگر پیوند داد تا یک فایل اجرایی تشکیل شود. همه سیستمها از این گزینه پشتیبانی نمیکنند. برای دستیابی به نتایج قابل پیشبینی، هنگام مشخص کردن این گزینه پیونددهنده، باید همان مجموعه گزینههای استفادهشده برای کامپایل (-fpic، -fPIC، یا زیرگزینههای مدل) را نیز مشخص کنید.[1]
- -static-libgcc
- در
سیستمهایی
که libgcc را به
عنوان یک
کتابخانه
اشتراکی
ارائه
میدهند،
این
گزینهها
به ترتیب
استفاده از
نسخه
اشتراکی یا
ایستا را
اجباری
میکنند.
اگر در زمان
پیکربندی
کامپایلر،
نسخه
اشتراکی libgcc
ساخته نشده
باشد، این
گزینهها
هیچ اثری
ندارند.
موقعیتهای متعددی وجود دارد که در آنها یک برنامه کاربردی باید از نسخه اشتراکی libgcc به جای نسخه ایستا استفاده کند. رایجترین آنها زمانی است که برنامه قصد دارد استثناها را در میان کتابخانههای اشتراکی مختلف پرتاب و دریافت کند. در آن صورت، هر یک از کتابخانهها و همچنین خود برنامه باید از نسخه اشتراکی libgcc استفاده کنند.
بنابراین، راهانداز G++ هر زمان که یک کتابخانه اشتراکی یا یک فایل اجرایی اصلی بسازید، بهطور خودکار -shared-libgcc را اضافه میکند؛ زیرا برنامههای ++C معمولاً از استثناها استفاده میکنند و در نتیجه این کار مناسب است.
اگر در عوض، از راهانداز GCC برای ایجاد کتابخانههای اشتراکی استفاده کنید، ممکن است متوجه شوید که آنها همیشه با نسخه اشتراکی libgcc پیوند داده نمیشوند. اگر GCC در زمان پیکربندی خود تشخیص دهد که پیونددهنده غیر GNU یا پیونددهنده GNU فاقد پشتیبانی از گزینه --eh-frame-hdr دارید، بهطور پیشفرض نسخه اشتراکی libgcc را به کتابخانههای اشتراکی پیوند میدهد. در غیر این صورت، از پیونددهنده بهره برده و پیوند با نسخه اشتراکی libgcc را بهینهسازی و حذف میکند و بهطور پیشفرض با نسخه ایستای libgcc پیوند برقرار مینماید. این امر به استثناها اجازه میدهد تا بدون تحمیل هزینههای بازتعیین در زمان بارگذاری کتابخانه، در میان چنین کتابخانههای اشتراکی منتشر شوند.
با این حال، اگر قرار است یک کتابخانه یا فایل اجرایی اصلی استثناها را پرتاب یا دریافت کند، باید آن را با استفاده از راهانداز G++ یا با استفاده از گزینه -shared-libgcc پیوند دهید، به گونهای که با نسخه اشتراکی libgcc پیوند داده شود.
- -static-libasan
- هنگامی که گزینه -fsanitize=address برای پیوند دادن یک برنامه استفاده میشود، راهانداز GCC به طور خودکار با libasan پیوند برقرار میکند. اگر libasan به عنوان یک کتابخانه اشتراکی در دسترس باشد و از گزینه -static استفاده نشود، در این صورت پیوند با نسخه اشتراکی libasan انجام میشود. گزینه -static-libasan به راهانداز GCC دستور میدهد که libasan را به صورت ایستا پیوند دهد، بدون اینکه لزوماً سایر کتابخانهها به صورت ایستا پیوند داده شوند.
- -static-libtsan
- هنگامی که گزینه -fsanitize=thread برای پیوند دادن یک برنامه استفاده میشود، راهانداز GCC به طور خودکار با libtsan پیوند برقرار میکند. اگر libtsan به عنوان یک کتابخانه اشتراکی در دسترس باشد و از گزینه -static استفاده نشود، در این صورت پیوند با نسخه اشتراکی libtsan انجام میشود. گزینه -static-libtsan به راهانداز GCC دستور میدهد که libtsan را به صورت ایستا پیوند دهد، بدون اینکه لزوماً سایر کتابخانهها به صورت ایستا پیوند داده شوند.
- -static-liblsan
- هنگامی که گزینه -fsanitize=leak برای پیوند دادن یک برنامه استفاده میشود، راهانداز GCC به طور خودکار با liblsan پیوند برقرار میکند. اگر liblsan به عنوان یک کتابخانه اشتراکی در دسترس باشد و از گزینه -static استفاده نشود، در این صورت پیوند با نسخه اشتراکی liblsan انجام میشود. گزینه -static-liblsan به راهانداز GCC دستور میدهد که liblsan را به صورت ایستا پیوند دهد، بدون اینکه لزوماً سایر کتابخانهها به صورت ایستا پیوند داده شوند.
- -static-libubsan
- هنگامی که گزینه -fsanitize=undefined برای پیوند دادن یک برنامه استفاده میشود، راهانداز GCC به طور خودکار با libubsan پیوند برقرار میکند. اگر libubsan به عنوان یک کتابخانه اشتراکی در دسترس باشد و از گزینه -static استفاده نشود، در این صورت پیوند با نسخه اشتراکی libubsan انجام میشود. گزینه -static-libubsan به راهانداز GCC دستور میدهد که libubsan را به صورت ایستا پیوند دهد، بدون اینکه لزوماً سایر کتابخانهها به صورت ایستا پیوند داده شوند.
- -static-libstdc++
- هنگامی که برنامه g++ برای پیوند دادن یک برنامه ++C استفاده میشود، معمولاً به طور خودکار با libstdc++ پیوند برقرار میکند. اگر libstdc++ به عنوان یک کتابخانه اشتراکی در دسترس باشد و از گزینه -static استفاده نشود، در این صورت پیوند با نسخه اشتراکی libstdc++ انجام میشود. این حالت معمولاً مناسب است. با این حال، گاهی اوقات تثبیت نسخه libstdc++ مورد استفاده برنامه بدون پیش رفتن به سوی پیوند کاملاً ایستا مفید است. گزینه -static-libstdc++ به راهانداز g++ دستور میدهد که libstdc++ را به صورت ایستا پیوند دهد، بدون اینکه لزوماً سایر کتابخانهها به صورت ایستا پیوند داده شوند..IP -symbolic 4 هنگام ساخت یک شیء اشتراکی (shared object)، ارجاعات به نمادهای سراسری را مقید (bind) میکند. در صورت وجود هرگونه ارجاع حلنشده هشدار میدهد (مگر اینکه توسط گزینه پیونددهنده -Xlinker -z -Xlinker defs لغو شده باشد). تنها شمار اندکی از سیستمها از این گزینه پشتیبانی میکنند.
- -T script
- از script به عنوان اسکریپت پیونددهنده (linker script) استفاده میکند. این گزینه در اکثر سیستمهایی که از پیونددهنده GNU استفاده میکنند پشتیبانی میشود. در برخی مقصدها، مانند مقصدهای bare-board بدون سیستمعامل، ممکن است گزینه -T هنگام پیوند دادن برای جلوگیری از ارجاع به نمادهای تعریفنشده الزامی باشد.
- -Xlinker option
- option را به
عنوان یک
گزینه به
پیونددهنده
ارسال
میکند.
میتوانید
از این
گزینه برای
ارائه
گزینههای
پیونددهنده
مختص سیستم
که GCC آنها
را
نمیشناسد،
استفاده
کنید.
اگر میخواهید گزینهای را ارسال کنید که یک آرگومان جداگانه میپذیرد، باید دو بار از -Xlinker استفاده کنید؛ یکبار برای گزینه و یکبار برای آرگومان. برای نمونه، جهت ارسال -assert definitions، باید بنویسید -Xlinker -assert -Xlinker definitions. نوشتن -Xlinker "-assert definitions" کار نخواهد کرد، زیرا کل رشته را به عنوان یک آرگومان واحد ارسال میکند که آن چیزی نیست که پیونددهنده انتظار دارد.
هنگام استفاده از پیونددهنده GNU، معمولاً راحتتر است که آرگومانها را به جای آرگومانهای جداگانه، با نحو option=value به گزینههای پیونددهنده ارسال کنید. برای نمونه، میتوانید به جای -Xlinker -Map -Xlinker output.map عبارت -Xlinker -Map=output.map را مشخص کنید. ممکن است پیونددهندههای دیگر از این نحو برای گزینههای خط فرمان پشتیبانی نکنند.
- -Wl,option
- option را به عنوان یک گزینه به پیونددهنده ارسال میکند. اگر option حاوی کاما باشد، در محل کاماها به چند گزینه تقسیم میشود. میتوانید از این نحو برای ارسال یک آرگومان به گزینه استفاده کنید. برای نمونه، -Wl,-Map,output.map گزینه -Map output.map را به پیونددهنده ارسال میکند. هنگام استفاده از پیونددهنده GNU، همچنین میتوانید با -Wl,-Map=output.map به همان نتیجه برسید.
- -u symbol
- چنین وانمود میکند که نماد symbol تعریفنشده است، تا پیونددهی ماژولهای کتابخانهای برای تعریف آن اجباری شود. میتوانید چندین بار از -u با نمادهای مختلف استفاده کنید تا بارگذاری ماژولهای کتابخانهای اضافی تحمیل شود.
- -z keyword
- گزینه -z همراه با کلمه کلیدی keyword مستقیماً به پیونددهنده ارسال میشود. برای مقادیر مجاز و معانی آنها، بخش مربوطه را در مستندات پیونددهنده خود ببینید.
گزینههای جستجوی دایرکتوری (Options for Directory Search)
این گزینهها دایرکتوریهایی را برای جستجوی فایلهای سرایند (header files)، کتابخانهها و بخشهایی از کامپایلر مشخص میکنند:
- -I dir
- -iquote dir
- -isystem dir
- -idirafter dir
- دایرکتوری
dir را به
فهرست
دایرکتوریهایی
که در طول
پیشپردازش
برای
فایلهای
سرایند
جستجو
میشوند،
اضافه
میکند. اگر
dir با = یا
$SYSROOT آغاز
شود،
آنگاه = یا
$SYSROOT با
پیشوند sysroot
جایگزین
میشود؛ به
--sysroot و -isysroot
مراجعه
کنید.
دایرکتوریهای مشخصشده با -iquote تنها برای شکل نقلقولی دستور، یعنی "#include "file""، اعمال میشوند. دایرکتوریهای مشخصشده با -I، -isystem یا -idirafter هم برای جستجوی دستور "#include "file"" و هم "#include <file>" اعمال میشوند.
میتوانید هر تعداد یا ترکیبی از این گزینهها را در خط فرمان برای جستجوی فایلهای سرایند در چندین دایرکتوری مشخص کنید. ترتیب جستجو به شرح زیر است:
- 1.
- برای شکل نقلقولی دستور include، ابتدا دایرکتوری فایل فعلی جستجو میشود.
- 2.
- برای شکل نقلقولی دستور include، دایرکتوریهای مشخصشده با گزینههای -iquote به ترتیب از چپ به راست، همانگونه که در خط فرمان آمدهاند، جستجو میشوند.
- 3.
- دایرکتوریهای مشخصشده با گزینههای -I به ترتیب از چپ به راست پیمایش میشوند.
- 4.
- دایرکتوریهای مشخصشده با گزینههای -isystem به ترتیب از چپ به راست پیمایش میشوند.
- 5.
- دایرکتوریهای استاندارد سیستم پیمایش میشوند.
- 6.
- دایرکتوریهای مشخصشده با گزینههای -idirafter به ترتیب از چپ به راست پیمایش میشوند.
میتوانید از -I برای بازنویسی و جایگزینی یک فایل سرایند سیستم با نسخه خودتان استفاده کنید، چرا که این دایرکتوریها قبل از دایرکتوریهای استاندارد فایلهای سرایند سیستم جستجو میشوند. با این حال، نباید از این گزینه برای افزودن دایرکتوریهای حاوی فایلهای سرایند سیستمی ارائهشده توسط ارائهدهنده (vendor) استفاده کنید؛ برای این منظور از -isystem استفاده نمایید.
گزینههای -isystem و -idirafter همچنین دایرکتوری را به عنوان یک دایرکتوری سیستمی علامتگذاری میکنند، به طوری که همان رفتار ویژهای را دریافت میکند که برای دایرکتوریهای استاندارد سیستم اعمال میشود.
اگر یک دایرکتوری include استاندارد سیستم، یا یک دایرکتوری مشخصشده با -isystem، همزمان با -I نیز مشخص شود، گزینه -I نادیده گرفته میشود. دایرکتوری همچنان جستجو میشود اما به عنوان یک دایرکتوری سیستمی در جایگاه عادی خود در زنجیره include سیستم. این امر برای اطمینان از این است که سازوکار GCC برای اصلاح سرایندهای معیوب سیستم و ترتیب مربوط به دستور "#include_next" به طور ناخواسته تغییر نکند. اگر واقعاً نیاز به تغییر ترتیب جستجوی دایرکتوریهای سیستمی دارید، از گزینههای -nostdinc و/یا -isystem استفاده کنید.
- -I-
- مسیر include را
تفکیک
میکند. این
گزینه
منسوخ شده
است. لطفاً
برای
دایرکتوریهای
-I پیش از -I-
از -iquote
استفاده
کرده و
گزینه -I- را
حذف نمایید.
هر دایرکتوری مشخصشده با گزینههای -I پیش از -I- فقط برای سرایندهای درخواستشده با "#include "file"" جستجو میشود؛ آنها برای "#include <file>" جستجو نمیشوند. اگر دایرکتوریهای بیشتری با گزینههای -I پس از -I- مشخص شوند، آن دایرکتوریها برای همه دستورهای #include جستجو خواهند شد.
علاوه بر این، -I- مانع از استفاده از دایرکتوریِ فایل فعلی به عنوان اولین دایرکتوری جستجو برای "#include "file"" میشود. هیچ راهی برای باطل کردن این اثر -I- وجود ندارد.
- -iprefix prefix
- عبارت prefix را به عنوان پیشوند برای گزینههای بعدی -iwithprefix مشخص میکند. اگر این پیشوند نمایانگر یک دایرکتوری باشد، باید اسلش پایانی / را نیز بگنجانید.
- -iwithprefix dir
- -iwithprefixbefore dir
- dir را به پیشوندی که پیشتر با -iprefix مشخص شده الحاق میکند و دایرکتوری حاصل را به مسیر جستجوی include میافزاید. گزینه -iwithprefixbefore آن را در همان جایی قرار میدهد که -I قرار میداد؛ گزینه -iwithprefix آن را در جایی قرار میدهد که -idirafter قرار میداد.
- -isysroot dir
- این گزینه شبیه به گزینه --sysroot است، اما تنها برای فایلهای سرایند اعمال میشود (به جز در مقصدهای Darwin، که در آنجا هم برای فایلهای سرایند و هم کتابخانهها اعمال میگردد). برای اطلاعات بیشتر، گزینه --sysroot را ببینید.
- -imultilib dir
- از dir به عنوان یک زیردایرکتوری از دایرکتوریِ حاوی سرایندهای ++C مختص مقصد استفاده میکند.
- -nostdinc
- دایرکتوریهای استاندارد سیستم را برای فایلهای سرایند جستجو نمیکند. تنها دایرکتوریهایی جستجو میشوند که به طور صریح با گزینههای -I، -iquote، -isystem و/یا -idirafter مشخص شدهاند (و در صورت لزوم، دایرکتوری فایل فعلی).
- -nostdinc++
- فایلهای
سرایند را
در
دایرکتوریهای
استاندارد
مختص ++C
جستجو
نمیکند،
اما سایر
دایرکتوریهای
استاندارد
را همچنان
جستجو
میکند.
(این گزینه
هنگام ساخت
کتابخانه ++C
استفاده
میشود.).IP
--embed-dir=dir 4
دایرکتوری
dir را به
فهرست
دایرکتوریهای
مورد جستجو
برای دستور
پیشپردازندهٔ
"#embed" یا
ماکروی
"__has_embed"
اضافه
میکند. هیچ
دایرکتوری
پیشفرضی
برای
"#embed"
وجود ندارد.
اگر dir با = یا $SYSROOT آغاز شود، آنگاه = یا $SYSROOT با پیشوند sysroot جایگزین میشود؛ گزینههای --sysroot و -isysroot را ببینید.
- -iplugindir=dir
- دایرکتوریِ مورد جستجو برای افزایههایی (plugins) را مشخص میکند که به جای -fplugin=path/name.so از طریق -fplugin=name ارسال میشوند. این گزینه برای استفاده توسط کاربر در نظر گرفته نشده است، بلکه تنها توسط گرداننده (driver) ارسال میشود.
- -Ldir
- دایرکتوری dir را به فهرست دایرکتوریهای مورد جستجو برای -l اضافه میکند.
- -Bprefix
- این گزینه
مشخص
میکند که
فایلهای
اجرایی،
کتابخانهها،
فایلهای
سرایند (include) و
فایلهای
دادهایِ
خودِ
کامپایلر
در کجا پیدا
شوند.
برنامهٔ گردانندهٔ کامپایلر یک یا چند زیربرنامه از میان cpp، cc1، as و ld را اجرا میکند. این برنامه prefix را به عنوان پیشوند برای هر برنامهای که اجرا میکند، هم با و هم بدون machine/version/ برای ماشین هدف و نسخهٔ کامپایلر مربوطه میآزماید.
برای هر زیربرنامهای که باید اجرا شود، گردانندهٔ کامپایلر ابتدا پیشوند -B را (در صورت وجود) امتحان میکند. اگر آن نام پیدا نشود، یا اگر -B مشخص نشده باشد، گرداننده دو پیشوند استاندارد /usr/lib/gcc/ و /usr/local/lib/gcc/ را امتحان میکند. اگر هیچیک از آنها به نام فایلی که پیدا شود ختم نشود، نام دستنخوردهٔ برنامه با استفاده از دایرکتوریهای مشخصشده در متغیر محیطی PATH شما جستجو میشود.
کامپایلر بررسی میکند که آیا مسیر ارائهشده توسط -B به یک دایرکتوری اشاره دارد یا خیر، و در صورت لزوم نویسهٔ جداکنندهٔ دایرکتوری را به انتهای مسیر میافزاید.
پیشوندهای -B که عملاً نام دایرکتوریها را مشخص میکنند، بر روی کتابخانهها در پیونددهنده (linker) نیز اعمال میشوند، زیرا کامپایلر این گزینهها را به گزینههای -L برای پیونددهنده ترجمه میکند. آنها همچنین بر روی فایلهای سرایند در پیشپردازنده اعمال میشوند، زیرا کامپایلر این گزینهها را به گزینههای -isystem برای پیشپردازنده ترجمه میکند. در این حالت، کامپایلر include را به انتهای پیشوند الحاق میکند.
فایل پشتیبانی زمان اجرای libgcc.a نیز میتواند در صورت نیاز با استفاده از پیشوند -B جستجو شود. اگر در آنجا یافت نشد، دو پیشوند استاندارد فوق آزمایش میشوند و تمام. اگر این فایل از آن طریقها پیدا نشود، از فرآیند پیوند کنار گذاشته میشود.
روش دیگر برای مشخص کردن پیشوندی بسیار شبیه به پیشوند -B، استفاده از متغیر محیطی GCC_EXEC_PREFIX است.
به عنوان یک راهکار موقت و ویژه (kludge)، اگر مسیر ارائهشده توسط -B به صورت [dir/]stageN/ باشد، که در آن N عددی در محدودهٔ 0 تا 9 است، آنگاه با [dir/]include جایگزین میشود. این ویژگی برای کمک به خودراهاندازی (boot-strapping) کامپایلر است.
- -no-canonical-prefixes
- هنگام ایجاد یک پیشوند نسبی، هیچ پیوند نمادینی را باز نکند، ارجاعات به /../ یا /./ را حلوفصل ننماید، و مسیر را به مسیر مطلق تبدیل نکند.
- --sysroot=dir
- از dir به
عنوان
دایرکتوری
ریشهٔ
منطقی برای
سرایندها و
کتابخانهها
استفاده
میکند.
برای مثال،
اگر
کامپایلر
به طور
معمول
سرایندها
را در /usr/include و
کتابخانهها
را در /usr/lib
جستجو کند،
به جای آن
dir/usr/include و dir/usr/lib را
جستجو
میکند.
اگر هم از این گزینه و هم از گزینهٔ -isysroot استفاده کنید، آنگاه گزینهٔ --sysroot بر روی کتابخانهها اعمال میشود، اما گزینهٔ -isysroot بر روی فایلهای سرایند اعمال میگردد.
پیونددهندهٔ GNU (با شروع از نسخهٔ 2.16) از پشتیبانی لازم برای این گزینه برخوردار است. اگر پیونددهندهٔ شما از این گزینه پشتیبانی نکند، بخش مربوط به فایلهای سرایند در --sysroot همچنان کار میکند، اما بخش مربوط به کتابخانهها کار نخواهد کرد.
- --no-sysroot-suffix
- برای برخی هدفها، بسته به گزینههای دیگری که استفاده شده است، پسوندی به دایرکتوری ریشهٔ مشخصشده با --sysroot اضافه میشود، به گونهای که سرایندها برای مثال ممکن است به جای dir/usr/include در dir/suffix/usr/include پیدا شوند. این گزینه اضافه شدن چنین پسوندی را غیرفعال میکند..SS "گزینههای مربوط به قراردادهای تولید کد (Options for Code Generation Conventions)" این گزینههای مستقل از ماشین، قراردادهای واسط بهکاررفته در تولید کد را کنترل میکنند.
بیشتر آنها هم دارای شکل مثبت و هم شکل منفی هستند؛ شکل منفی -ffoo بهصورت -fno-foo است. در جدول زیر، تنها یکی از شکلها فهرست شده است---شکلی که پیشفرض نیست. شما میتوانید شکل دیگر را با حذف no- یا اضافه کردن آن مشخص کنید.
- -fstack-reuse=reuse-level
- این گزینه
استفادهٔ
مجدد از
فضای پشته
را برای
متغیرهای
محلی/اتوماتیک
تعریفشده
توسط کاربر
و متغیرهای
موقت
تولیدشده
توسط
کامپایلر
کنترل
میکند. reuse_level
میتواند
all، named_vars یا none
باشد. مقدار
all
استفادهٔ
مجدد از
پشته را
برای تمام
متغیرهای
محلی و
متغیرهای
موقت فعال
میکند، named_vars
استفادهٔ
مجدد را
تنها برای
متغیرهای
محلی
نامدار
تعریفشده
توسط کاربر
فعال
میسازد، و
none
استفادهٔ
مجدد از
پشته را
بهطور
کامل
غیرفعال
میکند.
مقدار
پیشفرض all
است. این
گزینه
زمانی مورد
نیاز است که
برنامه طول
عمر یک
متغیر محلی
دارای حوزه
یا یک شیء
موقت
تولیدشده
توسط
کامپایلر
را فراتر از
نقطهٔ
پایان
تعریفشده
توسط زبان
گسترش دهد.
هنگامی که
طول عمر یک
متغیر به
پایان
میرسد، در
صورتی که
متغیر در
حافظه مقیم
باشد،
کامپایلر
بهینهساز
این آزادی
را دارد که
از فضای
پشتهٔ آن
برای
متغیرهای
موقت دیگر
یا
متغیرهای
محلی درون
حوزهای که
بازهٔ حیات
آنها با آن
همپوشانی
ندارد،
مجدداً
استفاده
کند. کدهای
قدیمی (legacy) که
طول عمر
متغیرهای
محلی را
گسترش
میدهند،
احتمالاً
با
بهینهسازی
استفادهٔ
مجدد از
پشته دچار
شکست
میشوند.
به عنوان مثال،
int *p; { int local1; p = &local1; local1 = 10; .... } { int local2; local2 = 20; ... } if (*p == 10) // out of scope use of local1 { }مثالی دیگر:
struct A { A(int k) : i(k), j(k) { } int i; int j; }; A *ap; void foo(const A& ar) { ap = &ar; } void bar() { foo(A(10)); // temp object's lifetime ends when foo returns { A a(20); .... } ap->i+= 10; // ap references out of scope temp whose space // is reused with a. What is the value of ap->i? }طول عمر یک شیء موقت تولیدشده توسط کامپایلر بهخوبی در استاندارد ++C تعریف شده است. هنگامی که طول عمر یک شیء موقت به پایان میرسد، اگر شیء موقت در حافظه مقیم باشد، کامپایلر بهینهساز این آزادی را دارد که از فضای پشتهٔ آن برای اشیاء موقت دیگر یا متغیرهای محلی درون حوزهای که دامنهٔ حیات آنها همپوشانی ندارد، دوباره استفاده کند. با این حال، از آنجا که برخی از کدهای قدیمی به رفتار کامپایلرهای قدیمیتر وابسته هستند که در آنها فضای پشتهٔ متغیرهای موقت بازیافت نمیشد، استفادهٔ مجدد تهاجمی از پشته میتواند به خطاهای زمان اجرا منجر شود. این گزینه برای کنترل بهینهسازی استفادهٔ مجدد از پشته برای متغیرهای موقت استفاده میشود.
- -ftrapv
- این گزینه برای سرریز علامتدار در عملیات جمع، تفریق و ضرب تله (trap) تولید میکند. گزینههای -ftrapv و -fwrapv یکدیگر را لغو (override) میکنند؛ بنابراین، استفاده از -ftrapv -fwrapv در خط فرمان منجر به اعمال -fwrapv میشود. توجه داشته باشید که تنها گزینههای فعال یکدیگر را لغو میکنند، بنابراین استفاده از -ftrapv -fwrapv -fno-wrapv در خط فرمان منجر به اعمال -ftrapv خواهد شد.
- -fwrapv
- این گزینه به کامپایلر دستور میدهد فرض کند که سرریز محاسبات علامتدار در جمع، تفریق و ضرب با استفاده از نمایش مکمل دو (twos-complement) بهصورت چرخشی (wrap around) رفتار میکند. این پرچم برخی بهینهسازیها را فعال و برخی دیگر را غیرفعال میکند. گزینههای -ftrapv و -fwrapv یکدیگر را لغو میکنند؛ بنابراین، استفاده از -ftrapv -fwrapv در خط فرمان منجر به اعمال -fwrapv میشود. توجه داشته باشید که تنها گزینههای فعال یکدیگر را لغو میکنند، بنابراین استفاده از -ftrapv -fwrapv -fno-wrapv در خط فرمان منجر به اعمال -ftrapv خواهد شد.
- -fwrapv-pointer
- این گزینه به کامپایلر دستور میدهد فرض کند که سرریز محاسبات اشارهگر در جمع و تفریق با استفاده از نمایش مکمل دو بهصورت چرخشی رفتار میکند. این پرچم برخی بهینهسازیها را که فرض میکنند سرریز اشارهگر نامعتبر است غیرفعال میکند.
- -fstrict-overflow
- این گزینه به معنی اعمال -fno-wrapv -fno-wrapv-pointer است و در صورت منفی شدن، به معنی اعمال -fwrapv -fwrapv-pointer خواهد بود.
- -fexceptions
- مدیریت استثناها (exception handling) را فعال میکند. این گزینه کدهای اضافی مورد نیاز برای انتشار استثناها را تولید میکند. برای برخی اهداف، این امر موجب میشود که GCC اطلاعات بازپیچی فریم (frame unwind information) را برای تمام توابع تولید کند که میتواند سربار اندازهٔ دادهٔ قابلتوجهی به همراه داشته باشد، اگرچه تأثیری بر اجرا نمیگذارد. اگر این گزینه را تعیین نکنید، GCC بهطور پیشفرض آن را برای زبانهایی مانند ++C که معمولاً به مدیریت استثنا نیاز دارند فعال، و برای زبانهایی مانند C که معمولاً به آن نیازی ندارند غیرفعال میکند. با این حال، ممکن است هنگام کامپایل کد C که باید بهدرستی با گردانندههای استثنای نوشتهشده در ++C تعامل داشته باشد، به فعال کردن این گزینه نیاز پیدا کنید. همچنین اگر در حال کامپایل برنامههای قدیمیتر ++C هستید که از مدیریت استثنا استفاده نمیکنند، ممکن است مایل به غیرفعال کردن این گزینه باشید.
- -fnon-call-exceptions
- کدی تولید میکند که به دستورالعملهای تلهانداز اجازهٔ پرتاب استثناها را میدهد. توجه داشته باشید که این به پشتیبانی زمان اجرای مختص هر بستر نیاز دارد که در همه جا وجود ندارد. علاوه بر این، تنها به دستورالعملهای تلهانداز اجازه میدهد استثنا پرتاب کنند، یعنی ارجاعات حافظه یا دستورالعملهای ممیز شناور. این گزینه اجازه نمیدهد استثناها از گردانندههای سیگنال دلخواه مانند "SIGALRM" پرتاب شوند. این گزینه -fexceptions را فعال میکند.
- -fdelete-dead-exceptions
- در نظر میگیرد که دستورالعملهایی که ممکن است استثنا پرتاب کنند اما در غیر این صورت نقشی در اجرای برنامه ندارند، میتوانند از طریق بهینهسازی حذف شوند. این امر بر فراخوانی توابع تأثیری ندارد، مگر توابعی که دارای ویژگیهای "pure" یا "const" باشند. این گزینه بهطور پیشفرض برای کامپایلرهای Ada و ++C، بر اساس مجوزی که مشخصات زبان داده است، فعال است. گذارهای بهینهسازی که باعث حذف استثناهای مرده میشوند، بهطور مستقل در سطوح بهینهسازی مختلف فعال میگردند.
- -funwind-tables
- مشابه -fexceptions است، با این تفاوت که تنها دادههای ایستای مورد نیاز را تولید میکند و به هیچ روش دیگری بر کد تولیدشده تأثیر نمیگذارد. شما معمولاً نیازی به فعال کردن این گزینه ندارید؛ در عوض، پردازشگر زبانی که به این پردازش نیاز دارد، آن را از جانب شما فعال میکند.
- -fasynchronous-unwind-tables
- در صورت پشتیبانی توسط ماشین مقصد، جدول بازپیچی را در قالب DWARF تولید میکند. این جدول در هر مرز دستورالعمل دقیق است، بنابراین میتواند برای بازپیچی پشته از رویدادهای ناهمگام (مانند اشکالزدا یا زبالهروب) استفاده شود.
- -fno-gnu-unique
- در سیستمهایی با اسمبلر GNU و کتابخانهٔ C جدید، کامپایلر ++C از پیوند "STB_GNU_UNIQUE" استفاده میکند تا اطمینان یابد که تعاریف اعضای دادهای ایستای الگو و متغیرهای محلی ایستا در توابع درونخطی حتی در حضور "RTLD_LOCAL" یکتا هستند؛ این امر برای جلوگیری از بروز مشکل در کتابخانهای که توسط دو افزونهٔ "RTLD_LOCAL" مختلف استفاده میشود و وابسته به تعریفی در یکی از آنهاست و در نتیجه با دیگری دربارهٔ پیوند نماد اختلاف دارد، ضروری است. اما این باعث نادیده گرفته شدن "dlclose" برای اشیاء اشتراکی پویای (DSO) متأثر میشود؛ اگر برنامهٔ شما به مقداردهی اولیهٔ مجدد یک DSO از طریق "dlclose" و "dlopen" وابسته است، میتوانید از -fno-gnu-unique استفاده کنید.
- -fpcc-struct-return
- مقادیر
«کوتاه»
"struct" و
"union" را
مانند
مقادیر
طولانیتر
به جای
ثباتها در
حافظه
برمیگرداند.
این
قرارداد
کارایی
کمتری
دارد، اما
این مزیت را
داراست که
امکان
فراخوانی
متقابل
میان
فایلهای
کامپایلشده
با GCC و
فایلهای
کامپایلشده
با سایر
کامپایلرها،
بهویژه Portable C
Compiler (pcc) را فراهم
میکند.
قرارداد دقیق برای بازگرداندن ساختارها در حافظه به ماکروهای پیکربندی مقصد وابسته است.
ساختارها و اجتماعات کوتاه آنهایی هستند که اندازه و همترازی آنها با اندازهها و همترازی یکی از انواع عدد صحیح مطابقت دارد.
هشدار: کدی که با سوییچ -fpcc-struct-return کامپایل شده است، از نظر دودویی با کدی که با سوییچ -freg-struct-return کامپایل شده سازگار نیست. از آن برای انطباق با یک رابط باینری کاربردی (ABI) غیرپیشفرض استفاده کنید..IP -freg-struct-return 4 در صورت امکان، مقادیر "struct" و "union" را در ثباتها (registers) بازمیگرداند. این روش برای ساختارهای کوچک، کارآمدتر از -fpcc-struct-return است.
اگر نه -fpcc-struct-return و نه -freg-struct-return را مشخص کنید، GCC به قراردادی که برای معماری مقصد استاندارد است، پیشفرض میشود. اگر قرارداد استانداردی وجود نداشته باشد، GCC به -fpcc-struct-return پیشفرض خواهد شد، مگر در مقصدهایی که GCC کامپایلر اصلی است. در آن موارد، میتوانیم استاندارد را انتخاب کنیم و گزینه کارآمدتر بازگرداندن از طریق ثبات را انتخاب کردهایم.
هشدار: کدی که با سوییچ -freg-struct-return کامپایل شده است با کدی که با سوییچ -fpcc-struct-return کامپایل شده، سازگاری باینری ندارد. از آن برای سازگاری با یک رابط دودویی کاربردی (ABI) غیرپیشفرض استفاده کنید.
- -fshort-enums
- به یک نوع
"enum" فقط
به همان
تعداد
بایتی که
برای
محدوده
مقادیر
اعلامشدهاش
نیاز دارد،
فضا اختصاص
میدهد.
بهطور
مشخص، نوع
"enum"
معادل
کوچکترین
نوع عدد
صحیحی
خواهد بود
که فضای
کافی داشته
باشد. این
گزینه برای
یک نوع
شمارشی با
نوع
پایهای
ثابت (fixed underlying type)
هیچ تاثیری
ندارد.
هشدار: سوییچ -fshort-enums باعث میشود GCC کدی تولید کند که با کد تولیدشده بدون این سوییچ سازگاری باینری ندارد. از آن برای سازگاری با یک رابط دودویی کاربردی (ABI) غیرپیشفرض استفاده کنید.
- -fshort-wchar
- نوع
پایهای
"wchar_t" را
بازنویسی
کرده و آن
را بهجای
پیشفرض
سیستم
مقصد،
برابر با
"short unsigned int"
قرار
میدهد. این
گزینه برای
ساخت
برنامههایی
که قرار است
تحت WINE اجرا
شوند مفید
است.
هشدار: سوییچ -fshort-wchar باعث میشود GCC کدی تولید کند که با کد تولیدشده بدون این سوییچ سازگاری باینری ندارد. از آن برای سازگاری با یک رابط دودویی کاربردی (ABI) غیرپیشفرض استفاده کنید.
- -fcommon
- در کد C، این
گزینه
جایگذاری
متغیرهای
سراسری
تعریفشده
بدون مقدار
اولیهساز،
موسوم به tentative
definitions
(تعریفهای
موقت) در
استاندارد C
را کنترل
میکند.
تعریفهای
موقت
متمایز از
اعلانهای
متغیر با
کلیدواژه
"extern"
هستند که
هیچ فضایی
تخصیص
نمیدهند.
حالت پیشفرض -fno-common است که مشخص میکند کامپایلر متغیرهای سراسری مقداردهینشده را در بخش BSS از فایل شیء قرار دهد. این کار مانع از ادغام تعریفهای موقت توسط پیونددهنده میشود، بنابراین اگر یک متغیر بهطور تصادفی در بیش از یک واحد کامپایل تعریف شده باشد، خطای چندباره تعریفشدن (multiple-definition) دریافت میکنید.
گزینه -fcommon متغیرهای سراسری مقداردهینشده را در یک بلوک مشترک (common block) قرار میدهد. این به پیونددهنده اجازه میدهد تمام تعریفهای موقت یک متغیر یکسان در واحدهای کامپایل مختلف را به یک شیء واحد یا به یک تعریف غیرموقت پیوند دهد. این رفتار با C++ ناسازگار است و در بسیاری از معماریهای مقصد جریمههایی بر سرعت و اندازه کد در ارجاع به متغیرهای سراسری تحمیل میکند. کاربرد اصلی آن، امکانپذیر ساختن پیوند دادن کدهای قدیمی (legacy) بدون خطا است.
- -fno-ident
- دستورالعمل "#ident" را نادیده میگیرد.
- -finhibit-size-directive
- دستورالعمل اسمبلی ".size" یا هر چیز دیگری را که در صورت نصف شدن تابع در میانه و قرار گرفتن دو نیمه آن در مکانهای دور از هم در حافظه مشکل ایجاد میکند، تولید نمیکند. این گزینه هنگام کامپایل crtstuff.c استفاده میشود؛ نباید برای هیچ کاربرد دیگری به آن نیاز پیدا کنید.
- -fverbose-asm
- اطلاعات
تفسیری
اضافی در کد
اسمبلی
تولیدشده
قرار
میدهد تا
خوانایی آن
بیشتر شود.
این گزینه
عموماً فقط
برای کسانی
مفید است که
واقعاً به
خواندن کد
اسمبلی
تولیدشده
نیاز دارند
(احتمالاً
هنگام
اشکالزدایی
خود
کامپایلر).
گزینه پیشفرض، -fno-verbose-asm، باعث حذف اطلاعات اضافی میشود و هنگام مقایسه دو فایل اسمبلی مفید است.
توضیحات اضافهشده شامل موارد زیر است:
- اطلاعات مربوط به نسخه کامپایلر و گزینههای خط فرمان،
- خطوط کد منبع مرتبط با دستورالعملهای اسمبلی، در قالب FILENAME:LINENUMBER:CONTENT OF LINE،
- نکاتی درباره اینکه کدام عبارات سطح بالا با عملوندهای مختلف دستورالعمل اسمبلی مطابقت دارند.
برای نمونه، با این فایل منبع C:
int test (int n)
{
int i;
int total = 0;
for (i = 0; i < n; i++)
total += i * i;
return total;
}
کامپایل به اسمبلی (x86_64) از طریق -S و ارسال مستقیم نتیجه به stdout با -o -
gcc -S test.c -fverbose-asm -Os -o -
خروجیای مشابه این تولید میکند:
.file "test.c"
# GNU C11 (GCC) version 7.0.0 20160809 (experimental) (x86_64-pc-linux-gnu)
[...snip...]
# options passed:
[...snip...]
.text
.globl test
.type test, @function
test:
.LFB0:
.cfi_startproc
# test.c:4: int total = 0;
xorl %eax, %eax # <retval>
# test.c:6: for (i = 0; i < n; i++)
xorl %edx, %edx # i
.L2:
# test.c:6: for (i = 0; i < n; i++)
cmpl %edi, %edx # n, i
jge .L5 #,
# test.c:7: total += i * i;
movl %edx, %ecx # i, tmp92
imull %edx, %ecx # i, tmp92
# test.c:6: for (i = 0; i < n; i++)
incl %edx # i
# test.c:7: total += i * i;
addl %ecx, %eax # tmp92, <retval>
jmp .L2 #
.L5:
# test.c:10: }
ret
.cfi_endproc
.LFE0:
.size test, .-test
.ident "GCC: (GNU) 7.0.0 20160809 (experimental)"
.section .note.GNU-stack,"",@progbits
این توضیحات برای انسانها در نظر گرفته شدهاند نه ماشینها، و بنابراین فرمت دقیق آنها ممکن است تغییر کند.
- -frecord-gcc-switches
- این سوییچ باعث میشود خط فرمانی که برای فراخوانی کامپایلر استفاده شده است، در فایل شیء در حال ساخت ضبط و ذخیره شود. این سوییچ تنها روی برخی از معماریهای مقصد پیادهسازی شده است و قالب دقیق ذخیرهسازی به معماری مقصد و قالب فایل باینری بستگی دارد، اما معمولاً به شکل بخشی حاوی متن ASCII است. این سوییچ با سوییچ -fverbose-asm مرتبط است، اما آن سوییچ اطلاعات را فقط بهعنوان توضیح در فایل خروجی اسمبلی ثبت میکند، بنابراین هرگز به فایل شیء راه پیدا نمیکند. همچنین برای روش دیگری جهت ذخیره گزینههای کامپایلر در فایل شیء، -grecord-gcc-switches را ببینید.
- -fpic
- کد مستقل از
موقعیت (PIC)
مناسب برای
استفاده در
یک
کتابخانه
مشترک را در
صورت
پشتیبانی
توسط ماشین
مقصد تولید
میکند.
چنین کدی به
تمام
آدرسهای
ثابت از
طریق یک
جدول افست
سراسری (GOT)
دسترسی
پیدا
میکند.
بارگذار
پویا در
زمان شروع
برنامه،
مدخلهای GOT
را حل
میکند
(بارگذار
پویا بخشی
از GCC نیست؛
بلکه بخشی
از
سیستمعامل
است). اگر
اندازه GOT
برای فایل
اجرایی
پیوند داده
شده از
بیشینه
مقدار
مشخصشده
برای آن
ماشین
فراتر رود،
پیامی از
طرف
پیونددهنده
دریافت
میکنید که
نشان
میدهد -fpic
کار
نمیکند؛
در این
حالت،
بهجای آن
با -fPIC
بازکامپایل
کنید. (این
مقادیر
بیشینه در SPARC
برابر با 8k،
در AArch64 برابر
با 28k و در m68k و RS/6000
برابر با 32k
است. معماری
x86 چنین
محدودیتی
ندارد.)
کد مستقل از موقعیت به پشتیبانی ویژهای نیاز دارد، و بنابراین فقط روی ماشینهای خاصی کار میکند. برای x86، کامپایلر GCC از PIC برای System V پشتیبانی میکند اما برای Sun 386i پشتیبانی نمیکند. کد تولیدشده برای IBM RS/6000 همیشه مستقل از موقعیت است.
هنگامی که این پرچم تنظیم شود، ماکروهای "__pic__" و "__PIC__" با مقدار 1 تعریف میشوند..IP -fPIC 4 در صورت پشتیبانی توسط ماشین مقصد، کد مستقل از موقعیت (position-independent) مناسب برای پیوند پویا و بدون محدودیت روی اندازه جدول آفست سراسری (GOT) تولید میکند. این گزینه در AArch64، m68k، PowerPC و SPARC تفاوت ایجاد میکند.
کد مستقل از موقعیت نیازمند پشتیبانی ویژهای است، و بنابراین فقط روی ماشینهای خاصی کار میکند.
هنگامی که این پرچم تنظیم شود، ماکروهای "__pic__" و "__PIC__" با مقدار 2 تعریف میشوند.
- -fpie
- -fPIE
- این
گزینهها
مشابه -fpic و
-fPIC هستند،
اما کد
مستقل از
موقعیت
تولیدشده
تنها
میتواند
در
فایلهای
اجرایی
پیوند داده
شود.
معمولاً
این
گزینهها
برای
کامپایل
کدی
استفاده
میشوند که
با استفاده
از گزینه -pie
در GCC پیوند
خواهد خورد.
هر دوی -fpie و -fPIE ماکروهای "__pie__" و "__PIE__" را تعریف میکنند. مقدار این ماکروها برای -fpie برابر 1 و برای -fPIE برابر 2 است.
- -fno-plt
- برای
فراخوانی
توابع
خارجی در کد
مستقل از
موقعیت، از
PLT استفاده
نمیکند. در
عوض، آدرس
تابع
فراخوانیشده
را در محل
فراخوانی
از GOT
بارگذاری
کرده و به
آن انشعاب
میدهد (branch).
این کار با
حذف کدهای
واسط (stubهای) PLT
و قرار دادن
بارگذاریهای
GOT در معرض
بهینهسازیها،
منجر به
تولید کد
کارآمدتر
میشود. در
معماریهایی
مانند x86
۳۲بیتی که
در آنها
استابهای
PLT انتظار
دارند
اشارهگر GOT
در یک ثبات
خاص قرار
داشته
باشد، این
کار آزادی
عمل بیشتری
در تخصیص
ثبات به
کامپایلر
میدهد.
اتصال
دیرهنگام (Lazy
binding) نیازمند
استفاده از
PLT است؛ با -fno-plt
تمام
نمادهای
خارجی در
زمان
بارگذاری
حلوفصل
میشوند.
به عنوان جایگزین، میتوان از مشخصه تابع "noplt" برای جلوگیری از فراخوانیهای مبتنی بر PLT برای توابع خارجی خاص استفاده کرد.
در کد وابسته به موقعیت، چند مقصد نیز فراخوانی توابعی را که برای عدم استفاده از PLT نشانهگذاری شدهاند، به استفاده از GOT تبدیل میکنند.
- -fno-jump-tables
- از جدولهای پرش (jump tables) برای دستورات switch استفاده نمیکند، حتی در مواردی که نسبت به سایر راهبردهای تولید کد کارآمدتر باشد. این گزینه در ترکیب با -fpic یا -fPIC برای ساخت کدی که بخشی از یک پیونددهنده پویا را تشکیل میدهد و نمیتواند به آدرس یک جدول پرش ارجاع دهد مفید است. در برخی از مقصدهای معماری، جدولهای پرش نیازی به GOT ندارند و این گزینه مورد نیاز نیست.
- -fno-bit-tests
- از آزمونهای بیتی (bit tests) برای دستورات switch استفاده نمیکند، حتی در مواردی که نسبت به سایر راهبردهای تولید کد کارآمدتر باشد.
- -ffixed-reg
- با ثبات با
نام reg
مانند یک
ثبات ثابت (fixed
register) رفتار
میکند؛ کد
تولیدشده
هرگز نباید
به آن ارجاع
دهد (مگر
احتمالاً
به عنوان
اشارهگر
پشته،
اشارهگر
فریم یا در
نقشی ثابت
از نوعی
دیگر).
reg باید نام یک ثبات باشد. نامهای ثبات قابل قبول مختص ماشین بوده و در ماکروی "REGISTER_NAMES" در فایل ماکروی توصیف ماشین تعریف شدهاند.
این پرچم شکل نقیض ندارد، زیرا یک انتخاب سهحالته را مشخص میکند.
- -fcall-used-reg
- با ثبات با
نام reg
مانند یک
ثبات قابل
تخصیص
رفتار
میکند که
توسط
فراخوانیهای
توابع
رونویسی (clobbered)
میشود.
ممکن است
این ثبات
برای
متغیرهای
موقت یا
متغیرهایی
که در طول
یک
فراخوانی
زنده
نمیمانند
تخصیص یابد.
توابعی که
با این روش
کامپایل
میشوند،
ثبات reg را
ذخیره و
بازیابی
نمیکنند.
استفاده از این پرچم برای اشارهگر فریم یا اشارهگر پشته یک خطا است. استفاده از این پرچم برای سایر ثباتها که نقشهای ثابت و فراگیری در مدل اجرای ماشین دارند، نتایج فاجعهباری به همراه خواهد داشت.
این پرچم شکل نقیض ندارد، زیرا یک انتخاب سهحالته را مشخص میکند.
- -fcall-saved-reg
- با ثبات با
نام reg
مانند یک
ثبات قابل
تخصیص که
توسط توابع
ذخیره
میشود
رفتار
میکند.
ممکن است
حتی برای
مقادیر
موقت یا
متغیرهایی
که در طول
یک
فراخوانی
زنده
میمانند
تخصیص یابد.
توابعی که
به این روش
کامپایل
میشوند،
در صورت
استفاده از
ثبات reg آن
را ذخیره و
بازیابی
میکنند.
استفاده از این پرچم برای اشارهگر فریم یا اشارهگر پشته یک خطا است. استفاده از این پرچم برای سایر ثباتها که نقشهای ثابت و فراگیری در مدل اجرای ماشین دارند، نتایج فاجعهباری به همراه خواهد داشت.
نوع متفاوتی از فاجعه از استفاده از این پرچم برای ثباتی حاصل میشود که مقادیر بازگشتی توابع ممکن است در آن قرار گیرند.
این پرچم شکل نقیض ندارد، زیرا یک انتخاب سهحالته را مشخص میکند.
- -fpack-struct[=n]
- بدون تعیین
یک مقدار،
تمام اعضای
ساختار (structure)
را بدون هیچ
فاصلهای
در کنار هم
فشرده (pack)
میکند.
هنگامی که
مقداری
مشخص شود
(که باید
توان کوچکی
از ۲ باشد)،
اعضای
ساختار را
مطابق با
این مقدار
که
نمایانگر
حداکثر
تراز (alignment) است
فشرده
میکند
(یعنی
اشیایی با
نیازمندیهای
تراز
پیشفرض
بزرگتر از
این مقدار،
به صورت
بالقوه
ترازنشده
در
نزدیکترین
مکان مناسب
قرار
میگیرند).
هشدار: گزینه -fpack-struct باعث میشود GCC کدی تولید کند که با کد تولیدشده بدون این گزینه از نظر باینری سازگار نیست. علاوه بر این، کد حاصل غیربهینه خواهد بود. از آن تنها برای مطابقت با یک رابط باینری برنامه (ABI) غیرپیشفرض استفاده کنید.
- -fleading-underscore
- این گزینه و
نقطه مقابل
آن، -fno-leading-underscore،
نحوه نمایش
نمادهای C
را در فایل
شیء (object file) به
طور اجباری
تغییر
میدهند.
یکی از
کاربردهای
آن، کمک به
پیوند با
کدهای
اسمبلی
قدیمی است.
هشدار: گزینه -fleading-underscore باعث میشود GCC کدی تولید کند که با کد تولیدشده بدون این گزینه از نظر باینری سازگار نیست. از آن برای مطابقت با یک رابط باینری برنامه غیرپیشفرض استفاده کنید. همه مقصدهای معماری پشتیبانی کاملی از این گزینه ارائه نمیدهند.
- -ftls-model=model
- مدل
ذخیرهسازی
محلی
ریسمان (TLS)
مورد
استفاده را
تغییر
میدهد.
آرگومان model
باید یکی از
global-dynamic، local-dynamic،
initial-exec یا local-exec
باشد. توجه
داشته
باشید که
این انتخاب
مشمول
بهینهسازی
است:
کامپایلر
ممکن است
برای
نمادهایی
که در خارج
از واحد
ترجمه (translation unit)
قابل
مشاهده
نیستند، یا
اگر -fpic در خط
فرمان مشخص
نشده باشد،
از مدل
کارآمدتری
استفاده
کند.
حالت پیشفرض بدون -fpic برابر با initial-exec است؛ همراه با -fpic، مقدار پیشفرض global-dynamic خواهد بود.
- -ftrampolines
- برای
مقصدهایی
که معمولاً
برای توابع
تودرتو (nested functions)
به
ترامپولینها
(trampolines) نیاز
دارند،
همیشه به
جای
استفاده از
توصیفکنندهها
(descriptors) آنها را
تولید
میکند. در
غیر این
صورت، برای
مقصدهایی
که به آنها
نیازی
ندارند،
مانند HP-PA یا
IA-64، کاری
انجام
نمیدهد.
ترامپولین قطعه کد کوچکی است که در زمان اجرا، هنگامی که آدرس یک تابع تودرتو گرفته میشود، روی پشته ایجاد میشود و برای فراخوانی غیرمستقیم تابع تودرتو به کار میرود. بنابراین، برای عملکرد صحیح برنامه نیاز است که پشته قابل اجرا (executable) باشد.
گزینه -fno-trampolines به صورت زبانبهزبان به طور پیشفرض فعال است تا به کامپایلر اجازه دهد در صورت تشخیص بیخطر بودن، از تولید آنها خودداری کند و آنها را با توصیفکنندهها جایگزین سازد. توصیفکنندهها تنها از داده تشکیل شدهاند، اما کد تولیدشده باید برای کار با آنها آماده باشد. تا زمان نگارش این متن، -fno-trampolines فقط برای زبان Ada به صورت پیشفرض فعال است.
علاوه بر این، در صورت وجود توابع تودرتو، کد کامپایلشده با -ftrampolines و کد کامپایلشده با -fno-trampolines از نظر باینری با یکدیگر سازگار نیستند. بنابراین این گزینه باید در سطح کل برنامه استفاده شود و با احتیاط بسیار به کار رود.
برای زبانهایی غیر از Ada، گزینههای "-ftrampolines" و "-fno-trampolines" در حال حاضر هیچ اثری ندارند و روی پلتفرمهایی که برای توابع تودرتو به ترامپولینها نیاز دارند، ترامپولینها همیشه تولید میشوند.
- -ftrampoline-impl=[stack|heap]
- بهطور پیشفرض، ترامپولینها روی پشته تولید میشوند. با این حال، برخی از پلتفرمها (مانند Apple M1) اجازه پشته قابل اجرا را نمیدهند. کامپایل با -ftrampoline-impl=heap فراخوانیهایی به "__gcc_nested_func_ptr_created" و "__gcc_nested_func_ptr_deleted" ایجاد میکند تا فضای ترامپولین را روی هیپ قابل اجرا تخصیص داده و آزاد کند. این توابع در libgcc پیادهسازی شدهاند و فقط در مقصدهای خاصی ارائه میشوند: x86_64 Darwin، و x86_64 و aarch64 Linux. توجه داشته باشید: در صورتی که از "setjmp" استفاده کنید، توابع تودرتو را نمونهسازی نمایید، و سپس با "longjmp" به حالتی قبل از تخصیص آن توابع تودرتو برگردید، تضمینی وجود ندارد که ترامپولینهای هیپ به درستی آزاد شوند.
- -fvisibility=[default|internal|hidden|protected]
- دیداریپذیری
پیشفرض
نمادهای
تصویر ELF را
روی گزینه
مشخصشده
تنظیم
میکند---تمام
نمادها با
این مشخصه
علامتگذاری
میشوند
مگر اینکه
در داخل کد
لغو شده
باشند.
استفاده از
این ویژگی
میتواند
زمان پیوند
و بارگذاری
کتابخانههای
شیء
اشتراکی (shared object)
را به طور
چشمگیری
بهبود
بخشد، کد
بهینهتری
تولید کند،
صدور API
تقریباً
بینقصی
ارائه دهد و
از تداخل
نمادها
جلوگیری
کند.
اکیداً
توصیه
میشود که
در تمام
اشیاء
اشتراکی که
توزیع
میکنید از
این گزینه
استفاده
نمایید.
علیرغم نامگذاری، default همیشه به معنای عمومی (public) است؛ یعنی برای پیوند از خارج از شیء اشتراکی در دسترس است. گزینههای protected و internal در عمل چندان کاربردی ندارند، بنابراین تنها گزینه پرکاربرد دیگر hidden است. اگر -fvisibility مشخص نشده باشد، حالت پیشفرض default است، یعنی تمام نمادها عمومی میشوند.
توضیح خوبی درباره مزایای حاصل از اطمینان از داشتن دیداریپذیری صحیح نمادهای ELF در «How To Write Shared Libraries» نوشته Ulrich Drepper (که در https://www.akkadia.org/drepper قابل یافتن است) ارائه شده است---با این حال، راهحل برتری که این گزینه فراهم میکند، به جای مخفی کردن موارد در حالی که پیشفرض عمومی است، این است که پیشفرض را مخفی (hidden) کرده و موارد را عمومی (public) نشانهگذاری کنید. این امر در DLLها در ویندوز معمول است و با -fvisibility=hidden و "__attribute__ ((visibility("default")))" به جای "__declspec(dllexport)" تقریباً همان معناشناسی را با نحوی یکسان به دست میآورید. این امر موهبت بزرگی برای کسانی است که روی پروژههای چندسکویی کار میکنند.
برای کسانی که پشتیبانی از دیداریپذیری را به کدهای موجود اضافه میکنند، دستور "#pragma GCC visibility" میتواند مفید باشد. نحوه عملکرد آن به این صورت است که اعلانهایی را که میخواهید دیداریپذیری آنها را تنظیم کنید (برای مثال) بین "#pragma GCC visibility push(hidden)" و "#pragma GCC visibility pop" قرار میدهید. به یاد داشته باشید که دیداریپذیری نمادها باید به عنوان بخشی از قرارداد رابط API در نظر گرفته شود و بنابراین تمام کدهای جدید باید همیشه در صورتی که دیداریپذیری غیرپیشفرض است آن را مشخص کنند؛ یعنی اعلانهایی که صرفاً برای استفاده در DSO محلی هستند، همیشه باید صراحتاً به عنوان hidden علامتگذاری شوند تا از سربار ارجاع غیرمستقیم PLT جلوگیری شود---شفافسازی کامل این موضوع همچنین به خوانایی و خودسندسازی کد کمک میکند. توجه داشته باشید که با توجه به الزامات استاندارد ISO C++، عملگرهای "operator new" و "operator delete" همیشه باید دارای دیداریپذیری default باشند.
آگاه باشید که هدرهای خارج از پروژه شما، به ویژه هدرهای سیستمی و هدرهای هر کتابخانه دیگری که استفاده میکنید، ممکن است انتظار نداشته باشند با دیداریپذیری غیر از پیشفرض کامپایل شوند. ممکن است لازم باشد پیش از گنجاندن چنین هدرهایی صراحتاً از "#pragma GCC visibility push(default)" استفاده کنید.
اعلانهای "extern" تحت تأثیر -fvisibility قرار نمیگیرند، بنابراین بسیاری از کدها را میتوان بدون تغییر مجدداً با -fvisibility=hidden کامپایل کرد. با این حال، این بدان معناست که فراخوانی توابع "extern" بدون دیداریپذیری صریح از PLT استفاده میکند، بنابراین مؤثرتر است که از "__attribute ((visibility))" و/یا "#pragma GCC visibility" استفاده کنید تا به کامپایلر بگویید کدام اعلانهای "extern" باید مخفی تلقی شوند.
توجه داشته باشید که -fvisibility بر موجودیتهای پیوند مبهم (vague linkage) در C++ تأثیر میگذارد. این بدان معناست که برای نمونه، یک کلاس استثنا که بین چند DSO پرتاب (throw) میشود باید صراحتاً با دیداریپذیری default علامتگذاری شود تا گرههای type_info بین DSOها یکپارچه شوند.
مروری بر این روشها، مزایای آنها و نحوه استفاده از آنها در https://gcc.gnu.org/wiki/Visibility موجود است..IP -fstrict-volatile-bitfields 4 این گزینه زمانی باید استفاده شود که دسترسیها به فیلدهای بیتیِ فرّار (volatile bit-fields) (یا سایر فیلدهای ساختار، اگرچه کامپایلر معمولاً در هر حال آن نوعها را رعایت میکند) باید از یک دسترسی منفرد با پهنای نوعِ فیلد، در صورت امکان همتراز شده با همترازی طبیعی استفاده کنند. برای مثال، هدفهایی با ثباتهای جانبی نگاشتشده در حافظه (memory-mapped peripheral registers) ممکن است نیازمند این باشند که تمام این دسترسیها ۱۶ بیتی باشند؛ با این پرچم میتوانید تمام فیلدهای بیتیِ جانبی را بهصورت "unsigned short" اعلان کنید (با این فرض که short روی این هدفها ۱۶ بیتی است) تا GCC را مجبور کنید بهجای مثلاً یک دسترسیِ کارآمدتر ۳۲ بیتی، از دسترسیهای ۱۶ بیتی استفاده کند.
اگر این گزینه غیرفعال باشد، کامپایلر از کارآمدترین دستورالعمل استفاده میکند. در مثال قبلی، این ممکن است یک دستورالعمل بارگذاری ۳۲ بیتی باشد، حتی اگر به بایتهایی دسترسی پیدا کند که شامل هیچ بخشی از فیلد بیتی نیستند، یا ثباتهای نگاشتشده در حافظهای را در بر گیرد که ارتباطی با ثباتِ در حال بهروزرسانی ندارند.
در برخی موارد، مانند زمانی که ویژگی "packed" روی یک فیلد ساختار اعمال شده است، ممکن است دسترسی به فیلد با یک خواندن یا نوشتنِ منفرد که بهدرستی برای ماشین هدف همتراز شده باشد، امکانپذیر نباشد. در این حالت GCC بهجای کدی که در زمان اجرا دچار خطا شده یا نتیجه را کوتاه (truncate) کند، به تولید چندین دسترسی بازمیگردد.
نکته: بهدلیل محدودیتهای مدل حافظهٔ C/C++11، دسترسیهای نوشتن مجاز نیستند اعضای غیر فیلد بیتی را تغییر دهند. بنابراین توصیه میشود تمام بیتهای نوعِ فیلد را بهعنوان اعضای فیلد بیتی تعریف کنید.
مقدار پیشفرض این گزینه توسط رابط دودویی برنامه (ABI) برای پردازندهٔ هدف تعیین میشود.
- -fsync-libcalls
- این گزینه
کنترل
میکند که
آیا هرگونه
نمونهٔ
برونخط (out-of-line)
از
خانوادهٔ
توابع
"__sync"
ممکن است
برای
پیادهسازی
خانوادهٔ
توابع
"__atomic" در C++11
استفاده
شوند یا
خیر.
مقدار پیشفرض این گزینه فعال است، بنابراین تنها شکل کاربردی این گزینه -fno-sync-libcalls است. این گزینه در پیادهسازی کتابخانهٔ زمان اجرای libatomic استفاده میشود.
- -fzero-init-padding-bits=value
- مقداردهی
اولیه با
صفر را برای
بیتهای
فاصلهساز
(padding bits) در
مقداردهندههای
متغیرهای
خودکار
تضمین
میکند.
برخی
زبانها
مقداردهی
با صفر
بیتهای
فاصلهساز
را در موارد
خاصی تضمین
میکنند؛
برای
نمونه، C23
هنگام
استفاده از
مقداردهندههای
خالی
("{}")، یا C++
هنگام
استفاده از
مقداردهی
صفر، یا C
تضمین
میکند
فیلدهایی
که در
مقداردهنده
مشخص
نشدهاند،
بیتهای
فاصلهساز
آنها با
صفر
مقداردهی
اولیه
میشوند.
این گزینه
امکان
تغییر
شرایطی را
فراهم
میکند که
در آن
بیتهای
فاصلهساز
در
مقداردهندهها
تضمین
میشود با
صفر
مقداردهی
اولیه شوند.
پیشفرض
"-fzero-init-padding-bits=standard"
است، که
تضمینی
فراتر از
استاندارد
مربوطه
ارائه
نمیدهد.
برای مثال:
struct A { char a; unsigned long long b; char c; }; union B { char a; unsigned long long b; }; struct A a = {}; // C23 guarantees padding bits are zero. struct A b = { 1, 2, 3 }; // No guarantees. union B c = {}; // C23 guarantees padding bits are zero. union B d = { 1 }; // No guarantees.گزینهٔ "-fzero-init-padding-bits=unions" علاوه بر آنچه استانداردها تضمین میکنند، مقداردهی اولیه با صفر را برای بیتهای فاصلهساز در unionها تضمین میکند، در صورتی که مقداردهندهٔ union خالی باشد (که در این صورت تمام بیتهای union با صفر مقداردهی میشوند) یا اگر عضو مقداردهیشدهٔ union کوچکتر از اندازهٔ union باشد (که در این صورت صفر شدن بیتهای فاصلهساز خارج از عضو مقداردهیشده را تضمین میکند). این رفتار GCC پیش از GCC 15 بود و در مثال بالا مقداردهی اولیه با صفر آخرین "sizeof (unsigned long long) - 1" بایت را در union تضمین میکند.
گزینهٔ "-fzero-init-padding-bits=all" علاوه بر این، مقداردهی با صفر بیتهای فاصلهساز سایر دادههای تجمیعی (aggregates) را تضمین میکند؛ بنابراین فاصلهگذاری بین "b.a" و "b.b" (در صورت وجود) و فاصلهگذاری انتهایی در ساختار (در صورت وجود) با صفر مقداردهی میشوند.
گزینههای توسعهدهندگان GCC (GCC Developer Options)
این بخش گزینههای خط فرمانی را شرح میدهد که عمدتاً مورد توجه توسعهدهندگان GCC هستند، از جمله گزینههایی برای پشتیبانی از آزمایش کامپایلر و بررسی باگهای کامپایلر و مشکلات کارایی در زمان کامپایل. این موارد شامل گزینههایی است که در مراحل مختلف کامپایل رونوشتهای اشکالزدایی (debug dumps) ایجاد میکنند؛ آمارهایی مانند مصرف حافظه و زمان اجرا را چاپ میکنند؛ و اطلاعاتی دربارهٔ پیکربندی GCC، مانند مسیرهای جستجوی کتابخانهها ارائه میدهند. بهندرت پیش میآید که برای کارهای عادی کامپایل و پیونددهی به استفاده از هیچیک از این گزینهها نیاز داشته باشید.
بسیاری از گزینههای توسعهدهنده که باعث میشوند GCC خروجی را در یک فایل رونوشت (dump) بنویسد، یک پسوند اختیاری بهصورت =filename میپذیرند. میتوانید stdout یا - را برای رونوشت در خروجی استاندارد، و stderr را برای خطای استاندارد مشخص کنید.
اگر =filename حذف شود، یک نام فایل رونوشت پیشفرض با الحاق نام پایهٔ فایل رونوشت، شمارهٔ گذر (pass number)، حرف فاز (phase letter) و نام گذر ساخته میشود. نام پایهٔ فایل رونوشت، در صورتی که بهطور صریح مشخص شده باشد و یک فایل اجرایی نباشد، نام فایل خروجی تولیدشده توسط کامپایلر است؛ در غیر این صورت نام فایل منبع خواهد بود. شمارهٔ گذر بر اساس ترتیبی که گذرها در مدیر گذرهای کامپایلر ثبت میشوند تعیین میگردد. این ترتیب عموماً با ترتیب اجرا یکسان است، اما گذرهایی که توسط افزونهها ثبت میشوند، گذرهای مختص هدف، یا گذرهایی که به هر شکل دیرتر ثبت میشوند، شمارهای بالاتر از گذر با نام final دریافت میکنند، حتی اگر زودتر اجرا شوند. حرف فاز یکی از موارد i (تحلیل بینرویهای)، l (مختص زبان)، r (RTL) یا t (درخت) است. فایلها در دایرکتوری فایل خروجی ایجاد میشوند.
- -fcallgraph-info
- -fcallgraph-info=MARKERS
- باعث
میشود
کامپایلر
اطلاعات
گراف
فراخوانی
(callgraph) را برای
برنامه،
بهازای هر
فایل شیء
خروجی دهد.
این
اطلاعات در
قالب رایج VCG
تولید
میشود. در
صورتی که
فهرستی از
نشانگرهای
جداشده با
کاما نیز
مشخص شود،
میتوان آن
را با
اطلاعات
اضافی
بهازای هر
گره یا
بهازای هر
یال آراست.
هنگامی که
نشانگر
"su" مشخص
شود، گراف
فراخوانی
با اطلاعات
میزان مصرف
پشته
آراسته
میشود؛
این حالت
معادل -fstack-usage
است. هنگامی
که نشانگر
"da" مشخص
شود، گراف
فراخوانی
با اطلاعات
مربوط به
شیءهای
تخصیصیافته
بهصورت
پویا
آراسته
میشود.
هنگام کامپایل با -flto، هیچ اطلاعات گراف فراخوانی به همراه فایل شیء خروجی داده نمیشود. در زمان پیوند LTO، گزینهٔ -fcallgraph-info ممکن است چندین فایل اطلاعات گراف فراخوانی را در کنار فایلهای خروجی واسط LTO تولید کند.
- -dletters
- -fdump-rtl-pass
- -fdump-rtl-pass=filename
- مشخص
میکند که
در حین
کامپایل و
در
زمانهایی
که توسط letters
تعیین شده
است،
رونوشتهای
اشکالزدایی
ایجاد شوند.
این گزینه
برای
اشکالزدایی
گذرهای
مبتنی بر RTL
کامپایلر
استفاده
میشود.
برخی از سوئیچهای -dletters هنگامی که از -E برای پیشپردازش استفاده میشود، معنای متفاوتی دارند.
رونوشتهای اشکالزدایی را میتوان با یک سوئیچ -fdump-rtl یا برخی حروف در گزینهٔ -d (letters) فعال کرد. در اینجا حروف ممکن برای استفاده در pass و letters و معانی آنها آورده شده است:
- -fdump-rtl-alignments
- رونوشت پس از محاسبهٔ همترازیهای پرش (branch alignments).
- -fdump-rtl-asmcons
- رونوشت پس از اصلاح گزارههای rtl که محدودیتهای ورودی/خروجی برآوردهنشده دارند.
- -fdump-rtl-auto_inc_dec
- رونوشت پس از شناسایی افزایش/کاهش خودکار (auto-inc-dec). این گذر تنها روی معماریهایی اجرا میشود که دستورالعملهای افزایش خودکار یا کاهش خودکار دارند.
- -fdump-rtl-barriers
- رونوشت پس از پاکسازی دستورالعملهای مانع (barrier instructions).
- -fdump-rtl-bbpart
- رونوشت پس از افرازبندی بلوکهای پایهای داغ و سرد (hot and cold basic blocks).
- -fdump-rtl-bbro
- رونوشت پس از بازآرایی بلوکها (block reordering).
- -fdump-rtl-btl1
- -fdump-rtl-btl2
- گزینههای -fdump-rtl-btl1 و -fdump-rtl-btl2 رونوشتگیری را پس از دو گذر بهینهسازی بارگذاری مقصد پرش فعال میکنند.
- -fdump-rtl-bypass
- رونوشت پس از میانبُر زدن پرش (jump bypassing) و بهینهسازیهای جریان کنترل.
- -fdump-rtl-combine
- رونوشت پس از گذر ترکیب دستورالعملهای RTL.
- -fdump-rtl-compgotos
- رونوشت پس از تکثیر gotoهای محاسباتی (computed gotos)..IP -fdump-rtl-ce1 4
- -fdump-rtl-ce2
- -fdump-rtl-ce3
- -fdump-rtl-ce1، -fdump-rtl-ce2 و -fdump-rtl-ce3 تخلیه اطلاعات را پس از سه گذر تبدیل if فعال میکنند.
- -fdump-rtl-cprop_hardreg
- تخلیه اطلاعات پس از انتشار کپی ثبات سختافزاری (hard register copy propagation).
- -fdump-rtl-csa
- تخلیه اطلاعات پس از ترکیب تنظیمات پشته (stack adjustments).
- -fdump-rtl-cse1
- -fdump-rtl-cse2
- -fdump-rtl-cse1 و -fdump-rtl-cse2 تخلیه اطلاعات را پس از دو گذر حذف زیرعبارتهای مشترک (common subexpression elimination) فعال میکنند.
- -fdump-rtl-dce
- تخلیه اطلاعات پس از گذرهای مستقل حذف کد مرده (dead code elimination).
- -fdump-rtl-dbr
- تخلیه اطلاعات پس از زمانبندی انشعابهای با تاخیر (delayed branch scheduling).
- -fdump-rtl-dce1
- -fdump-rtl-dce2
- -fdump-rtl-dce1 و -fdump-rtl-dce2 تخلیه اطلاعات را پس از دو گذر حذف ذخیرهسازیهای مرده (dead store elimination) فعال میکنند.
- -fdump-rtl-eh
- تخلیه اطلاعات پس از نهاییسازی کد مدیریت استثنا (EH).
- -fdump-rtl-eh_ranges
- تخلیه اطلاعات پس از تبدیل محدودههای مدیریت استثنا (EH).
- -fdump-rtl-expand
- تخلیه اطلاعات پس از تولید RTL.
- -fdump-rtl-fwprop1
- -fdump-rtl-fwprop2
- -fdump-rtl-fwprop1 و -fdump-rtl-fwprop2 تخلیه اطلاعات را پس از دو گذر انتشار رو به جلو (forward propagation) فعال میکنند.
- -fdump-rtl-gcse1
- -fdump-rtl-gcse2
- -fdump-rtl-gcse1 و -fdump-rtl-gcse2 تخلیه اطلاعات را پس از حذف سراسری زیرعبارتهای مشترک فعال میکنند.
- -fdump-rtl-init-regs
- تخلیه اطلاعات پس از مقداردهی اولیه ثباتها.
- -fdump-rtl-initvals
- تخلیه اطلاعات پس از محاسبه مجموعههای مقادیر اولیه.
- -fdump-rtl-into_cfglayout
- تخلیه اطلاعات پس از تبدیل به حالت cfglayout.
- -fdump-rtl-ira
- تخلیه اطلاعات پس از تخصیص تکرارشونده ثبات (iterated register allocation).
- -fdump-rtl-jump
- تخلیه اطلاعات پس از بهینهسازی دوم پرشها.
- -fdump-rtl-loop2
- -fdump-rtl-loop2 تخلیه اطلاعات پس از گذرهای بهینهسازی حلقههای rtl را فعال میکند.
- -fdump-rtl-mach
- تخلیه اطلاعات پس از اجرای گذر بازسازماندهی وابسته به ماشین، در صورت وجود آن گذر.
- -fdump-rtl-mode_sw
- تخلیه اطلاعات پس از حذف تعویضهای زاید حالت.
- -fdump-rtl-rnreg
- تخلیه اطلاعات پس از شمارهگذاری مجدد ثباتها.
- -fdump-rtl-outof_cfglayout
- تخلیه اطلاعات پس از تبدیل از حالت cfglayout.
- -fdump-rtl-peephole2
- تخلیه اطلاعات پس از گذر روزنهای (peephole).
- -fdump-rtl-postreload
- تخلیه اطلاعات پس از بهینهسازیهای پس از بارگذاری مجدد (post-reload).
- -fdump-rtl-pro_and_epilogue
- تخلیه اطلاعات پس از تولید مقدمهها و موخرههای تابع.
- -fdump-rtl-sched1
- -fdump-rtl-sched2
- -fdump-rtl-sched1 و -fdump-rtl-sched2 تخلیه اطلاعات را پس از گذرهای زمانبندی بلوکهای پایه فعال میکنند.
- -fdump-rtl-ree
- تخلیه اطلاعات پس از حذف بسط علامت/صفر (sign/zero extension elimination).
- -fdump-rtl-seqabstr
- تخلیه اطلاعات پس از کشف توالیهای مشترک.
- -fdump-rtl-shorten
- تخلیه اطلاعات پس از کوتاهسازی انشعابها.
- -fdump-rtl-split1
- -fdump-rtl-split2
- -fdump-rtl-split3
- -fdump-rtl-split4
- -fdump-rtl-split5
- این گزینهها تخلیه اطلاعات را پس از پنج دور تقسیم دستورالعملها فعال میکنند.
- -fdump-rtl-sms
- تخلیه اطلاعات پس از زمانبندی پیمانهای (modulo scheduling). این گذر تنها روی برخی معماریها اجرا میشود.
- -fdump-rtl-stack
- تخلیه اطلاعات پس از تبدیل ثباتهای «پرونده ثبات مسطح» GCC به ثباتهای پشتهمانند x87. این گذر تنها روی مشتقات x86 اجرا میشود.
- -fdump-rtl-subreg1
- -fdump-rtl-subreg2
- -fdump-rtl-subreg1 و -fdump-rtl-subreg2 تخلیه اطلاعات را پس از دو گذر بسط subreg فعال میکنند.
- -fdump-rtl-vartrack
- تخلیه اطلاعات پس از ردگیری متغیرها.
- -fdump-rtl-vregs
- تخلیه اطلاعات پس از تبدیل ثباتهای مجازی به ثباتهای سختافزاری.
- -fdump-rtl-web
- تخلیه اطلاعات پس از تقسیم محدوده حیات (live range splitting).
- -fdump-rtl-regclass
- -fdump-rtl-subregs_of_mode_init
- -fdump-rtl-subregs_of_mode_finish
- -fdump-rtl-dfinit
- -fdump-rtl-dfinish
- این تخلیهها تعریف شدهاند اما همواره فایلهای خالی تولید میکنند.
- -da
- -fdump-rtl-all
- تولید تمام تخلیههای فهرستشده در بالا..IP -dA 4 خروجی اسمبلر را با اطلاعات اشکالزدایی گوناگون حاشیهنویسی میکند.
- -dD
- در پایان پیشپردازش، علاوه بر خروجی عادی، تمام تعاریف ماکرو را برونریزی میکند.
- -dH
- هر زمان که خطایی رخ دهد، یک core dump تولید میکند.
- -dp
- خروجی اسمبلر را با توضیحی که نشان میدهد از کدام الگو و گزینه جایگزین استفاده شده است، حاشیهنویسی میکند. طول و هزینه هر دستورالعمل نیز چاپ میشود.
- -dP
- نمایش RTL را در خروجی اسمبلر به عنوان یک توضیح پیش از هر دستورالعمل برونریزی میکند. همچنین حاشیهنویسی -dp را نیز فعال میسازد.
- -dx
- فقط برای یک تابع RTL تولید میکند به جای اینکه آن را کامپایل کند. معمولاً همراه با -fdump-rtl-expand استفاده میشود.
- -fdump-debug
- اطلاعات اشکالزدایی تولیدشده در طول فاز تولید اشکالزدایی را برونریزی میکند.
- -fdump-earlydebug
- اطلاعات اشکالزدایی تولیدشده در طول فاز اولیه تولید اشکالزدایی را برونریزی میکند.
- -fdump-noaddr
- هنگام برونریزیهای اشکالزدایی، از چاپ آدرسها جلوگیری میکند. این کار مقایسه با diff را روی برونریزیهای اشکالزدایی برای فراخوانیهای کامپایلر با باینریهای کامپایلر مختلف و/یا مکانهای شروع متفاوت text / bss / data / heap / stack / dso امکانپذیرتر میسازد.
- -freport-bug
- در صورت وقوع خطای داخلی کامپایلر (ICE)، اطلاعات اشکالزدایی را جمعآوری کرده و در یک فایل موقت برونریزی میکند.
- -fdump-unnumbered
- هنگام برونریزیهای اشکالزدایی، از چاپ شماره دستورالعملها و آدرسها جلوگیری میکند. این کار مقایسه برونریزیهای اشکالزدایی با diff را برای فراخوانیهای کامپایلر با گزینههای متفاوت، به ویژه با و بدون -g، آسانتر میسازد.
- -fdump-unnumbered-links
- هنگام برونریزیهای اشکالزدایی (گزینه -d در بالا را ببینید)، از نمایش شماره دستورالعملها برای پیوندها به دستورالعملهای پیشین و پسین در یک توالی جلوگیری میکند.
- -fdump-ipa-switch
- -fdump-ipa-switch-options
- برونریزی درخت زبان تحلیل میانرویهای (inter-procedural analysis) را در مراحل مختلف در یک فایل کنترل میکند. نام فایل با افزودن یک پسوند ویژه سوییچ به نام فایل منبع تولید میشود، و فایل در همان دایرکتوری فایل خروجی ایجاد میگردد. برونریزیهای زیر امکانپذیر هستند:
- all
- تمام برونریزیهای تحلیل میانرویهای را فعال میکند.
- cgraph
- اطلاعات مربوط به بهینهسازی گراف فراخوانی (call-graph)، حذف توابع استفادهنشده، و تصمیمات درونخطیسازی (inlining) را برونریزی میکند.
- inline
- برونریزی پس از درونخطیسازی تابع.
- strubm
- برونریزی پس از انتخاب حالتهای "strub" و ثبت انتخابها به عنوان مشخصههای تابع.
- strub
- برونریزی تبدیلات "strub": تغییرات رابط، بستهبندی توابع (function wrapping)، و درج فراخوانیهای توکار (builtin) برای پاکسازی پشته (stack scrubbing) و واترمارکگذاری.
علاوه بر این، گزینههای -optimized، -missed، -note و -all را میتوان مشخص کرد که مفهومی مشابه با -fopt-info دارند، و مقدار پیشفرض آنها -optimized است.
برای نمونه، -fdump-ipa-inline-optimized-missed اطلاعات مربوط به نقاط فراخوانی درونخطیشده را به همراه نقاط فراخوانی که درونخطی نشدهاند منتشر میکند.
به طور پیشفرض، برونریزی شامل پیامهایی درباره بهینهسازیهای موفقیتآمیز (معادل -optimized) به همراه جزئیات سطح پایین درباره تحلیل خواهد بود.
- -fdump-ipa-clones
- یک فایل
برونریزی
حاوی
اطلاعاتی
درباره
ایجاد
همتاهای (clones)
گرههای
گراف
فراخوانی و
حذف
گرههای
گراف
فراخوانی
در طول
بهینهسازیها
و تبدیلات
میانرویهای
ایجاد
میکند.
کاربرد
اصلی آن این
است که
ابزارهای
ایجاد وصله
زنده (live-patch)
بتوانند
مجموعه
توابعی را
که برای
جایگزینی
کامل یک
تابع خاص
نیاز به
وصله زنده
دارند،
تعیین کنند
(نگاه کنید
به -flive-patching). نام
فایل با
افزودن
پسوند
"ipa-clones" به
نام فایل
منبع تولید
میشود و
فایل در
همان
دایرکتوری
فایل خروجی
ایجاد
میگردد. هر
مدخل در
فایل روی یک
خط مجزا
شامل
فیلدهایی
است که با
نقطه
ویرگول (semicolon)
از یکدیگر
جدا
شدهاند.
در صورت ایجاد همتا در گراف فراخوانی، فیلدهای مجزا عبارتند از:
- 1.
- رشته "Callgraph clone".
- 2.
- نام تابعی که از آن همتاسازی میشود، همانگونه که به اسمبلر ارائه شده است.
- 3.
- عددی که به صورت یکتا تابع در حال همتاسازی را در گراف فراخوانی مشخص میکند. توجه داشته باشید که این عدد فقط درون یک واحد کامپایل یا در تحلیل کل برنامه یکتا است، اما احتمالاً در این دو فاز متفاوت خواهد بود.
- 4.
- نام فایل منبعی که تابع در آن تعریف شده است.
- 5.
- شماره خطی که تعریف تابع در آن قرار دارد.
- 6.
- شماره ستونی که تعریف تابع در آن قرار دارد.
- 7.
- نام همتای جدید تابع، همانگونه که به اسمبلر ارائه شده است.
- 8.
- عددی که به صورت یکتا همتای جدید تابع را در گراف فراخوانی مشخص میکند. توجه داشته باشید که این عدد فقط درون یک واحد کامپایل یا در تحلیل کل برنامه یکتا است، اما احتمالاً در این دو فاز متفاوت خواهد بود.
- 9.
- نام فایل منبعی که مکان کد منبعِ همتای جدید به آن اشاره دارد.
- 10.
- شماره خطی که مکان کد منبعِ همتای جدید به آن اشاره دارد.
- 11.
- شماره ستونی که مکان کد منبعِ همتای جدید به آن اشاره دارد.
- 12.
- رشتهای که دلیل همتاسازی را مشخص میکند.
در صورت حذف همتا در گراف فراخوانی، فیلدهای مجزا عبارتند از:
- 1.
- رشته "Callgraph removal".
- 2.
- نام تابعی که حذف میشود، همانگونه که به اسمبلر ارائه میشد.
- 3.
- عددی که به صورت یکتا تابع همتاسازیشده را در گراف فراخوانی مشخص میکند. توجه داشته باشید که این عدد فقط درون یک واحد کامپایل یا در تحلیل کل برنامه یکتا است، اما احتمالاً در این دو فاز متفاوت خواهد بود.
- 4.
- نام فایل منبعی که تابع در آن تعریف شده است.
- 5.
- شماره خطی که تعریف تابع در آن قرار دارد.
- 6.
- شماره ستونی که تعریف تابع در آن قرار دارد.
- -fdump-lang-all
- -fdump-lang-switch
- -fdump-lang-switch-options
- -fdump-lang-switch-options=filename
- کنترل تخلیه اطلاعات وابسته به زبان. بخشهای options و filename همانطور که در گزینه -fdump-tree شرح داده شده است عمل میکنند. مقادیر switch زیر پذیرفته میشوند:
- all
- فعالسازی تمام تخلیههای وابسته به زبان.
- class
- تخلیه اطلاعات سلسلهمراتب کلاسها. اطلاعات جدول مجازی (virtual table) صادر میشود مگر آنکه 'slim' مشخص شده باشد. این گزینه فقط برای C++ کاربرد دارد.
- module
- تخلیه اطلاعات ماژول. گزینههای lineno (مکانها)، graph (دسترسپذیری)، blocks (خوشهها)، uid (سریالسازی)، alias (ادغامپذیر)، asmname (الروند)، eh (نگاشتکننده) و vops (ماکروها) ممکن است اطلاعات بیشتری ارائه دهند. این گزینه فقط برای C++ کاربرد دارد.
- raw
- تخلیه دادههای خام درخت داخلی. این گزینه فقط برای C++ کاربرد دارد.
- -fdump-passes
- چاپ فهرست گذرهای بهینهسازی که توسط گزینههای خط فرمان فعلی روشن یا خاموش شدهاند در stderr.
- -fdump-statistics-option
- فعالسازی و کنترل تخلیه آمار گذرها در یک فایل جداگانه. نام فایل با افزودن پسوندی که به .statistics ختم میشود به نام فایل منبع ایجاد میشود، و فایل در همان دایرکتوری فایل خروجی ایجاد میگردد. اگر از قالب -option استفاده شود، -stats باعث میشود شمارندهها در سرتاسر کل واحد ترجمه جمع بسته شوند، در حالی که -details هر رویداد را همانطور که گذرها تولید میکنند تخلیه میکند. حالت پیشفرض بدون هیچ گزینهای، جمع بستن شمارندهها برای هر تابع کامپایلشده است.
- -fdump-tree-all
- -fdump-tree-switch
- -fdump-tree-switch-options
- -fdump-tree-switch-options=filename
- کنترل تخلیه درخت زبان میانی به یک فایل در مراحل مختلف پردازش. اگر از قالب -options استفاده شود، options فهرستی از گزینههای جداشده با - است که جزئیات تخلیه را کنترل میکنند. همه گزینهها برای همه تخلیهها قابل اعمال نیستند؛ مواردی که بیمعنی باشند نادیده گرفته میشوند. گزینههای زیر در دسترس هستند:
- address
- چاپ آدرس هر گره. معمولاً این مورد بیمعنی است چرا که با توجه به محیط و فایل منبع تغییر میکند. کاربرد اصلی آن برای تطبیق دادن یک فایل تخلیه با محیط اشکالزدایی است.
- asmname
- اگر "DECL_ASSEMBLER_NAME" برای یک اعلان مشخص تنظیم شده باشد، بهجای "DECL_NAME" از آن در تخلیه استفاده شود. کاربرد اصلی آن، سهولت استفاده هنگام ردیابی به عقب از نامهای درهمریخته (mangled names) در فایل اسمبلی است.
- slim
- هنگام
تخلیه
نمایشهای
میانی بخش
فرانتاند،
از تخلیه
اعضای یک
حوزه یا
بدنه یک
تابع صرفاً
به این دلیل
که به آن
حوزه رسیده
شده است،
جلوگیری
میکند.
چنین
مواردی را
تنها زمانی
تخلیه
میکند که
مستقیماً
از طریق
مسیر دیگری
قابل دسترس
باشند.
هنگام تخلیه درختهای زیباسازیشده، این گزینه از تخلیه بدنه ساختارهای کنترلی جلوگیری میکند.
هنگام تخلیه RTL، زبان RTL را بهجای نمایش پیشفرض شبیه LISP، در قالب فشرده (slim) چاپ میکند.
- raw
- چاپ نمایشی خام از درخت. بهطور پیشفرض، درختها بهصورت نمایشی شبیه C زیباسازی شده و چاپ میشوند.
- details
- فعالسازی تخلیههای با جزئیات بیشتر (توسط همه گزینههای تخلیه رعایت نمیشود). همچنین اطلاعات حاصل از گذرهای بهینهسازی را شامل میشود.
- stats
- فعالسازی تخلیه آمارهای گوناگون درباره گذر (توسط همه گزینههای تخلیه رعایت نمیشود).
- blocks
- فعالسازی نمایش مرزهای بلوکهای پایهای (در تخلیههای خام غیرفعال است).
- graph
- برای هر یک
از سایر
فایلهای
تخلیه
مشخصشده
(-fdump-rtl-pass)،
نمایشی از
گراف جریان
کنترل
مناسب برای
مشاهده با GraphViz
را در file.passid.pass.dot
تخلیه
میکند. هر
تابع در
فایل
بهصورت یک
زیرگراف
زیباسازی
میشود تا GraphViz
بتواند همه
آنها را در
یک نمودار
واحد رسم
کند.
این گزینه در حال حاضر فقط برای تخلیههای RTL کار میکند و RTL همیشه به صورت فشرده (slim) تخلیه میشود.
- vops
- فعالسازی نمایش عملوندهای مجازی برای هر گزاره.
- lineno
- فعالسازی نمایش شماره خطوط برای گزارهها.
- uid
- فعالسازی نمایش شناسه یکتا ("DECL_UID") برای هر متغیر.
- verbose
- فعالسازی نمایش تخلیه درخت برای هر گزاره.
- eh
- فعالسازی نمایش شماره ناحیه EH که شامل هر گزاره است.
- scev
- فعالسازی نمایش جزئیات تحلیل تکامل اسکالر (scalar evolution).
- optimized
- فعالسازی نمایش اطلاعات بهینهسازی (فقط در گذرهای خاصی در دسترس است).
- missed
- فعالسازی نمایش اطلاعات بهینهسازیهای ازدسترفته (فقط در گذرهای خاصی در دسترس است).
- note
- فعالسازی سایر اطلاعات تفصیلی بهینهسازی (فقط در گذرهای خاصی در دسترس است).
- all
- روشن کردن همه گزینهها، به جز raw، slim، verbose و lineno.
- optall
- روشن کردن همه گزینههای بهینهسازی، یعنی optimized، missed و note.
برای تعیین اینکه چه تخلیههای درختی در دسترس هستند یا یافتن تخلیه برای گذر مورد نظر، مراحل زیر را دنبال کنید:
- 1.
- دستور GCC را با -fdump-passes اجرا کنید و در خروجی stderr به دنبال کدی بگردید که با گذر مورد نظر شما مطابقت دارد. برای مثال، کدهای "tree-evrp"، "tree-vrp1" و "tree-vrp2" متناظر با سه گذر انتشار دامنه مقادیر (Value Range Propagation) هستند. عدد انتهای نام، فراخوانیهای مجزای همان گذر را از یکدیگر متمایز میکند.
- 2.
- برای فعالسازی ایجاد فایل تخلیه، کد گذر را به پیشوند گزینه -fdump- الحاق کرده و GCC را با آن اجرا کنید. برای مثال، جهت فعالسازی تخلیه حاصل از گذر Early Value Range Propagation، دستور GCC را با گزینه -fdump-tree-evrp اجرا کنید. به صورت اختیاری، میتوانید نام فایل تخلیه را مشخص کنید. اگر نامی تعیین نکنید، GCC آن را طبق توضیحات زیر ایجاد میکند.
- 3.
- فایل تخلیه گذر را در فایلی بیابید که نام آن از سه جزء جداشده با نقطه تشکیل شده است: نام فایل منبعی که GCC برای کامپایل آن فراخوانی شده بود، یک پسوند عددی نشاندهنده شماره گذر به همراه حرف t برای گذرهای درختی (و حرف r برای گذرهای RTL)، و در نهایت کد گذر. برای مثال، تخلیه گذر Early VRP ممکن است در فایلی به نام myfile.c.038t.evrp در دایرکتوری کاری فعلی قرار داشته باشد. توجه داشته باشید که کدهای عددی پایدار نیستند و ممکن است از نسخهای از GCC به نسخه دیگر تغییر کنند.
- -fopt-info-options
- -fopt-info-options=filename
- خروجیهای
گزارش
بهینهسازی
را از
گذرهای
مختلف
بهینهسازی
کنترل
میکند. اگر
از قالب -options
استفاده
شود، options
فهرستی از
کلیدواژههای
گزینه است
که با - از
هم جدا
شدهاند تا
جزئیات
گزارش و
بهینهسازیها
را انتخاب
کنند.
گزینههای options را میتوان به سه گروه تقسیم کرد:
- 1.
- گزینههایی که مشخص میکنند چه نوع پیامهایی باید صادر شوند،
- 2.
- گزینههایی که میزان جزئیات گزارش را تعیین میکنند، و
- 3.
- گزینههایی که تعیین میکنند کدام بهینهسازیها باید گنجانده شوند.
گزینههای هر گروه را میتوان آزادانه با یکدیگر ترکیب کرد زیرا این گزینهها همپوشانی ندارند. با این حال، در صورت بروز هرگونه تعارض، گزینههای متأخرتر در خط فرمان بر گزینههای متقدم اولویت دارند.
گزینههای زیر کنترل میکنند که چه نوع پیامهایی باید صادر شوند:
- optimized
- چاپ اطلاعات هنگام اعمال موفقیتآمیز یک بهینهسازی. اینکه چه اطلاعاتی مرتبط است به خود گذر بهینهسازی بستگی دارد. برای نمونه، گذرهای برداریساز (vectorizer) مکان مبدأ حلقههایی را که با موفقیت برداریسازی شدهاند چاپ میکنند.
- missed
- چاپ اطلاعات درباره بهینهسازیهای ازدسترفته. هر گذر بهینهسازی مشخص میکند چه اطلاعاتی در خروجی گنجانده شود.
- note
- چاپ اطلاعات با جزئیات بیشتر درباره بهینهسازیها، مانند برخی دگرگونیها، پیامهای دقیقتر درباره تصمیمگیریها و غیره.
- all
- چاپ اطلاعات تفصیلی بهینهسازی. این گزینه شامل optimized، missed و note است.
گزینه زیر میزان پرگویی (verbosity) گزارش را کنترل میکند:
- internals
- بهطور پیشفرض، فقط پیامهای «سطح بالا» صادر میشوند. این گزینه پیامهای اضافی با جزئیات بیشتر را فعال میکند که احتمالاً فقط برای توسعهدهندگان GCC جالب توجه خواهد بود.
یک یا چند مورد از کلیدواژههای گزینهای زیر را میتوان برای توصیف یک گروه از بهینهسازیها به کار برد:
- ipa
- فعالسازی گزارشها از تمام بهینهسازیهای بینرویهای (interprocedural).
- loop
- فعالسازی گزارشها از تمام بهینهسازیهای حلقه (loop).
- inline
- فعالسازی گزارشها از تمام بهینهسازیهای درونخطیسازی (inlining).
- omp
- فعالسازی گزارشها از تمام بهینهسازیهای OMP (تخلیه بار پردازشی و چندپردازشی).
- vec
- فعالسازی گزارشها از تمام بهینهسازیهای برداریسازی (vectorization).
- optall
- فعالسازی گزارشها از تمام بهینهسازیها. این گزینه یک ابرمجموعه از گروههای بهینهسازی فهرستشده در بالا است.
اگر options حذف شود، مقدار پیشفرض آن optimized-optall خواهد بود، به این معنی که پیامهای مربوط به بهینهسازیهای موفقیتآمیز از همه گذرها ثبت میشوند و پیامهایی که به عنوان «داخلی» (internals) در نظر گرفته میشوند نادیده گرفته خواهند شد.
اگر filename مشخص شود، گزارشهای تمام بهینهسازیهای منطبق در انتهای filename الحاق میشوند. در غیر این صورت، گزارش در stderr خروجی داده میشود. اگرچه استفاده از چندین گزینه -fopt-info مجاز است، تنها یکی از آنها میتواند حاوی یک filename باشد. اگر نامفایلهای دیگری ارائه شوند، تمام گزینهها به جز اولین گزینه نادیده گرفته میشوند.
توجه داشته باشید که فایل خروجی filename در صورت وجود چندین واحد ترجمه بازنویسی میشود. اگر خروجی یکپارچه از چندین واحد ترجمه مورد نظر است، باید بهجای آن از stderr استفاده شود.
در مثال زیر، اطلاعات بهینهسازی در stderr خروجی داده میشود:
gcc -O3 -fopt-info
این مثال:
gcc -O3 -fopt-info-missed=missed.all
گزارش بهینهسازیهای ازدسترفته را از تمام گذرها در missed.all ذخیره میکند، و این مثال:
gcc -O2 -ftree-vectorize -fopt-info-vec-missed
اطلاعات مربوط به فرصتهای بهینهسازی ازدسترفته از گذرهای برداریسازی را در stderr چاپ میکند. توجه داشته باشید که -fopt-info-vec-missed معادل -fopt-info-missed-vec است. ترتیب نام گروههای بهینهسازی و انواع پیامهای ذکرشده پس از -fopt-info اهمیتی ندارد.
به عنوان مثالی دیگر:
gcc -O3 -fopt-info-inline-optimized-missed=inline.txt
اطلاعات مربوط به بهینهسازیهای ازدسترفته و همچنین مکانهای بهینهسازیشده را از تمام گذرهای درونخطیسازی به inline.txt میفرستد.
در نهایت، این دستور را در نظر بگیرید:
gcc -fopt-info-vec-missed=vec.miss -fopt-info-loop-optimized=loop.opt
در اینجا دو نام فایل خروجی vec.miss و loop.opt دچار تعارض هستند، چرا که تنها یک فایل خروجی مجاز است. در این حالت، فقط گزینه اول اعمال میشود و گزینههای بعدی نادیده گرفته میشوند. بنابراین فقط فایل vec.miss ایجاد میشود که حاوی گزارشهای برداریساز درباره فرصتهای ازدسترفته است.
- -fsave-optimization-record
- یک فایل
SRCFILE.opt-record.json.gz ایجاد
میکند که
جزئیات
بهینهسازیهای
انجامشده
را برای
بهینهسازیهایی
که از -fopt-info
پشتیبانی
میکنند،
ثبت
مینماید.
این گزینه آزمایشی است و ساختار دادهها در فایل فشرده JSON ممکن است تغییر کند.
این گزینه تقریباً معادل یک نسخه ماشینخوان از -fopt-info-all است؛ به صورت مجموعهای از پیامها به همراه فایل مبدأ، شماره خط و شماره ستون، همراه با دادههای اضافی زیر برای هر پیام:
- تعداد دفعات اجرای کدی که در حال بهینهسازی است، به همراه فرادادهای درباره اینکه آیا این داده از پروفایل واقعی به دست آمده یا صرفاً یک تخمین است، تا به مصرفکنندگان داده امکان اولویتبندی پیامها بر اساس میزان پرکاربرد بودن (hotness) کد را بدهد،
- نام تابع مربوط به کدی که در حال بهینهسازی است، در صورت کاربرد،
- «زنجیره درونخطیسازی» (inlining chain) برای کدی که در حال بهینهسازی است، بهطوری که وقتی یک تابع در چندین مکان مختلف درونخطی میشود (که خود ممکن است درونخطی شده باشند)، خواننده بتواند بین نسخهها تمایز قائل شود،
- اشیایی که بخشهایی از پیام را که به عبارتها (expressions)، دستورها (statements) یا گرههای جدول نماد (symbol-table nodes) ارجاع دارند مشخص میکنند؛ اینکه به کدامیک از این دستهها تعلق دارند و، در صورت دسترسی، مکان آنها در کد مبدأ،
- گذر GCC که پیام را صادر کرده است، و.IP * 4 موقعیت در کد خود GCC که پیام از آنجا صادر شده است
علاوه بر این، برخی پیامها به طور منطقی درون پیامهای دیگر تودرتو شدهاند که بازتابدهندهٔ جزئیات پیادهسازی گذرهای بهینهسازی است.
- -fsched-verbose=n
- در
مقصدهایی
که از
زمانبندی
دستورالعملها
استفاده
میکنند،
این گزینه
میزان
خروجی
اشکالزداییای
را که
زمانبند
در
فایلهای
رونوشت چاپ
میکند،
کنترل
میکند.
به ازای n بزرگتر از صفر، -fsched-verbose همان اطلاعات -fdump-rtl-sched1 و -fdump-rtl-sched2 را خروجی میدهد. برای n بزرگتر از یک، همچنین احتمالات بلوک پایه، اطلاعات تفصیلی فهرست آماده و اطلاعات unit/insn را خروجی میدهد. برای n بزرگتر از دو، شامل RTL در نقطهٔ توقف (abort point)، جریان کنترل و اطلاعات نواحی میشود. و برای n بیشتر از چهار، -fsched-verbose همچنین شامل اطلاعات وابستگی است.
- -fenable-kind-pass
- -fdisable-kind-pass=range-list
- این مجموعهای از گزینهها است که برای فعال یا غیرفعال کردن صریح گذرهای بهینهسازی به کار میروند. این گزینهها برای استفاده در اشکالزدایی GCC در نظر گرفته شدهاند. کاربران کامپایلر در عوض باید از گزینههای معمولی برای فعال یا غیرفعال کردن گذرها استفاده کنند.
- -fdisable-ipa-pass
- گذر IPA با نام pass را غیرفعال میکند. pass نام گذر است. اگر همان گذر به صورت ایستا چندین بار در کامپایلر فراخوانی شود، باید یک شمارهٔ ترتیبی که از ۱ شروع میشود به انتهای نام گذر افزوده شود.
- -fdisable-rtl-pass
- -fdisable-rtl-pass=range-list
- گذر RTL با نام pass را غیرفعال میکند. pass نام گذر است. اگر همان گذر به صورت ایستا چندین بار در کامپایلر فراخوانی شود، باید یک شمارهٔ ترتیبی که از ۱ شروع میشود به انتهای نام گذر افزوده شود. range-list فهرستی جداشده با کاما از بازههای توابع یا نامهای اسمبلی است. هر بازه یک جفتعدد جداشده با دونقطه است. بازه در هر دو انتها بسته (شامل دو عدد انتهایی) است. اگر بازه بدیهی باشد، جفتعدد میتواند به یک عدد تنها ساده شود. اگر uid گره گراف فراخوانی تابع درون یکی از بازههای مشخصشده قرار گیرد، آن pass برای آن تابع غیرفعال میشود. مقدار uid در سرآیند تابع در یک فایل رونوشت نشان داده میشود، و نامهای گذر را میتوان با استفاده از گزینهٔ -fdump-passes رونوشت گرفت.
- -fdisable-tree-pass
- -fdisable-tree-pass=range-list
- گذر tree با نام pass را غیرفعال میکند. برای شرح آرگومانهای گزینه، -fdisable-rtl را ببینید.
- -fenable-ipa-pass
- گذر IPA با نام pass را فعال میکند. pass نام گذر است. اگر همان گذر به صورت ایستا چندین بار در کامپایلر فراخوانی شود، باید یک شمارهٔ ترتیبی که از ۱ شروع میشود به انتهای نام گذر افزوده شود.
- -fenable-rtl-pass
- -fenable-rtl-pass=range-list
- گذر RTL با نام pass را فعال میکند. برای شرح آرگومانهای گزینه و مثالها، -fdisable-rtl را ببینید.
- -fenable-tree-pass
- -fenable-tree-pass=range-list
- گذر tree با نام pass را فعال میکند. برای شرح آرگومانهای گزینه، -fdisable-rtl را ببینید.
در اینجا چند مثال از کاربرد این گزینهها آورده شده است.
# disable ccp1 for all functions -fdisable-tree-ccp1 # disable complete unroll for function whose cgraph node uid is 1 -fenable-tree-cunroll=1 # disable gcse2 for functions at the following ranges [1,1], # [300,400], and [400,1000] # disable gcse2 for functions foo and foo2 -fdisable-rtl-gcse2=foo,foo2 # disable early inlining -fdisable-tree-einline # disable ipa inlining -fdisable-ipa-inline # enable tree full unroll -fenable-tree-unroll
- -fchecking
- -fchecking=n
- بررسی سازگاری داخلی را فعال میکند. مقدار پیشفرض به پیکربندی کامپایلر بستگی دارد. -fchecking=2 بررسیهای سازگاری داخلی بیشتری را فعال میکند که ممکن است بر تولید کد تأثیر بگذارد.
- -frandom-seed=string
- این گزینه
بذری (seed) را
فراهم
میکند که GCC
به جای
اعداد
تصادفی در
تولید نام
نمادهای
مشخصی که
باید در هر
فایل
کامپایلشده
متفاوت
باشند،
استفاده
میکند.
همچنین
برای قرار
دادن
مُهرهای
یکتا در
فایلهای
دادههای
پوشش (coverage data) و
فایلهای
شیءِ
تولیدکنندهٔ
آنها به
کار میرود.
میتوانید
از گزینهٔ
-frandom-seed برای
تولید
فایلهای
شیءِ یکسان
و
بازتولیدپذیر
استفاده
کنید.
مقدار string میتواند یک عدد (دهدهی، هشتهشتی یا شانزدهشانزدهی) یا یک رشتهٔ دلخواه باشد (که در این صورت با محاسبهٔ CRC32 به یک عدد تبدیل میشود).
مقدار string باید برای هر فایلی که کامپایل میکنید متفاوت باشد.
- -save-temps
- فایلهای
واسط
معمولِ
«موقتی» را
به طور
دائمی
ذخیره
میکند؛
آنها را
همانگونه
که در ذیل
-dumpbase و -dumpdir شرح
داده شده،
به عنوان
فایلهای
خروجی کمکی
نامگذاری
میکند.
هنگامی که در ترکیب با گزینهٔ خط فرمان -x استفاده میشود، -save-temps به اندازهٔ کافی هوشمند است که از بازنویسی روی فایل منبع ورودی با همان پسوند فایل واسط جلوگیری کند. فایل واسط متناظر را میتوان با تغییر نام فایل منبع پیش از استفاده از -save-temps به دست آورد.
- -save-temps=cwd
- معادل با -save-temps -dumpdir ./ است.
- -save-temps=obj
- معادل با -save-temps -dumpdir outdir/ است، که در آن outdir/ دایرکتوریِ فایل خروجی مشخصشده پس از گزینهٔ -o است، شامل هرگونه جداکنندهٔ دایرکتوری. اگر از گزینهٔ -o استفاده نشود، سوئیچ -save-temps=obj مانند -save-temps=cwd عمل میکند.
- -time[=file]
- زمان CPU
مصرفشده
توسط هر
زیرپردازش
در توالی
کامپایل را
گزارش
میدهد.
برای
فایلهای
منبع C، این
شامل خود
کامپایلر و
اسمبلر است
(به علاوهٔ
پیونددهنده
در صورتی که
پیونددهی
انجام شود).
بدون مشخص کردن یک فایل خروجی، خروجی به این صورت خواهد بود:
# cc1 0.12 0.01 # as 0.00 0.01
اولین عدد در هر سطر «زمان کاربر» (user time) است، یعنی زمانی که صرف اجرای خود برنامه شده است. عدد دوم «زمان سیستم» (system time) است، زمانی که صرف اجرای روالهای سیستمعامل به نیابت از برنامه شده است. هر دو عدد به ثانیه هستند.
با مشخص کردن یک فایل خروجی، خروجی به انتهای فایل نامبرده پیوست میشود و به این صورت خواهد بود:
0.12 0.01 cc1 <options> 0.00 0.01 as <options>
«زمان کاربر» و «زمان سیستم» به قبل از نام برنامه منتقل میشوند، و گزینههای فرستادهشده به برنامه نمایش داده میشوند، تا بعداً بتوان فهمید چه فایلی در حال کامپایل بوده و با چه گزینههایی.
- -fdump-final-insns[=file]
- نمایش
درونی
نهایی (RTL) را
در file
رونوشت
میگیرد.
اگر
آرگومان
اختیاری
حذف شود (یا
اگر file
برابر با
"."
باشد)، نام
فایل
رونوشت با
پیوست کردن
".gkd" به
نام پایهٔ
رونوشت
تعیین
میشود، -dumpbase
را ببینید..IP
-fcompare-debug[=opts] 4 اگر
در طول
کامپایل
هیچ خطایی
رخ ندهد،
کامپایلر
را برای بار
دوم اجرا
میکند و opts
و -fcompare-debug-second را به
آرگومانهای
ارسالشده
به کامپایل
دوم
میافزاید.
نمایش
درونی
نهایی را در
هر دو
کامپایل
برونریزی
(dump) کرده و در
صورت وجود
تفاوت میان
آنها، یک
خطا چاپ
میکند.
اگر علامت مساوی درج نشود، گزینهٔ پیشفرض -gtoggle استفاده میشود.
متغیر محیطی GCC_COMPARE_DEBUG در صورت تعریف شدن، غیرخالی بودن و غیرصفر بودن، بهطور ضمنی -fcompare-debug را فعال میکند. اگر GCC_COMPARE_DEBUG با رشتهای مقداردهی شود که با یک خط تیره شروع میشود، آن رشته برای opts استفاده میشود؛ در غیر این صورت مقدار پیشفرض -gtoggle به کار میرود.
گزینهٔ -fcompare-debug=، با علامت مساوی اما بدون opts، معادل -fno-compare-debug است که برونریزی نمایش درونی نهایی و کامپایل دوم را غیرفعال کرده و حتی از اعمال اثر GCC_COMPARE_DEBUG نیز جلوگیری میکند.
برای بررسی پوشش کامل در هنگام آزمایش با -fcompare-debug، متغیر GCC_COMPARE_DEBUG را مثلاً روی -fcompare-debug-not-overridden تنظیم کنید، که GCC آن را به عنوان یک گزینهٔ نامعتبر در هر کامپایل واقعی (به جای پیشپردازش، اسمبلی یا پیوند) رد میکند. برای دریافت صرفاً یک هشدار، تنظیم GCC_COMPARE_DEBUG به -w%n-fcompare-debug not overridden کافی خواهد بود.
- -fcompare-debug-second
- این گزینه
بهطور
ضمنی برای
کامپایل
دومی که
توسط -fcompare-debug
درخواست
شده است،
همراه با
گزینههایی
برای
بیصدا
کردن
هشدارها و
حذف سایر
گزینههایی
که باعث
میشوند
کامپایلر
به عنوان یک
اثر جانبی
خروجی در
فایل یا
خروجی
استاندارد
تولید کند،
به
کامپایلر
ارسال
میشود.
فایلهای
دامپ و
فایلهای
موقت
حفظشده
تغییر نام
مییابند
تا شامل
پسوند
اضافی
".gk" در
حین
کامپایل
دوم باشند و
از
بازنویسی
روی
فایلهای
تولیدشده
توسط
کامپایل
اول
جلوگیری
شود.
هنگامی که این گزینه به گردانندهٔ کامپایلر (compiler driver) ارسال شود، باعث میشود کامپایل اول نادیده گرفته شود، که این امر کاربردی به جز اشکالزدایی خود کامپایلر ندارد.
- -gtoggle
- تولید اطلاعات اشکالزدایی را در صورتی که بدون این گزینه تولید میشد خاموش میکند، یا در غیر این صورت آن را در سطح ۲ فعال میسازد. جایگاه این آرگومان در خط فرمان اهمیتی ندارد؛ این گزینه پس از پردازش تمام گزینههای دیگر اعمال میشود و صرفنظر از اینکه چند بار مشخص شده باشد، تنها یکبار اعمال میگردد. کاربرد اصلی این گزینه همراه با -fcompare-debug است.
- -fvar-tracking-assignments-toggle
- وضعیت -fvar-tracking-assignments را تغییر وضعیت (toggle) میدهد، همانطور که -gtoggle وضعیت -g را تغییر میدهد.
- -Q
- هنگامی که
در خط فرمان
پیش از --help=
استفاده
شود، -Q به
عنوان
تغییردهندهٔ
خروجی
راهنما عمل
میکند.
در غیر این صورت، این گزینه باعث میشود که کامپایلر نام هر تابع را هنگام کامپایل شدن چاپ کند و آمارهایی دربارهٔ هر گذر (pass) پس از پایان یافتن آن نمایش دهد.
- -ftime-report
- باعث
میشود
کامپایلر
پس از اتمام
کار،
آمارهایی
دربارهٔ
زمان
مصرفشده
توسط هر گذر
(pass) در stderr چاپ
کند.
اگر خروجی SARIF برای تشخیصها از طریق -fdiagnostics-format=sarif-file یا -fdiagnostics-format=sarif-stderr درخواست شده باشد، اطلاعات -ftime-report در قالب JSON به عنوان بخشی از خروجی SARIF صادر میشود. فرمت دقیق این دادههای JSON ممکن است دستخوش تغییر شود، و به دلیل ثبت شدن در نقطهای کمی متفاوت در درون کامپایلر، مقادیر ممکن است دقیقاً با مقادیر ارسالشده به stderr مطابقت نداشته باشند.
- -ftime-report-details
- زمان مصرفشده توسط بخشهای زیرساختی را برای هر گذر (pass) بهطور جداگانه ثبت میکند.
- -fira-verbose=n
- میزان جزئیات (verbosity) فایل دامپ را برای تخصیصدهندهٔ یکپارچهٔ ثبات (integrated register allocator) کنترل میکند. مقدار پیشفرض ۵ است. اگر مقدار n بزرگتر یا مساوی ۱۰ باشد، خروجی دامپ با همان فرمت n منهای ۱۰ به stderr ارسال میشود.
- -flto-report
- گزارشی
حاوی
جزئیات
درونی
دربارهٔ
عملکرد
بهینهساز
زمان پیوند
(link-time optimizer) چاپ
میکند.
محتویات
این گزارش
از نسخهای
به نسخهٔ
دیگر
متفاوت است.
این گزینه
برای
استفادهٔ
توسعهدهندگان
GCC هنگام
پردازش
فایلهای
شیء در حالت
LTO (از طریق -flto)
در نظر
گرفته شده
است.
بهطور پیشفرض غیرفعال است.
- -flto-report-wpa
- مانند -flto-report است، اما تنها برای فاز WPA در بهینهسازی زمان پیوند خروجی چاپ میکند.
- -fmem-report
- باعث میشود کامپایلر پس از اتمام کار، آمارهایی دربارهٔ تخصیص حافظهٔ دائمی چاپ کند.
- -fmem-report-wpa
- باعث میشود کامپایلر آمارهایی دربارهٔ تخصیص حافظهٔ دائمی را صرفاً برای فاز WPA چاپ کند.
- -fpre-ipa-mem-report
- -fpost-ipa-mem-report
- باعث میشود کامپایلر آمارهایی دربارهٔ تخصیص حافظهٔ دائمی را قبل یا بعد از بهینهسازی میانروالی (interprocedural optimization) چاپ کند.
- -fmultiflags
- این گزینه
استفاده از
"TFLAGS"
آگاه از multilib
را برای
ساخت
کتابخانههای
مقصد با
گزینههایی
متفاوت از
آنچه
کامپایلر
بهطور
پیشفرض
پیکربندی
شده است، از
طریق
بهکارگیری
مشخصههای
(specs)
تعیینشده
توسط
بخشهای
درونی
کامپایلر،
مقصد (target) یا
سازندگان
در زمان
پیکربندی
(configure time)
امکانپذیر
میسازد.
مانند "TFLAGS"، این قابلیت اجازه میدهد کتابخانههای مقصد برای محیطهای پایه و سازگار ساخته شوند، در حالی که کامپایلر بهطور پیشفرض از گزینههای پیشرفتهتر استفاده میکند. این ویژگی از آن جهت کاربردی است که کاربران در صورت نامناسب بودن مقادیر پیشفرض برای محیط مقصد، میتوانند به سادگی پیشفرضهای پیکربندی کامپایلر را هنگام ساخت برنامههای خود بازنویسی (override) کنند، در حالی که بازسازی کتابخانههای زمان اجرا معمولاً آسان یا مطلوب نیست.
برخلاف "TFLAGS"، استفاده از مشخصهها (specs) امکان انتخاب پرچمهای متفاوت را برای multilibهای گوناگون فراهم میکند. روش انجام این کار، ساخت برنامه با make TFLAGS=-fmultiflags پس از پیکربندی با --with-specs=%{fmultiflags:...} است.
این گزینه پس از اینکه گرداننده (driver) پردازش driver self spec را تمام کرد، کنار گذاشته میشود.
این گزینه همچنین برای بررسی اینکه آیا "TFLAGS" برای ساخت تمام کتابخانههای مقصد استفاده میشوند یا خیر، با پیکربندی یک کامپایلر غیر-bootstrap به صورت --with-specs='%{!fmultiflags:%emissing TFLAGS}' و ساخت کامپایلر و کتابخانههای مقصد مفید است.
- -fprofile-report
- باعث میشود کامپایلر آمارهایی دربارهٔ سازگاری پروفایل (تخمینی) و اثر گذرهای مجزا چاپ کند.
- -fstack-usage
- باعث میشود کامپایلر اطلاعات میزان مصرف پشته (stack) را برای برنامه، بر پایهٔ هر تابع، در خروجی ارائه دهد. نام فایل دامپ با افزودن .su به انتهای auxname ساخته میشود. در صورتی که نام فایل خروجی صراحتاً تعیین شده باشد و فایل اجرایی نباشد، auxname از نام آن مشتق میشود؛ در غیر این صورت نام پایه (basename) فایل مبدأ خواهد بود. هر مدخل از سه فیلد تشکیل شده است:
- نام تابع.
- تعداد بایتها.
- یک یا چند توصیفگر: "static"، "dynamic"، "bounded".
توصیفگر "static" به این معنی است که تابع پشته را بهطور ایستا دستکاری میکند: تعداد مشخص و ثابتی بایت در هنگام ورود به تابع برای فریم تخصیص مییابد و هنگام خروج از تابع آزاد میشود؛ هیچگونه تغییر دیگری روی پشته درون تابع اعمال نمیگردد. فیلد دوم نمایانگر همین تعداد بایت ثابت است.
توصیفگر "dynamic" به این معنی است که تابع پشته را بهطور پویا دستکاری میکند: علاوه بر تخصیص ایستای شرحدادهشده در بالا، تغییراتی در پشته درون بدنهٔ تابع انجام میشود، برای مثال قرار دادن یا برداشتن آرگومانها (push/pop) در هنگام فراخوانی توابع. اگر توصیفگر "bounded" نیز موجود باشد، میزان این تنظیمات در زمان کامپایل کراندار است و فیلد دوم کران بالای کل پشتهٔ مصرفشده توسط تابع را نشان میدهد. اگر این توصیفگر موجود نباشد، میزان این تنظیمات در زمان کامپایل کراندار نیست و فیلد دوم تنها نمایانگر بخش کراندار خواهد بود.
- -fstats
- در پایان کامپایل، آمارهایی دربارهٔ پردازش فرانتاند (front-end) صادر میکند. این گزینه فقط توسط فرانتاند C++ پشتیبانی میشود و اطلاعات آن بهطور کلی صرفاً برای تیم توسعهٔ G++ کاربرد دارد.
- -fdbg-cnt-list
- نام و کران بالای شمارنده را برای تمام شمارندههای اشکالزدایی چاپ میکند.
- -fdbg-cnt=counter-value-list
- کران پایین و بالای شمارندهٔ اشکالزدایی داخلی را تعیین میکند. آرگومان counter-value-list فهرستی جداشده با کاما از چندتاییهای name:lower_bound1-upper_bound1[:lower_bound2-upper_bound2...] است که نام شمارنده و فهرست بازههای بسته را تعیین میکند. مقدار lower_bound اختیاری است و در صورت تعیین نشدن، با صفر مقداردهی اولیه میشود. به عنوان مثال، با -fdbg-cnt=dce:2-4:10-11,tail_call:10، عبارت dbg_cnt(dce) تنها برای فراخوانیهای دوم، سوم، چهارم، دهم و یازدهم مقدار true برمیگرداند. برای dbg_cnt(tail_call)، برای ۱۰ فراخوانی اول مقدار true برگردانده میشود..IP -print-file-name=library 4 نام کامل و مطلق فایل کتابخانهٔ library را که هنگام پیوند استفاده میشود چاپ میکند---و کار دیگری انجام نمیدهد. با این گزینه، GCC هیچ چیز را کامپایل یا پیوند نمیزند؛ بلکه تنها نام فایل را چاپ میکند.
- -print-multi-directory
- نام دایرکتوری متناظر با multilib انتخابشده توسط سایر سوئیچهای موجود در خط فرمان را چاپ میکند. فرض بر این است که این دایرکتوری در GCC_EXEC_PREFIX وجود دارد.
- -print-multi-lib
- نگاشت میان نام دایرکتوریهای multilib و سوئیچهای کامپایلری که آنها را فعال میکنند چاپ میکند. نام دایرکتوری با یک ; از سوئیچها جدا میشود، و هر سوئیچ به جای - با یک @ آغاز میشود، بدون هیچ فاصلهای میان چندین سوئیچ. این قالببندی برای تسهیل پردازش در شل در نظر گرفته شده است.
- -print-multi-os-directory
- مسیر کتابخانههای سیستمعامل برای multilib انتخابشده را به صورت نسبی به یک زیردایرکتوری lib چاپ میکند. اگر کتابخانههای سیستمعامل در زیردایرکتوری lib موجود باشند و از هیچ multilib استفاده نشود، این مقدار معمولاً فقط . است؛ اگر کتابخانههای سیستمعامل در دایرکتوریهای همسطح libsuffix حضور داشته باشند، این گزینه مثلاً ../lib64، ../lib یا ../lib32 را چاپ میکند، یا اگر کتابخانههای سیستمعامل در زیردایرکتوریهای lib/subdir باشند، مثلاً amd64، sparcv9 یا ev6 را چاپ میکند.
- -print-multiarch
- مسیر کتابخانههای سیستمعامل برای چندمعماری (multiarch) انتخابشده را به صورت نسبی به یک زیردایرکتوری lib چاپ میکند.
- -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 را چاپ میکند. برای رفع این مشکل، یا باید cpp0 و دیگر اجزای کامپایلر را در جایی که gcc انتظار دارد قرار دهید، یا میتوانید متغیر محیطی GCC_EXEC_PREFIX را روی دایرکتوری محل نصب آنها تنظیم کنید. اسلش انتهایی / را فراموش نکنید.
- -print-sysroot
- دایرکتوری sysroot هدف را که در طول کامپایل استفاده میشود، چاپ میکند. این همان sysroot هدفی است که در زمان پیکربندی یا با استفاده از گزینهٔ --sysroot تعیین شده است، احتمالاً به همراه یک پسوند اضافی که به گزینههای کامپایل بستگی دارد. اگر هیچ sysroot هدفی مشخص نشده باشد، این گزینه چیزی چاپ نمیکند.
- -print-sysroot-headers-suffix
- پسوند افزودهشده به sysroot هدف را هنگام جستجوی سرآیندها چاپ میکند، یا اگر کامپایلر با چنین پسوندی پیکربندی نشده باشد خطایی صادر میکند---و کار دیگری انجام نمیدهد.
- -dumpmachine
- ماشین هدف کامپایلر را چاپ میکند (برای نمونه، i686-pc-linux-gnu)---و کار دیگری انجام نمیدهد.
- -dumpversion
- نسخهٔ کامپایلر را چاپ میکند (برای نمونه، 3.0، 6.3.0 یا 7)---و کار دیگری انجام نمیدهد. این نسخهٔ کامپایلری است که در مسیرهای فایلسیستم و specs استفاده میشود. بسته به نحوهٔ پیکربندی کامپایلر، میتواند تنها یک تکعدد (نسخهٔ اصلی یا major)، دو عدد جداشده با نقطه (نسخهٔ اصلی و فرعی یا major و minor) یا سه عدد جداشده با نقطه (نسخههای major، minor و patchlevel) باشد.
- -dumpfullversion
- نسخهٔ کامل کامپایلر را چاپ میکند---و کار دیگری انجام نمیدهد. خروجی همیشه سه عدد جداشده با نقطه است: نسخههای major، minor و patchlevel.
- -dumpspecs
- مشخصات درونی (built-in specs) کامپایلر را چاپ میکند---و کار دیگری انجام نمیدهد. (این گزینه هنگام ساخت خود GCC استفاده میشود.).SS "گزینههای وابسته به ماشین (Machine-Dependent Options)" هر ماشین مقصدی که توسط GCC پشتیبانی میشود میتواند گزینههای خاص خود را داشته باشد---برای نمونه، برای اینکه به شما امکان دهد برای گونهای خاص از پردازنده یا ABI کامپایل کنید، یا بهینهسازیهای ویژهٔ آن ماشین را کنترل نمایید. طبق قرارداد، نام گزینههای وابسته به ماشین با -m آغاز میشود.
برخی از پیکربندیهای کامپایلر همچنین از گزینههای ویژهٔ مقصد بیشتری پشتیبانی میکنند، که معمولاً برای سازگاری با سایر کامپایلرها روی همان پلتفرم است.
گزینههای AArch64 (AArch64 Options)
این گزینهها برای پیادهسازیهای AArch64 تعریف شدهاند:
- -mabi=name
- تولید کد
برای مدل
دادهٔ
مشخصشده.
مقادیر
مجاز
عبارتند از
ilp32 برای مدل
دادهٔ شبه SysV
که در آن int، long int
و
اشارهگرها
۳۲ بیتی
هستند، و lp64
برای مدل
دادهٔ شبه SysV
که در آن int،
۳۲ بیتی است
اما long int و
اشارهگرها
۶۴ بیتی
هستند.
مقدار پیشفرض به پیکربندی مقصد خاص بستگی دارد. توجه داشته باشید که ABIهای LP64 و ILP32 سازگار با پیوند (link-compatible) نیستند؛ شما باید کل برنامهٔ خود را با یک ABI یکسان کامپایل کرده و با مجموعهای از کتابخانههای سازگار پیوند (link) دهید.
مدل ilp32 منسوخ شده است.
- -mbig-endian
- تولید کد بزرگپایان (big-endian). این حالت پیشفرض است هنگامی که GCC برای یک مقصد aarch64_be-*-* پیکربندی شده باشد.
- -mgeneral-regs-only
- تولید کدی که تنها از ثباتهای همهمنظوره (general-purpose registers) استفاده میکند. این کار مانع از استفادهٔ کامپایلر از ثباتهای ممیز شناور (floating-point) و Advanced SIMD خواهد شد، اما هیچ محدودیتی بر اسمبلر اعمال نخواهد کرد.
- -mlittle-endian
- تولید کد کوچکپایان (little-endian). این حالت پیشفرض است هنگامی که GCC برای یک مقصد aarch64-*-* و نه مقصد aarch64_be-*-* پیکربندی شده باشد.
- -mcmodel=tiny
- تولید کد برای مدل کد tiny. برنامه و نمادهای ایستا تعریفشدهٔ آن باید در فاصلهٔ ۱ مگابایتی از یکدیگر باشند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند (link) داده شوند.
- -mcmodel=small
- تولید کد برای مدل کد small. برنامه و نمادهای ایستا تعریفشدهٔ آن باید در فاصلهٔ ۴ گیگابایتی از یکدیگر باشند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند داده شوند. این، مدل کد پیشفرض است.
- -mcmodel=large
- تولید کد برای مدل کد large. این مدل هیچ فرضی دربارهٔ آدرسها و اندازهٔ بخشها در نظر نمیگیرد. برنامهها فقط میتوانند بهصورت ایستا پیوند داده شوند. گزینهٔ -mcmodel=large با گزینههای -mabi=ilp32، -fpic و -fPIC ناسازگار است.
- -mtp=name
- مشخص کردن ثبات سیستمی مورد استفاده بهعنوان اشارهگر ریسه (thread pointer). مقادیر معتبر عبارتند از tpidr_el0، tpidrro_el0، tpidr_el1، tpidr_el2، و tpidr_el3. برای سازگاری با نسخههای پیشین، نامهای مستعار el0، el1، el2، و el3 نیز پذیرفته میشوند. تنظیم پیشفرض tpidr_el0 است. توصیه میشود تمام کدهایی که قرار است با هم تعامل داشته باشند، با مقدار یکسانی از این گزینه کامپایل شوند تا از دسترسی به یک اشارهگر ریسهٔ متفاوت از یک سطح استثناء (exception level) نادرست جلوگیری شود.
- -mstrict-align
- -mno-strict-align
- جلوگیری از تولید دسترسیهای حافظهای که ممکن است بر روی مرز طبیعی شیء تراز نشده باشند (یا مجاز ساختن آن)، همانگونه که در مشخصات معماری شرح داده شده است.
- -momit-leaf-frame-pointer
- -mno-omit-leaf-frame-pointer
- حذف یا نگهداشتن اشارهگر چارچوب (frame pointer) در توابع برگ (leaf functions). رفتار اول پیشفرض است.
- -mstack-protector-guard=guard
- -mstack-protector-guard-reg=reg
- -mstack-protector-guard-offset=offset
- تولید کد
محافظت از
پشته با
استفاده از
قناری (canary) در
guard.
مکانهای
پشتیبانیشده
عبارتند از
global برای یک
قناری
سراسری یا
sysreg برای یک
قناری در یک
ثبات
سیستمی
مناسب.
با انتخاب حالت دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset علاوه بر این مشخص میکنند که از کدام ثبات سیستمی بهعنوان ثبات پایه برای خواندن قناری، و از چه آفستی نسبت به آن ثبات پایه استفاده شود. هیچ ثبات یا آفست پیشفرضی وجود ندارد چرا که این گزینه کاملاً برای استفاده درون کرنل لینوکس است.
- -mtls-dialect=desc
- استفاده از توصیفکنندههای TLS به عنوان سازوکار حافظهٔ محلی ریسه (thread-local storage) برای دسترسیهای پویای متغیرهای TLS. این پیشفرض است.
- -mtls-dialect=traditional
- استفاده از TLS سنتی بهعنوان سازوکار حافظهٔ محلی ریسه برای دسترسیهای پویای متغیرهای TLS.
- -mtls-size=size
- مشخص کردن اندازهٔ بیتی آفستهای بیواسطهٔ (immediate) متغیرهای TLS. مقادیر معتبر عبارتند از 12، 24، 32، 48. این گزینه به binutils نسخهٔ 2.26 یا جدیدتر نیاز دارد.
- -mfix-cortex-a53-835769
- -mno-fix-cortex-a53-835769
- فعال یا غیرفعال کردن راهکار ترمیمی (workaround) برای خطای سختافزاری (erratum) شمارهٔ 835769 در ARM Cortex-A53. این مورد شامل درج یک دستور NOP میان دستورهای حافظه و دستورهای ضرب و جمع انباشته (multiply-accumulate) صحیح ۶۴ بیتی است. در صورتی که معماری یا پردازندهای در خط فرمان مشخص شده باشد که به این راهکار ترمیمی نیازی ندارد، این پرچم نادیده گرفته خواهد شد.
- -mfix-cortex-a53-843419
- -mno-fix-cortex-a53-843419
- فعال یا غیرفعال کردن راهکار ترمیمی برای خطای سختافزاری (erratum) شمارهٔ 843419 در ARM Cortex-A53. این راهکار ترمیمی در زمان پیوند (link time) انجام میشود و این گزینه صرفاً پرچم مربوطه را به پیونددهنده (linker) ارسال خواهد کرد. در صورتی که معماری یا پردازندهای در خط فرمان مشخص شده باشد که به این راهکار ترمیمی نیازی ندارد، این پرچم نادیده گرفته خواهد شد.
- -mlow-precision-recip-sqrt
- -mno-low-precision-recip-sqrt
- فعال یا غیرفعال کردن تقریب جذر معکوس (reciprocal square root). این گزینه تنها در صورتی اثرگذار است که -ffast-math یا -funsafe-math-optimizations نیز استفاده شده باشد. فعال کردن این گزینه، دقت نتایج جذر معکوس را برای دقت یگانه (single precision) به حدود ۱۶ بیت و برای دقت مضاعف (double precision) به ۳۲ بیت کاهش میدهد.
- -mlow-precision-sqrt
- -mno-low-precision-sqrt
- فعال یا غیرفعال کردن تقریب ریشه دوم (square root). این گزینه تنها در صورتی اثرگذار است که -ffast-math یا -funsafe-math-optimizations نیز استفاده شده باشد. فعال کردن این گزینه، دقت نتایج ریشه دوم را برای دقت یگانه به حدود ۱۶ بیت و برای دقت مضاعف به ۳۲ بیت کاهش میدهد. در صورت فعال بودن، بهطور ضمنی -mlow-precision-recip-sqrt را نیز اعمال میکند.
- -mlow-precision-div
- -mno-low-precision-div
- فعال یا غیرفعال کردن تقریب تقسیم. این گزینه تنها در صورتی اثرگذار است که -ffast-math یا -funsafe-math-optimizations نیز استفاده شده باشد. فعال کردن این گزینه، دقت نتایج تقسیم را برای دقت یگانه به حدود ۱۶ بیت و برای دقت مضاعف به ۳۲ بیت کاهش میدهد.
- -mtrack-speculation
- -mno-track-speculation
- فعال یا غیرفعال کردن تولید کد اضافی برای ردیابی اجرای حدسی (speculative execution) از میان شاخههای شرطی. سپس این وضعیت ردیابی میتواند هنگام بسط فراخوانیهای "__builtin_speculation_safe_copy" توسط کامپایلر مورد استفاده قرار گیرد تا امکان تولید توالی کد بهینهتری فراهم شود..IP -moutline-atomics 4
- -mno-outline-atomics
- فعال یا
غیرفعال
کردن
فراخوانی
توابع کمکی
برونخط (out-of-line
helpers) برای
پیادهسازی
عملیات
اتمیک. این
توابع کمکی
در زمان
اجرا بررسی
میکنند که
آیا
دستورالعملهای
LSE از ARMv8.1-A قابل
استفاده
هستند یا
خیر؛ در غیر
این صورت،
از
دستورالعملهای
load/store-exclusive موجود
در ISA پایهٔ ARMv8.0
استفاده
خواهند کرد.
این گزینه تنها هنگام کامپایل برای مجموعه دستورالعملهای پایهٔ ARMv8.0 کاربرد دارد. در صورت استفاده از نگارشهای جدیدتر، مانند -march=armv8.1-a یا -march=armv8-a+lse، دستورالعملهای ARMv8.1-Atomics بهطور مستقیم به کار گرفته خواهند شد. همین امر هنگام استفاده از -mcpu= در صورتی که پردازندهٔ انتخابشده از ویژگی lse پشتیبانی کند نیز صدق میکند. این گزینه بهطور پیشفرض فعال است.
- -march=name
- تعیین نام
معماری
مقصد و در
صورت
تمایل، یک
یا چند
اصلاحکنندهٔ
ویژگی (feature modifier).
این گزینه
ساختار
-march=arch{+[no]feature}*
را دارد.
جدول زیر مقادیر مجاز برای arch و ویژگیهایی را که بهطور پیشفرض فعال میکنند خلاصه میکند:
- مقدار arch : معماری : شاملشده بهطور پیشفرض
- armv8-a : Armv8-A : +fp, +simd
- armv8.1-a : Armv8.1-A : armv8-a, +crc, +lse, +rdma
- armv8.2-a : Armv8.2-A : armv8.1-a
- armv8.3-a : Armv8.3-A : armv8.2-a, +pauth, +fcma, +jscvt
- armv8.4-a : Armv8.4-A : armv8.3-a, +flagm, +fp16fml, +dotprod, +rcpc2
- armv8.5-a : Armv8.5-A : armv8.4-a, +sb, +ssbs, +predres, +frintts, +flagm2
- armv8.6-a : Armv8.6-A : armv8.5-a, +bf16, +i8mm
- armv8.7-a : Armv8.7-A : armv8.6-a, +wfxt, +xs
- armv8.8-a : Armv8.8-a : armv8.7-a, +mops
- armv8.9-a : Armv8.9-a : armv8.8-a
- armv9-a : Armv9-A : armv8.5-a, +sve, +sve2
- armv9.1-a : Armv9.1-A : armv9-a, +bf16, +i8mm
- armv9.2-a : Armv9.2-A : armv9.1-a, +wfxt, +xs
- armv9.3-a : Armv9.3-A : armv9.2-a, +mops
- armv9.4-a : Armv9.4-A : armv9.3-a, +sve2p1
- armv9.5-a : Armv9.4-A : armv9.4-a, cpa, +faminmax, +lut
- armv8-r : Armv8-R : armv8-r
مقدار native در سیستمهای محلی AArch64 GNU/Linux در دسترس است و باعث میشود کامپایلر معماری سیستم میزبان را انتخاب کند. این گزینه در صورتی که کامپایلر نتواند معماری سیستم میزبان را شناسایی کند، هیچ تأثیری ندارد. هنگامی که -march=native مشخص شود و هیچ گزینهٔ -mcpu یا -mtune دیگری داده نشود، GCC پردازندهٔ میزبان را هم به عنوان پردازندهٔ بهینهسازی و هم برای انتخاب ویژگیهای معماری در نظر میگیرد؛ بدین معنا که با -march=native همانند -mcpu=native رفتار میشود.
مقادیر مجاز برای feature در زیربخش مربوط به aarch64-feature-modifiers,,-march and -mcpu Feature Modifiers فهرست شدهاند. در صورت تعیین اصلاحکنندههای ویژگی متناقض، راستترین ویژگی اعمال خواهد شد.
کامپایلر GCC از name برای تعیین نوع دستورالعملهایی که میتواند هنگام تولید کد اسمبلی استفاده کند، بهره میبرد. اگر -march بدون مشخص کردن هیچکدام از -mtune یا -mcpu تعیین شود، کد بهگونهای بهینهسازی میشود که در طیف وسیعی از پردازندههای مقصد که معماری هدف را پیادهسازی کردهاند عملکرد مطلوبی داشته باشد.
- -mtune=name
- تعیین نام
پردازندهٔ
مقصدی که GCC
باید
کارایی کد
را برای آن
بهینهسازی
کند. مقادیر
مجاز برای
این گزینه
عبارتند از:
generic، cortex-a35، cortex-a53،
cortex-a55، cortex-a57،
cortex-a72، cortex-a73،
cortex-a75، cortex-a76،
cortex-a76ae، cortex-a77،
cortex-a65، cortex-a65ae،
cortex-a34، cortex-a78،
cortex-a78ae، cortex-a78c، ares،
exynos-m1، emag، falkor،
oryon-1، neoverse-512tvb،
neoverse-e1، neoverse-n1،
neoverse-n2، neoverse-v1،
neoverse-v2، grace، neoverse-v3،
neoverse-v3ae، neoverse-n3،
olympus، cortex-a725،
cortex-x925، qdf24xx، saphira،
phecda، xgene1، vulcan،
octeontx، octeontx81،
octeontx83، octeontx2،
octeontx2t98، octeontx2t96،
octeontx2t93، octeontx2f95،
octeontx2f95n، octeontx2f95mm،
a64fx، fujitsu-monaka، thunderx،
thunderxt88، thunderxt88p1،
thunderxt81، tsv110،
thunderxt83، thunderx2t99،
thunderx3t110، zeus،
cortex-a57.cortex-a53، cortex-a72.cortex-a53،
cortex-a73.cortex-a35، cortex-a73.cortex-a53،
cortex-a75.cortex-a55، cortex-a76.cortex-a55،
cortex-r82، cortex-r82ae،
cortex-x1، cortex-x1c،
cortex-x2، cortex-x3، cortex-x4،
cortex-a510، cortex-a520،
cortex-a520ae، cortex-a710،
cortex-a715، cortex-a720،
cortex-a720ae، ampere1،
ampere1a، ampere1b، cobalt-100،
apple-m1، apple-m2، apple-m3 و
native.
مقادیر cortex-a57.cortex-a53، cortex-a72.cortex-a53، cortex-a73.cortex-a35، cortex-a73.cortex-a53، cortex-a75.cortex-a55، cortex-a76.cortex-a55، apple-m1، apple-m2، apple-m3 و gb10 مشخص میکنند که GCC باید برای یک سامانهٔ big.LITTLE بهینهسازی کند.
مقدار neoverse-512tvb مشخص میکند که GCC باید برای هستههای Neoverse که (الف) SVE را پیادهسازی کرده و (ب) پهنای باند برداری کل آنها ۵۱۲ بیت در هر چرخه است، بهینهسازی کند. به عبارت دیگر، این گزینه به GCC اعلام میکند که برای هستههای Neoverse که توانایی اجرای ۴ دستورالعمل محاسباتی ۱۲۸ بیتی Advanced SIMD در هر چرخه و اجرای تعداد معادل آن از دستورالعملهای محاسباتی SVE در هر چرخه را دارند (۲ مورد برای SVE ۲۵۶ بیتی، ۴ مورد برای SVE ۱۲۸ بیتی)، بهینهسازی انجام دهد. این حالت کلیتر از بهینهسازی برای یک هستهٔ خاص مانند Neoverse V1 است، اما مشخصتر از بهینهسازی پیشفرضی است که در زیر شرح داده شده است.
علاوه بر این، در سیستمهای محلی AArch64 GNU/Linux، مقدار native کارایی را برای سیستم میزبان بهینهسازی میکند. این گزینه در صورتی که کامپایلر قادر به شناسایی پردازندهٔ سیستم میزبان نباشد، هیچ تأثیری ندارد.
در حالتی که هیچیک از گزینههای -mtune=، -mcpu= یا -march= تعیین نشده باشند، کد بهگونهای بهینهسازی میشود که در میان طیف وسیعی از پردازندههای مقصد عملکرد مطلوبی ارائه دهد.
این گزینه نمیتواند اصلاحکنندهٔ ویژگی به عنوان پسوند دریافت کند.
- -mcpu=name
- تعیین نام
پردازندهٔ
مقصد که
میتواند
بهطور
اختیاری
دارای یک یا
چند پسوند
اصلاحکنندهٔ
ویژگی باشد.
این گزینه
ساختار
-mcpu=cpu{+[no]feature}*
را دارد، که
در آن
مقادیر
مجاز برای
cpu همان
مقادیر
موجود برای
-mtune هستند.
مقادیر
مجاز برای
feature در
زیربخش
مربوط به
aarch64-feature-modifiers,,-march and -mcpu
Feature Modifiers مستند
شدهاند. در
صورت تعیین
اصلاحکنندههای
ویژگی
متناقض،
راستترین
ویژگی
اعمال
خواهد شد.
کامپایلر GCC از name هم برای تعیین نوع دستورالعملهایی که میتواند هنگام تولید کد اسمبلی منتشر کند (مانند -march) و هم برای تعیین پردازندهٔ مقصدی که باید کارایی برای آن بهینهسازی شود (مانند -mtune) استفاده میکند. در صورتی که این گزینه همراه با -march یا -mtune استفاده شود، آن گزینهها بر بخش متناظر از این گزینه ارجحیت خواهند داشت.
گزینهٔ -mcpu=neoverse-512tvb از این نظر خاص است که به یک هستهٔ مشخص اشاره ندارد، بلکه به تمام هستههای Neoverse اشاره میکند که (الف) SVE را پیادهسازی کرده و (ب) دارای پهنای باند برداری کل ۵۱۲ بیت در هر چرخه هستند. مگر اینکه توسط -march بازنویسی شود، -mcpu=neoverse-512tvb کدی تولید میکند که روی هستهٔ Neoverse V1 قابل اجرا است؛ زیرا Neoverse V1 نخستین هستهٔ Neoverse دارای این ویژگیها است. مگر اینکه توسط -mtune بازنویسی شود، -mcpu=neoverse-512tvb کد را به همان شیوهٔ -mtune=neoverse-512tvb بهینهسازی میکند.
- -moverride=string
- بازنویسی
تصمیمات
بهینهسازی
اتخاذشده
توسط بخش
پشتی (back-end) در
پاسخ به
سوییچ -mtune=.
ساختار،
معناشناسی،
و مقادیر
پذیرفتهشده
برای string در
این گزینه
تضمین
نمیشود که
در تمام
نگارشها
یکسان
بمانند.
این گزینه صرفاً برای استفاده در زمان توسعهٔ GCC طراحی شده است..IP -mverbose-cost-dump 4 فعالسازی تخلیهٔ مفصل مدل هزینه در فایلهای تخلیهٔ اشکالزدایی. این گزینه برای استفاده در اشکالزدایی کامپایلر فراهم شده است.
- -mpc-relative-literal-loads
- -mno-pc-relative-literal-loads
- فعال یا غیرفعال کردن بارگذاری مقادیر ثابت وابسته به PC (شمارندهٔ برنامه). با این گزینه استخرهای مقادیر ثابت (literal pools) با استفاده از یک تکدستورالعمل قابل دسترسی بوده و پس از هر تابع صادر میشوند. این امر حداکثر اندازهٔ توابع را به 1MB محدود میکند. این گزینه بهطور پیشفرض برای -mcmodel=tiny فعال است.
- -msign-return-address=scope
- حوزهٔ تابعی را که امضای نشانی بازگشت بر آن اعمال میشود انتخاب میکند. مقادیر مجاز عبارتند از: none که امضای نشانی بازگشت را غیرفعال میکند، non-leaf که امضای اشارهگر را برای توابعی که تابع برگ (leaf) نیستند فعال میکند، و all که امضای اشارهگر را برای همهٔ توابع فعال میسازد. مقدار پیشفرض none است. این گزینه به نفع -mbranch-protection منسوخ شده است.
- -mbranch-protection=none|standard|pac-ret[+leaf+b-key]|bti|gcs
- انتخاب ویژگیهای محافظت از انشعاب مورد استفاده. none مقدار پیشفرض است و تمام انواع محافظت از انشعاب را خاموش میکند. standard تمام انواع ویژگیهای محافظت از انشعاب را روشن میکند. اگر یک ویژگی دارای گزینههای تنظیم دقیق اضافی باشد، standard آن را در سطح استانداردش تنظیم میکند. pac-ret[+leaf] امضای نشانی بازگشت را در سطح استانداردش روشن میکند: امضای توابعی که نشانی بازگشت را در حافظه ذخیره میکنند (توابع non-leaf عملاً همواره این کار را انجام میدهند) با استفاده از a-key. از آرگومان اختیاری leaf میتوان برای تعمیم امضا جهت در بر گرفتن توابع برگ (leaf) استفاده کرد. از آرگومان اختیاری b-key میتوان برای امضای توابع با B-key به جای A-key استفاده کرد. bti سازوکار شناسایی هدف انشعاب (branch target identification) را روشن میکند. gcs تولید کد سازگار با پشتهٔ کنترلی محافظتشده (guarded control stack) را فعال میکند.
- -mharden-sls=opts
- فعالسازی مقاومسازی کامپایلر در برابر حدس و گمان مستقیم خطی (SLS). opts فهرستی از گزینههای زیر است که با کاما از هم جدا شدهاند:
علاوه بر این، -mharden-sls=all تمام مقاومسازیهای SLS را فعال میکند، در حالی که -mharden-sls=none تمام مقاومسازیهای SLS را غیرفعال میسازد.
- -mearly-ra=scope
- تعیین زمان
فعالسازی
گذر تخصیص
زودهنگام
ثبات (early register allocation pass).
این گذر پیش
از
زمانبندی
دستورالعملها
اجرا
میشود و
تلاش
میکند یک
تخصیص بدون
سرریز (spill-free)
برای کدهای
ممیز شناور
و برداری
بیابد.
همچنین
تلاش
میکند از
دستورالعملهای
چندثباتی
گامدار (strided)،
مانند
دستورهای
گامدار LD1 و ST1
در SME2' بهره
ببرد.
مقادیر ممکن برای scope عبارتند از: all که گذر را روی تمامی توابع اجرا میکند؛ strided که گذر را روی توابعی که به دستورالعملهای چندثباتی گامدار دسترسی دارند اجرا میکند؛ و none که گذر را غیرفعال میسازد.
-mearly-ra=all مقدار پیشفرض برای -O2 و بالاتر، و برای -Os است. در غیر این صورت، مقدار پیشفرض -mearly-ra=none است.
- -mearly-ldp-fusion
- فعالسازی نسخهٔ گذر ادغام جفت load/store در AArch64 که قبل از تخصیص ثبات اجرا میشود. بهطور پیشفرض در -O و بالاتر فعال است.
- -mlate-ldp-fusion
- فعالسازی نسخهٔ گذر ادغام جفت load/store در AArch64 که بعد از تخصیص ثبات اجرا میشود. بهطور پیشفرض در -O و بالاتر فعال است.
- -msve-vector-bits=bits
- تعداد
بیتها را
در یک ثبات
برداری SVE
مشخص
میکند. این
گزینه تنها
زمانی مؤثر
است که SVE
فعال باشد.
کامپایلر GCC از دو شیوهٔ تولید کد SVE پشتیبانی میکند: خروجی «مستقل از طول بردار» (vector-length agnostic) که با هر اندازهای از ثبات برداری کار میکند و خروجی «وابسته به طول بردار» (vector-length specific) که به GCC اجازه میدهد در مواردی که برای بهینهسازی مفید است، فرضیاتی دربارهٔ طول بردار در نظر بگیرد. مقادیر ممکن برای bits عبارتند از: scalable، 128، 256، 512، 1024 و 2048. مشخص کردن scalable خروجی مستقل از طول بردار را انتخاب میکند. در حال حاضر -msve-vector-bits=128 نیز برای مقصدهای big-endian خروجی مستقل از طول بردار تولید میکند. تمامی مقادیر دیگر کدی وابسته به طول بردار تولید میکنند. رفتار این مقادیر ممکن است در انتشارهای آینده تغییر کند و برای تولید کدی که بین طولهای مختلف ثبات برداری SVE در سختافزارهای مختلف سازگار و قابل حمل باشد، نباید به هیچ مقداری جز scalable اتکا کرد.
پیشفرض -msve-vector-bits=scalable است که کدی مستقل از طول بردار تولید میکند.
- -Wexperimental-fmv-target
- هشدار دربارهٔ استفاده از قابلیت چندنسخهای کردن توابع (Function Multi Versioning) آزمایشی. مشخصات Arm C Language Extension برای Function Multi Versioning در وضعیت بتا بوده و ممکن است تغییر کند. هرگونه استفاده از FMV مشروط به این هشدار است که احتمال تغییر رفتار و ناسازگاری در آینده وجود دارد.
اصلاحکنندههای ویژگی -march و -mcpu
اصلاحکنندههای ویژگی که با -march و -mcpu استفاده میشوند میتوانند هر یک از موارد زیر و معکوس آنها یعنی nofeature باشند:
- crc
- فعالسازی افزونهٔ CRC. این گزینه بهطور پیشفرض برای -march=armv8.1-a فعال است.
- crypto
- فعالسازی افزونهٔ Crypto. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- fp
- فعالسازی دستورالعملهای ممیز شناور. این گزینه بهطور پیشفرض برای تمام مقادیر ممکنِ گزینههای -march و -mcpu فعال است.
- simd
- فعالسازی دستورالعملهای Advanced SIMD. این گزینه همچنین دستورالعملهای ممیز شناور را فعال میکند. این گزینه بهطور پیشفرض برای تمام مقادیر ممکنِ گزینههای -march و -mcpu فعال است.
- sve
- فعالسازی دستورالعملهای Scalable Vector Extension. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- lse
- فعالسازی دستورالعملهای Large System Extension. این گزینه بهطور پیشفرض برای -march=armv8.1-a فعال است.
- rdma
- فعالسازی دستورالعملهای Round Double Multiply Accumulate. این گزینه بهطور پیشفرض برای -march=armv8.1-a فعال است.
- fp16
- فعالسازی افزونهٔ FP16. این گزینه همچنین دستورالعملهای ممیز شناور را فعال میکند.
- fp16fml
- فعالسازی افزونهٔ FP16 fmla. این گزینه همچنین افزونههای FP16 و دستورالعملهای ممیز شناور را فعال میکند. این گزینه بهطور پیشفرض برای -march=armv8.4-a فعال است. استفاده از این گزینه با معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- rcpc
- فعالسازی افزونهٔ RCpc. این گزینه استفاده از دستورالعملهای LDAPR را برای معناشناسی اتمی load-acquire فعال کرده و آن را به اسمبلر منتقل میکند تا دستورهای asm درونخطی بتوانند از دستورالعملهای افزونهٔ RCpc استفاده کنند.
- dotprod
- فعالسازی افزونهٔ Dot Product. این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میکند.
- aes
- فعالسازی افزونهٔ رمزنگاری aes و pmull در Armv8-a. این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میکند.
- sha2
- فعالسازی افزونهٔ رمزنگاری sha2 در Armv8-a. این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میکند.
- sha3
- فعالسازی افزونهٔ رمزنگاری sha512 و sha3. این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میکند. استفاده از این گزینه با معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- sm4
- فعالسازی افزونهٔ رمزنگاری sm3 و sm4. این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میکند. استفاده از این گزینه با معماریهای پیش از Armv8.2-A پشتیبانی نمیشود.
- profile
- فعالسازی افزونهٔ Statistical Profiling. این گزینه تنها برای فعالسازی افزونه در سطح اسمبلر است و بر تولید کد تأثیری ندارد.
- rng
- فعالسازی دستورالعملهای تولید عدد تصادفی (Random Number) در Armv8.5-a. این گزینه تنها برای فعالسازی افزونه در سطح اسمبلر است و بر تولید کد تأثیری ندارد.
- memtag
- فعالسازی افزونههای Memory Tagging در Armv8.5-a. استفاده از این گزینه با معماریهای پیش از Armv8.5-A پشتیبانی نمیشود..IP sb 4 فعالسازی دستور Speculation Barrier در Armv8-a. این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلی است و روی تولید کد تأثیری نمیگذارد. این گزینه بهطور پیشفرض برای -march=armv8.5-a فعال است.
- ssbs
- فعالسازی دستور Speculative Store Bypass Safe در Armv8-a. این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلی است و روی تولید کد تأثیری نمیگذارد. این گزینه بهطور پیشفرض برای -march=armv8.5-a فعال است.
- predres
- فعالسازی دستورهای Execution and Data Prediction Restriction در Armv8-a. این گزینه صرفاً برای فعالسازی افزونه در سطح اسمبلی است و روی تولید کد تأثیری نمیگذارد. این گزینه بهطور پیشفرض برای -march=armv8.5-a فعال است.
- sve2
- فعالسازی Armv8-a Scalable Vector Extension 2. این گزینه دستورهای SVE را نیز فعال میکند.
- sve2-bitperm
- فعالسازی دستورهای SVE2 bitperm. این گزینه دستورهای SVE2 را نیز فعال میکند.
- sve2-sm4
- فعالسازی دستورهای SVE2 sm4. این گزینه دستورهای SVE2 را نیز فعال میکند.
- sve2-aes
- فعالسازی دستورهای SVE2 aes. این گزینه دستورهای SVE2 را نیز فعال میکند.
- sve2-sha3
- فعالسازی دستورهای SVE2 sha3. این گزینه دستورهای SVE2 را نیز فعال میکند.
- sve2p1
- فعالسازی دستورهای SVE2.1. این گزینه دستورهای SVE2 را نیز فعال میکند.
- tme
- فعالسازی Transactional Memory Extension.
- i8mm
- فعالسازی دستورهای ضرب ماتریسی اعداد صحیح ۸ بیتی (8-bit Integer Matrix Multiply). این گزینه همچنین دستورهای ممیز شناور و Advanced SIMD را فعال میکند. این گزینه بهطور پیشفرض برای -march=armv8.6-a فعال است. استفاده از این گزینه با معماریهای قبل از Armv8.2-A پشتیبانی نمیشود.
- f32mm
- فعالسازی دستورهای ضرب ماتریسی ممیز شناور ۳۲ بیتی. این گزینه همچنین دستورهای SVE را فعال میکند. استفاده از این گزینه با معماریهای قبل از Armv8.2-A پشتیبانی نمیشود.
- f64mm
- فعالسازی دستورهای ضرب ماتریسی ممیز شناور ۶۴ بیتی. این گزینه همچنین دستورهای SVE را فعال میکند. استفاده از این گزینه با معماریهای قبل از Armv8.2-A پشتیبانی نمیشود.
- bf16
- فعالسازی دستورهای ممیز شناور دقت نیمه brain. این گزینه همچنین دستورهای Advanced SIMD و ممیز شناور را فعال میکند. این گزینه بهطور پیشفرض برای -march=armv8.6-a فعال است. استفاده از این گزینه با معماریهای قبل از Armv8.2-A پشتیبانی نمیشود.
- ls64
- فعالسازی دستورهای بارگذاری و ذخیرهسازی اتمیک ۶۴ بایتی برای شتابدهندهها.
- mops
- فعالسازی دستورها برای شتاببخشی به عملیاتهای حافظه مانند "memcpy"، "memmove" و "memset". این گزینه بهطور پیشفرض برای -march=armv8.8-a فعال است.
- flagm
- فعالسازی افزونه دستورهای دستکاری پرچم (Flag Manipulation instructions Extension).
- flagm2
- فعالسازی دستورهای تبدیل پرچم FlagM2.
- pauth
- فعالسازی Pointer Authentication Extension.
- cssc
- فعالسازی دستورهای Common Short Sequence Compression.
- sme
- فعالسازی Scalable Matrix Extension. این مورد تنها زمانی پشتیبانی میشود که SVE2 نیز فعال باشد.
- sme-i16i64
- فعالسازی افزونه FEAT_SME_I16I64 برای SME. این گزینه دستورهای SME را نیز فعال میکند.
- sme-f64f64
- فعالسازی افزونه FEAT_SME_F64F64 برای SME. این گزینه دستورهای SME را نیز فعال میکند.
- sme2
- فعالسازی Scalable Matrix Extension 2. این گزینه دستورهای SME را نیز فعال میکند.
- sme-b16b16
- فعالسازی افزونه FEAT_SME_B16B16 برای SME. این گزینه دستورهای SME2 و SVE_B16B16 را نیز فعال میکند.
- sme-f16f16
- فعالسازی افزونه FEAT_SME_F16F16 برای SME. این گزینه دستورهای SME2 را نیز فعال میکند.
- sme2p1
- فعالسازی Scalable Matrix Extension نگارش 2.1. این گزینه دستورهای SME2 را نیز فعال میکند.
- fcma
- فعالسازی افزونههای SIMD برای اعداد مختلط.
- jscvt
- فعالسازی دستور تبدیل جاوااسکریپت "fjcvtzs".
- frintts
- فعالسازی دستورهای گرد کردن ممیز شناور به مقدار صحیح.
- wfxt
- فعالسازی دستورهای "wfet" و "wfit".
- xs
- فعالسازی افزونه صفت حافظه XS.
- lse128
- فعالسازی افزونه دستورهای اتمیک ۱۲۸ بیتی LSE128. این گزینه دستورهای LSE را نیز فعال میکند.
- d128
- فعالسازی پشتیبانی از دستورهای خواندن/نوشتن ثبات سیستم ۱۲۸ بیتی. این گزینه افزونه LSE128 را نیز فعال میکند.
- gcs
- فعالسازی پشتیبانی از افزونه Guarded Control Stack در Armv9.4-a.
- the
- فعالسازی پشتیبانی از افزونه translation hardening در Armv8.9-a/9.4-a.
- rcpc2
- فعالسازی افزونه RCpc2.
- rcpc3
- فعالسازی افزونه RCpc3 (Release Consistency).
- fp8
- فعالسازی افزونه fp8 (ممیز شناور ۸ بیتی).
- fp8fma
- فعالسازی افزونه ضرب و انباشت ممیز شناور ۸ بیتی (fp8).
- ssve-fp8fma
- فعالسازی افزونه ضرب و انباشت ممیز شناور ۸ بیتی (fp8) در حالت جاری (streaming mode).
- fp8dot4
- فعالسازی افزونه ضرب داخلی ۴ جهته ممیز شناور ۸ بیتی (fp8) به دقت یگانه.
- ssve-fp8dot4
- فعالسازی افزونه ضرب داخلی ۴ جهته ممیز شناور ۸ بیتی (fp8) به دقت یگانه در حالت جاری.
- fp8dot2
- فعالسازی افزونه ضرب داخلی ۲ جهته ممیز شناور ۸ بیتی (fp8) به دقت نیمه.
- ssve-fp8dot2
- فعالسازی افزونه ضرب داخلی ۲ جهته ممیز شناور ۸ بیتی (fp8) به دقت نیمه در حالت جاری.
- faminmax
- فعالسازی افزونه Floating Point Absolute Maximum/Minimum.
- lut
- فعالسازی افزونه Lookup Table.
- cpa
- فعالسازی دستورهای Checked Pointer Arithmetic.
- sve-b16b16
- فعالسازی افزونه SVE non-widening brain floating-point ("bf16"). این مورد تنها زمانی اثرگذار است که "sve2" یا "sme2" نیز فعال باشند..PP قابلیت crypto مستلزم aes، sha2 و simd است که خود مستلزم fp میباشد. برعکس، nofp مستلزم nosimd است که خود مستلزم nocrypto، noaes و nosha2 خواهد بود.
گزینههای Adapteva Epiphany
این گزینههای -m برای Adapteva Epiphany تعریف شدهاند:
- -mhalf-reg-file
- هیچ ثباتی را در محدوده "r32"..."r63" تخصیص ندهید. این کار اجازه میدهد تا کد روی نسخههای سختافزاری که فاقد این ثباتها هستند اجرا شود.
- -mprefer-short-insn-regs
- ترجیحاً ثباتهایی را تخصیص دهید که امکان تولید دستورالعملهای کوتاه را فراهم میکنند. این کار میتواند منجر به افزایش تعداد دستورالعملها شود، بنابراین ممکن است اندازه کلی کد را کاهش یا افزایش دهد.
- -mbranch-cost=num
- هزینه انشعابها را تقریباً برابر با num دستورالعمل «ساده» تنظیم میکند. این هزینه صرفاً یک تخمین تقریبی است و تضمینی برای ایجاد نتایج یکسان در انتشارها و نگارشهای مختلف وجود ندارد.
- -mcmove
- تولید دستورالعملهای انتقال شرطی را فعال میکند.
- -mnops=num
- پیش از هر دستورالعمل تولیدشده دیگر، به تعداد num دستور NOP درج میکند.
- -mno-soft-cmpsf
- برای مقایسههای ممیز شناور با دقت یگانه (single-precision)، یک دستور "fsub" صادر کرده و پرچمها را بررسی میکند. این کار سریعتر از مقایسه نرمافزاری است، اما میتواند در حضور مقادیر NaN، یا هنگامی که دو عدد کوچکِ متفاوت به گونهای مقایسه میشوند که تفاضل آنها صفر محاسبه میشود، نتایج نادرستی ایجاد کند. پیشفرض -msoft-cmpsf است که از مقایسههای نرمافزاری کندتر، ولی منطبق بر استاندارد IEEE استفاده میکند.
- -mstack-offset=num
- آفست بین بالای پشته و اشارهگر پشته (stack pointer) را تنظیم میکند. برای نمونه، مقدار 8 بدین معناست که هشت بایت در محدوده "sp+0...sp+7" میتواند توسط توابع برگ (leaf functions) بدون تخصیص پشته استفاده شود. مقادیر غیر از 8 یا 16 آزمایشنشده هستند و بعید است کار کنند. همچنین توجه داشته باشید که این گزینه ABI را تغییر میدهد؛ کامپایل یک برنامه با یک آفست پشته متفاوت از کتابخانههایی که قبلاً با آن کامپایل شدهاند، عموماً کار نخواهد کرد. این گزینه در صورتی که بخواهید بررسی کنید آیا یک آفست پشته متفاوت کد بهتری ایجاد میکند یا خیر میتواند مفید باشد، اما برای استفاده واقعی از آفست پشته متفاوت جهت ساخت برنامههای کارآمد، توصیه میشود زنجیره ابزار با گزینه مناسب --with-stack-offset=num پیکربندی شود.
- -mno-round-nearest
- باعث میشود زمانبند فرض کند که حالت گرد کردن روی کوتاهکردن (truncating) تنظیم شده است. پیشفرض -mround-nearest است.
- -mlong-calls
- اگر خلاف آن توسط یک ویژگی (attribute) مشخص نشده باشد، فرض میکند که تمام فراخوانیها ممکن است فراتر از محدوده آفست دستورالعملهای "b" / "bl" باشند، و بنابراین نشانی تابع را پیش از اجرای یک فراخوانی (که در غیر این صورت مستقیم میبود) در یک ثبات بارگذاری میکند. این مقدار پیشفرض است.
- -mshort-calls
- اگر خلاف آن توسط یک ویژگی مشخص نشده باشد، فرض میکند تمام فراخوانیهای مستقیم در محدوده دستورالعملهای "b" / "bl" قرار دارند، بنابراین از این دستورالعملها برای فراخوانیهای مستقیم استفاده میکند. پیشفرض -mlong-calls است.
- -msmall16
- فرض میکند که نشانیها میتوانند به صورت مقادیر بدون علامت ۱۶ بیتی بارگذاری شوند. این مورد برای نشانیهای تابعی که معنای -mlong-calls روی آنها مؤثر است اعمال نمیشود.
- -mfp-mode=mode
- حالت غالب
واحد ممیز
شناور را
تنظیم
میکند. این
مشخص
میکند که
چه حالت
ممیز
شناوری در
زمان
فراخوانی
تابع و
بازگشت از
آن ارائه
شده و مورد
انتظار است.
تطبیق این
حالت با
حالتی که
عمدتاً در
ابتدای
تابع به آن
نیاز دارید
میتواند
با جلوگیری
از
تعویضهای
غیرضروری
حالت،
برنامههای
شما را
کوچکتر و
سریعتر
کند.
mode میتواند یکی از مقادیر زیر باشد:
- caller
- هر حالتی در ورودی تابع معتبر است، و هنگام بازگشت تابع و زمانی که توابع دیگر را فراخوانی میکند، حفظ یا بازیابی میشود. این حالت برای کامپایل کتابخانهها یا سایر واحدهای کامپایلی که ممکن است بخواهید در برنامههای مختلف با حالتهای غالب FPU متفاوت ادغام کنید مفید است، و راحتی استفاده از یک فایل شیء واحد، بر سربار اندازه و سرعت برای تعویضهای حالت اضافی که ممکن است مورد نیاز باشد (در مقایسه با انتخابی خاصتر برای حالت غالب FPU)، برتری دارد.
- truncate
- این حالتی است که برای محاسبات ممیز شناور با روش گرد کردنِ کوتاهسازی (یعنی گرد کردن به سمت صفر) استفاده میشود. این مورد شامل تبدیل از ممیز شناور به عدد صحیح نیز میشود.
- round-nearest
- این حالتی است که برای محاسبات ممیز شناور با روش گرد کردن به نزدیکترین یا زوج (round-to-nearest-or-even) استفاده میشود.
- int
- این حالتی است که برای انجام محاسبات صحیح در FPU استفاده میشود، مانند ضرب اعداد صحیح، یا ضرب و جمع انباشته صحیح (multiply-and-accumulate).
پیشفرض -mfp-mode=caller است.
- -mno-split-lohi
- -mno-postinc
- -mno-postmodify
- بهینهسازیهای جزئی تولید کد که به ترتیب تقسیم بارگذاریهای ۳۲ بیتی، تولید نشانیهای پسافزایشی (post-increment)، و تولید نشانیهای پستغییری (post-modify) را غیرفعال میکنند. پیشفرضها msplit-lohi، -mpost-inc و -mpost-modify هستند.
- -mnovect-double
- حالت برداری SIMD ترجیحی را به SImode تغییر میدهد. پیشفرض -mvect-double است که از DImode به عنوان حالت ترجیحی SIMD استفاده میکند.
- -max-vect-align=num
- بیشینه تراز برای انواع حالت برداری SIMD. num میتواند ۴ یا ۸ باشد. پیشفرض ۸ است. توجه داشته باشید که این یک تغییر در ABI است، اگرچه بسیاری از رابطهای توابع کتابخانهای در صورتی که از حالتهای برداری SIMD در جاهایی که بر اندازه یا تراز انواع مربوطه تأثیر میگذارد استفاده نکنند، تحت تأثیر قرار نمیگیرند.
- -msplit-vecmove-early
- انتقالهای برداری را پیش از مرحله reload به انتقالهای تککلمهای تقسیم میکند. در تئوری این میتواند تخصیص ثبات بهتری ارائه دهد، اما تاکنون به طور کلی عکس این موضوع مشاهده شده است.
- -m1reg-reg
- یک ثبات را برای نگهداری مقدار ثابت -1 تعیین میکند که بارگذاری مقادیر منفی کوچک و ماسکهای بیتی خاص را سریعتر میسازد. مقادیر مجاز برای reg شامل r43 و r63 است که استفاده از آن ثبات را به عنوان یک ثبات ثابت تعیین میکند، و none که به معنی عدم استفاده از هیچ ثباتی برای این منظور است. پیشفرض -m1reg-none است.
گزینههای AMD GCN
این گزینهها به طور ویژه برای پورت AMD GCN تعریف شدهاند.
- -march=gpu
- -mtune=gpu
- نوع معماری یا تنظیم عملکرد (tuning) را برای gpu تعیین میکند. مقادیر پشتیبانیشده برای gpu عبارتاند از:
- gfx900
- کامپایل برای دستگاههای GCN5 Vega 10 (gfx900).
- gfx902
- کامپایل برای دستگاههای GCN5 Vega gfx902. (آزمایشی)
- gfx904
- کامپایل برای دستگاههای GCN5 Vega gfx904. (آزمایشی)
- gfx906
- کامپایل برای دستگاههای GCN5 Vega 20 (gfx906).
- gfx908
- کامپایل برای دستگاههای سری CDNA1 Instinct MI100 (gfx908).
- gfx909
- کامپایل برای دستگاههای GCN5 Vega gfx909. (آزمایشی)
- gfx90a
- کامپایل برای دستگاههای سری CDNA2 Instinct MI200 (gfx90a)..IP gfx90c 4 کامپایل برای دستگاههای GCN5 Vega 7 (gfx90c).
- gfx9-generic
- کامپایل کد عمومی برای دستگاههای Vega، قابل اجرا روی زیرمجموعه زیر از دستگاههای GFX9: gfx900، gfx902، gfx904، gfx906، gfx909 و gfx90c. (آزمایشی)
- gfx1030
- کامپایل برای دستگاههای RDNA2 gfx1030 (سری GFX10).
- gfx1031
- کامپایل برای دستگاههای RDNA2 gfx1031 (سری GFX10). (آزمایشی)
- gfx1032
- کامپایل برای دستگاههای RDNA2 gfx1032 (سری GFX10). (آزمایشی)
- gfx1033
- کامپایل برای دستگاههای RDNA2 gfx1033 (سری GFX10). (آزمایشی)
- gfx1034
- کامپایل برای دستگاههای RDNA2 gfx1034 (سری GFX10). (آزمایشی)
- gfx1035
- کامپایل برای دستگاههای RDNA2 gfx1035 (سری GFX10). (آزمایشی)
- gfx1036
- کامپایل برای دستگاههای RDNA2 gfx1036 (سری GFX10).
- gfx10-3-generic
- کامپایل کد عمومی برای دستگاههای GFX10-3، قابل اجرا روی gfx1030، gfx1031، gfx1032، gfx1033، gfx1034، gfx1035 و gfx1036. (آزمایشی)
- gfx1100
- کامپایل برای دستگاههای RDNA3 gfx1100 (سری GFX11).
- gfx1101
- کامپایل برای دستگاههای RDNA3 gfx1101 (سری GFX11). (آزمایشی)
- gfx1102
- کامپایل برای دستگاههای RDNA3 gfx1102 (سری GFX11). (آزمایشی)
- gfx1103
- کامپایل برای دستگاههای RDNA3 gfx1103 (سری GFX11).
- gfx1150
- کامپایل برای دستگاههای RDNA3 gfx1150 (سری GFX11). (آزمایشی)
- gfx1151
- کامپایل برای دستگاههای RDNA3 gfx1151 (سری GFX11). (آزمایشی)
- gfx1152
- کامپایل برای دستگاههای RDNA3 gfx1152 (سری GFX11). (آزمایشی)
- gfx1153
- کامپایل برای دستگاههای RDNA3 gfx1153 (سری GFX11). (آزمایشی)
- gfx11-generic
- کامپایل کد عمومی برای دستگاههای GFX11، قابل اجرا روی gfx1100، gfx1101، gfx1102، gfx1103، gfx1150، gfx1151، gfx1152 و gfx1153. (آزمایشی)
- -msram-ecc=on
- -msram-ecc=off
- -msram-ecc=any
- کامپایل باینریهای مناسب برای دستگاههایی با ویژگی SRAM-ECC فعال، غیرفعال یا هر یک از این دو حالت. این ویژگی در برخی دستگاهها میتواند بهازای هر پردازش فعال شود. کد کامپایلشده باید با حالت دستگاه مطابقت داشته باشد. مقدار پیشفرض برای دستگاههایی که از آن پشتیبانی میکنند، any است.
- -mstack-size=bytes
- تعیین میکند چه تعداد بایت از فضای پشته برای هر ریسه GPU (wave-front) درخواست شود. توجه داشته باشید که ممکن است ریسههای بسیار و حافظه محدودی در دسترس باشد. اندازه تخصیص پشته همچنین میتواند بر کارایی زمان اجرا تأثیر بگذارد. مقدار پیشفرض هنگام استفاده از OpenACC یا OpenMP برابر 32KB و در غیر این صورت 1MB است.
- -mxnack=on
- -mxnack=off
- -mxnack=any
- کامپایل باینریهای مناسب برای دستگاههایی با قابلیت XNACK فعال، غیرفعال یا در هر دو حالت. برخی دستگاهها همیشه به XNACK نیاز دارند و برخی به کاربر اجازه میدهند XNACK را پیکربندی کند. کد کامپایلشده باید با حالت دستگاه مطابقت داشته باشد. پیشفرض در دستگاههایی که از Unified Shared Memory پشتیبانی میکنند -mxnack=any و در غیر این صورت -mxnack=no است.
گزینههای ARC
گزینههای زیر نگارش معماری را که کد برای آن کامپایل میشود، کنترل میکنند:
- -mbarrel-shifter
- تولید دستورالعملهای پشتیبانیشده توسط barrel shifter. این حالت پیشفرض است مگر اینکه -mcpu=ARC601 یا -mcpu=ARCEM فعال باشد.
- -mjli-always
- اجبار به فراخوانی تابع با استفاده از دستورالعمل jli_s. این گزینه فقط برای معماری ARCv2 معتبر است.
- -mcpu=cpu
- تنظیم نوع معماری، نحوه استفاده از ثباتها (رجیسترها)، و پارامترهای زمانبندی دستورالعملها برای cpu. همچنین گزینههای میانبر ناممستعار (alias) برای سازگاری با گذشته و راحتی کار در دسترس هستند. مقادیر پشتیبانیشده برای cpu عبارتاند از:
- arc600
- کامپایل برای ARC600. نامهای مستعار: -mA6، -mARC600.
- arc601
- کامپایل برای ARC601. نام مستعار: -mARC601.
- arc700
- کامپایل برای ARC700. نامهای مستعار: -mA7، -mARC700. هنگام پیکربندی با --with-cpu=arc700، این مقدار پیشفرض است.
- arcem
- کامپایل برای ARC EM.
- archs
- کامپایل برای ARC HS.
- em
- کامپایل برای پردازنده ARC EM بدون افزونههای سختافزاری.
- em4
- کامپایل برای پردازنده ARC EM4.
- em4_dmips
- کامپایل برای پردازنده ARC EM4 DMIPS.
- em4_fpus
- کامپایل برای پردازنده ARC EM4 DMIPS با افزونه ممیز شناور با دقت یگانه (single-precision).
- em4_fpuda
- کامپایل برای پردازنده ARC EM4 DMIPS با ممیز شناور دقت یگانه و دستورالعملهای کمکی دقت مضاعف (double assist).
- hs
- کامپایل برای پردازنده ARC HS بدون افزونههای سختافزاری، بهجز دستورالعملهای اتمیک (atomic).
- hs34
- کامپایل برای پردازنده ARC HS34.
- hs38
- کامپایل برای پردازنده ARC HS38.
- hs38_linux
- کامپایل برای پردازنده ARC HS38 با فعال بودن تمامی افزونههای سختافزاری.
- hs4x
- کامپایل برای پردازنده ARC HS4x.
- hs4xd
- کامپایل برای پردازنده ARC HS4xD.
- hs4x_rel31
- کامپایل برای پردازنده ARC HS4x نگارش 3.10a.
- arc600_norm
- کامپایل برای پردازنده ARC 600 با فعال بودن دستورالعملهای "norm".
- arc600_mul32x16
- کامپایل برای پردازنده ARC 600 با فعال بودن دستورالعملهای "norm" و ضرب 32x16-bit.
- arc600_mul64
- کامپایل برای پردازنده ARC 600 با فعال بودن دستورالعملهای "norm" و خانواده "mul64"..IP arc601_norm 4 کامپایل برای پردازندهٔ ARC 601 با فعال بودن دستورهای "norm".
- arc601_mul32x16
- کامپایل برای پردازندهٔ ARC 601 با فعال بودن دستورهای "norm" و ضرب 32x16-bit.
- arc601_mul64
- کامپایل برای پردازندهٔ ARC 601 با فعال بودن دستورهای "norm" و خانوادهٔ دستورهای "mul64".
- nps400
- کامپایل برای ARC 700 روی تراشهٔ NPS400.
- em_mini
- کامپایل برای پیکربندی کمینهگرای ARC EM با مجموعه ثباتهای کاهشیافته.
- -mdpfp
- -mdpfp-compact
- تولید دستورهای FPX با دقت مضاعف (double-precision)، بهینهسازیشده برای پیادهسازی فشرده (compact).
- -mdpfp-fast
- تولید دستورهای FPX با دقت مضاعف، بهینهسازیشده برای پیادهسازی سریع (fast).
- -mno-dpfp-lrsr
- غیرفعال کردن استفادهٔ دستورهای "lr" و "sr" از ثباتهای کمکی افزونهٔ FPX.
- -mea
- تولید دستورهای محاسباتی گسترشیافته. در حال حاضر تنها "divaw"، "adds"، "subs" و "sat16" پشتیبانی میشوند. تنها برای -mcpu=ARC700 معتبر است.
- -mno-mpy
- عدم تولید دستورهای خانوادهٔ "mpy" برای ARC700. این گزینه منسوخ شده است.
- -mmul32x16
- تولید دستورهای ضرب و ضرب-انباشت (multiply-accumulate) 32x16-bit.
- -mmul64
- تولید دستورهای "mul64" و "mulu64". تنها برای -mcpu=ARC600 معتبر است.
- -mnorm
- تولید دستورهای "norm". اگر -mcpu=ARC700 اعمال شده باشد، این حالت پیشفرض است.
- -mspfp
- -mspfp-compact
- تولید دستورهای FPX با دقت یگانه (single-precision)، بهینهسازیشده برای پیادهسازی فشرده (compact).
- -mspfp-fast
- تولید دستورهای FPX با دقت یگانه، بهینهسازیشده برای پیادهسازی سریع (fast).
- -msimd
- فعالسازی تولید دستورهای ARC SIMD از طریق توابع توکار (builtins) ویژهٔ مقصد. تنها برای -mcpu=ARC700 معتبر است.
- -msoft-float
- این گزینه نادیده گرفته میشود؛ صرفاً برای سازگاری ارائه شده است. کد ممیز شناور نرمافزاری بهطور پیشفرض تولید میشود، و این پیشفرض میتواند با گزینههای FPX لغو شود؛ -mspfp، -mspfp-compact یا -mspfp-fast برای دقت یگانه، و -mdpfp، -mdpfp-compact یا -mdpfp-fast برای دقت مضاعف.
- -mswap
- تولید دستورهای "swap".
- -matomic
- این گزینه استفاده از افزونهٔ شرطی بارگذاری/ذخیرهسازی قفلشده (locked load/store conditional) را برای پیادهسازی توابع توکار حافظهٔ اتمی فعال میکند. برای هستههای ARC 6xx یا ARC EM در دسترس نیست.
- -mdiv-rem
- فعالسازی دستورهای "div" و "rem" برای هستههای ARCv2.
- -mcode-density
- فعالسازی دستورهای فشردگی کد (code density) برای ARC EM. این گزینه بهطور پیشفرض برای ARC HS فعال است.
- -mll64
- فعالسازی عملیات بارگذاری/ذخیرهسازی مضاعف (double load/store) برای هستههای ARC HS.
- -mtp-regno=regno
- مشخص کردن شمارهٔ ثبات اشارهگر رشته (thread pointer).
- -mmpy-option=multo
- کامپایل کد ARCv2 با یک گزینهٔ طراحی ضربکننده (multiplier). میتوانید این گزینه را با استفاده از یک رشته یا یک مقدار عددی برای multo مشخص کنید. مقدار پیشفرض wlh1 است. مقادیر شناختهشده عبارتند از:
- 0
- none
- هیچ ضربکنندهای در دسترس نیست.
- 1
- w
- ضربکنندهٔ 16x16، کاملاً خطلولهای (fully pipelined). دستورهای زیر فعال میشوند: "mpyw" و "mpyuw".
- 2
- wlh1
- ضربکنندهٔ 32x32، کاملاً خطلولهای (۱ مرحله). دستورهای زیر علاوه بر این فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 3
- wlh2
- ضربکنندهٔ 32x32، کاملاً خطلولهای (۲ مرحله). دستورهای زیر علاوه بر این فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 4
- wlh3
- دو ضربکنندهٔ 16x16، مسدودکننده (blocking)، ترتیبی (sequential). دستورهای زیر علاوه بر این فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 5
- wlh4
- یک ضربکنندهٔ 16x16، مسدودکننده، ترتیبی. دستورهای زیر علاوه بر این فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 6
- wlh5
- یک ضربکنندهٔ 32x4، مسدودکننده، ترتیبی. دستورهای زیر علاوه بر این فعال میشوند: "mpy"، "mpyu"، "mpym"، "mpymu" و "mpy_s".
- 7
- plus_dmpy
- پشتیبانی از ARC HS SIMD.
- 8
- plus_macd
- پشتیبانی از ARC HS SIMD..IP 9 4
- plus_qmacw
- پشتیبانی از ARC HS SIMD.
این گزینه تنها برای هستههای ARCv2 در دسترس است.
- -mfpu=fpu
- پشتیبانی از افزونههای سختافزاری ممیز شناور خاص را برای هستههای ARCv2 فعال میکند. مقادیر پشتیبانیشده برای fpu عبارتند از:
- fpus
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت یگانه را فعال میکند.
- fpud
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت دوگانه را فعال میکند. افزونهٔ ممیز شناور با دقت یگانه نیز فعال میشود. برای ARC EM در دسترس نیست.
- fpuda
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت دوگانه را با استفاده از دستورالعملهای کمکی دقت دوگانه فعال میکند. افزونهٔ ممیز شناور با دقت یگانه نیز فعال میشود. این گزینه تنها برای ARC EM در دسترس است.
- fpuda_div
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت دوگانه را با استفاده از دستورالعملهای کمکی دقت دوگانه فعال میکند. افزونههای ممیز شناور با دقت یگانه، ریشهٔ دوم و تقسیم نیز فعال میشوند. این گزینه تنها برای ARC EM در دسترس است.
- fpuda_fma
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت دوگانه را با استفاده از دستورالعملهای کمکی دقت دوگانه فعال میکند. افزونههای سختافزاری ممیز شناور با دقت یگانه و ضرب و جمع ترکیبشده نیز فعال میشوند. این گزینه تنها برای ARC EM در دسترس است.
- fpuda_all
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت دوگانه را با استفاده از دستورالعملهای کمکی دقت دوگانه فعال میکند. تمام افزونههای سختافزاری ممیز شناور با دقت یگانه نیز فعال میشوند. این گزینه تنها برای ARC EM در دسترس است.
- fpus_div
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت یگانه، ریشهٔ دوم و تقسیم را فعال میکند.
- fpud_div
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت دوگانه، ریشهٔ دوم و تقسیم را فعال میکند. این گزینه شامل گزینهٔ fpus_div نیز میشود. برای ARC EM در دسترس نیست.
- fpus_fma
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت یگانه و ضرب و جمع ترکیبشده را فعال میکند.
- fpud_fma
- پشتیبانی از افزونههای سختافزاری ممیز شناور با دقت دوگانه و ضرب و جمع ترکیبشده را فعال میکند. این گزینه شامل گزینهٔ fpus_fma نیز میشود. برای ARC EM در دسترس نیست.
- fpus_all
- پشتیبانی از تمام افزونههای سختافزاری ممیز شناور با دقت یگانه را فعال میکند.
- fpud_all
- پشتیبانی از تمام افزونههای سختافزاری ممیز شناور با دقت یگانه و دوگانه را فعال میکند. برای ARC EM در دسترس نیست.
- -mirq-ctrl-saved=register-range, blink, lp_count
- ثباتهای همهمنظورهای را مشخص میکند که پردازنده هنگام ورود به وقفه و خروج از آن، بهطور خودکار ذخیره/بازیابی میکند. register-range به صورت دو ثبات که با یک خط تیره از هم جدا شدهاند مشخص میشود. محدودهٔ ثباتها همواره با "r0" آغاز میشود و حد بالایی آن ثبات "fp" است. blink و lp_count اختیاری هستند. این گزینه تنها برای هستههای ARC EM و ARC HS معتبر است.
- -mrgf-banked-regs=number
- تعداد ثباتهای تکثیرشده در بانک دوم ثباتها را هنگام ورود به وقفهٔ سریع مشخص میکند. وقفههای سریع، وقفههایی با بالاترین سطح اولویت P0 هستند. این وقفهها تنها ثباتهای PC و STATUS32 را ذخیره میکنند تا از تراکنشهای حافظه در طول توالی ورود و خروج وقفه جلوگیری شود. زمانی که از وقفههای سریع در پردازندهای از خانوادهٔ ARC V2 استفاده میکنید، از این گزینه بهره ببرید. مقادیر مجاز عبارتند از 4، 8، 16 و 32.
- -mlpc-width=width
- عرض ثبات "lp_count" را مشخص میکند. مقادیر معتبر برای width عبارتند از 8، 16، 20، 24، 28 و 32 بیت. عرض پیشفرض روی 32 بیت ثابت است. اگر عرض کمتر از 32 باشد، کامپایلر تلاشی برای تبدیل حلقهها در برنامهٔ شما جهت استفاده از سازوکار حلقه با تاخیر صفر (zero-delay loop) نمیکند، مگر آنکه مشخص باشد ثبات "lp_count" میتواند مقدار شمارندهٔ حلقهٔ مورد نیاز را در خود نگه دارد. بسته به عرض مشخصشده، ممکن است کامپایلر و کتابخانهٔ زماناجرا همچنان برای نیازهای گوناگون به استفاده از این سازوکار حلقه ادامه دهند. این گزینه ماکروی "__ARC_LPC_WIDTH__" را با مقدار width تعریف میکند.
- -mrf16
- این گزینه به کامپایلر دستور میدهد کدی برای یک فایل ثبات (register file) با 16 مدخل تولید کند. این گزینه ماکروی پیشپردازندهٔ "__ARC_RF16__" را تعریف میکند.
- -mbranch-index
- استفاده از دستورالعملهای "bi" یا "bih" را برای پیادهسازی جدولهای پرش فعال میکند.
گزینههای زیر به اسمبلر منتقل میشوند و همچنین نمادهای ماکروی پیشپردازنده را تعریف میکنند:
- -mdsp-packa
- برای فعالسازی افزونههای DSP Pack A به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xdsp_packa" را تنظیم میکند. این گزینه منسوخ شده است.
- -mdvbf
- برای فعالسازی افزونهٔ پروانهای دوگانهٔ ویتربی به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xdvbf" را تنظیم میکند. این گزینه منسوخ شده است.
- -mlock
- برای فعالسازی افزونهٔ بارگذاری/ذخیرهسازی شرطی قفلشده به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xlock" را تنظیم میکند.
- -mmac-d16
- به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xxmac_d16" را تنظیم میکند. این گزینه منسوخ شده است.
- -mmac-24
- به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xxmac_24" را تنظیم میکند. این گزینه منسوخ شده است.
- -mrtsc
- برای فعالسازی دستورالعمل افزونهٔ شمارندهٔ برچسب زمان 64 بیتی به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xrtsc" را تنظیم میکند. این گزینه منسوخ شده است.
- -mswape
- برای فعالسازی دستورالعمل افزونهٔ جابهجایی ترتیب بایتها به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xswape" را تنظیم میکند.
- -mtelephony
- برای فعالسازی دستورالعملهای تکعملوندی و دوعملوندی تلفنی به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xtelephony" را تنظیم میکند. این گزینه منسوخ شده است.
- -mxy
- برای فعالسازی افزونهٔ حافظهٔ XY به اسمبلر منتقل میشود. همچنین نماد پیشپردازندهٔ "__Xxy" را تنظیم میکند.
گزینههای زیر نحوهٔ حاشیهنویسی کد اسمبلی را کنترل میکنند:
- -misize
- دستورالعملهای اسمبلر را با آدرسهای تخمینی حاشیهنویسی میکند.
- -mannotate-align
- کاری انجام نمیدهد. برای سازگاری با نسخههای پیشین حفظ شده است.
گزینههای زیر به پیونددهنده منتقل میشوند:
- -marclinux
- به پیونددهنده منتقل میشود تا استفاده از شبیهسازی "arclinux" را مشخص کند. این گزینه بهطور پیشفرض در زنجیرههای ابزار ساختهشده برای مقصدهای "arc-linux-uclibc" و "arceb-linux-uclibc" هنگامی که پروفایلگیری درخواست نشده باشد، فعال است.
- -marclinux_prof
- به پیونددهنده منتقل میشود تا استفاده از شبیهسازی "arclinux_prof" را مشخص کند. این گزینه بهطور پیشفرض در زنجیرههای ابزار ساختهشده برای مقصدهای "arc-linux-uclibc" و "arceb-linux-uclibc" هنگامی که پروفایلگیری درخواست شده باشد، فعال است..PP گزینههای زیر معناشناسی کد تولیدشده را کنترل میکنند:
- -mlong-calls
- فراخوانیها را بهصورت فراخوانی غیرمستقیم با ثبات (register indirect calls) تولید میکند، و بدین ترتیب دسترسی به کل محدوده آدرس ۳۲ بیتی را فراهم میسازد.
- -mmedium-calls
- برای فراخوانیها از محدوده آدرسدهی کمتر از ۲۵ بیت، که آفست موجود برای یک دستور غیرشرطی branch-and-link است، استفاده نمیکند. اجرای شرطی فراخوانی توابع سرکوب میشود تا امکان استفاده از محدوده ۲۵ بیتی، به جای محدوده ۲۱ بیتی در branch-and-link شرطی، فراهم گردد. این مقدار پیشفرض برای زنجیرههای ابزار ساختهشده برای اهداف "arc-linux-uclibc" و "arceb-linux-uclibc" است.
- -G num
- در صورتی که دادههای در دسترس از بیرون (externally-visible) بزرگتر از num بایت نباشند، تعاریف آنها را در یک بخش دادههای کوچک (small data section) قرار میدهد. مقدار پیشفرض num برای هر پیکربندی ARC برابر ۴ است، یا در صورتی که عملیات دوگانه load/store داشته باشیم ۸ خواهد بود.
- -mno-sdata
- ارجاعات sdata را تولید نمیکند. این مقدار پیشفرض برای زنجیرههای ابزار ساختهشده برای اهداف "arc-linux-uclibc" و "arceb-linux-uclibc" است.
- -mvolatile-cache
- برای ارجاعات فرار (volatile)، از دسترسیهای حافظه به صورت کششدهی معمولی استفاده میکند. این حالت پیشفرض است.
- -mno-volatile-cache
- دور زدن کش (cache bypass) را برای ارجاعات فرار فعال میکند.
گزینههای زیر تولید کد را دقیقتر تنظیم میکنند:
- -malign-call
- کاری انجام نمیدهد. برای سازگاری با نسخههای قبلی حفظ شده است.
- -mauto-modify-reg
- استفاده از تغییر قبل/بعد (pre/post modify) را با جابهجایی ثبات فعال میکند.
- -mbbit-peephole
- کاری انجام نمیدهد. برای سازگاری با نسخههای قبلی حفظ شده است.
- -mno-brcc
- این گزینه یک گذر (pass) ویژه هدف را در arc_reorg برای تولید دستورات مقایسه و انشعاب ("brcc") غیرفعال میکند. این گزینه هیچ اثری بر تولید این دستورات توسط گذر ترکیبکننده (combiner pass) ندارد.
- -mcase-vector-pcrel
- از جدولهای switch case نسبی به PC برای فعالسازی کوتاهسازی جدول case استفاده میکند. این حالت پیشفرض برای -Os است.
- -mcompact-casesi
- الگوی فشرده "casesi" را فعال میکند. این حالت پیشفرض برای -Os است، و فقط برای هستههای ARCv1 در دسترس است. این گزینه منسوخ شده است.
- -mno-cond-exec
- گذر ویژه ARCompact
را برای
تولید
دستورات
اجرای شرطی
غیرفعال
میکند.
بهدلیل زمانبندی شکاف تاخیر (delay slot) و برهمکنش میان تعداد عملوندها، اندازه مقادیر ثابت، طول دستورات و پشتیبانی از اجرای شرطی، گذر مستقل از هدف برای تولید اجرای شرطی معمولاً ناکافی است؛ بنابراین پورت ARC یک گذر اختصاصی را حفظ کرده است که پس از انجام تخصیص ثبات، کوتاهسازی انشعاب و زمانبندی شکاف تاخیر، تلاش میکند فرصتهای بیشتری برای تولید اجرای شرطی بیابد. این گذر معمولاً، اما نه همیشه، کارایی و اندازه کد را به بهای زمان کامپایل بیشتر بهبود میبخشد، که دلیل وجود گزینهای برای خاموش کردن آن همین است. اگر با دستورات فراخوانی که به دلیل شرطی شدن از محدوده آفست مجاز خود فراتر میروند مشکل دارید، باید به جای آن استفاده از -mmedium-calls را در نظر بگیرید.
- -mearly-cbranchsi
- استفاده از الگوی "cbranchsi" پیش از مرحله reload را فعال میکند.
- -mexpand-adddi
- دستورات "adddi3" و "subdi3" را در زمان تولید RTL به "add.f"، "adc" و غیره بسط میدهد. این گزینه منسوخ شده است.
- -mindexed-loads
- استفاده از بارگذاریهای نمایهدار (indexed loads) را فعال میکند. این امر میتواند مشکلساز باشد زیرا برخی بهینهسازها فرض میکنند که ذخیرهسازیهای نمایهدار (indexed stores) نیز وجود دارند، در حالی که چنین نیست.
- -mlra
- کاری انجام نمیدهد. برای سازگاری با نسخههای قبلی حفظ شده است.
- -mlra-priority-none
- هیچ اولویتی برای ثباتهای هدف مشخص نمیکند.
- -mlra-priority-compact
- اولویت ثباتهای هدف را برای r0..r3 / r12..r15 مشخص میکند.
- -mlra-priority-noncompact
- اولویت ثباتهای هدف را برای r0..r3 / r12..r15 کاهش میدهد.
- -mmillicode
- هنگام بهینهسازی برای اندازه (با استفاده از -Os)، پیشدرآمدها (prologues) و پسدرآمدها (epilogues) که باید تعداد زیادی ثبات را ذخیره یا بازیابی کنند، اغلب با استفاده از فراخوانی یک تابع ویژه در libgcc کوتاه میشوند؛ این فراخوانی با عنوان فراخوانی millicode شناخته میشود. از آنجا که این فراخوانیها میتوانند مسائلی در زمینه کارایی ایجاد کنند، یا هنگام پیوند زدن به شیوهای غیر استاندارد باعث بروز مشکلاتی در پیونددهی شوند، این گزینه برای روشن یا خاموش کردن تولید فراخوانی millicode ارائه شده است.
- -mcode-density-frame
- این گزینه کامپایلر را قادر میسازد تا دستورات "enter" و "leave" را صادر کند. این دستورات فقط برای پردازندههای دارای قابلیت code-density معتبر هستند.
- -mmixed-code
- کاری انجام نمیدهد. برای سازگاری با نسخههای قبلی حفظ شده است.
- -mq-class
- این گزینه منسوخ شده است. گزینههای جایگزین دستور q را فعال میکند. این حالت پیشفرض برای -Os است.
- -mRcq
- کاری انجام نمیدهد. برای سازگاری با نسخههای قبلی حفظ شده است.
- -mRcw
- کاری انجام نمیدهد. برای سازگاری با نسخههای قبلی حفظ شده است.
- -msize-level=level
- بهینهسازی اندازه را با توجه به طول دستورالعملها و همترازی (alignment) دقیقتر تنظیم میکند. مقادیر شناختهشده برای level عبارتند از:
- 0
- بدون بهینهسازی اندازه. این سطح منسوخ شده و مانند 1 با آن رفتار میشود.
- 1
- از دستورالعملهای کوتاه به صورت فرصتطلبانه استفاده میشود.
- 2
- علاوه بر این، همترازی حلقهها و کدِ پس از سدها (barriers) نادیده گرفته میشود.
- 3
- علاوه بر این، همترازی اختیاری دادهها نادیده گرفته شده و گزینه Os فعال میشود.
هنگامی که -Os برقرار باشد، این گزینه بهطور پیشفرض 3 است. در غیر این صورت، رفتار در صورت تنظیم نشدن معادل سطح 1 خواهد بود.
- -mtune=cpu
- پارامترهای
زمانبندی
دستورالعمل
را برای cpu
تنظیم
میکند، و
هر موردی را
که توسط -mcpu=
به صورت
ضمنی تعیین
شده است لغو
و بازنویسی
میکند.
مقادیر پشتیبانیشده برای cpu عبارتند از:
- ARC600
- تنظیم برای پردازنده ARC600.
- ARC601
- تنظیم برای پردازنده ARC601.
- ARC700
- تنظیم برای پردازنده ARC700 با بلوک ضربکننده استاندارد.
- ARC700-xmac
- تنظیم برای پردازنده ARC700 با بلوک XMAC.
- ARC725D
- تنظیم برای پردازنده ARC725D.
- ARC750D
- تنظیم برای پردازنده ARC750D.
- core3
- تنظیم برای پردازنده نوع core3 در ARCv2. این گزینه استفاده از دستور "dbnz" را فعال میکند.
- release31a
- تنظیم برای ARC4x نگارش 3.10a.
- -munalign-prob-threshold=probability
- کاری انجام نمیدهد. برای سازگاری با نسخههای پیشین حفظ شده است.
گزینههای زیر برای سازگاری با نسخههای پیشین نگهداشته شدهاند، اما اکنون منسوخ شدهاند و در نسخههای آینده حذف خواهند شد:
- -margonaut
- واحد FPX منسوخشده.
- -mbig-endian
- -EB
- کامپایل کد برای مقصدهای big-endian. استفاده از این گزینهها اکنون منسوخ شده است. کد big-endian با پیکربندی GCC برای ساخت مقصدهای "arceb-elf32" و "arceb-linux-uclibc" که در آنها big endian پیشفرض است، پشتیبانی میشود.
- -mlittle-endian
- -EL
- کامپایل کد برای مقصدهای little-endian. استفاده از این گزینهها اکنون منسوخ شده است. کد little-endian با پیکربندی GCC برای ساخت مقصدهای "arc-elf32" و "arc-linux-uclibc" که در آنها little endian پیشفرض است، پشتیبانی میشود.
- -mbarrel_shifter
- با -mbarrel-shifter جایگزین شده است.
- -mdpfp_compact
- با -mdpfp-compact جایگزین شده است.
- -mdpfp_fast
- با -mdpfp-fast جایگزین شده است.
- -mdsp_packa
- با -mdsp-packa جایگزین شده است.
- -mEA
- با -mea جایگزین شده است.
- -mmac_24
- با -mmac-24 جایگزین شده است.
- -mmac_d16
- با -mmac-d16 جایگزین شده است.
- -mspfp_compact
- با -mspfp-compact جایگزین شده است.
- -mspfp_fast
- با -mspfp-fast جایگزین شده است.
- -mtune=cpu
- مقادیر arc600، arc601، arc700 و arc700-xmac برای cpu به ترتیب با ARC600، ARC601، ARC700 و ARC700-xmac جایگزین شدهاند.
- -multcost=num
- با -mmultcost جایگزین شده است.
گزینههای ARM
این گزینههای -m برای پورت ARM تعریف شدهاند:
- -mabi=name
- تولید کد برای ABI مشخصشده. مقادیر مجاز عبارتاند از: apcs-gnu، atpcs، aapcs، aapcs-linux و iwmmxt.
- -mapcs-frame
- تولید یک فریم پشته (stack frame) منطبق با استاندارد فراخوانی رویه ARM برای همه توابع، حتی اگر این کار برای اجرای صحیح کد کاملاً ضروری نباشد. مشخص کردن -fomit-frame-pointer همراه با این گزینه باعث میشود که فریم پشته برای توابع برگ (leaf) تولید نشود. مقدار پیشفرض -mno-apcs-frame است. این گزینه منسوخ شده است.
- -mapcs
- این گزینه مترادفی برای -mapcs-frame است و منسوخ شده است.
- -mthumb-interwork
- تولید کدی که از فراخوانی متقابل بین مجموعههای دستورالعمل ARM و Thumb پشتیبانی میکند. بدون این گزینه، در معماریهای پیش از نسخه ۵ (pre-v5)، نمیتوان با اطمینان از هر دو مجموعه دستورالعمل درون یک برنامه استفاده کرد. مقدار پیشفرض -mno-thumb-interwork است، چرا که در صورت تعیین -mthumb-interwork کدی با حجم اندکی بیشتر تولید میشود. در پیکربندیهای AAPCS این گزینه بیاثر است.
- -mno-sched-prolog
- جلوگیری از بازآرایی دستورالعملها در پیشدرآمد تابع (prologue)، یا ادغام آن دستورالعملها با دستورالعملهای بدنه تابع. این بدان معناست که همه توابع با مجموعهای قابل تشخیص از دستورالعملها شروع میشوند (یا در واقع با انتخابی از یک مجموعه کوچک از پیشدرآمدهای مختلف توابع)، و میتوان از این اطلاعات برای تعیین محل آغاز توابع درون یک قطعه کد اجرایی استفاده کرد. مقدار پیشفرض -msched-prolog است.
- -mfloat-abi=name
- مشخص
میکند که
از کدام ABI
ممیز شناور
(floating-point) استفاده
شود. مقادیر
مجاز
عبارتاند
از: soft، softfp و hard.
تعیین soft باعث میشود GCC خروجیای تولید کند که حاوی فراخوانیهای کتابخانهای برای عملیات ممیز شناور است. softfp اجازه تولید کد با استفاده از دستورالعملهای سختافزاری ممیز شناور را میدهد، اما همچنان از قراردادهای فراخوانی soft-float استفاده میکند. hard امکان تولید دستورالعملهای ممیز شناور را فراهم ساخته و از قراردادهای فراخوانی مخصوص FPU استفاده میکند.
مقدار پیشفرض به پیکربندی خاص معماری مقصد بستگی دارد. توجه داشته باشید که ABIهای hard-float و soft-float از نظر پیونددهی (link) با یکدیگر سازگار نیستند؛ شما باید تمام برنامه خود را با یک ABI یکسان کامپایل کرده و با مجموعهای سازگار از کتابخانهها پیوند دهید.
- -mgeneral-regs-only
- تولید کدی که تنها از ثباتهای همهمنظوره استفاده میکند. این گزینه مانع از استفاده کامپایلر از ثباتهای ممیز شناور و Advanced SIMD میشود، اما هیچ محدودیتی بر اسمبلر اعمال نمیکند.
- -mlittle-endian
- تولید کد برای پردازندهای که در حالت little-endian اجرا میشود. این مقدار پیشفرض برای تمام پیکربندیهای استاندارد است.
- -mbig-endian
- تولید کد برای پردازندهای که در حالت big-endian اجرا میشود؛ پیشفرض این است که کد برای یک پردازنده little-endian کامپایل شود.
- -mbe8
- -mbe32
- هنگام پیوند دادن یک ایمیج big-endian، قالب را بین BE8 و BE32 انتخاب میکند. این گزینه روی ایمیجهای little-endian بیتأثیر بوده و نادیده گرفته میشود. مقدار پیشفرض به معماری مقصد انتخابشده بستگی دارد. برای معماریهای ARMv6 و جدیدتر مقدار پیشفرض BE8 است، و برای معماریهای قدیمیتر مقدار پیشفرض BE32 است. قالب BE32 توسط ARM منسوخ شده است.
- -march=name[+extension...]
- این گزینه
نام معماری
ARM مقصد را
مشخص
میکند. GCC از
این نام
برای تعیین
نوع
دستورالعملهایی
که
میتواند
هنگام
تولید کد
اسمبلی
ایجاد کند،
استفاده
میکند. این
گزینه
میتواند
در کنار یا
به جای
گزینه -mcpu= به
کار رود.
نامهای مجاز عبارتاند از: armv4t، armv5t، armv5te، armv6، armv6j، armv6k، armv6kz، armv6t2، armv6z، armv6zk، armv7، armv7-a، armv7ve، armv8-a، armv8.1-a، armv8.2-a، armv8.3-a، armv8.4-a، armv8.5-a، armv8.6-a، armv9-a، armv7-r، armv8-r، armv6-m، armv6s-m، armv7-m، armv7e-m، armv8-m.base، armv8-m.main، armv8.1-m.main، iwmmxt و iwmmxt2.
علاوه بر این، معماریهای زیر که فاقد پشتیبانی از حالت اجرای Thumb هستند شناسایی میشوند، اما پشتیبانی از آنها منسوخ شده است: armv4.
بسیاری از معماریها از افزونهها پشتیبانی میکنند. این موارد را میتوان با افزودن +extension به انتهای نام معماری مشخص کرد. گزینههای مربوط به افزونه به ترتیب پردازش میشوند و قابلیتها انباشته میگردند. یک افزونه همچنین هر افزونه پایه لازمی را که به آن وابسته است فعال میکند. برای مثال، افزونه +crypto همواره افزونه +simd را فعال خواهد کرد. تنها استثنا در این قاعده افزایشی، افزونههایی هستند که دارای پیشوند +no... میباشند: این افزونهها گزینه مشخصشده و هر افزونه دیگری را که ممکن است به حضور آن افزونه وابسته باشد غیرفعال میکنند.
برای مثال، -march=armv7-a+simd+nofp+vfpv4 معادل با نوشتن -march=armv7-a+vfpv4 است، زیرا گزینه +simd کاملاً توسط گزینه بعدی یعنی +nofp غیرفعال میشود.
بیشتر نامهای افزونهها به صورت عمومی نامگذاری شدهاند، اما اثری متناسب با معماری اعمالشده دارند. برای نمونه، گزینه +simd میتواند هم برای معماری armv7-a و هم برای معماریهای armv8-a به کار رود، اما افزونههای اصلی Advanced SIMD (Neon) معماری ARMv7-A را برای armv7-a و گونه متناسب با ARMv8-A را برای armv8-a فعال میکند.
جدول زیر افزونههای پشتیبانیشده برای هر معماری را فهرست میکند. معماریهایی که نام برده نشدهاند از هیچ افزونهای پشتیبانی نمیکنند.
- +fp
- دستورالعملهای ممیز شناور VFPv2. از افزونهی +vfpv2 میتوان به عنوان یک نام مستعار برای این افزونه استفاده کرد.
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور.
- armv7
- زیرمجموعهی مشترک معماریهای ARMv7-A، ARMv7-R و ARMv7-M.
- +fp
- دستورالعملهای ممیز شناور VFPv3، با ۱۶ ثبات دقت مضاعف (double-precision). از افزونهی +vfpv3-d16 میتوان به عنوان یک نام مستعار برای این افزونه استفاده کرد. توجه داشته باشید که ممیز شناور توسط معماری پایهی ARMv7-M پشتیبانی نمیشود، اما با هر دو معماری ARMv7-A و ARMv7-R سازگار است.
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور.
- +mp
- افزونهی چندپردازشی (multiprocessing).
- +sec
- افزونهی امنیتی (security).
- +fp
- دستورالعملهای ممیز شناور VFPv3، با ۱۶ ثبات دقت مضاعف (double-precision). از افزونهی +vfpv3-d16 میتوان به عنوان یک نام مستعار برای این افزونه استفاده کرد.
- +simd
- دستورالعملهای Advanced SIMD (Neon) v1 و ممیز شناور VFPv3. از افزونههای +neon و +neon-vfpv3 میتوان به عنوان نامهای مستعار برای این افزونه استفاده کرد.
- +vfpv3
- دستورالعملهای ممیز شناور VFPv3، با ۳۲ ثبات دقت مضاعف (double-precision).
- +vfpv3-d16-fp16
- دستورالعملهای ممیز شناور VFPv3، با ۱۶ ثبات دقت مضاعف (double-precision) و عملیات تبدیل ممیز شناور با نیمهدقت (half-precision).
- +vfpv3-fp16
- دستورالعملهای ممیز شناور VFPv3، با ۳۲ ثبات دقت مضاعف (double-precision) و عملیات تبدیل ممیز شناور با نیمهدقت (half-precision).
- +vfpv4-d16
- دستورالعملهای ممیز شناور VFPv4، با ۱۶ ثبات دقت مضاعف (double-precision).
- +vfpv4
- دستورالعملهای ممیز شناور VFPv4، با ۳۲ ثبات دقت مضاعف (double-precision).
- +neon-fp16
- دستورالعملهای Advanced SIMD (Neon) v1 و ممیز شناور VFPv3، همراه با عملیات تبدیل ممیز شناور با نیمهدقت (half-precision).
- +neon-vfpv4
- دستورالعملهای Advanced SIMD (Neon) v2 و ممیز شناور VFPv4.
- +nosimd
- غیرفعال کردن دستورالعملهای Advanced SIMD (دستورالعملهای ممیز شناور را غیرفعال نمیکند).
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور و Advanced SIMD.
- armv7ve
- نسخهی گسترشیافتهی معماری ARMv7-A با پشتیبانی از مجازیسازی (virtualization).
- +fp
- دستورالعملهای ممیز شناور VFPv4، با ۱۶ ثبات دقت مضاعف (double-precision). از افزونهی +vfpv4-d16 میتوان به عنوان یک نام مستعار برای این افزونه استفاده کرد.
- +simd
- دستورالعملهای Advanced SIMD (Neon) v2 و ممیز شناور VFPv4. از افزونهی +neon-vfpv4 میتوان به عنوان یک نام مستعار برای این افزونه استفاده کرد.
- +vfpv3-d16
- دستورالعملهای ممیز شناور VFPv3، با ۱۶ ثبات دقت مضاعف (double-precision).
- +vfpv3
- دستورالعملهای ممیز شناور VFPv3، با ۳۲ ثبات دقت مضاعف (double-precision).
- +vfpv3-d16-fp16
- دستورالعملهای ممیز شناور VFPv3، با ۱۶ ثبات دقت مضاعف (double-precision) و عملیات تبدیل ممیز شناور با نیمهدقت (half-precision).
- +vfpv3-fp16
- دستورالعملهای ممیز شناور VFPv3، با ۳۲ ثبات دقت مضاعف (double-precision) و عملیات تبدیل ممیز شناور با نیمهدقت (half-precision).
- +vfpv4-d16
- دستورالعملهای ممیز شناور VFPv4، با ۱۶ ثبات دقت مضاعف (double-precision).
- +vfpv4
- دستورالعملهای ممیز شناور VFPv4، با ۳۲ ثبات دقت مضاعف (double-precision).
- +neon
- دستورالعملهای Advanced SIMD (Neon) v1 و ممیز شناور VFPv3. از افزونهی +neon-vfpv3 میتوان به عنوان یک نام مستعار برای این افزونه استفاده کرد.
- +neon-fp16
- دستورالعملهای Advanced SIMD (Neon) v1 و ممیز شناور VFPv3، همراه با عملیات تبدیل ممیز شناور با نیمهدقت (half-precision).
- +nosimd
- غیرفعال کردن دستورالعملهای Advanced SIMD (دستورالعملهای ممیز شناور را غیرفعال نمیکند).
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور و Advanced SIMD.
- +crc
- دستورالعملهای بررسی افزونگی چرخهای (CRC).
- +simd
- دستورالعملهای Advanced SIMD و ممیز شناور در ARMv8-A.
- +crypto
- دستورالعملهای رمزنگاری (cryptographic).
- +nocrypto
- غیرفعال کردن دستورالعملهای رمزنگاری.
- +nofp
- غیرفعال کردن دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +sb
- دستورالعمل سد اجرای حدسی (Speculation Barrier Instruction)..IP +predres 4 دستورالعملهای محدودسازی پیشبینی اجرا و داده.
- +simd
- دستورالعملهای Advanced SIMD و ممیز شناور ARMv8.1-A.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +nocrypto
- غیرفعالسازی دستورالعملهای رمزنگاری.
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +sb
- دستورالعمل حائل حدسوگمان (Speculation Barrier).
- +predres
- دستورالعملهای محدودسازی پیشبینی اجرا و داده.
- +fp16
- دستورالعملهای پردازش دادههای ممیز شناور با دقت نیمه. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +fp16fml
- افزونهٔ fmla ممیز شناور با دقت نیمه. این گزینه همچنین افزونهٔ ممیز شناور با دقت نیمه و دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +simd
- دستورالعملهای Advanced SIMD و ممیز شناور ARMv8.1-A.
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +dotprod
- فعالسازی افزونهٔ ضرب داخلی (Dot Product). این گزینه همچنین دستورالعملهای Advanced SIMD را فعال میکند.
- +nocrypto
- غیرفعالسازی افزونهٔ رمزنگاری.
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +sb
- دستورالعمل حائل حدسوگمان (Speculation Barrier).
- +predres
- دستورالعملهای محدودسازی پیشبینی اجرا و داده.
- +i8mm
- دستورالعملهای ضرب ماتریسی اعداد صحیح ۸ بیتی. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +bf16
- دستورالعملهای ممیز شناور با دقت نیمهٔ Brain. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +fp16
- دستورالعملهای پردازش دادههای ممیز شناور با دقت نیمه. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور، و نیز افزونهٔ ضرب داخلی (Dot Product) و افزونهٔ fmla ممیز شناور با دقت نیمه را فعال میکند.
- +simd
- دستورالعملهای Advanced SIMD و ممیز شناور ARMv8.3-A و همچنین افزونهٔ ضرب داخلی (Dot Product).
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور، و نیز افزونهٔ ضرب داخلی (Dot Product) را فعال میکند.
- +nocrypto
- غیرفعالسازی افزونهٔ رمزنگاری.
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +sb
- دستورالعمل حائل حدسوگمان (Speculation Barrier).
- +predres
- دستورالعملهای محدودسازی پیشبینی اجرا و داده.
- +i8mm
- دستورالعملهای ضرب ماتریسی اعداد صحیح ۸ بیتی. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +bf16
- دستورالعملهای ممیز شناور با دقت نیمهٔ Brain. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +fp16
- دستورالعملهای پردازش دادههای ممیز شناور با دقت نیمه. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور، و نیز افزونهٔ ضرب داخلی (Dot Product) و افزونهٔ fmla ممیز شناور با دقت نیمه را فعال میکند.
- +simd
- دستورالعملهای Advanced SIMD و ممیز شناور ARMv8.3-A و همچنین افزونهٔ ضرب داخلی (Dot Product).
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور، و نیز افزونهٔ ضرب داخلی (Dot Product) را فعال میکند.
- +nocrypto
- غیرفعالسازی افزونهٔ رمزنگاری.
- +nofp
- غیرفعالسازی دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری.
- +i8mm
- دستورالعملهای ضرب ماتریسی اعداد صحیح ۸ بیتی. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +bf16
- دستورالعملهای ممیز شناور با دقت نیمهٔ Brain. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +fp16
- دستورالعملهای پردازش دادههای ممیز شناور با دقت نیمه. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور، و نیز افزونهٔ ضرب داخلی (Dot Product) و افزونهٔ fmla ممیز شناور با دقت نیمه را فعال میکند.
- +simd
- دستورالعملهای Advanced SIMD و ممیز شناور ARMv8.3-A و همچنین افزونهٔ ضرب داخلی (Dot Product).
- +crypto
- دستورالعملهای رمزنگاری. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور، و نیز افزونهٔ ضرب داخلی (Dot Product) را فعال میکند.
- +nocrypto
- غیرفعالسازی افزونهٔ رمزنگاری..IP +nofp 4 دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری را غیرفعال میکند.
- +i8mm
- دستورالعملهای ضرب ماتریسی عدد صحیح ۸ بیتی. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +bf16
- دستورالعملهای ممیز شناور با دقت نیمه Brain. این گزینه همچنین دستورالعملهای Advanced SIMD و ممیز شناور را فعال میکند.
- +fp.sp
- دستورالعملهای ممیز شناور VFPv3 با دقت تکی. افزونهٔ +vfpv3xd میتواند به عنوان یک نام مستعار برای این افزونه استفاده شود.
- +fp
- دستورالعملهای ممیز شناور VFPv3 با ۱۶ ثبات با دقت مضاعف. افزونهٔ +vfpv3-d16 میتواند به عنوان یک نام مستعار برای این افزونه استفاده شود.
- +vfpv3xd-d16-fp16
- دستورالعملهای ممیز شناور VFPv3 با دقت تکی همراه با ۱۶ ثبات با دقت مضاعف و عملیات تبدیل ممیز شناور با دقت نیمه.
- +vfpv3-d16-fp16
- دستورالعملهای ممیز شناور VFPv3 با ۱۶ ثبات با دقت مضاعف و عملیات تبدیل ممیز شناور با دقت نیمه.
- +nofp
- افزونهٔ ممیز شناور را غیرفعال میکند.
- +idiv
- دستورالعملهای تقسیم عدد صحیح در حالت ARM.
- +noidiv
- افزونهٔ تقسیم عدد صحیح در حالت ARM را غیرفعال میکند.
- +fp
- دستورالعملهای ممیز شناور VFPv4 با دقت تکی.
- +fpv5
- دستورالعملهای ممیز شناور FPv5 با دقت تکی.
- +fp.dp
- دستورالعملهای ممیز شناور FPv5 با دقت تکی و مضاعف.
- +nofp
- افزونههای ممیز شناور را غیرفعال میکند.
- +dsp
- دستورالعملهای DSP.
- +mve
- دستورالعملهای عدد صحیح افزونهٔ برداری نمایهٔ M (MVE).
- +mve.fp
- دستورالعملهای عدد صحیح و ممیز شناور با دقت تکی افزونهٔ برداری نمایهٔ M (MVE).
- +fp
- دستورالعملهای ممیز شناور با دقت تکی.
- +fp.dp
- دستورالعملهای ممیز شناور با دقت تکی و مضاعف.
- +nofp
- افزونهٔ ممیز شناور را غیرفعال میکند.
- +cdecp0, +cdecp1, ... , +cdecp7
- افزونهٔ مسیر دادهٔ سفارشی (CDE) را روی کمکپردازندههای انتخابشده بر پایهٔ شمارههای دادهشده در گزینهها در بازهٔ 0 تا 7 فعال میکند.
- +pacbti
- افزونهٔ احراز هویت اشارهگر و شناسایی هدف شاخه (PACBTI) را فعال میکند.
- +dsp
- دستورالعملهای DSP.
- +nodsp
- افزونهٔ DSP را غیرفعال میکند.
- +fp
- دستورالعملهای ممیز شناور با دقت تکی.
- +fp.dp
- دستورالعملهای ممیز شناور با دقت تکی و مضاعف.
- +nofp
- افزونهٔ ممیز شناور را غیرفعال میکند.
- +cdecp0, +cdecp1, ... , +cdecp7
- افزونهٔ مسیر دادهٔ سفارشی (CDE) را روی کمکپردازندههای انتخابشده بر پایهٔ شمارههای دادهشده در گزینهها در بازهٔ 0 تا 7 فعال میکند.
- +crc
- دستورالعملهای بررسی افزونگی چرخشی (CRC).
- +fp.sp
- دستورالعملهای ممیز شناور FPv5 با دقت تکی.
- +simd
- دستورالعملهای Advanced SIMD و ممیز شناور ARMv8-A.
- +crypto
- دستورالعملهای رمزنگاری.
- +nocrypto
- دستورالعملهای رمزنگاری را غیرفعال میکند.
- +nofp
- دستورالعملهای ممیز شناور، Advanced SIMD و رمزنگاری را غیرفعال میکند.
گزینهٔ -march=native باعث میشود کامپایلر معماری رایانهٔ ساخت را بهطور خودکار تشخیص دهد. در حال حاضر، این قابلیت تنها روی GNU/Linux پشتیبانی میشود و همهٔ معماریها شناسایی نمیشوند. اگر تشخیص خودکار ناموفق باشد، این گزینه هیچ تأثیری نخواهد داشت.
گزینهٔ -march=unset باعث میشود کامپایلر هرگونه گزینهٔ -march=... را که پیشتر در خط فرمان آمده است نادیده بگیرد و به گونهای رفتار کند که گویی این گزینه هرگز داده نشده است. این ویژگی برای جلوگیری از هشدارهای مربوط به تداخل میان گزینههای CPU و معماری، در شرایطی که این دو مشخصات معماری متفاوتی تولید میکنند، مفید است.
- -mtune=name
- این گزینه
نام
پردازندهٔ
هدف ARM را
مشخص
میکند که GCC
باید
کارایی کد
را برای آن
بهینهسازی
(tune) کند. برای
برخی از
پیادهسازیهای
ARM، میتوان
با استفاده
از این
گزینه به
کارایی
بهتری دست
یافت.
نامهای
مجاز
عبارتند از:
arm7tdmi، arm7tdmi-s، arm710t،
arm720t، arm740t، strongarm،
strongarm110، strongarm1100،
strongarm1110، 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، arm1156t2-s،
arm1156t2f-s، arm1176jz-s،
arm1176jzf-s، generic-armv7-a،
cortex-a5، cortex-a7، cortex-a8،
cortex-a9، cortex-a12،
cortex-a15، cortex-a17،
cortex-a32، cortex-a35،
cortex-a53، cortex-a55،
cortex-a57، cortex-a72،
cortex-a73، cortex-a75،
cortex-a76، cortex-a76ae،
cortex-a77، cortex-a78،
cortex-a78ae، cortex-a78c،
cortex-a710، ares، cortex-r4،
cortex-r4f، cortex-r5،
cortex-r7، cortex-r8،
cortex-r52، cortex-r52plus،
cortex-m0، cortex-m0plus،
cortex-m1، cortex-m3، cortex-m4،
cortex-m7، cortex-m23،
cortex-m33، cortex-m35p،
cortex-m52، cortex-m55،
cortex-m85، cortex-x1،
cortex-x1c، cortex-m1.small-multiply،
cortex-m0.small-multiply،
cortex-m0plus.small-multiply، exynos-m1،
marvell-pj4، neoverse-n1،
neoverse-n2، neoverse-v1،
xscale، iwmmxt، iwmmxt2،
ep9312، fa526، fa626،
fa606te، fa626te، fmp626،
fa726te، star-mc1، xgene1.
علاوه بر این، این گزینه میتواند مشخص کند که GCC باید کارایی کد را برای یک سامانهٔ big.LITTLE بهینهسازی کند. نامهای مجاز عبارتند از: cortex-a15.cortex-a7، cortex-a17.cortex-a7، cortex-a57.cortex-a53، cortex-a72.cortex-a53، cortex-a72.cortex-a35، cortex-a73.cortex-a53، cortex-a75.cortex-a55، cortex-a76.cortex-a55.
گزینهٔ -mtune=generic-arch مشخص میکند که GCC باید کارایی را برای ترکیبی از پردازندههای درون معماری arch بهینهسازی کند. هدف، تولید کدی است که روی رایجترین پردازندههای کنونی به خوبی اجرا شود، به طوری که تعادلی میان بهینهسازیهای سودمند برای برخی از CPUها در این محدوده و اجتناب از تلههای کارایی سایر پردازندهها ایجاد شود. اثرات این گزینه ممکن است در نسخههای آیندهٔ GCC با ظهور و کنار رفتن مدلهای CPU تغییر کند.
گزینهٔ -mtune همان گزینههای افزونهٔ مجاز در -mcpu را میپذیرد، اما این گزینههای افزونه تأثیری بر تنظیم کارایی کد تولیدشده ندارند.
گزینهٔ -mtune=native باعث میشود کامپایلر CPU رایانهٔ ساخت را بهطور خودکار تشخیص دهد. در حال حاضر، این قابلیت تنها روی GNU/Linux پشتیبانی میشود و همهٔ معماریها شناسایی نمیشوند. اگر تشخیص خودکار ناموفق باشد، این گزینه هیچ تأثیری نخواهد داشت..IP -mcpu=name[+extension...] 4 این گزینه نام پردازندهٔ ARM مقصد را مشخص میکند. GCC از این نام برای استخراج نام معماری ARM مقصد (همانند وقتی که با -march مشخص شده باشد) و نوع پردازندهٔ ARM جهت بهینهسازی کارایی (همانند وقتی که با -mtune مشخص شده باشد) استفاده میکند. در صورتی که این گزینه همراه با -march یا -mtune به کار رود، آن گزینهها بر بخش مربوطه از این گزینه اولویت دارند.
بسیاری از پردازندههای پشتیبانیشده، افزونههای معماری اختیاری را پیادهسازی میکنند. در این حالت، افزونههای معماری معمولاً به صورت پیشفرض فعال هستند. اگر پیادهسازیهایی وجود داشته باشند که فاقد این افزونهها باشند، میتوان از نحو افزونهها برای غیرفعال کردن مواردی که حذف شدهاند استفاده کرد. برای دستورالعملهای ممیز شناور (floating-point) و Advanced SIMD (Neon)، تنظیمات گزینههای -mfloat-abi و -mfpu نیز باید در نظر گرفته شوند: دستورالعملهای ممیز شناور و Advanced SIMD تنها در صورتی استفاده خواهند شد که -mfloat-abi روی soft تنظیم نشده باشد؛ و هر تنظیمی از -mfpu بهجز auto، دستورالعملهای افزونهٔ ممیز شناور و SIMD در دسترس را بازنویسی (override) خواهد کرد.
برای مثال، cortex-a9 را میتوان در سه پیکربندی اصلی یافت: فقط اعداد صحیح (integer only)، فقط با یک واحد ممیز شناور، یا با ممیز شناور و Advanced SIMD. حالت پیشفرض فعالسازی همهٔ دستورالعملها است، اما افزونههای +nosimd و +nofp میتوانند به ترتیب برای غیرفعال کردن تنها SIMD یا هر دوی دستورالعملهای SIMD و ممیز شناور استفاده شوند.
نامهای مجاز برای این گزینه مشابه نامهای مجاز برای -mtune هستند.
گزینههای افزونهٔ زیر میان پردازندههای فهرستشده مشترک هستند:
- +nodsp
- دستورالعملهای DSP را در cortex-m33، cortex-m35p، cortex-m52، cortex-m55 و cortex-m85 غیرفعال میکند. همچنین دستورالعملهای اعداد صحیح و ممیز شناور با دقت یگانه مربوط به افزونهٔ برداری مشخصهٔ M (MVE یا M-Profile Vector Extension) را در cortex-m52، cortex-m55 و cortex-m85 غیرفعال میکند.
- +nopacbti
- افزونهٔ احراز هویت اشارهگر و شناسایی مقصد پرش (Pointer Authentication and Branch Target Identification Extension) را در cortex-m52 و cortex-m85 غیرفعال میکند.
- +nomve
- دستورالعملهای اعداد صحیح و ممیز شناور با دقت یگانه مربوط به افزونهٔ برداری مشخصهٔ M (MVE) را در cortex-m52، cortex-m55 و cortex-m85 غیرفعال میکند.
- +nomve.fp
- دستورالعملهای ممیز شناور با دقت یگانهٔ افزونهٔ برداری مشخصهٔ M (MVE) را در cortex-m52، cortex-m55 و cortex-m85 غیرفعال میکند.
- +cdecp0, +cdecp1, ... , +cdecp7
- افزونهٔ مسیر دادهٔ سفارشی (CDE یا Custom Datapath Extension) را روی همپردارندههای (coprocessors) انتخابشده طبق شمارههای ارائهشده در گزینهها در بازهٔ ۰ تا ۷ روی cortex-m52، cortex-m55 و star-mc1 فعال میکند.
- +nofp
- دستورالعملهای ممیز شناور را در arm9e، arm946e-s، arm966e-s، arm968e-s، arm10e، arm1020e، arm1022e، arm926ej-s، arm1026ej-s، cortex-r5، cortex-r7، cortex-r8، cortex-m4، cortex-m7، cortex-m33، cortex-m35p، cortex-m52، cortex-m55 و cortex-m85 غیرفعال میکند. دستورالعملهای ممیز شناور و SIMD را در generic-armv7-a، cortex-a5، cortex-a7، cortex-a8، cortex-a9، cortex-a12، cortex-a15، cortex-a17، cortex-a15.cortex-a7، cortex-a17.cortex-a7، cortex-a32، cortex-a35، cortex-a53 و cortex-a55 غیرفعال میکند.
- +nofp.dp
- بخش دقت دوگانهٔ (double-precision) دستورالعملهای ممیز شناور را در cortex-r5، cortex-r7، cortex-r8، cortex-r52، cortex-r52plus و cortex-m7 غیرفعال میکند.
- +nosimd
- دستورالعملهای SIMD (اما نه ممیز شناور) را در generic-armv7-a، cortex-a5، cortex-a7 و cortex-a9 غیرفعال میکند.
- +crypto
- دستورالعملهای رمزنگاری را در cortex-a32، cortex-a35، cortex-a53، cortex-a55، cortex-a57، cortex-a72، cortex-a73، cortex-a75، exynos-m1، xgene1، cortex-a57.cortex-a53، cortex-a72.cortex-a53، cortex-a73.cortex-a35، cortex-a73.cortex-a53 و cortex-a75.cortex-a55 فعال میکند.
علاوه بر این، شبهمقصد generic-armv7-a به صورت پیشفرض روی VFPv3 با ۱۶ ثبات با دقت دوگانه تنظیم شده است. این شبهمقصد از گزینههای افزونهٔ زیر پشتیبانی میکند: mp، sec، vfpv3-d16، vfpv3، vfpv3-d16-fp16، vfpv3-fp16، vfpv4-d16، vfpv4، neon، neon-vfpv3، neon-fp16، neon-vfpv4. معانی آنها مشابه افزونههای -march=armv7-a است.
گزینهٔ -mcpu=generic-arch نیز مجاز است و معادل -march=arch -mtune=generic-arch میباشد. برای اطلاعات بیشتر -mtune را ببینید.
گزینهٔ -mcpu=native باعث میشود کامپایلر CPU رایانهٔ ساخت را بهطور خودکار شناسایی کند. در حال حاضر، این قابلیت تنها در GNU/Linux پشتیبانی میشود و همهٔ معماریها شناسایی نمیشوند. در صورت ناموفق بودن تشخیص خودکار، این گزینه هیچ اثری نخواهد داشت.
گزینهٔ -mcpu=unset باعث میشود کامپایلر هرگونه گزینهٔ -mcpu=... که پیشتر در خط فرمان آمده است را نادیده بگیرد و به گونهای رفتار کند که گویی این گزینه هرگز ارسال نشده است. این مورد برای جلوگیری از هشدارهای مربوط به تداخل گزینههای CPU و معماری، زمانی که هر دو مشخصات معماری متفاوتی تولید میکنند، مفید است.
- -mfpu=name
- این گزینه
مشخص
میکند چه
سختافزار
ممیز
شناوری (یا
شبیهساز
سختافزاری)
روی مقصد در
دسترس است.
نامهای
مجاز
عبارتند از:
auto، vfpv2، vfpv3،
vfpv3-fp16، vfpv3-d16،
vfpv3-d16-fp16، vfpv3xd،
vfpv3xd-fp16، neon-vfpv3،
neon-fp16، vfpv4، vfpv4-d16،
fpv4-sp-d16، neon-vfpv4،
fpv5-d16، fpv5-sp-d16، fp-armv8،
neon-fp-armv8 و crypto-neon-fp-armv8.
توجه داشته
باشید که neon
یک نام
مستعار
برای neon-vfpv3 و vfp
یک نام
مستعار
برای vfpv2 است.
تنظیم auto پیشفرض بوده و خاص است. این تنظیم باعث میشود کامپایلر دستورالعملهای ممیز شناور و Advanced SIMD را بر اساس تنظیمات -mcpu و -march انتخاب کند.
اگر سختافزار ممیز شناورِ انتخابشده شامل افزونهٔ NEON باشد (مانند -mfpu=neon)، توجه داشته باشید که عملیات ممیز شناور توسط مرحلهٔ بردارسازی خودکار GCC تولید نمیشوند مگر اینکه -funsafe-math-optimizations نیز مشخص شده باشد. دلیل این امر آن است که سختافزار NEON استاندارد IEEE 754 را برای محاسبات ممیز شناور به طور کامل پیادهسازی نمیکند (بهویژه مقادیر غیرعادی یا denormal به عنوان صفر در نظر گرفته میشوند)، بنابراین استفاده از دستورالعملهای NEON ممکن است منجر به کاهش دقت شود.
شما همچنین میتوانید نام fpu را در سطح تابع با استفاده از صفتهای تابع یا پراگماهای target("fpu=") تنظیم کنید.
- -mfp16-format=name
- قالب نوع ممیز شناور با نیمدقت (half-precision) یعنی "__fp16" را مشخص میکند. نامهای مجاز عبارتند از none، ieee و alternative؛ مقدار پیشفرض none است که در این حالت نوع "__fp16" تعریف نشده است.
- -mstructure-size-boundary=n
- اندازهٔ
همهٔ
ساختارها
(structures) و
اجتماعها
(unions) به مضربی
از تعداد
بیتهای
تعیینشده
توسط این
گزینه رو به
بالا گرد
میشود.
مقادیر
مجاز
عبارتند از
۸، ۳۲ و ۶۴.
مقدار
پیشفرض
برای
زنجیرههای
ابزار
مختلف،
متفاوت است.
برای
زنجیرهٔ
ابزاری که COFF
را هدف قرار
میدهد
مقدار
پیشفرض ۸
است. مقدار
۶۴ تنها در
صورتی مجاز
است که ABI
زیربنایی
از آن
پشتیبانی
کند.
مشخص کردن عددی بزرگتر میتواند کدی سریعتر و کارآمدتر تولید کند، اما ممکن است اندازهٔ برنامه را نیز افزایش دهد. مقادیر مختلف به طور بالقوه ناسازگار هستند. کدی که با یک مقدار کامپایل شده است، لزوماً نمیتواند انتظار داشته باشد با کد یا کتابخانههایی که با مقدار دیگری کامپایل شدهاند کار کند، در صورتی که آنها اطلاعات را از طریق ساختارها یا اجتماعها تبادل کنند.
این گزینه منسوخ شده است (deprecated).
- -mabort-on-noreturn
- یک فراخوانی به تابع "abort" در انتهای یک تابع "noreturn" تولید میکند. این فراخوانی در صورتی که تابع تلاش کند مقداری برگرداند یا بازگردد، اجرا میشود.
- -mlong-calls
- -mno-long-calls
- به
کامپایلر
میگوید که
فراخوانیهای
تابع را
ابتدا با
بارگذاری
نشانی تابع
در یک ثبات
و سپس انجام
یک
فراخوانی
زیرروال (subroutine call)
روی این
ثبات انجام
دهد. این
سوییچ
زمانی لازم
است که تابع
مقصد خارج
از محدودهٔ
آدرسدهی
۶۴
مگابایتی
نسخهٔ
مبتنی بر
آفست از
دستورالعمل
فراخوانی
زیرروال
قرار داشته
باشد.
حتی اگر این سوییچ فعال باشد، همهٔ فراخوانیهای تابع به فراخوانیهای طولانی (long calls) تبدیل نمیشوند. قاعدهٔ اکتشافی (heuristic) این است که توابع ایستا (static)، توابعی که دارای صفت "short_call" هستند، توابعی که در محدودهٔ یک رهنمود "#pragma no_long_calls" قرار دارند، و توابعی که تعاریف آنها قبلاً در واحد ترجمهٔ جاری کامپایل شده است، به فراخوانیهای طولانی تبدیل نمیشوند. استثنائات این قاعده عبارتند از تعاریف توابع ضعیف (weak)، توابع با صفت "long_call" یا صفت "section"، و توابعی که در دامنهٔ یک رهنمود "#pragma long_calls" هستند، که همواره به فراخوانیهای طولانی تبدیل میشوند.
این قابلیت به صورت پیشفرض فعال نیست. مشخص کردن -mno-long-calls رفتار پیشفرض را بازمیگرداند، همانطور که قرار دادن فراخوانیهای تابع در دامنهٔ یک رهنمود "#pragma long_calls_off" این کار را انجام میدهد. توجه داشته باشید این سوییچها هیچ تاثیری بر نحوهٔ تولید کد توسط کامپایلر برای مدیریت فراخوانیهای تابع از طریق اشارهگرهای تابع ندارند..IP -msingle-pic-base 4 با ثبات مورد استفاده برای آدرسدهی PIC به عنوان فقطخواندنی برخورد میکند، به جای اینکه آن را در مقدمه (prologue) هر تابع بارگذاری کند. سیستم زمان اجرا مسئول مقداردهی اولیهٔ این ثبات با یک مقدار مناسب پیش از شروع اجرا است.
- -mpic-register=reg
- ثبات مورد استفاده برای آدرسدهی PIC را مشخص میکند. برای حالت استاندارد پایهٔ PIC، پیشفرض هر ثبات مناسبی است که توسط کامپایلر تعیین شود. برای حالت پایهٔ تکPIC، در صورتی که هدف مبتنی بر EABI باشد یا بررسی پشته (stack-checking) فعال باشد، پیشفرض R9 است؛ در غیر این صورت پیشفرض R10 خواهد بود.
- -mpic-data-is-text-relative
- فرض میکند که جابهجایی میان بخشهای text و data در زمان پیوند ایستا (static link time) ثابت است. این امر اجازه میدهد تا از عملیات آدرسدهی نسبی به PC برای دسترسی به دادههایی که مشخص است در بخش داده قرار دارند استفاده شود. برای اهداف غیر VxWorks RTP، این گزینه به طور پیشفرض فعال است. هنگامی که روی چنین اهدافی غیرفعال شود، -msingle-pic-base را به طور پیشفرض فعال خواهد کرد.
- -mpoke-function-name
- نام هر تابع
را
مستقیماً
پیش از
مقدمهٔ
تابع (function prologue)،
در بخش text
مینویسد.
کد
تولیدشده
شبیه به این
است:
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هنگام انجام ردگیری به عقب پشته (stack backtrace)، کد میتواند مقدار "pc" ذخیرهشده در "fp + 0" را بازرسی کند. اگر تابع ردگیری سپس به مکان "pc - 12" نگاه کند و ۸ بیت بالایی تنظیم شده باشند، درمییابیم که یک نام تابع بلافاصله پیش از این مکان جاسازی شده است و طولی برابر با "((pc[-3]) & 0xff000000)" دارد.
- -mthumb
- -marm
- بین تولید
کدی که در
وضعیتهای
ARM و Thumb اجرا
میشود،
انتخاب
میکند.
پیشفرض در
بیشتر
پیکربندیها
تولید کدی
است که در
وضعیت ARM
اجرا شود،
اما این
پیشفرض را
میتوان با
پیکربندی GCC
با استفاده
از گزینهٔ
پیکربندی
--with-mode=state تغییر
داد.
همچنین میتوانید حالت ARM و Thumb را برای هر تابع با استفاده از مشخصههای تابع یا پراگماهای target("thumb") و target("arm") بازنویسی کنید.
- -mflip-thumb
- حالتهای ARM/Thumb را در توابع به صورت متناوب تغییر میدهد. این گزینه برای آزمون پسرفت (regression testing) تولید کد ترکیبی Thumb/ARM ارائه شده است و برای استفادهٔ عادی در کامپایل کد در نظر گرفته نشده است.
- -mtpcs-frame
- برای تمام توابع غیربرگ (non-leaf)، یک فریم پشته مطابق با استاندارد فراخوانی رویهٔ Thumb (Thumb Procedure Call Standard) تولید میکند. (تابع برگ تابعی است که هیچ تابع دیگری را فراخوانی نمیکند.) پیشفرض -mno-tpcs-frame است.
- -mtpcs-leaf-frame
- برای تمام توابع برگ (leaf)، یک فریم پشته مطابق با استاندارد فراخوانی رویهٔ Thumb تولید میکند. (تابع برگ تابعی است که هیچ تابع دیگری را فراخوانی نمیکند.) پیشفرض -mno-apcs-leaf-frame است.
- -mcallee-super-interworking
- به تمامی توابع با دید بیرونی در فایل در حال کامپایل، یک سرآیند از مجموعه دستورالعمل ARM میدهد که پیش از اجرای بقیهٔ تابع به حالت Thumb تغییر وضعیت میدهد. این امکان را فراهم میآورد تا این توابع از کدهای non-interworking فراخوانی شوند. این گزینه در پیکربندیهای AAPCS معتبر نیست زیرا interworking به طور پیشفرض فعال است.
- -mcaller-super-interworking
- به فراخوانیها از طریق اشارهگرهای تابع (شامل توابع مجازی) اجازه میدهد بدون در نظر گرفتن اینکه کد مقصد برای interworking کامپایل شده است یا خیر، به درستی اجرا شوند. در صورت فعال بودن این گزینه، هزینهٔ اجرای یک اشارهگر تابع اندکی بار اضافی دارد. این گزینه در پیکربندیهای AAPCS معتبر نیست زیرا interworking به طور پیشفرض فعال است.
- -mtp=name
- مدل دسترسی را برای اشارهگر حافظه محلی نخ (thread local storage) مشخص میکند. مدل soft فراخوانیهایی به "__aeabi_read_tp" تولید میکند. مدلهای پذیرفتهشدهٔ دیگر tpidrurw، tpidruro و tpidrprw هستند که اشارهگر نخ را مستقیماً از ثبات سیستمی مربوطه واکشی میکنند (از معماری arm6k به بعد پشتیبانی میشود). این ثباتهای سیستمی از طریق رابط کمکپردازندهٔ CP15 قابل دسترسی هستند و آرگومان cp15 نیز به عنوان یک نام مستعار مناسب برای tpidruro پذیرفته میشود. آرگومان auto از بهترین روش موجود برای پردازندهٔ انتخابشده استفاده میکند. تنظیم پیشفرض auto است.
- -mtls-dialect=dialect
- گویش مورد استفاده برای دسترسی به حافظه محلی نخ را مشخص میکند. دو dialect پشتیبانی میشوند---gnu و gnu2. گویش gnu طرح اصلی GNU را برای پشتیبانی از مدلهای TLS پویای محلی و سراسری انتخاب میکند. گویش gnu2 طرح توصیفکنندهٔ GNU را انتخاب میکند که کارایی بهتری برای کتابخانههای اشتراکی فراهم میسازد. طرح توصیفکنندهٔ GNU با طرح اصلی سازگار است، اما به پشتیبانی از سوی اسمبلر، پیونددهنده و کتابخانهٔ جدید نیاز دارد. مدلهای TLS نوع Initial و local exec تحت تأثیر این گزینه قرار نمیگیرند و همیشه از طرح اصلی استفاده میکنند.
- -mword-relocations
- تنها بازنشانیهای مطلق (absolute relocations) را روی مقادیر به اندازهٔ کلمه (یعنی R_ARM_ABS32) تولید میکند. این گزینه به طور پیشفرض روی اهدافی (uClinux، SymbianOS) که بارگذار زمان اجرا این محدودیت را اعمال میکند، و هنگامی که -fpic یا -fPIC مشخص شده باشد فعال است. این گزینه با -mslow-flash-data تداخل دارد.
- -mfix-cortex-m3-ldrd
- برخی هستههای Cortex-M3 میتوانند در هنگام استفاده از دستورالعملهای "ldrd" با ثباتهای مقصد و پایهٔ همپوشان، موجب خرابی دادهها شوند. این گزینه از تولید این دستورالعملها جلوگیری میکند. این گزینه به طور پیشفرض هنگامی که -mcpu=cortex-m3 مشخص شده باشد، فعال است.
- -mfix-cortex-a57-aes-1742098
- -mno-fix-cortex-a57-aes-1742098
- -mfix-cortex-a72-aes-1655431
- -mno-fix-cortex-a72-aes-1655431
- کاهش اثر (یا غیرفعال کردن آن برای) یک نقص فنی (erratum) در Cortex-A57 و Cortex-A72 را که بر دستورالعملهای رمزنگاری AES اثر میگذارد، فعال (یا غیرفعال) میکند. این گزینه به طور پیشفرض زمانی که هر یک از گزینههای -mcpu=cortex-a57 یا -mcpu=cortex-a72 مشخص شده باشند، فعال است.
- -munaligned-access
- -mno-unaligned-access
- خواندن و
نوشتن
مقادیر ۱۶ و
۳۲ بیتی را
از
نشانیهایی
که تراز ۱۶
یا ۳۲ بیتی
ندارند
فعال (یا
غیرفعال)
میکند. به
طور
پیشفرض
دسترسی
ناتراز
برای تمام
معماریهای
پیش از ARMv6،
تمام ARMv6-M و
معماریهای
ARMv8-M Baseline غیرفعال
بوده و برای
تمام
معماریهای
دیگر فعال
است. اگر
دسترسی
ناتراز
فعال
نباشد،
دسترسی به
کلمات در
ساختارهای
دادهٔ
فشرده (packed) هر
بار به صورت
یک بایت
انجام
میشود.
مشخصهٔ ARM با نام "Tag_CPU_unaligned_access" در فایل شیء تولیدشده بسته به تنظیم این گزینه، روی true یا false تنظیم میشود. در صورت فعال بودن دسترسی ناتراز، نماد پیشپردازندهٔ "__ARM_FEATURE_UNALIGNED" نیز تعریف میگردد.
- -mneon-for-64bits
- این گزینه منسوخ شده است و هیچ اثری ندارد.
- -mslow-flash-data
- فرض میکند که بارگذاری داده از حافظهٔ فلش کندتر از واکشی دستورالعمل است. بنابراین برای کارایی بهتر، بارگذاری مقادیر لفظی (literal load) به حداقل میرسد. این گزینه تنها هنگام کامپایل برای ARMv7 M-profile پشتیبانی میشود و به طور پیشفرض خاموش است. این گزینه با -mword-relocations تداخل دارد.
- -masm-syntax-unified
- فرض میکند که اسمبلر درونخطی از نحو unified asm استفاده میکند. پیشفرض در حال حاضر خاموش است که بر نحو تقسیمشده (divided syntax) دلالت دارد. این گزینه هیچ اثری روی Thumb2 ندارد. با این حال، ممکن است در نگارشهای آیندهٔ GCC تغییر کند. نحو تقسیمشده باید منسوخ تلقی شود.
- -mrestrict-it
- تولید بلوکهای IT را محدود میکند تا با قوانین ARMv8-A مطابقت داشته باشد. بلوکهای IT تنها میتوانند شامل یک دستورالعمل ۱۶ بیتی منفرد از مجموعهای منتخب از دستورالعملها باشند. این گزینه به طور پیشفرض برای حالت Thumb در ARMv8-A روشن است.
- -mprint-tune-info
- اطلاعات تنظیم دقیق پردازنده را به صورت توضیح (کامنت) در فایل اسمبلر چاپ میکند. این گزینه تنها برای آزمون پسرفت کامپایلر استفاده میشود و برای استفادهٔ عادی در کامپایل کد در نظر گرفته نشده است. این گزینه به طور پیشفرض غیرفعال است.
- -mverbose-cost-dump
- تخلیهٔ دقیق مدل هزینه را در فایلهای تخلیهٔ اشکالزدایی فعال میکند. این گزینه برای استفاده در اشکالزدایی کامپایلر ارائه شده است..IP -mpure-code 4 اجازه قرار گرفتن دادههای ثابت در بخشهای کد داده نمیشود. علاوه بر این، هنگام کامپایل برای قالب شیء ELF، به تمامی بخشهای متنی (text sections) صفتِ بخشیِ مختص به پردازندهٔ ELF با عنوان "SHF_ARM_PURECODE" اختصاص داده میشود. این گزینه فقط هنگام تولید کد غیر-PIC (non-pic) برای مقصدهای M-profile در دسترس است.
- -mcmse
- تولید کد امن بر اساس «ARMv8-M Security Extensions: Requirements on Development Tools Engineering Specification»، که میتوان آن را در https://developer.arm.com/documentation/ecm0359818/latest یافت.
- -mfix-cmse-cve-2021-35465
- کاهش اثر یک آسیبپذیری امنیتی احتمالی با دستورالعمل "VLLDM" در برخی دستگاههای M-profile هنگام استفاده از CMSE (CVE-2021-365465). این گزینه به صورت پیشفرض زمانی که گزینهٔ -mcpu= همراه با "cortex-m33"، "cortex-m35p"، "cortex-m52"، "cortex-m55"، "cortex-m85" یا "star-mc1" استفاده شود، فعال است. از گزینهٔ -mno-fix-cmse-cve-2021-35465 میتوان برای غیرفعال کردن این کاهش اثر استفاده کرد.
- -mstack-protector-guard=guard
- -mstack-protector-guard-offset=offset
- تولید کد محافظت از پشته با استفاده از قناری (canary) در guard. مکانهای پشتیبانیشده عبارتند از global برای یک قناری سراسری یا tls برای یک قناری قابل دسترسی از طریق ثبات TLS. گزینهٔ -mstack-protector-guard-offset= برای استفاده همراه با -fstack-protector-guard=tls است و برای استفاده در کدهای فضای کاربری (user-land) در نظر گرفته نشده است.
- -mfdpic
- -mno-fdpic
- انتخاب FDPIC ABI،
که از
توصیفکنندههای
تابع ۶۴
بیتی برای
نمایش
اشارهگرها
به توابع
استفاده
میکند.
هنگامی که
کامپایلر
برای
مقصدهای
"arm-*-uclinuxfdpiceabi"
پیکربندی
شده باشد،
این گزینه
به طور
پیشفرض
فعال است و
در صورتی که
هیچیک از
گزینههای
مرتبط با PIC/PIE
مشخص نشده
باشند،
متضمن -fPIE
خواهد بود.
در سایر
مقصدها،
این گزینه
تنها
ویژگیهای
اختصاصی
تولید کد FDPIC
را فعال
میکند و
کاربر باید
در صورت
نیاز،
گزینههای
مرتبط با PIC/PIE
را صراحتاً
مشخص کند.
توجه داشته باشید که پیوند ایستا پشتیبانی نمیشود، زیرا هنگام بازنشانیِ خودکار برنامه، همچنان پیونددهندهٔ پویا درگیر خواهد شد. اگر چنین رفتاری قابل قبول است، از گزینههای -static و -Wl,-dynamic-linker استفاده کنید.
گزینهٔ متقابل -mno-fdpic برای ساخت هستهٔ لینوکس با استفاده از همان زنجیره ابزاری ("arm-*-uclinuxfdpiceabi") که برای ساخت برنامههای کاربردی فضای کاربری استفاده شده است، مفید (و الزامی) است.
- -mbranch-protection=none|standard|pac-ret[+leaf][+bti]|bti[+pac-ret[+leaf]]
- فعالسازی
ویژگیهای
محافظت از
انشعاب (فقط
armv8.1-m.main). none تولید
کد بدون
محافظت از
انشعاب یا
امضای
نشانی
بازگشت.
standard[+leaf]
تولید کد با
تمام
ویژگیهای
محافظت از
انشعابِ
فعالشده
در سطح
استانداردشان.
pac-ret[+leaf]
تولید کد با
امضای
نشانی
بازگشت
تنظیمشده
روی سطح
استاندارد
آن، یعنی
امضای تمام
توابعی که
نشانی
بازگشت را
در حافظه
ذخیره
میکنند. leaf
هنگامی که
امضای
نشانی
بازگشت
فعال است،
توابع برگ (leaf)
را نیز حتی
اگر نشانی
بازگشت را
در حافظه
ننویسند،
امضا
میکند. +bti
افزودن
دستورالعملهای
landing-pad در
مقصدهای
مجاز
دستورالعملهای
انشعاب
غیرمستقیم.
اگر افزونهٔ معماری +pacbti فعال نباشد، آنگاه تمام عملیاتهای محافظت از انشعاب و امضای نشانی بازگشت محدود به استفاده از دستورالعملهایی هستند که در فضای معادل NOP معماری تعریف شدهاند. کد تولیدشده با نسخههای قبلی معماری سازگار رو به عقب باقی میماند، اما امنیت تکمیلی میتواند در زمان اجرا روی پردازندههایی که از افزونهٔ PACBTI پشتیبانی میکنند فعال شود.
اعمال مقصد انشعاب با استفاده از BTI تنها در زمان اجرا قابل فعالسازی است اگر تمام کدهای برنامه دستکم با -mbranch-protection=bti کامپایل شده باشند.
هر تنظیمی به جز none تنها در armv8-m.main یا بالاتر پشتیبانی میشود.
حالت پیشفرض تولید کد بدون محافظت از انشعاب یا امضای نشانی بازگشت است.
گزینههای AVR
این گزینهها برای پیادهسازیهای AVR تعریف شدهاند:
- -mmcu=mcu
- معماری
مجموعه
دستورالعمل
(ISA) یا نوع
قطعهٔ AVR را
مشخص
میکند.
مقدار
پیشفرض
این گزینه
"avr2" است.
دستگاهها و ISAهای AVR زیر پشتیبانی میشوند. نکته: پشتیبانی کامل از یک دستگاه شامل کد راهاندازی "crtmcu.o"، یک سرآیند دستگاه "avr/io*.h"، یک کتابخانهٔ دستگاه "libmcu.a" و یک فایل مشخصات دستگاه ("https://gcc.gnu.org/wiki/avr-gcc#spec-files") با نام "specs-mcu" است. تنها مورد آخر بر اساس "mcu"های پشتیبانیشده در زیر توسط کامپایلر ارائه میشود. سایر موارد توسط AVR-LibC ("https://github.com/avrdudes/avr-libc") یا از طریق فایلهای "atpack" ("https://gcc.gnu.org/wiki/avr-gcc#atpack") از سوی سازندهٔ سختافزار پشتیبانی میشوند.
- "avr2"
- دستگاههای «Classic» با حداکثر 8 KiB حافظهٔ برنامه. mcu = "attiny22", "attiny26", "at90s2313", "at90s2323", "at90s2333", "at90s2343", "at90s4414", "at90s4433", "at90s4434", "at90c8534", "at90s8515", "at90s8535".
- "avr25"
- دستگاههای «Classic» با حداکثر 8 KiB حافظهٔ برنامه و دارای دستورالعمل "MOVW". mcu = "attiny13", "attiny13a", "attiny24", "attiny24a", "attiny25", "attiny261", "attiny261a", "attiny2313", "attiny2313a", "attiny43u", "attiny44", "attiny44a", "attiny45", "attiny48", "attiny441", "attiny461", "attiny461a", "attiny4313", "attiny84", "attiny84a", "attiny85", "attiny87", "attiny88", "attiny828", "attiny841", "attiny861", "attiny861a", "ata5272", "ata6616c", "at86rf401".
- "avr3"
- دستگاههای «Classic» با 16 KiB تا 64 KiB حافظهٔ برنامه. mcu = "at76c711", "at43usb355".
- "avr31"
- دستگاههای «Classic» با 128 KiB حافظهٔ برنامه. mcu = "atmega103", "at43usb320".
- "avr35"
- دستگاههای «Classic» با 16 KiB تا 64 KiB حافظهٔ برنامه و دارای دستورالعمل "MOVW". mcu = "attiny167", "attiny1634", "atmega8u2", "atmega16u2", "atmega32u2", "ata5505", "ata6617c", "ata664251", "at90usb82", "at90usb162".
- "avr4"
- دستگاههای «Enhanced» با حداکثر 8 KiB حافظهٔ برنامه. mcu = "atmega48", "atmega48a", "atmega48p", "atmega48pa", "atmega48pb", "atmega8", "atmega8a", "atmega8hva", "atmega88", "atmega88a", "atmega88p", "atmega88pa", "atmega88pb", "atmega8515", "atmega8535", "ata5795", "ata6285", "ata6286", "ata6289", "ata6612c", "at90pwm1", "at90pwm2", "at90pwm2b", "at90pwm3", "at90pwm3b", "at90pwm81".
- "avr5"
- دستگاههای «Enhanced» با 16 KiB تا 64 KiB حافظهٔ برنامه. mcu = "atmega16", "atmega16a", "atmega16hva", "atmega16hva2", "atmega16hvb", "atmega16hvbrevb", "atmega16m1", "atmega16u4", "atmega161", "atmega162", "atmega163", "atmega164a", "atmega164p", "atmega164pa", "atmega165", "atmega165a", "atmega165p", "atmega165pa", "atmega168", "atmega168a", "atmega168p", "atmega168pa", "atmega168pb", "atmega169", "atmega169a", "atmega169p", "atmega169pa", "atmega32", "atmega32a", "atmega32c1", "atmega32hvb", "atmega32hvbrevb", "atmega32m1", "atmega32u4", "atmega32u6", "atmega323", "atmega324a", "atmega324p", "atmega324pa", "atmega324pb", "atmega325", "atmega325a", "atmega325p", "atmega325pa", "atmega328", "atmega328p", "atmega328pb", "atmega329", "atmega329a", "atmega329p", "atmega329pa", "atmega3250", "atmega3250a", "atmega3250p", "atmega3250pa", "atmega3290", "atmega3290a", "atmega3290p", "atmega3290pa", "atmega406", "atmega64", "atmega64a", "atmega64c1", "atmega64hve", "atmega64hve2", "atmega64m1", "atmega64rfr2", "atmega640", "atmega644", "atmega644a", "atmega644p", "atmega644pa", "atmega644rfr2", "atmega645", "atmega645a", "atmega645p", "atmega649", "atmega649a", "atmega649p", "atmega6450", "atmega6450a", "atmega6450p", "atmega6490", "atmega6490a", "atmega6490p", "ata5790", "ata5790n", "ata5791", "ata6613c", "ata6614q", "ata5782", "ata5831", "ata8210", "ata8510", "ata5787", "ata5835", "ata5700m322", "ata5702m322", "at90pwm161", "at90pwm216", "at90pwm316", "at90can32", "at90can64", "at90scr100", "at90usb646", "at90usb647", "at94k", "m3000".
- "avr51"
- دستگاههای «Enhanced» با 128 KiB حافظهٔ برنامه. mcu = "atmega128", "atmega128a", "atmega128rfa1", "atmega128rfr2", "atmega1280", "atmega1281", "atmega1284", "atmega1284p", "atmega1284rfr2", "at90can128", "at90usb1286", "at90usb1287".
- "avr6"
- دستگاههای «Enhanced» با PC سهبایتی، یعنی با بیش از 128 KiB حافظهٔ برنامه. mcu = "atmega256rfr2", "atmega2560", "atmega2561", "atmega2564rfr2".
- "avrxmega2"
- دستگاههای «XMEGA» با بیش از 8 KiB و تا حداکثر 64 KiB حافظهٔ برنامه. mcu = "atxmega8e5", "atxmega16a4", "atxmega16a4u", "atxmega16c4", "atxmega16d4", "atxmega16e5", "atxmega32a4", "atxmega32a4u", "atxmega32c3", "atxmega32c4", "atxmega32d3", "atxmega32d4", "atxmega32e5", "avr64da28", "avr64da28s", "avr64da32", "avr64da32s", "avr64da48", "avr64da48s", "avr64da64", "avr64da64s", "avr64db28", "avr64db32", "avr64db48", "avr64db64", "avr64dd14", "avr64dd20", "avr64dd28", "avr64dd32", "avr64du28", "avr64du32", "avr64ea28", "avr64ea32", "avr64ea48", "avr64sd28", "avr64sd32", "avr64sd48".
- "avrxmega3"
- دستگاههای «XMEGA» با حداکثر 64 KiB مجموع حافظهٔ برنامه و RAM، و با حافظهٔ برنامهٔ قابل مشاهده در فضای نشانی RAM. mcu = "attiny202", "attiny204", "attiny212", "attiny214", "attiny402", "attiny404", "attiny406", "attiny412", "attiny414", "attiny416", "attiny416auto", "attiny417", "attiny424", "attiny426", "attiny427", "attiny804", "attiny806", "attiny807", "attiny814", "attiny816", "attiny817", "attiny824", "attiny826", "attiny827", "attiny1604", "attiny1606", "attiny1607", "attiny1614", "attiny1616", "attiny1617", "attiny1624", "attiny1626", "attiny1627", "attiny3214", "attiny3216", "attiny3217", "attiny3224", "attiny3226", "attiny3227", "atmega808", "atmega809", "atmega1608", "atmega1609", "atmega3208", "atmega3209", "atmega4808", "atmega4809", "avr16dd14", "avr16dd20", "avr16dd28", "avr16dd32", "avr16du14", "avr16du20", "avr16du28", "avr16du32", "avr16ea28", "avr16ea32", "avr16ea48", "avr16eb14", "avr16eb20", "avr16eb28", "avr16eb32", "avr32da28", "avr32da28s", "avr32da32", "avr32da32s", "avr32da48", "avr32da48s", "avr32db28", "avr32db32", "avr32db48", "avr32dd14", "avr32dd20", "avr32dd28", "avr32dd32", "avr32du14", "avr32du20", "avr32du28", "avr32du32", "avr32ea28", "avr32ea32", "avr32ea48", "avr32sd20", "avr32sd28", "avr32sd32".
- "avrxmega4"
- دستگاههای «XMEGA» با بیش از 64 KiB و تا حداکثر 128 KiB حافظهٔ برنامه. mcu = "atxmega64a3", "atxmega64a3u", "atxmega64a4u", "atxmega64b1", "atxmega64b3", "atxmega64c3", "atxmega64d3", "atxmega64d4", "avr128da28", "avr128da28s", "avr128da32", "avr128da32s", "avr128da48", "avr128da48s", "avr128da64", "avr128da64s", "avr128db28", "avr128db32", "avr128db48", "avr128db64".
- "avrxmega5"
- دستگاههای «XMEGA» با بیش از 64 KiB و تا حداکثر 128 KiB حافظهٔ برنامه و بیش از 64 KiB حافظهٔ RAM. mcu = "atxmega64a1", "atxmega64a1u".
- "avrxmega6"
- دستگاههای «XMEGA» با بیش از 128 KiB حافظهٔ برنامه. mcu = "atxmega128a3", "atxmega128a3u", "atxmega128b1", "atxmega128b3", "atxmega128c3", "atxmega128d3", "atxmega128d4", "atxmega192a3", "atxmega192a3u", "atxmega192c3", "atxmega192d3", "atxmega256a3", "atxmega256a3b", "atxmega256a3bu", "atxmega256a3u", "atxmega256c3", "atxmega256d3", "atxmega384c3", "atxmega384d3".
- "avrxmega7"
- دستگاههای «XMEGA» با بیش از 128 KiB حافظهٔ برنامه و بیش از 64 KiB حافظهٔ RAM. mcu = "atxmega128a1", "atxmega128a1u", "atxmega128a4u".
- "avrtiny"
- دستگاههای هستهٔ Tiny از نوع «Reduced Tiny» تنها با ۱۶ ثبات همهمنظوره و 512 B تا 4 KiB حافظهٔ برنامه. mcu = "attiny4", "attiny5", "attiny9", "attiny10", "attiny102", "attiny104", "attiny20", "attiny40".
- "avr1"
- این ISA توسط هستهٔ کمینهٔ AVR پیادهسازی شده و فقط برای اسمبلر پشتیبانی میشود. mcu = "attiny11", "attiny12", "attiny15", "attiny28", "at90s1200".
- -mcvt
- از یک جدول
بردار
فشرده (compact vector table)
استفاده
میکند.
برخی
دستگاهها
از CVT با تنها
چهار مدخل
پشتیبانی
میکنند: 0=Reset،
1=NMI، 2=Prio1 IRQ، 3=Prio0 IRQs. این
گزینه کد
راهاندازی
را به جای
"crtmcu.o"
معمول، از
"crtmcu-cvt.o"
پیوند
میدهد. کد
راهاندازی
علاوه بر
ارائه یک
جدول بردار
فشرده، بیت
"CPUINT_CTRLA.CPUINT_CVT"
را تنظیم
خواهد کرد
که CVT را روی
دستگاه
فعال
میکند.
هنگامی که نمیخواهید کد راهاندازی "CPUINT_CTRLA.CPUINT_CVT" را تنظیم کند، میتوانید نماد "__init_cvt" را تأمین کنید تا کد مربوطه دیگر از "libmcu.a" فراخوانده نشود. برای مثال، میتوانید با "-Wl,--defsym,__init_cvt=0" پیوند دهید.
کد راهاندازی CVT از AVR-LibC v2.3 در دسترس است ("https://github.com/avrdudes/avr-libc/issues/1010").
- -mdouble=bits
- -mlong-double=bits
- اندازهٔ (بر حسب بیت) نوعهای "double" یا "long double" را به ترتیب تعیین میکند. مقادیر ممکن برای bits برابر ۳۲ و ۶۴ هستند. اینکه آیا یک مقدار خاص برای bits مجاز است یا خیر، به گزینههای پیکربندی "--with-double=" و "--with-long-double=" در configure بستگی دارد ("https://gcc.gnu.org/install/configure.html#avr")، و همین قاعده برای مقادیر پیشفرض گزینهها نیز صدق میکند.
- -mgas-isr-prologues
- روالهای خدمت وقفه (ISRs) میتوانند از شبهدستورالعمل "__gcc_isr" که توسط GNU Binutils پشتیبانی میشود استفاده کنند. اگر این گزینه روشن باشد، این قابلیت همچنان میتواند برای تکتک ISRها با استفاده از ویژگی تابع AVR Function Attributes,,"no_gccisr" غیرفعال شود. این قابلیت چنانچه بهینهسازی روشن باشد بهطور پیشفرض فعال است (اما نه با -Og، @pxref{Optimize Options})، و در صورتی که GNU Binutils از PR21683 پشتیبانی کند ("https://sourceware.org/PR21683").
- -mint8
- نوع "int" را یک عدد صحیح ۸ بیتی فرض میکند. این امر بر اندازهٔ تمام انواع داده تأثیر میگذارد: یک "char" برابر با ۱ بایت، یک "int" برابر با ۱ بایت، یک "long" برابر با ۲ بایت، و یک "long long" برابر با ۴ بایت است. لطفاً توجه داشته باشید که این گزینه با استانداردهای C مطابقت ندارد، اما منجر به کاهش اندازهٔ کد میشود.
- -mmain-is-OS_task
- ثباتها را در "main" ذخیره نمیکند. اثر آن مشابه الصاق ویژگی AVR Function Attributes,,"OS_task" به "main" است. در صورت روشن بودن بهینهسازی، این گزینه بهطور پیشفرض فعال است.
- -mno-call-main
- تابع "main"
را با
دستورهای
زیر اجرا
نمیکند:
XCALL main XJMP exit
در عوض، "main" را در بخش ".init9" قرار میدهد ("https://avrdudes.github.io/avr-libc/avr-libc-user-manual/mem_sections.html#sec_dot_init") تا نیازی به فراخوانی نباشد. با تنظیم این گزینه، کاربر تعهد میدهد که "main" بازگشتی نخواهد داشت.
از این گزینه میتوان برای دستگاههایی با منابع بسیار محدود به منظور صرفهجویی در چند بایت کد و فضای پشته استفاده کرد. این گزینه از AVR-LibC v2.3 طبق انتظار عمل خواهد کرد ("https://github.com/avrdudes/avr-libc/issues/1012"). در نسخههای قدیمیتر، هیچ بهبودی در عملکرد حاصل نخواهد شد.
- -mno-interrupts
- کد تولیدشده با وقفههای سختافزاری سازگار نیست. اندازهٔ کد کوچکتر است.
- -mrelax
- تلاش
میکند در
صورت
امکان،
دستورالعملهای
"CALL" یا
"JMP" را به
ترتیب با
دستورالعملهای
کوتاهتر
"RCALL" یا
"RJMP"
جایگزین
کند. تنظیم
-mrelax صرفاً
گزینهٔ --mlink-relax
را به خط
فرمان
اسمبلر و
گزینهٔ --relax
را به خط
فرمان
پیونددهنده
اضافه
میکند.
تعدیل پرش (Jump relaxing) توسط پیونددهنده انجام میگیرد، زیرا آفستهای پرش پیش از جایگذاری کد مشخص نیستند. بنابراین، کد اسمبلی تولیدشده توسط کامپایلر یکسان است، اما دستورالعملهای موجود در فایل اجرایی ممکن است با دستورالعملهای کد اسمبلی تفاوت داشته باشند.
در صورتی که به خردّههای پیونددهنده (linker stubs) نیاز باشد، تعدیل باید فعال شود؛ بخش مربوط به "EIND" و خردّههای پیونددهنده را در زیر مشاهده کنید.
- -mrodata-in-ram
- -mno-rodata-in-ram
- بخشهای
".rodata"
مربوط به
دادههای
فقطخواندنی
را به ترتیب
در RAM یا در
حافظهٔ
برنامه
قرار
میدهد.
برای بیشتر
دستگاهها
انتخابی
وجود ندارد
و این گزینه
بیشتر شبیه
به یک
گزارهٔ
تأییدی عمل
میکند.
از نسخهٔ ۱۴ و برای دستگاههای *AVR64 و *AVR128، چنانچه پشتیبانی لازم در GNU Binutils موجود باشد (PR31124 ("https://sourceware.org/PR31124"))، بخش ".rodata" بهطور پیشفرض در حافظهٔ فلش قرار میگیرد. در این حالت، میتوان از -mrodata-in-ram برای بازگشت به چیدمان قبلی با قرار گرفتن ".rodata" در RAM استفاده کرد.
- -mtiny-stack
- تنها ۸ بیت پایینی اشارهگر پشته را تغییر میدهد.
- -mfract-convert-truncate
- امکان استفاده از کوتاهسازی (truncation) به جای گرد کردن به سمت صفر را برای انواع ممیز ثابت کسری فراهم میکند.
- -nodevicelib
- با
کتابخانهٔ
مختص به
دستگاه
"libmcu.a"
در AVR-LibC پیوند
انجام
نمیدهد.
توجه داشته باشید که از نسخهٔ AVR-LibC v2.3، این کتابخانه حاوی کدهایی است که برای عملکرد صحیح برنامه ضروری هستند. بهویژه، شامل بخشهایی از کد راهاندازی مانند این موارد است: "__init_sp" ("https://github.com/avrdudes/avr-libc/issues/1011") برای مقداردهی اولیهٔ اشارهگر پشته با نماد "__stack"، "__init_cvt" ("https://github.com/avrdudes/avr-libc/issues/1010") برای تنظیم سختافزار جهت استفاده از یک جدول بردار فشرده با -mcvt، "__call_main" ("https://github.com/avrdudes/avr-libc/issues/1012") برای فراخوانی "main" و "exit"، و "__do_flmap_init" ("https://github.com/avrdudes/avr-libc/issues/931") برای راهاندازی FLMAP مطابق با نماد "__flmap".
- -nodevicespecs
- عبارت
-specs=device-specs/specs-mcu را
به خط فرمان
راهانداز
کامپایلر
اضافه
نمیکند.
مسئولیت
تأمین
گزینههای
مناسب خط
فرمان برای
زیرفرآیندهایی
مانند خودِ
کامپایلر،
اسمبلر و
پیونددهنده
بر عهدهٔ
کاربر
خواهد بود.
این بدان
معناست که
کاربر باید
فایل
مشخصات
دستگاه
اختصاصی
خود را از
طریق -specs=path-to-specs-file
مشخص کند.
در این حالت
دیگر نیازی
به گزینهٔ
-mmcu=mcu نیست.
این گزینه همچنین میتواند جایگزینی برای روش قدیمیتر تعیین فایلهای سفارشی device-specs باشد که در آن نیاز بود -B some-path به دایرکتوریای اشاره کند که شامل پوشهای به نام "device-specs" بود و آن نیز شامل یک فایل مشخصات با نام "specs-mcu" میشد، که در آن mcu توسط -mmcu=mcu تعیین شده بود.
- -Waddr-space-convert
- در مواردی که فضای آدرس حاصل در فضای آدرس ورودی گنجانده نشده باشد، دربارهٔ تبدیلهای بین فضاهای آدرس هشدار میدهد.
- -Wmisspelled-isr
- اگر نام ISR اشتباه نوشته شده باشد (یعنی بدون پیشوند __vector باشد)، هشدار میدهد. بهطور پیشفرض فعال است.
گزینههای بهینهسازی AVR
گزینههای زیر گزینههای بهینهسازی خالص هستند. گزینههای -mgas-isr-prologues، -mmain-is-OS_task، -mno-call-main و -mrelax که در بالا ذکر شدند تنها تقریباً گزینههای بهینهسازی محسوب میشوند، زیرا به ندرت پیش میآید که تفاوت تولید کد توسط آنها اهمیتی داشته باشد.
- -maccumulate-args
- آرگومانهای
خروجی تابع
را انباشته
کرده و فضای
پشتهٔ مورد
نیاز برای
آرگومانهای
خروجی را یک
بار در
پیشدرآمد/پسدرآمد
(prologue/epilogue) تابع
تخصیص داده
و آزاد
میکند.
بدون این
گزینه،
آرگومانهای
خروجی پیش
از
فراخوانی
یک تابع روی
پشته قرار
گرفته و پس
از آن
برداشته
میشوند.
همچنین
گزینهٔ
بهینهسازی
-fdefer-pop را در Optimize
Options,,optimization option
ببینید.
برداشتن آرگومانها از پشته پس از فراخوانی تابع میتواند در AVR هزینهبر باشد، بنابراین تجمیع فضای پشته ممکن است به کوچکتر شدن اندازهٔ فایلهای اجرایی منجر شود زیرا نیازی نیست آرگومانها پس از چنین فراخوانی تابعی از پشته حذف شوند.
این گزینه میتواند برای توابعی که چندین بار توابعی با آرگومانهای روی پشته را فراخوانی میکنند (مانند فراخوانی توابع مشابه printf)، به کاهش اندازهٔ کد بیانجامد.
- -mbranch-cost=cost
- هزینهٔ انشعاب را برای دستورالعملهای انشعاب شرطی روی cost تنظیم میکند. مقادیر منطقی برای cost، اعداد صحیح کوچک و غیرمنفی هستند. هزینهٔ پیشفرض انشعاب 0 است..IP -mcall-prologues 4 پیشدرآمدها/پسدرآمدهای توابع به صورت فراخوانی به زیرروالهای مناسب بسط مییابند. اندازه کد کوچکتر میشود.
- -mfuse-add
- -mno-fuse-add
- -mfuse-add=level
- دسترسیهای غیرمستقیم به حافظه را روی دستگاههای تقلیلیافته Tiny بهینهسازی میکند. حالت پیشفرض از "level=1" برای بهینهسازیهای -Og و -O1، و از "level=2" برای بهینهسازیهای بالاتر استفاده میکند. مقادیر معتبر برای level شامل 0، 1 و 2 هستند.
- -mfuse-move
- -mno-fuse-move
- -mfuse-move=level
- یک گذر بهینهسازی پس از بارگذاری مجدد (post reload) را اجرا میکند که تلاش مینماید دستورالعملهای انتقال (move) را ادغام کرده و دستورالعملهای چندبایتی را به عملیاتهای ۸ بیتی تقسیم کند. حالت پیشفرض از "level=3" برای بهینهسازی -O1، و از "level=23" برای بهینهسازیهای بالاتر استفاده میکند. مقادیر معتبر برای level در محدوده 0 ... 23 هستند که مقداری با مبنای مختلط (mixed radix) 3:2:2:2 است. هر رقم جنبهای از بهینهسازی را کنترل میکند.
- -mfuse-move2
- یک گذر بهینهسازی پس از ترکیب (post combine) را اجرا میکند که تلاش مینماید دستورالعملهای انتقال (move) را ادغام کند.
- -mstrict-X
- از ثبات
آدرس "X"
به شیوهای
که توسط
سختافزار
پیشنهاد
شده
استفاده
میکند. این
بدان
معناست که
"X" تنها
در
آدرسدهیهای
غیرمستقیم،
پسافزایشی
(post-increment) یا
پیشکاهشی
(pre-decrement) به کار
میرود.
بدون این گزینه، ثبات "X" ممکن است به همان شیوهٔ "Y" یا "Z" استفاده شود که در این صورت توسط دستورالعملهای اضافی شبیهسازی میگردد. برای مثال، بارگذاری یک مقدار با آدرسدهی "X+const" با یک مقدار نامنفی کوچک "const < 64" درون یک ثبات Rn به صورت زیر انجام میشود:
adiw r26, const ; X += const ld <Rn>, X ; <Rn> = *X sbiw r26, const ; X -= const
- -msplit-bit-shift
- شیفتهای چندبایتی با آفست ثابت را به یک شیفت با آفست بایتی و یک شیفت باقیمانده با آفست غیربایتی تقسیم میکند. این بهینهسازی بهطور پیشفرض برای -O2 و بالاتر فعال است، شامل -Os اما بدون -Oz. تقسیم شیفتهای دارای آفست ثابت که مضربی از ۸ باشند توسط -mfuse-move کنترل میشود.
- -msplit-ldst
- بارگذاریها و ذخیرهسازیهای چندبایتی را به چند بارگذاری و ذخیرهسازی بایتی تقسیم میکند. این بهینهسازی بهطور پیشفرض برای -O2 و بالاتر فعال است.
- -muse-nonzero-bits
- بهینهسازیهایی را فعال میکند که تنها زمانی امکانپذیر هستند که برخی بیتها در یک ثبات همواره صفر باشند. این بهینهسازی بهطور پیشفرض برای -O2 و بالاتر فعال است.
"EIND" و دستگاههایی با بیش از ۱۲۸ کیبیبایت حافظه فلش
اشارهگرها در این پیادهسازی پهنای ۱۶ بیتی دارند. آدرس یک تابع یا برچسب به عنوان آدرس کلمهای (word address) نشان داده میشود تا پرشها و فراخوانیهای غیرمستقیم بتوانند هر آدرس کدی در محدوده ۶۴ کیبیکلمه را هدف قرار دهند.
به منظور تسهیل پرشهای غیرمستقیم روی دستگاههایی با بیش از ۱۲۸ کیبیبایت فضای حافظه برنامه، یک ثبات با تابع ویژه به نام "EIND" وجود دارد که هنگام استفاده از دستورالعملهای "EICALL" یا "EIJMP"، به عنوان باارزشترین بخش آدرس هدف عمل میکند.
پرشها و فراخوانیهای غیرمستقیم روی این دستگاهها توسط کامپایلر به شرح زیر مدیریت میشوند و مشمول برخی محدودیتها هستند:
- کامپایلر هرگز "EIND" را مقداردهی نمیکند.
- کامپایلر از "EIND" بهطور ضمنی در دستورالعملهای "EICALL"/"EIJMP" استفاده میکند یا ممکن است برای شبیهسازی یک فراخوانی/پرش غیرمستقیم از طریق یک دستورالعمل "RET"، مقدار "EIND" را مستقیماً بخواند.
- کامپایلر فرض میکند که "EIND" هرگز در حین اجرای کد راهاندازی (startup) یا در حین اجرای برنامه تغییر نمیکند. بهویژه، "EIND" در پیشدرآمد/پسدرآمد توابع یا روتینهای مدیریت وقفه (ISR) ذخیره یا بازیابی نمیشود.
- برای فراخوانیهای غیرمستقیم به توابع و goto محاسباتی، پیونددهنده stubها (تکهکدهای واسط) را تولید میکند. واسطها سکوهای پرش هستند که گاهی اوقات trampoline نیز نامیده میشوند. بنابراین، فراخوانی/پرش غیرمستقیم به چنین stubای میپرد. این stub حاوی یک پرش مستقیم به آدرس مورد نظر است.
- بهینهسازی relaxation پیونددهنده باید فعال باشد تا پیونددهنده بتواند stubها را در همه وضعیتها به درستی بسازد. گزینه کامپایلر -mrelax و گزینه پیونددهنده --relax را ببینید. موارد خاصی وجود دارند که در آنها پیونددهنده باید stubها را تولید کند اما بدون فعال بودن relaxation و بدون پیام خطای مفید متوقف میشود.
- اسکریپت پیشفرض پیونددهنده برای کدهایی با "EIND = 0" تنظیم شده است. اگر قرار باشد کد در تنظیمی با "EIND != 0" کار کند، باید از یک اسکریپت پیونددهنده سفارشی استفاده شود تا بخشهایی که نام آنها با ".trampolines" شروع میشود را در قطعهای قرار دهد که "EIND" به آن اشاره میکند.
- کد راهاندازی از libgcc هرگز "EIND" را مقداردهی نمیکند. توجه داشته باشید که کد راهاندازی آمیزهای از کدهای libgcc و AVR-LibC است. برای تأثیر AVR-LibC بر "EIND"، به راهنمای کاربر AVR-LibC ("https://avrdudes.github.io/avr-libc/avr-libc-user-manual") مراجعه کنید.
- برای کد
راهاندازی
اختصاصی
کاربر مجاز
است که
"EIND" را در
همان ابتدا
تنظیم کند،
برای مثال
از طریق کد
مقداردهی
اولیهای
که در بخش
".init3"
قرار دارد.
چنین کدی
قبل از کد
راهاندازی
عمومی که RAM
را
مقداردهی
اولیه کرده
و
سازندهها
را
فراخوانی
میکند
اجرا
میشود،
اما بعد از
آن بخش از
کد
راهاندازی
AVR-LibC اجرا
میگردد که
"EIND" را
روی
قطعهای که
جدول بردار
در آن قرار
دارد تنظیم
میکند.
#include <avr/io.h> static void __attribute__((section(".init3"),naked,used,no_instrument_function)) init3_set_eind (void) { __asm volatile ("ldi r24,pm_hh8(__trampolines_start)\n\t" "out %i0,r24" :: "n" (&EIND) : "r24","memory"); }نماد "__trampolines_start" در اسکریپت پیونددهنده تعریف شده است.
- واسطها (stubs) در صورتی بهطور خودکار توسط پیونددهنده تولید میشوند که هر دو شرط زیر برقرار باشد:
- -<آدرس یک برچسب با استفاده از اصلاحگر "gs" گرفته شده باشد>
- (کوتاهشدهٔ
generate stubs) مانند
زیر:
LDI r24, lo8(gs(<func>)) LDI r25, hi8(gs(<func>))
- -<مکان نهایی آن برچسب در یک قطعه کد باشد>
- خارج از قطعهای که stubها در آن قرار دارند.
- *
- کامپایلر چنین اصلاحگرهای "gs" را برای برچسبهای کد در موقعیتهای زیر صادر میکند:
- -<گرفتن آدرس یک تابع یا برچسب کد.>
- -<دستور goto محاسباتی.>
- -<اگر تابع ذخیره پیشدرآمد استفاده شود، گزینه خط فرمان -mcall-prologues>
- را ببینید.
- -<جدولهای توزیع switch/case. اگر چنین جدولهای توزیعی را نمیخواهید،>
- میتوانید گزینه خط فرمان -fno-jump-tables را مشخص کنید.
- -<سازندهها/ویرانگرهای C و ++C که در حین راهاندازی/خاموشی فراخوانی میشوند.>
- -<اگر ابزارها با یک اصلاحگر ()gs که در بالا توضیح داده شد مواجه شوند.>
- *
- پریدن به
آدرسهای
غیرنمادین
مانند زیر
پشتیبانی
نمیشود:
int main (void) { /* Call function at word address 0x2 */ return ((int(*)(void)) 0x2)(); }در عوض، باید یک رابط میانی (stub) ایجاد شود، یعنی تابع باید از طریق یک نماد فراخوانی گردد (در مثال، "func_4"):
int main (void) { extern int func_4 (void); /* Call function at byte address 0x4 */ return func_4(); }و برنامه با -Wl,--defsym,func_4=0x4 پیوند داده شود. همچنین، میتوان "func_4" را در اسکریپت پیونددهنده (linker script) تعریف کرد.
مدیریت ثباتهای با کاربرد خاص "RAMPD"، "RAMPX"، "RAMPY" و "RAMPZ"
برخی از دستگاههای AVR از حافظههای بزرگتر از محدوده ۶۴ کیبیبایت (64 KiB) که با اشارهگرهای ۱۶ بیتی قابل دسترسی هستند پشتیبانی میکنند. برای دسترسی به مکانهای حافظه خارج از این محدوده ۶۴ کیبیبایتی، محتوای یک ثبات "RAMP" بهعنوان بخش بالایی آدرس استفاده میشود: ثباتهای آدرس "X"، "Y"، "Z" به ترتیب با ثباتهای با کاربرد خاص "RAMPX"، "RAMPY" و "RAMPZ" الحاق میشوند تا یک آدرس عریض تشکیل شود. بهطور مشابه، "RAMPD" به همراه آدرسدهی مستقیم به کار میرود.
- کد راهاندازی (startup code) ثباتهای با کاربرد خاص "RAMP" را با صفر مقداردهی اولیه میکند.
- اگر یک AVR Named Address Spaces,فضای آدرس نامگذاری شده غیر از عمومی (generic) یا "__flash" استفاده شود، آنگاه "RAMPZ" در صورت نیاز پیش از عملیات مقداردهی میشود.
- اگر دستگاه از حافظه RAM بزرگتر از ۶۴ کیبیبایت پشتیبانی کند و کامپایلر برای انجام یک عملیات نیاز به تغییر "RAMPZ" داشته باشد، "RAMPZ" پس از پایان عملیات مجدداً به صفر بازنشانی میشود.
- اگر دستگاه دارای یک ثبات خاص "RAMP" باشد، بخش آغازین/پایانی روتین وقفه (ISR prologue/epilogue) آن SFR را ذخیره/بازیابی کرده و آن را با صفر مقداردهی میکند، مبادا کد ISR (بهطور ضمنی) از آن استفاده کند.
- حافظه RAM بزرگتر از ۶۴ کیبیبایت توسط GCC برای اهداف AVR پشتیبانی نمیشود. اگر از اسمبلی درونخطی (inline assembler) برای خواندن از مکانهایی خارج از محدوده آدرس ۱۶ بیتی استفاده میکنید و یکی از ثباتهای "RAMP" را تغییر میدهید، باید پس از دسترسی آن را به صفر بازنشانی کنید.
ماکروهای توکار AVR
کامپایلر GCC چندین ماکروی توکار را تعریف میکند تا کد کاربر بتواند وجود یا عدم وجود قابلیتها را بررسی کند. تقریباً تمام ماکروهای توکار زیر از قابلیتهای دستگاه استنتاج شده و بنابراین با گزینه خط فرمان -mmcu= فعال میشوند.
برای ماکروهای توکار اختصاصی بیشتر در AVR، بخشهای AVR Named Address Spaces و AVR Built-in Functions را ببینید.
- "__AVR_ARCH__"
- ماکروی
توکاری که
به یک عدد
دهدهی
شناساییکننده
معماری بسط
مییابد و
به گزینه
-mmcu=mcu بستگی
دارد.
مقادیر
ممکن
عبارتند از:
2, 25, 3, 31, 35, 4, 5, 51, 6
به ترتیب برای mcu="avr2"، "avr25"، "avr3"، "avr31"، "avr35"، "avr4"، "avr5"، "avr51"، "avr6"،
و
100, 102, 103, 104, 105, 106, 107
به ترتیب برای mcu="avrtiny"، "avrxmega2"، "avrxmega3"، "avrxmega4"، "avrxmega5"، "avrxmega6"، "avrxmega7". اگر mcu یک دستگاه را مشخص کند، این ماکروی توکار بر همان اساس تنظیم میشود. برای نمونه، با -mmcu=atmega8 این ماکرو برابر با 4 تعریف میشود.
- "__AVR_Device__"
- تنظیم -mmcu=device
این ماکروی
توکار را
تعریف
میکند که
نمایانگر
نام دستگاه
است. برای
نمونه، -mmcu=atmega8
ماکروی
توکار
"__AVR_ATmega8__" را
تعریف
میکند،
-mmcu=attiny261a ماکروی
"__AVR_ATtiny261A__" را
تعریف
میکند، و
غیره.
نام ماکروهای توکار از الگوی "__AVR_Device__" پیروی میکند که در آن Device نام دستگاه مطابق با دفترچه راهنمای کاربر AVR است. تفاوت بین Device در ماکروی توکار و device در -mmcu=device این است که دومی همیشه با حروف کوچک نوشته میشود.
اگر device یک دستگاه نبوده بلکه صرفاً یک معماری هسته مانند avr51 باشد، این ماکرو تعریف نخواهد شد.
- "__AVR_DEVICE_NAME__"
- تنظیم -mmcu=device
این ماکروی
توکار را
برابر با
نام دستگاه
قرار
میدهد.
برای
نمونه، با
-mmcu=atmega8 این
ماکرو
برابر با
"atmega8"
تعریف
میشود.
اگر device یک دستگاه نبوده بلکه صرفاً یک معماری هسته مانند avr51 باشد، این ماکرو تعریف نخواهد شد.
- "__AVR_CVT__"
- کد با گزینه "-mcvt" برای استفاده از یک جدول بردار فشرده (compact vector table) کامپایل میشود.
- "__AVR_XMEGA__"
- دستگاه / معماری متعلق به خانواده دستگاههای XMEGA است.
- "__AVR_HAVE_ADIW__"
- دستگاه دارای دستورالعملهای "ADIW" و "SBIW" است.
- "__AVR_HAVE_ELPM__"
- دستگاه دارای دستورالعمل "ELPM" است.
- "__AVR_HAVE_ELPMX__"
- دستگاه دارای دستورالعملهای "ELPM Rn,Z" و "ELPM Rn,Z+" است.
- "__AVR_HAVE_LPMX__"
- دستگاه دارای دستورالعملهای "LPM Rn,Z" و "LPM Rn,Z+" است.
- "__AVR_HAVE_MOVW__"
- دستگاه دارای دستورالعمل "MOVW" برای انجام انتقالهای ۱۶ بیتی ثبات به ثبات است.
- "__AVR_HAVE_MUL__"
- دستگاه دارای یک ضربکننده سختافزاری است.
- "__AVR_HAVE_JMP_CALL__"
- دستگاه دارای دستورالعملهای "JMP" و "CALL" است. این مورد برای دستگاههایی با بیش از ۸ کیبیبایت حافظه برنامه صدق میکند.
- "__AVR_HAVE_EIJMP_EICALL__"
- "__AVR_3_BYTE_PC__"
- دستگاه دارای دستورالعملهای "EIJMP" و "EICALL" است. این مورد برای دستگاههایی با بیش از ۱۲۸ کیبیبایت حافظه برنامه صدق میکند. این امر همچنین بدان معنی است که شمارنده برنامه (PC) دارای پهنای ۳ بایت است.
- "__AVR_2_BYTE_PC__"
- شمارنده برنامه (PC) دارای پهنای ۲ بایت است. این مورد برای دستگاههایی با حداکثر ۱۲۸ کیبیبایت حافظه برنامه صدق میکند.
- "__AVR_HAVE_8BIT_SP__"
- "__AVR_HAVE_16BIT_SP__"
- ثبات اشارهگر پشته (SP) به ترتیب به عنوان ثبات ۸ بیتی یا ۱۶ بیتی توسط کامپایلر در نظر گرفته میشود. تعریف این ماکروها تحت تأثیر -mtiny-stack قرار دارد.
- "__AVR_HAVE_SPH__"
- "__AVR_SP8__"
- افزاره به ترتیب دارای ثبات تابع خاص SPH (بخش بالایی اشارهگر پشته) است یا دارای یک اشارهگر پشتهٔ ۸ بیتی میباشد. تعریف این ماکروها تحت تأثیر -mmcu= و در موارد -mmcu=avr2 و -mmcu=avr25 همچنین تحت تأثیر -msp8 قرار میگیرد.
- "__AVR_HAVE_RAMPD__"
- "__AVR_HAVE_RAMPX__"
- "__AVR_HAVE_RAMPY__"
- "__AVR_HAVE_RAMPZ__"
- افزاره به ترتیب دارای ثباتهای تابع خاص "RAMPD"، "RAMPX"، "RAMPY" و"RAMPZ" است.
- "__NO_INTERRUPTS__"
- این ماکرو بازتابدهندهٔ گزینهٔ خط فرمان -mno-interrupts است.
- "__AVR_ERRATA_SKIP__"
- "__AVR_ERRATA_SKIP_JMP_CALL__"
- برخی از افزارههای AVR (مانند AT90S8515 و ATmega103) نباید دستورالعملهای ۳۲ بیتی را به دلیل یک نقص سختافزاری نادیده بگیرند (skip کنند). دستورالعملهای رد کردن عبارتند از "SBRS"، "SBRC"، "SBIS"، "SBIC" و "CPSE". ماکروی دوم تنها زمانی تعریف میشود که "__AVR_HAVE_JMP_CALL__" نیز تنظیم شده باشد.
- "__AVR_ISA_RMW__"
- افزاره دارای دستورالعملهای خواندن-تغییر-نوشتن (شامل XCH، LAC، LAS و LAT) است.
- "__AVR_SFR_OFFSET__=offset"
- دستورالعملهایی که میتوانند مستقیماً ثباتهای تابع خاص I/O را آدرسدهی کنند مانند "IN"، "OUT"، "SBI" و غیره، ممکن است از آدرسی متفاوت نسبت به زمانی که با دستورالعمل دسترسی به RAM مانند "LD" یا "STS" آدرسدهی میشوند استفاده کنند. این آفست به معماری افزاره بستگی دارد و باید از آدرس RAM کم شود تا آدرس I/O مربوطه به دست آید.
- "__AVR_SHORT_CALLS__"
- گزینه خط فرمان -mshort-calls تنظیم شده است.
- "__AVR_PM_BASE_ADDRESS__=addr"
- برخی از افزارهها خواندن از حافظه فلش را به کمک دستورالعملهای "LD*" پشتیبانی میکنند. حافظه فلش در فضای آدرس داده با آفست "__AVR_PM_BASE_ADDRESS__" دیده میشود. اگر این ماکرو تعریف نشده باشد، این ویژگی در دسترس نیست. اگر تعریف شده باشد، فضای آدرس خطی است و نیازی به قرار دادن ".rodata" در RAM وجود ندارد. این مورد توسط پرونده توصیف پیونددهنده پیشفرض مدیریت میشود و در حال حاضر برای "avrtiny" و "avrxmega3" در دسترس است. حتی سادهتر از آن، نیازی به استفاده از فضاهای آدرس مانند "__flash" یا ویژگیهایی چون صفت "progmem" و "pgm_read_*" نیست.
- "__AVR_HAVE_FLMAP__"
- این ماکرو در صورتی تعریف میشود که شرایط زیر برقرار باشند:
- *<افزاره دارای میدانبیتی "NVMCTRL_CTRLB.FLMAP" باشد.>
- این مورد برای افزارههای AVR64* و AVR128* صدق میکند.
- *<در زمان اسمبل مشخص نباشد که کدام شبیهسازی استفاده خواهد شد.>
این بدین معناست که کامپایلر با GNU Binutils که PR31124 را پیادهسازی میکند ("https://sourceware.org/PR31124") پیکربندی شده است.
- "__AVR_RODATA_IN_RAM__"
- این ماکرو
هنگامی که
کد برای یک
معماری
پایه
کامپایل
میشود،
تعریفنشده
است.
هنگامی که کد برای یک افزاره کامپایل شود، در صورتی که بخشهای ".rodata" برای دادههای فقطخواندنی در RAM قرار گیرند، این ماکرو با مقدار 1 تعریف میشود؛ و در غیر این صورت با مقدار 0 تعریف خواهد شد.
- "__WITH_AVRLIBC__"
- کامپایلر برای استفاده همراه با AVR-LibC پیکربندی شده است. گزینهٔ پیکربندی --with-avrlibc را ببینید.
- "__HAVE_SIGNAL_N__"
- کامپایلر از صفتهای تابع signal(num) و interrupt(num) در AVR Function Attributes,,function attributes با آرگومان num که شمارهٔ روتین سرویس وقفه را مشخص میکند، پشتیبانی میکند.
- "__HAVE_DOUBLE_MULTILIB__"
- تعریف میشود اگر -mdouble= به عنوان یک گزینهٔ multilib عمل کند.
- "__HAVE_DOUBLE32__"
- "__HAVE_DOUBLE64__"
- تعریف میشود اگر کامپایلر به ترتیب از double ۳۲ بیتی یا ۶۴ بیتی پشتیبانی کند. چیدمان واقعی توسط گزینه -mdouble= مشخص میشود.
- "__DEFAULT_DOUBLE__"
- اندازهٔ "double" بر حسب بیت، در صورتی که -mdouble= تنظیم نشده باشد. برای بررسی چیدمان "double" در یک برنامه، از ماکروی توکار "__SIZEOF_DOUBLE__" استفاده کنید.
- "__HAVE_LONG_DOUBLE32__"
- "__HAVE_LONG_DOUBLE64__"
- "__HAVE_LONG_DOUBLE_MULTILIB__"
- "__DEFAULT_LONG_DOUBLE__"
- مشابه مورد بالا، اما به جای "double" برای "long double".
- "__WITH_DOUBLE_COMPARISON__"
- نمایانگر گزینهٔ پیکربندی "--with-double-comparison={tristate|bool|libf7}" ("https://gcc.gnu.org/install/configure.html#avr") بوده و با مقدار 2 یا 3 تعریف میشود.
- "__WITH_LIBF7_LIBGCC__"
- "__WITH_LIBF7_MATH__"
- "__WITH_LIBF7_MATH_SYMBOLS__"
- نمایانگر گزینهٔ پیکربندی "--with-libf7={libgcc|math|math-symbols}" ("https://gcc.gnu.org/install/configure.html#avr") است.
گزینههای داخلی AVR
گزینههای زیر به صورت داخلی توسط کامپایلر و برای برقراری ارتباط بین پروندههای مشخصات افزاره (device specs) و خود کامپایلر استفاده میشوند. نیازی به تنظیم دستی این گزینهها ندارید؛ بهویژه آنکه آنها گزینههای بهینهسازی نیستند. استفاده نادرست از این گزینهها ممکن است به کدهای غیربهینه یا اشتباه منجر شود. این گزینهها صرفاً جهت کامل بودن مستندات و به منظور درک بهتر پروندههای device specs ("https://gcc.gnu.org/wiki/avr-gcc#spec-files") مستند شدهاند..IP -mn-flash=num 4 فرض میکند که حافظه فلش دارای اندازهای برابر با num ضرب در ۶۴ کیبیبایت (KiB) است. این گزینه مشخص میکند کدام فضاهای آدرس "__flashN" در دسترس هستند.
- -mflmap
- دستگاه دارای میدان بیتی "FLMAP" واقع در ثبات عملکرد خاص "NVMCTRL_CTRLB" است.
- -mrmw
- فرض میکند که دستگاه از دستورالعملهای خواندن-تغییر-نوشتن (Read-Modify-Write) شامل "XCH"، "LAC"، "LAS" و "LAT" پشتیبانی میکند.
- -mshort-calls
- فرض میکند که "RJMP" و "RCALL" میتوانند کل حافظه برنامه را هدف قرار دهند. این گزینه برای تولید و انتخاب multilib برای دستگاههای معماری "avrxmega3" استفاده میشود.
- -mskip-bug
- کد را بدون پرش ("CPSE"، "SBRS"، "SBRC"، "SBIS"، "SBIC") روی دستورالعملهای ۳۲ بیتی تولید میکند.
- -msp8
- با ثبات اشارهگر پشته به عنوان یک ثبات ۸ بیتی رفتار میکند، یعنی بایت بالای اشارهگر پشته صفر فرض میشود. این گزینه توسط کامپایلر برای انتخاب و ساخت multilibها برای معماریهای "avr2" و "avr25" استفاده میشود. این معماریها دستگاههای با و بدون "SPH" را ترکیب میکنند.
گزینههای Blackfin
- -mcpu=cpu[-sirevision]
- نام
پردازنده Blackfin
هدف را مشخص
میکند. در
حال حاضر،
cpu
میتواند
یکی از
مقادیر bf512،
bf514، bf516، bf518،
bf522، bf523، bf524،
bf525، bf526، bf527،
bf531، bf532، bf533،
bf534، bf536، bf537،
bf538، bf539، bf542،
bf544، bf547، bf548،
bf549، bf542m، bf544m،
bf547m، bf548m، bf549m،
bf561 یا bf592
باشد.
بخش اختیاری sirevision نسخه سیلیکون پردازنده Blackfin هدف را مشخص میکند. تمام راهکارهای دور زدن مشکل (workaround) موجود برای نسخه سیلیکون هدف فعال میشوند. اگر sirevision برابر با none باشد، هیچ راهکاری فعال نخواهد شد. اگر sirevision برابر با any باشد، تمام راهکارها برای پردازنده هدف فعال میشوند. ماکروی "__SILICON_REVISION__" به صورت دو رقم هگزادسیمال نشاندهنده اعداد اصلی و فرعی در نسخه سیلیکون تعریف میشود. اگر sirevision برابر با none باشد، ماکروی "__SILICON_REVISION__" تعریف نمیشود. اگر sirevision برابر با any باشد، "__SILICON_REVISION__" به صورت 0xffff تعریف میگردد. اگر این sirevision اختیاری استفاده نشود، GCC جدیدترین نسخه سیلیکون شناختهشده از پردازنده Blackfin هدف را فرض میکند.
کامپایلر GCC یک ماکروی پیشپردازنده برای cpu مشخصشده تعریف میکند. برای زنجیره ابزار bfin-elf، این گزینه باعث میشود در صورت عدم تعیین -msim، بسته پشتیبانی سختافزار (BSP) ارائهشده توسط libgloss پیوند زده شود.
بدون این گزینه، بهطور پیشفرض از bf532 به عنوان پردازنده استفاده میشود.
توجه داشته باشید که پشتیبانی از bf561 ناقص است. برای bf561، تنها ماکروی پیشپردازنده تعریف شده است.
- -msim
- مشخص میکند که برنامه روی شبیهساز اجرا خواهد شد. این گزینه باعث پیوند خوردن BSP شبیهساز ارائهشده توسط libgloss میشود. این گزینه فقط برای زنجیره ابزار bfin-elf اثر دارد. برخی گزینههای دیگر مانند -mid-shared-library و -mfdpic متضمن -msim هستند.
- -momit-leaf-frame-pointer
- اشارهگر فریم را در ثباتی برای توابع برگ (leaf) نگه نمیدارد. این کار از دستورالعملهای ذخیره، راهاندازی و بازیابی اشارهگرهای فریم جلوگیری کرده و یک ثبات اضافه را در توابع برگ در دسترس قرار میدهد.
- -mspecld-anomaly
- در صورت فعال بودن، کامپایلر اطمینان حاصل میکند که کد تولیدشده شامل بارهای حدسی (speculative loads) پس از دستورالعملهای پرش نباشد. در صورت استفاده از این گزینه، "__WORKAROUND_SPECULATIVE_LOADS" تعریف میشود.
- -mno-specld-anomaly
- کد اضافی برای جلوگیری از وقوع بارهای حدسی تولید نمیکند.
- -mcsync-anomaly
- در صورت فعال بودن، کامپایلر اطمینان حاصل میکند که کد تولیدشده بلافاصله پس از شاخههای شرطی شامل دستورالعملهای CSYNC یا SSYNC نباشد. در صورت استفاده از این گزینه، "__WORKAROUND_SPECULATIVE_SYNCS" تعریف میشود.
- -mno-csync-anomaly
- کد اضافی برای جلوگیری از وقوع دستورالعملهای CSYNC یا SSYNC بلافاصله پس از یک شاخه شرطی تولید نمیکند.
- -mlow64k
- در صورت فعال بودن، کامپایلر مجاز است با تکیه بر این آگاهی که کل برنامه در ۶۴ کیلوبایت پایینی حافظه جا میگیرد، کد را بهینهسازی کند.
- -mno-low64k
- فرض میکند که برنامه میتواند به هر اندازه بزرگ باشد. این حالت پیشفرض است.
- -mstack-check-l1
- بررسی پشته را با استفاده از اطلاعات قرارگرفته در حافظه چرکنویس (scratchpad) L1 توسط کرنل uClinux انجام میدهد.
- -mid-shared-library
- کدی تولید میکند که از طریق روش شناسه کتابخانه (library ID method) از کتابخانههای اشتراکی پشتیبانی میکند. این کار امکان اجرای درجا (execute in place) و استفاده از کتابخانههای اشتراکی را در محیطهای بدون مدیریت حافظه مجازی فراهم میسازد. این گزینه متضمن -fPIC است. با هدف bfin-elf، این گزینه متضمن -msim است.
- -mno-id-shared-library
- کدی تولید میکند که فرض نمیکند کتابخانههای اشتراکی مبتنی بر ID در حال استفاده هستند. این حالت پیشفرض است.
- -mleaf-id-shared-library
- کدی تولید میکند که از طریق روش شناسه کتابخانه از کتابخانههای اشتراکی پشتیبانی میکند، اما فرض را بر این میگذارد که این کتابخانه یا فایل اجرایی به هیچ کتابخانه اشتراکی مبتنی بر ID دیگری پیوند نخواهد خورد. این به کامپایلر اجازه میدهد از کد سریعتری برای پرشها و فراخوانیها استفاده کند.
- -mno-leaf-id-shared-library
- فرض نمیکند که کد در حال کامپایل به کتابخانههای اشتراکی مبتنی بر ID دیگر پیوند نخواهد خورد. برای دستورالعملهای پرش و فراخوانی کد کندتری تولید میشود.
- شماره شناسایی کتابخانه اشتراکی مبتنی بر ID در حال کامپایل را مشخص میکند. تعیین مقدار 0 کد فشردهتری تولید میکند؛ تعیین مقادیر دیگر تخصیص آن شماره را به کتابخانه فعلی اجباری میکند اما از نظر فضا یا زمان بهینهتر از حذف این گزینه نیست.
- -msep-data
- کدی تولید میکند که امکان قرارگیری قطعه داده (data segment) را در ناحیهای از حافظه متفاوت با قطعه متن (text segment) فراهم میسازد. این ویژگی با حذف بازنشانیها (relocations) نسبت به بخش متن، امکان اجرای درجا را در محیطی بدون مدیریت حافظه مجازی فراهم میکند.
- -mno-sep-data
- کدی تولید میکند که فرض میکند قطعه داده بلافاصله پس از قطعه متن قرار دارد. این حالت پیشفرض است.
- -mlong-calls
- -mno-long-calls
- به
کامپایلر
اعلام
میکند که
فراخوانیهای
تابع را با
بارگذاری
اولیه آدرس
تابع در یک
ثبات و سپس
انجام
فراخوانی
زیرروال بر
روی این
ثبات انجام
دهد. این
گزینه در
صورتی مورد
نیاز است که
تابع هدف
خارج از
محدوده
آدرسدهی
۲۴ بیتیِ
نسخه مبتنی
بر آفست
دستورالعمل
فراخوانی
زیرروال
قرار داشته
باشد.
این قابلیت بهطور پیشفرض فعال نیست. تعیین -mno-long-calls رفتار پیشفرض را بازمیگرداند. توجه داشته باشید این گزینهها تاثیری بر چگونگی تولید کد توسط کامپایلر جهت مدیریت فراخوانیهای تابع از طریق اشارهگرهای تابع ندارند.
- -mfast-fp
- با کتابخانه ممیز شناور سریع پیوند میدهد. این کتابخانه به جهت بهبود کارایی، برخی از قوانین استاندارد ممیز شناور IEEE را برای بررسی ورودیها در برابر «ناعدد» (NAN) نادیده میگیرد یا سادهتر میکند.
- -minline-plt
- درونخطسازی مدخلهای PLT را در فراخوانیهای مربوط به توابعی که مشخص نیست به صورت محلی پیوند میخورند فعال میکند. این گزینه بدون -mfdpic هیچ اثری ندارد.
- -mmulticore
- یک برنامه
مستقل برای
پردازندههای
چندهستهای
Blackfin میسازد.
این گزینه
باعث
میشود
فایلهای
راهاندازی
و
اسکریپتهای
پیونددهنده
مناسب برای
پشتیبانی
از
چندهستهای
استفاده
شوند، و
ماکروی
"__BFIN_MULTICORE" را
تعریف
میکند. این
گزینه تنها
همراه با
-mcpu=bf561[-sirevision]
قابل
استفاده
است.
این گزینه میتواند همراه با -mcorea یا -mcoreb استفاده شود که مدل برنامهنویسی «یک برنامه به ازای هر هسته» را انتخاب میکند. بدون -mcorea یا -mcoreb، مدل برنامهنویسی «تکبرنامه/دوهستهای» استفاده میشود. در این مدل، تابع اصلی Core B باید با نام "coreb_main" تعریف شود.
اگر از این گزینه استفاده نشود، مدل برنامهنویسی برنامه تکهستهای به کار گرفته میشود.
- -mcorea
- هنگام استفاده از مدل برنامهنویسی یک برنامه به ازای هر هسته، یک برنامه مستقل برای Core A از BF561 میسازد. از فایلهای راهاندازی و اسکریپتهای پیونددهنده مناسب برای پشتیبانی از Core A استفاده میشود، و ماکروی "__BFIN_COREA" تعریف میگردد. این گزینه فقط در ترکیب با -mmulticore قابل استفاده است..IP -mcoreb 4 یک برنامه مستقل (standalone) را برای Core B از پردازنده BF561 هنگام استفاده از مدل برنامهنویسی یک-برنامه-به-ازای-هر-هسته میسازد. فایلهای راهاندازی مناسب و اسکریپتهای پیوند برای پشتیبانی از Core B به کار گرفته میشوند و ماکروی "__BFIN_COREB" تعریف میشود. هنگامی که از این گزینه استفاده شود، باید به جای "main" از "coreb_main" استفاده گردد. این گزینه تنها میتواند در ترکیب با -mmulticore به کار رود.
- -msdram
- یک برنامه مستقل برای SDRAM میسازد. فایلهای راهاندازی و اسکریپتهای پیوند مناسب برای قرار دادن برنامه در SDRAM به کار گرفته میشوند و ماکروی "__BFIN_SDRAM" تعریف میشود. بارگذار (loader) باید پیش از بارگذاری برنامه، SDRAM را مقداردهی اولیه کند.
- -micplb
- فرض میکند که ICPLBها در زمان اجرا فعال هستند. این امر بر راهکارهای دور زدن ناهنجاریهای (anomaly workarounds) خاصی تأثیر دارد. برای مقصدهای Linux، پیشفرض این است که فرض شود ICPLBها فعال هستند؛ برای برنامههای مستقل پیشفرض غیرفعال است.
گزینههای C6X
- -march=name
- نام معماری مقصد را مشخص میکند. GCC از این نام برای تعیین نوع دستورالعملهایی که میتواند هنگام تولید کد اسمبلی صادر کند، استفاده میکند. نامهای مجاز عبارتند از: c62x، c64x، c64x+، c67x، c67x+ و c674x.
- -mbig-endian
- تولید کد برای یک مقصد big-endian.
- -mlittle-endian
- تولید کد برای یک مقصد little-endian. این حالت پیشفرض است.
- -msim
- انتخاب فایلهای راهاندازی و اسکریپت پیونددهنده مناسب برای شبیهساز.
- -msdata=default
- قرار دادن دادههای سراسری و ایستای کوچک در بخش ".neardata" که ثبات "B14" به آن اشاره میکند. دادههای سراسری و ایستای کوچک مقداردهینشده را در بخش ".bss" که مجاور بخش ".neardata" است قرار میدهد. دادههای کوچک فقطخواندنی را در بخش ".rodata" قرار میدهد. بخشهای متناظر مورد استفاده برای دادههای بزرگ عبارتند از ".fardata"، ".far" و ".const".
- -msdata=all
- قرار دادن تمام دادهها، و نه فقط اشیاء کوچک، در بخشهای رزروشده برای دادههای کوچک، و استفاده از آدرسدهی نسبی به ثبات "B14" برای دسترسی به آنها.
- -msdata=none
- عدم استفاده از بخشهای رزروشده برای دادههای کوچک، و استفاده از آدرسهای مطلق برای دسترسی به تمام دادهها. تمام دادههای سراسری و ایستای مقداردهیشده را در بخش ".fardata" و تمام دادههای مقداردهینشده را در بخش ".far" قرار میدهد. تمام دادههای ثابت را در بخش ".const" قرار میدهد.
گزینههای CRIS
این گزینهها به طور خاص برای پورتهای CRIS تعریف شدهاند.
- -march=architecture-type
- -mcpu=architecture-type
- تولید کد برای معماری مشخصشده. گزینههای انتخابی برای architecture-type به ترتیب عبارتند از v3، v8 و v10 برای ETRAX 4، ETRAX 100 و ETRAX 100 LX. پیشفرض v0 است.
- -mtune=architecture-type
- تنظیم بهینه (tune) تمامی موارد قابل اعمال در کد تولیدشده برای architecture-type، به جز ABI و مجموعه دستورالعملهای در دسترس. گزینههای انتخابی برای architecture-type همانند گزینههای -march=architecture-type هستند.
- -mmax-stack-frame=n
- هشدار دادن در صورتی که فریم پشته (stack frame) یک تابع از n بایت فراتر رود.
- -metrax4
- -metrax100
- گزینههای -metrax4 و -metrax100 به ترتیب مترادفهای -march=v3 و -march=v8 هستند.
- -mmul-bug-workaround
- -mno-mul-bug-workaround
- دور زدن یک باگ در دستورالعملهای "muls" و "mulu" برای مدلهای پردازندهای که در آنها رخ میدهد. این گزینه به طور پیشفرض غیرفعال است.
- -mpdebug
- فعالسازی اطلاعات مفصل اشکالزدایی مخصوص CRIS در کد اسمبلی. این گزینه همچنین اثر غیرفعال کردن نشانگر کد قالببندیشدهی #NO_APP به اسمبلر در ابتدای فایل اسمبلی را دارد.
- -mcc-init
- عدم استفاده از نتایج کدهای وضعیت (condition codes) حاصل از دستورالعمل قبلی؛ همواره پیش از استفاده از کدهای وضعیت، دستورالعملهای مقایسه و آزمون را صادر میکند.
- -mno-side-effects
- عدم صدور دستورالعملهای دارای اثرات جانبی در حالتهای آدرسدهی غیر از پسافزایش (post-increment).
- -mstack-align
- -mno-stack-align
- -mdata-align
- -mno-data-align
- -mconst-align
- -mno-const-align
- این گزینهها (گزینههای no-) ترتیب همترازی (حذف ترتیب همترازی) فریم پشته، تکتک دادهها و مقادیر ثابت را برای حداکثر اندازه دسترسی تکی به داده در مدل پردازنده انتخابشده فراهم میکنند. پیشفرض، تنظیم همترازی ۳۲ بیتی است. جزئیات ABI مانند چیدمان ساختار تحت تأثیر این گزینهها قرار نمیگیرند.
- -m32-bit
- -m16-bit
- -m8-bit
- مشابه گزینههای تراز stack-، data- و const- در بالا، این گزینهها فریم پشته، دادههای قابل نوشتن و ثوابت را به گونهای تنظیم میکنند که همگی ۳۲ بیتی، ۱۶ بیتی یا ۸ بیتی تراز شوند. پیشفرض، تراز ۳۲ بیتی است.
- -mno-prologue-epilogue
- -mprologue-epilogue
- با گزینه -mno-prologue-epilogue، پیشدرآمد (prologue) و پسدرآمد (epilogue) عادی تابع که فریم پشته را برپا میکنند حذف میشوند و هیچ دستور بازگشت یا دنباله بازگشتی در کد تولید نمیشود. از این گزینه تنها به همراه بررسی چشمی کد کامپایلشده استفاده کنید: هیچ هشدار یا خطایی در هنگامی که ثباتهای فراخوانیمحفوظ (call-saved registers) باید ذخیره شوند یا فضا برای متغیرهای محلی باید تخصیص یابد، تولید نمیشود.
- -melf
- گزینه بدون عملیات (no-op) قدیمی.
- -sim
- این گزینه پیوند دادن با توابع ورودی-خروجی کتابخانه شبیهساز را ترتیب میدهد. کد، دادههای مقداردهیشده و دادههای مقداردهیشده با صفر به صورت متوالی تخصیص مییابند.
- -sim2
- مانند -sim، اما گزینههای پیونددهندهای را ارسال میکند تا دادههای مقداردهیشده را در 0x40000000 و دادههای مقداردهیشده با صفر را در 0x80000000 جایگذاری کند.
گزینههای C-SKY
کامپایلر GCC هنگام کامپایل برای پردازندههای C-SKY V2 از این گزینهها پشتیبانی میکند.
- -march=arch
- معماری مقصد C-SKY را مشخص میکند. مقادیر معتبر برای arch عبارتند از: ck801، ck802، ck803، ck807 و ck810. پیشفرض ck810 است.
- -mcpu=cpu
- پردازنده مقصد C-SKY را مشخص میکند. مقادیر معتبر برای cpu عبارتند از: ck801، ck801t، ck802، ck802t، ck802j، ck803، ck803h، ck803t، ck803ht، ck803f، ck803fh، ck803e، ck803eh، ck803et، ck803eht، ck803ef، ck803efh، ck803ft، ck803eft، ck803efht، ck803r1، ck803hr1، ck803tr1، ck803htr1، ck803fr1، ck803fhr1، ck803er1، ck803ehr1، ck803etr1، ck803ehtr1، ck803efr1، ck803efhr1، ck803ftr1، ck803eftr1، ck803efhtr1، ck803s، ck803st، ck803se، ck803sf، ck803sef، ck803seft، ck807e، ck807ef، ck807، ck807f، ck810e، ck810et، ck810ef، ck810eft، ck810، ck810v، ck810f، ck810t، ck810fv، ck810tv، ck810ft و ck810ftv..IP -mbig-endian 4
- -EB
- -mlittle-endian
- -EL
- کد big-endian یا little-endian را انتخاب میکند. حالت پیشفرض little-endian است.
- -mfloat-abi=name
- مشخص
میکند
کدام ABI ممیز
شناور
استفاده
شود. مقادیر
مجاز
عبارتند از:
soft، softfp و hard.
مشخص کردن soft باعث میشود GCC خروجیای حاوی فراخوانیهای کتابخانهای برای عملیات ممیز شناور تولید کند. softfp امکان تولید کد با استفاده از دستورالعملهای سختافزاری ممیز شناور را فراهم میکند، اما همچنان از قراردادهای فراخوانی soft-float استفاده مینماید. hard اجازه تولید دستورالعملهای ممیز شناور را داده و از قراردادهای فراخوانی مختص FPU استفاده میکند.
مقدار پیشفرض به پیکربندی مقصد خاص بستگی دارد. توجه داشته باشید که ABIهای hard-float و soft-float از نظر پیوند (link) با یکدیگر سازگار نیستند؛ باید کل برنامه خود را با همان ABI کامپایل کرده و با مجموعهای سازگار از کتابخانهها پیوند دهید.
- -mhard-float
- -msoft-float
- پیادهسازیهای سختافزاری یا نرمافزاری ممیز شناور را انتخاب میکند. پیشفرض soft float است.
- -mdouble-float
- -mno-double-float
- هنگامی که -mhard-float فعال است، تولید دستورالعملهای ممیز شناور با دقت مضاعف (double-precision) را فعال میکند. این حالت پیشفرض است مگر هنگام کامپایل برای CK803.
- -mfdivdu
- -mno-fdivdu
- هنگامی که -mhard-float فعال است، تولید دستورالعملهای "frecipd"، "fsqrtd" و "fdivd" را فعال میکند. این حالت پیشفرض است مگر هنگام کامپایل برای CK803.
- -mfpu=fpu
- پردازنده ممیز شناور را انتخاب میکند. این گزینه فقط همراه با -mhard-float قابل استفاده است. مقادیر مجاز برای fpu عبارتند از: fpv2_sf (معادل با -mno-double-float -mno-fdivdu)، fpv2 (-mdouble-float -mno-divdu) و fpv2_divd (-mdouble-float -mdivdu).
- -melrw
- -mno-elrw
- دستورالعمل گسترشیافتهٔ "lrw" را فعال میکند. این گزینه بهطور پیشفرض برای CK801 فعال و در غیر این صورت غیرفعال است.
- -mistack
- -mno-istack
- دستورالعملهای
پشته وقفه
را فعال
میکند؛
پیشفرض
غیرفعال
است.
گزینه -mistack برای رسیدگی به ویژگیهای تابعی "interrupt" و "isr" الزامی است.
- -mmp
- دستورالعملهای چندپردازندهای را فعال میکند؛ پیشفرض غیرفعال است.
- -mcp
- دستورالعملهای کمکپردازنده را فعال میکند؛ پیشفرض غیرفعال است.
- -mcache
- دستورالعملهای کمکپردازنده را فعال میکند؛ پیشفرض غیرفعال است.
- -msecurity
- دستورالعملهای امنیتی C-SKY را فعال میکند؛ پیشفرض غیرفعال است.
- -mtrust
- دستورالعملهای اعتمادسنجی C-SKY را فعال میکند؛ پیشفرض غیرفعال است.
- -mdsp
- -medsp
- -mvdsp
- به ترتیب دستورالعملهای C-SKY DSP، Enhanced DSP یا Vector DSP را فعال میکند. تمام این گزینهها بهطور پیشفرض غیرفعال هستند.
- -mdiv
- -mno-div
- دستورالعملهای تقسیم را تولید میکند. پیشفرض غیرفعال است.
- -msmart
- -mno-smart
- کد را برای حالت Smart تولید میکند که تنها از ثباتهای شمارهگذاریشده 0-7 برای امکان استفاده از دستورالعملهای ۱۶ بیتی استفاده میکند. این گزینه برای CK801 که این رفتار برای آن الزامی است نادیده گرفته میشود، و بهطور پیشفرض برای CK802 فعال است. برای سایر مقاصد، پیشفرض غیرفعال است.
- -mhigh-registers
- -mno-high-registers
- کد را با استفاده از ثباتهای بالایی شمارهگذاریشده 16-31 تولید میکند. این گزینه در CK801، CK802 یا CK803 پشتیبانی نمیشود، و بهطور پیشفرض برای سایر پردازندهها فعال است.
- -manchor
- -mno-anchor
- کد را با استفاده از آدرسهای نماد لنگر سراسری (global anchor symbol) تولید میکند.
- -mpushpop
- -mno-pushpop
- کد را با استفاده از دستورالعملهای "push" و "pop" تولید میکند. این گزینه بهطور پیشفرض فعال است.
- -mmultiple-stld
- -mstm
- -mno-multiple-stld
- -mno-stm
- کد را با استفاده از دستورالعملهای "stm" و "ldm" تولید میکند. این گزینه در CK801 پشتیبانی نمیشود اما بهطور پیشفرض در سایر پردازندهها فعال است.
- -mconstpool
- -mno-constpool
- استخرهای مقادیر ثابت (constant pools) را درون کامپایلر ایجاد میکند به جای آنکه آن را به اسمبلر موکول کند. این گزینه حالت پیشفرض بوده و برای تولید کد صحیح روی CK801 و CK802 الزامی است، و در سایر پردازندهها اختیاری میباشد.
- -mstack-size
- -mno-stack-size
- دستورات راهنمای ".stack_size" را برای هر تابع در خروجی اسمبلی درج میکند. این گزینه بهطور پیشفرض غیرفعال است.
- -mccrt
- -mno-ccrt
- کد را به جای libgcc برای زماناجرای (runtime) کامپایلر C-SKY تولید میکند. این گزینه بهطور پیشفرض غیرفعال است..IP -mbranch-cost=n 4 هزینهٔ انشعابها را تقریباً به اندازهٔ "n" دستورالعمل تنظیم میکند. مقدار پیشفرض 1 است.
- -msched-prolog
- -mno-sched-prolog
- اجازهٔ زمانبندی توالیهای مقدمه (prologue) و مؤخره (epilogue) تابع را صادر میکند. استفاده از این گزینه میتواند منجر به تولید کدی شود که با الزامات مقدمه در C-SKY V2 ABI سازگار نیست و قابلیت اشکالزدایی یا ردگیری به عقب (backtrace) ندارد. این گزینه بهطور پیشفرض غیرفعال است.
- -msim
- کتابخانهٔ libsemi.a را که با شبیهساز سازگار است پیوند میدهد. این گزینه فقط برای کامپایلر ELF کاربرد دارد.
گزینههای Cygwin و MinGW
این گزینههای اضافی برای مقصدهای Microsoft Windows در دسترس هستند:
- -mconsole
- این گزینه مشخص میکند که یک برنامهٔ کنسولی باید تولید شود؛ این کار با دستور دادن به پیونددهنده برای تنظیم نوع زیرسیستم سرآیند PE به موارد مورد نیاز برنامههای کنسولی انجام میگیرد. این گزینه برای مقصدهای Cygwin و MinGW در دسترس است و در آن مقصدها بهطور پیشفرض فعال میباشد.
- -mcrtdll=library
- پیشپردازش، کامپایل یا پیوند دادن با library مشخصشده از C RunTime DLL. این گزینه ماکروهای از پیش تعریفشدهٔ "__CRTDLL__"، "__MSVCRT__"، "_UCRT" و "__MSVCRT_VERSION__" را برای library CRT مشخصشده تنظیم میکند، فایل راهانداز را برای library CRT برمیگزیند و با library CRT پیوند برقرار میسازد. نامهای شناختهشدهٔ کتابخانهٔ CRT برای پیشپردازنده عبارتند از: "crtdll*"، "msvcrt10*"، "msvcrt20*"، "msvcrt40*"، "msvcr40*"، "msvcrtd*"، "msvcrt-os*"، "msvcr70*"، "msvcr71*"، "msvcr80*"، "msvcr90*"، "msvcr100*"، "msvcr110*"، "msvcr120*" و "ucrt*". اگر این گزینه مشخص نشود، کتابخانهٔ واردات (import library) پیشفرض MinGW یعنی "msvcrt" برای پیوند دادن استفاده میشود و هیچ تنظیم دیگری برای پیشپردازنده انجام نمیگیرد. کتابخانهٔ واردات MinGW با نام "msvcrt" صرفاً یک پیوند نمادین (یا کپی) از یک کتابخانهٔ واردات CRT دیگر در MinGW است که حین کامپایل MinGW انتخاب شده است. کتابخانهٔ واردات "msvcrt-os" مربوط به کتابخانهٔ سیستمی "msvcrt.dll" در Windows است و در بیشتر موارد کتابخانهٔ واردات پیشفرض MinGW به شمار میرود. بهطور کلی، تغییر DLL مربوط به CRT نیازمند کامپایل مجدد کل MinGW CRT است. این گزینه صرفاً برای مقاصد آزمایشی و ارزیابی در نظر گرفته شده است. این گزینه برای مقصدهای MinGW در دسترس است.
- -mdll
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که یک DLL – یک کتابخانهٔ پیوند پویا (dynamic link library) – باید تولید شود، و انتخاب شیء راهانداز زمان اجرا و نقطهٔ ورود لازم را فعال میکند.
- -mnop-fun-dllimport
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که صفت "dllimport" باید نادیده گرفته شود.
- -mthreads
- این گزینه برای مقصدهای MinGW در دسترس است. این گزینه مشخص میکند که پشتیبانی از ریسمانها (threads) ویژهٔ MinGW باید استفاده شود.
- -municode
- این گزینه برای مقصدهای MinGW-w64 در دسترس است. این گزینه سبب میشود که ماکروی پیشپردازندهٔ "UNICODE" بهطور پیشفرض تعریف گردد، و کد راهانداز زمان اجرای سازگار با یونیکد انتخاب شود.
- -mwin32
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که ماکروهای از پیش تعریفشدهٔ معمول Microsoft Windows باید در پیشپردازنده تنظیم شوند، اما تأثیری بر انتخاب کتابخانهٔ زمان اجرا یا کد راهانداز ندارد.
- -mwindows
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که یک برنامهٔ دارای رابط کاربری گرافیکی (GUI) باید با دستور دادن به پیونددهنده جهت تنظیم مناسب نوع زیرسیستم سرآیند PE تولید شود.
- -fno-set-stack-executable
- این گزینه برای مقصدهای MinGW در دسترس است. این گزینه مشخص میکند که پرچم قابلاجرا بودن برای پشتهای که توسط توابع تو در تو استفاده میشود، تنظیم نگردد. این مورد برای باینریهایی که در حالت هستهٔ (kernel mode) Microsoft Windows اجرا میشوند ضروری است، زیرا در آنجا API مربوط به User32 که برای تنظیم امتیازات اجرایی استفاده میشود، در دسترس نیست.
- -fwritable-relocated-rdata
- این گزینه برای مقصدهای MinGW و Cygwin در دسترس است. این گزینه مشخص میکند که دادههای بازنشانیشده در بخش فقطخواندنی، درون بخش ".data" قرار گیرند. این قابلیت برای محیطهای زمان اجرای قدیمیتری که از اصلاح بخشهای ".rdata" برای بازنشانی شبهمکانی (pseudo-relocation) پشتیبانی نمیکنند، ضروری است.
- -mpe-aligned-commons
- این گزینه برای مقصدهای Cygwin و MinGW در دسترس است. این گزینه مشخص میکند که پسوند GNU به قالب فایل PE که اجازهٔ همترازی صحیح متغیرهای COMMON را میدهد، هنگام تولید کد استفاده شود. این گزینه بهطور پیشفرض فعال است اگر GCC تشخیص دهد که اسمبلر مقصدِ شناساییشده در حین پیکربندی از این قابلیت پشتیبانی میکند.
برای گزینههای استاندارد، همچنین بخش گزینههای x86 را ببینید.
گزینههای Darwin
این گزینهها برای تمام معماریهایی که سیستمعامل Darwin را اجرا میکنند تعریف شدهاند.
نسخهٔ FSF GCC در Darwin فایلهای شیء چندمعماری («fat») ایجاد نمیکند؛ بلکه برای تکمعماری خاصی که GCC برای آن ساخته شده، فایل شیء تولید میکند. نسخهٔ Apple GCC در Darwin در صورت استفاده از چند گزینهٔ -arch، فایلهای «fat» ایجاد میکند؛ این کار با چندین بار اجرای کامپایلر یا پیونددهنده و ادغام نتایج با یکدیگر بهوسیلهٔ lipo انجام میگیرد.
زیرنوع (subtype) فایل ایجادشده (مانند ppc7400 یا ppc970 یا i686) با پرچمهایی تعیین میشود که معماری مجموعه دستورالعملها (ISA) هدف GCC را مشخص میکنند، مانند -mcpu یا -march. گزینهٔ -force_cpusubtype_ALL میتواند برای نادیده گرفتن این رفتار به کار رود.
ابزارهای Darwin هنگام مواجهه با عدم تطابق ISA رفتارهای متفاوتی دارند. اسمبلر، as، فقط اجازهٔ استفاده از دستورالعملهایی را میدهد که برای زیرنوعِ فایل در حال تولید معتبر باشند؛ بنابراین نمیتوان دستورالعملهای ۶۴ بیتی را در یک فایل شیء ppc750 قرار داد. پیونددهندهٔ کتابخانههای اشتراکی، یعنی /usr/bin/libtool، اگر خواسته شود کتابخانهای اشتراکی با زیرنوعی با محدودیت کمتر نسبت به فایلهای ورودیاش ایجاد کند، شکست خورده و خطایی را چاپ میکند (به عنوان مثال، تلاش برای قرار دادن یک فایل شیء ppc970 در یک کتابخانهٔ ppc7400). پیونددهندهٔ فایلهای اجرایی، ld، بدون اخطار، محدودکنندهترین زیرنوع را از میان تمام فایلهای ورودی به فایل اجرایی اختصاص میدهد.
- -Fdir
- دایرکتوری
چارچوب (framework)
با نام dir را
به ابتدای
فهرست
دایرکتوریهای
مورد جستجو
برای
فایلهای
سرآیند
اضافه
میکند. این
دایرکتوریها
با موارد
مشخصشده
توسط
گزینههای
-I
درهمآمیخته
شده و به
ترتیب از چپ
به راست
پویش
میشوند.
دایرکتوری چارچوب دایرکتوریای است که چارچوبها در آن قرار دارند. یک چارچوب، دایرکتوریای است که مستقیماً شامل یک دایرکتوری Headers و/یا PrivateHeaders بوده و نام آن با .framework پایان مییابد. نام یک چارچوب، همان نام این دایرکتوری با حذف پسوند .framework است. سرآیندهای مربوط به چارچوب در یکی از این دو دایرکتوری یافت میشوند، بهطوری که Headers زودتر جستجو میشود. یک زیرچارچوب (subframework) یک دایرکتوری چارچوب است که در دایرکتوری Frameworks یک چارچوب دیگر قرار دارد. گنجاندن سرآیندهای زیرچارچوب تنها میتواند در سرآیندِ چارچوبی که حاوی آن زیرچارچوب است رخ دهد، یا در سرآیندِ یک زیرچارچوبِ همردیف (sibling). دو زیرچارچوب زمانی همردیف محسوب میشوند که در یک چارچوب یکسان قرار داشته باشند. یک زیرچارچوب نباید همنام با یک چارچوب باشد؛ در صورت تخطی از این قاعده، هشداری صادر میشود. در حال حاضر یک زیرچارچوب نمیتواند دارای زیرچارچوب باشد؛ در آینده، ممکن است این سازوکار برای پشتیبانی از این قابلیت گسترش یابد. چارچوبهای استاندارد را میتوان در /System/Library/Frameworks و /Library/Frameworks یافت. یک نمونه از گنجاندن سرآیند به صورت "#include <Framework/header.h>" است، که در آن Framework نشاندهندهٔ نام چارچوب بوده و header.h در دایرکتوری PrivateHeaders یا Headers قرار دارد.
- -iframeworkdir
- مانند -F عمل میکند با این تفاوت که با دایرکتوری مانند یک دایرکتوری سیستمی رفتار میشود. تفاوت اصلی بین -iframework و -F در این است که با -iframework کامپایلر هیچ هشداری دربارهٔ سازههای موجود در فایلهای سرآیندِ یافتشده از طریق dir صادر نمیکند. این گزینه فقط برای زبانهای خانوادهٔ C معتبر است.
- -gused
- اطلاعات اشکالزدایی را برای نمادهایی که استفاده شدهاند تولید میکند. برای قالب اشکالزدایی stabs، این گزینه -feliminate-unused-debug-symbols را فعال میکند. این گزینه بهطور پیشفرض روشن (ON) است.
- -gfull
- اطلاعات اشکالزدایی را برای تمام نمادها و نوعها تولید میکند.
- -fconstant-cfstrings
- گزینهٔ -fconstant-cfstrings نام مستعاری برای -mconstant-cfstrings است..IP -mconstant-cfstrings 4 هنگامی که زماناجرای NeXT استفاده میشود (که در این سیستمها حالت پیشفرض است)، هرگونه تنظیمات -fconstant-string-class نادیده گرفته شده و باعث میشود لیترالهای "@"..."" بهصورت رشتههای ثابت CoreFoundation چیدمان شوند.
- -mmacosx-version-min=version
- قدیمیترین
نسخهٔ MacOS X که
این فایل
اجرایی روی
آن اجرا
خواهد شد،
version است.
مقادیر
معمول
پشتیبانیشده
برای version
شامل 12،
10.12 و 10.5.8
است.
اگر کامپایلر طوری ساخته شده باشد که بهطور پیشفرض از هدرهای سیستم استفاده کند، مقدار پیشفرض این گزینه نسخهٔ سیستمی خواهد بود که کامپایلر روی آن در حال اجراست؛ در غیر این صورت، حالت پیشفرض انتخاب گزینههایی است که با بیشترین تعداد سیستمها و پایگاههای کد سازگار باشند.
- -mkernel
- فعالسازی حالت توسعه هسته (kernel). گزینهٔ -mkernel در صورت کاربرد، گزینههای -static، -fno-common، -fno-use-cxa-atexit، -fno-exceptions، -fno-non-call-exceptions، -fapple-kext، -fno-weak و -fno-rtti را تنظیم میکند. این حالت همچنین گزینههای -mno-altivec، -msoft-float، -fno-builtin و -mlong-branch را برای اهداف PowerPC تنظیم مینماید.
- -mone-byte-bool
- نادیده
گرفتن
مقادیر
پیشفرض
برای "bool"
بهگونهای
که "sizeof(bool)==1"
برقرار
باشد.
بهطور
پیشفرض
مقدار
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
- باعث میشود خطاهای مربوط به فایلهایی با معماری نادرست، مهلک (fatal) تلقی شوند.
- -bind_at_load
- باعث میشود فایل خروجی بهگونهای علامتگذاری شود که پیونددهندهٔ پویا هنگام بارگذاری یا اجرای فایل، تمام ارجاعات تعریفنشده را متصل (bind) کند.
- -bundle
- فایلی با قالب Mach-o bundle تولید میکند. برای اطلاعات بیشتر به راهنمای ld(1) مراجعه کنید.
- -bundle_loader executable
- این گزینه فایل اجرایی (executable) را مشخص میکند که فایل خروجی ساختِ در حال پیوند را بارگذاری خواهد کرد. برای اطلاعات بیشتر به راهنمای ld(1) مراجعه کنید.
- -dynamiclib
- با دریافت این گزینه، GCC هنگام پیوند، با استفاده از دستور libtool در Darwin، بهجای فایل اجرایی یک کتابخانهٔ پویا ایجاد میکند.
- -force_cpusubtype_ALL
- این گزینه باعث میشود فایل خروجی GCC بهجای زیرنوعی که توسط گزینهٔ -mcpu یا -march تعیین میشود، دارای زیرنوع ALL باشد.
- -nodefaultrpaths
- مسیرهای اجرای پیشفرض (run paths) مربوط به دایرکتوریهای کتابخانهٔ کامپایلر را به فایلهای اجرایی، ماژولها یا کتابخانههای پویا اضافه نمیکند. در macOS 10.5 و جدیدتر، مسیر اجرای تعبیهشده بهطور پیشفرض اضافه میشود مگر اینکه کاربر -nodefaultrpaths را به خط پیوند اضافه کند. مسیرهای اجرا برای ساخت روی macOS نسخهٔ 10.11 یا بالاتر لازم هستند (و بنابراین اجباری شدهاند).
- -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
- -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 سازگار است. با این حال، برای سازگاری کامل به کمکهای نرمافزاری نیاز دارد. این گزینه کدی کاملاً سازگار با IEEE تولید میکند، به جز این که inexact-flag حفظ نمیشود (پایین را ببینید). اگر این گزینه فعال باشد، ماکروی پیشپردازنده "_IEEE_FP" در حین کامپایل تعریف میشود. کد حاصل بازدهی کمتری دارد، اما میتواند به درستی از اعداد غیرنرمال (denormalized) و مقادیر استثنایی IEEE مانند «ناعدد» (NaN) و مثبت/منفی بینهایت پشتیبانی کند. سایر کامپایلرهای Alpha این گزینه را -ieee_with_no_inexact مینامند.
- -mieee-with-inexact
- این گزینه مشابه -mieee است، با این تفاوت که کد تولید شده inexact-flag استاندارد IEEE را نیز حفظ میکند. فعال کردن این گزینه باعث میشود کد تولید شده محاسبات کاملاً منطبق بر استاندارد ریاضی IEEE را پیادهسازی کند. علاوه بر "_IEEE_FP"، ماکروی پیشپردازنده "_IEEE_FP_EXACT" نیز تعریف میشود. در برخی پیادهسازیهای Alpha، کد حاصل ممکن است به طور چشمگیری کندتر از کد پیشفرض اجرا شود. از آنجا که کدهای بسیار اندکی به inexact-flag وابسته هستند، معمولاً نباید این گزینه را تعیین کنید. سایر کامپایلرهای Alpha این گزینه را -ieee_with_inexact مینامند.
- -mfp-trap-mode=trap-mode
- این گزینه کنترل میکند که چه تلههای مربوط به ممیز شناور فعال باشند. سایر کامپایلرهای Alpha این گزینه را به صورت -fptm trap-mode مینامند. حالت تله را میتوان روی یکی از چهار مقدار زیر تنظیم کرد:
- n
- تنظیم پیشفرض (عادی). تنها تلههایی فعال میشوند که در نرمافزار قابل غیرفعالسازی نیستند (مانند تله تقسیم بر صفر).
- u
- علاوه بر تلههای فعالشده با n، تلههای زیرریز (underflow) نیز فعال میشوند.
- su
- مشابه u، با این تفاوت که دستورالعملها به عنوان ایمن برای تکمیل نرمافزاری علامتگذاری میشوند (برای جزئیات به راهنمای معماری Alpha مراجعه کنید).
- sui
- مشابه su، اما تلههای نادقیق (inexact) نیز فعال میشوند.
- -mfp-rounding-mode=rounding-mode
- حالت گرد کردن IEEE را انتخاب میکند. سایر کامپایلرهای Alpha این گزینه را -fprm rounding-mode مینامند. گزینه rounding-mode میتواند یکی از موارد زیر باشد:
- n
- حالت عادی گرد کردن IEEE. اعداد ممیز شناور به سمت نزدیکترین عدد ماشین، یا در صورت تساوی به سمت نزدیکترین عدد ماشین زوج گرد میشوند.
- m
- گرد کردن به سمت منفی بینهایت.
- c
- حالت گرد کردن برشی (Chopped). اعداد ممیز شناور به سمت صفر گرد میشوند.
- d
- حالت گرد کردن پویا (Dynamic). یک فیلد در ثبات کنترل ممیز شناور (fpcr، به راهنمای مرجع معماری Alpha مراجعه کنید) حالت گرد کردن فعال را تعیین میکند. کتابخانه C این ثبات را برای گرد کردن به سمت مثبت بینهایت مقداردهی اولیه میکند. بنابراین، مگر اینکه برنامه شما fpcr را تغییر دهد، d متناظر با گرد کردن به سمت مثبت بینهایت خواهد بود.
- -mtrap-precision=trap-precision
- در معماری Alpha، تلههای ممیز شناور غیردقیق (imprecise) هستند. این بدان معناست که بدون کمک نرمافزاری، بازیابی از یک تله ممیز شناور غیرممکن است و اجرای برنامه معمولاً باید خاتمه یابد. 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 در مقدمه تابع (function prologue) فایل اسمبلی تولید شده است.
- -mbuild-constants
- به طور
معمول، GCC یک
ثابت عدد
صحیح ۳۲ یا
۶۴ بیتی را
بررسی
میکند تا
ببیند آیا
میتواند
آن را در دو
یا سه
دستورالعمل
از
ثابتهای
کوچکتر
بسازد یا
خیر. اگر
نتواند،
ثابت را به
صورت
لیترال در
خروجی قرار
میدهد و
کدی تولید
میکند تا
آن را در
زمان اجرا
از بخش داده
(data segment)
بارگذاری
کند.
از این گزینه برای الزام کردن GCC به ساخت تمامی ثابتهای عدد صحیح با استفاده از کد استفاده کنید، حتی اگر به دستورالعملهای بیشتری نیاز داشته باشد (حداکثر شش دستورالعمل).
معمولاً از این گزینه برای ساخت بارگذار پویای کتابخانه مشترک استفاده میشود. از آنجا که این بارگذار خود یک کتابخانه مشترک است، باید پیش از آنکه بتواند متغیرها و ثابتها را در بخش داده خود پیدا کند، خود را در حافظه بازنشانی (relocate) کند..IP -mbwx 4
- -mno-bwx
- -mcix
- -mno-cix
- -mfix
- -mno-fix
- -mmax
- -mno-max
- مشخص میکند که آیا GCC باید کدی تولید کند که از مجموعهدستورالعملهای اختیاری BWX، CIX، FIX و MAX استفاده نماید یا خیر. حالت پیشفرض، استفاده از مجموعهدستورالعملهای پشتیبانیشده توسط نوع پردازندهای (CPU) است که با گزینهٔ -mcpu= مشخص شده، یا پردازندهای که GCC روی آن ساخته شده است در صورتی که هیچ نوعی مشخص نشده باشد.
- -msafe-bwa
- -mno-safe-bwa
- مشخص میکند که آیا در صورت عدم وجود مجموعهدستورالعمل اختیاری BWX، کامپایلر GCC باید کدی تولید کند که برای دسترسیهای حافظه به بایتها و کلمات همتراز، در برابر چندنخی (multi-thread) و سیگنالهای ناهمگام (async-signal) امن باشد یا خیر.
- -msafe-partial
- -mno-safe-partial
- مشخص میکند که آیا GCC باید برای دسترسیهای جزئی به حافظه کدی امن در برابر چندنخی و سیگنالهای ناهمگام تولید کند یا خیر؛ این شامل دسترسیهای تکهتکه به دادههای همترازشدهنبوده و همچنین دسترسیهای بلوکی به بخشهای ابتدایی و انتهایی نوعهای تجمیعی یا سایر اشیاء در حافظه میشود که به ترتیب در مرز دادههای همتراز ۶۴ بیتی شروع و پایان نمییابند.
- -mfloat-vax
- -mfloat-ieee
- کدی تولید میکند که به جای ممیز شناور تکدقت و دودقت IEEE، از محاسبات ممیز شناور VAX F و G استفاده میکند (یا استفاده نمیکند).
- -mexplicit-relocs
- -mno-explicit-relocs
- اسمبلرهای قدیمیتر Alpha هیچ راهی برای تولید بازنشانیهای نمادها (symbol relocations) به جز از طریق ماکروهای اسمبلر ارائه نمیدادند. استفاده از این ماکروها اجازهٔ زمانبندی بهینهٔ دستورالعملها را نمیدهد. بستهٔ GNU binutils از نسخهٔ 2.12 به بعد، از نحو جدیدی پشتیبانی میکند که به کامپایلر اجازه میدهد بهطور صریح مشخص کند کدام بازنشانیها باید برای کدام دستورالعملها اعمال شوند. این گزینه بیشتر برای اشکالزدایی مفید است، زیرا GCC در هنگام ساختهشدن قابلیتهای اسمبلر را تشخیص داده و پیشفرض را بر این اساس تنظیم میکند.
- -msmall-data
- -mlarge-data
- هنگامی که
-mexplicit-relocs فعال
باشد،
دادههای
ایستا از
طریق
بازنشانیهای
gp-relative در
دسترس قرار
میگیرند.
وقتی -msmall-data
استفاده
میشود،
اشیایی با
اندازهٔ ۸
بایت یا
کمتر در یک
ناحیهٔ
دادههای
کوچک
(بخشهای
".sdata" و
".sbss")
قرار
میگیرند و
از طریق
بازنشانیهای
۱۶ بیتی از
رجیستر
$gp در
دسترس
خواهند بود.
این کار
اندازهٔ
ناحیهٔ
دادههای
کوچک را به
۶۴
کیلوبایت
محدود
میکند،
اما به
متغیرها
اجازه
میدهد که
مستقیماً
از طریق یک
تکدستورالعمل
قابل
دسترسی
باشند.
حالت پیشفرض -mlarge-data است. با این گزینه، ناحیهٔ داده به کمی کمتر از ۲ گیگابایت محدود میشود. برنامههایی که به بیش از ۲ گیگابایت داده نیاز دارند باید از "malloc" یا "mmap" برای تخصیص داده در هیپ (heap) به جای بخش دادههای برنامه استفاده کنند.
هنگام تولید کد برای کتابخانههای اشتراکی، -fpic متضمن -msmall-data و -fPIC متضمن -mlarge-data است.
- -msmall-text
- -mlarge-text
- هنگامی که
-msmall-text
استفاده
میشود،
کامپایلر
فرض میکند
که کد کل
برنامه (یا
کتابخانهٔ
اشتراکی) در
۴ مگابایت
جا میشود،
و در نتیجه
با یک دستور
انشعاب (branch)
قابل دسترس
است. وقتی
-msmall-data
استفاده
میشود،
کامپایلر
میتواند
فرض کند که
تمام
نمادهای
محلی مقدار
یکسانی از
$gp را به
اشتراک
میگذارند،
و بدین
ترتیب
تعداد
دستورالعملهای
مورد نیاز
برای
فراخوانی
تابع را از
۴ به ۱ کاهش
میدهد.
حالت پیشفرض -mlarge-text است.
- -mcpu=cpu_type
- مجموعهدستورالعمل
و
پارامترهای
زمانبندی
دستورالعمل
را برای نوع
ماشین cpu_type
تنظیم
میکند.
میتوانید
نام با سبک
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 پشتیبانی میکند.
زنجیرهابزارهای بومی (native toolchains) از مقدار native نیز پشتیبانی میکنند، که بهترین گزینهٔ معماری را برای پردازندهٔ میزبان انتخاب میکند. در صورتی که GCC پردازنده را شناسایی نکند، گزینهٔ -mcpu=native هیچ اثری نخواهد داشت.
- -mtune=cpu_type
- تنها
پارامترهای
زمانبندی
دستورالعمل
را برای نوع
ماشین cpu_type
تنظیم
میکند.
مجموعهدستورالعمل
تغییری
نمیکند.
زنجیرهابزارهای بومی نیز از مقدار native پشتیبانی میکنند که بهترین گزینهٔ معماری را برای پردازندهٔ میزبان انتخاب میکند. در صورتی که GCC پردازنده را شناسایی نکند، گزینهٔ -mtune=native هیچ اثری نخواهد داشت.
- -mmemory-latency=time
- تاخیر (latency)
فرضی
زمانبند
برای
مراجعات
معمول به
حافظه را از
دیدگاه
برنامه
تنظیم
میکند. این
عدد
وابستگی
شدیدی به
الگوهای
دسترسی به
حافظهٔ
مورد
استفاده
توسط
برنامه و
اندازهٔ
حافظهٔ
نهان (cache)
خارجی روی
ماشین دارد.
گزینههای معتبر برای time عبارتند از:
گزینههای eBPF
- -mframe-limit=bytes
- این گزینه حد سختگیرانه (hard limit) اندازه فریمها را بر حسب بایت مشخص میکند. در حال حاضر، مقداری که میتوان تعیین کرد باید کمتر یا مساوی با 32767 باشد. پیشفرض، همان محدودیتی است که توسط نسخه هسته لینوکس هدف اعمال شده است.
- -mbig-endian
- تولید کد برای یک هدف big-endian.
- -mlittle-endian
- تولید کد برای یک هدف little-endian. این حالت پیشفرض است.
- -mjmpext
- -mno-jmpext
- فعال یا غیرفعال کردن تولید دستورالعملهای پرش شرطی اضافی. برای CPU v2 و بالاتر فعال است.
- -mjmp32
- -mno-jmp32
- فعال یا غیرفعال کردن تولید دستورالعملهای پرش ۳۲ بیتی. برای CPU v3 و بالاتر فعال است.
- -malu32
- -mno-alu32
- فعال یا غیرفعال کردن تولید دستورالعملهای ALU ۳۲ بیتی. برای CPU v3 و بالاتر فعال است.
- -mv3-atomics
- -mno-v3-atomics
- فعال یا غیرفعال کردن دستورالعملهای مربوط به عملیات اتمیک عمومی معرفیشده در CPU v3. برای CPU v3 و بالاتر فعال است.
- -mbswap
- -mno-bswap
- فعال یا غیرفعال کردن دستورالعملهای جابهجایی بایت (byte swap). برای CPU v4 و بالاتر فعال است.
- -msdiv
- -mno-sdiv
- فعال یا غیرفعال کردن دستورالعملهای تقسیم علامتدار و باقیمانده (modulus). برای CPU v4 و بالاتر فعال است.
- -msmov
- -mno-smov
- فعال یا غیرفعال کردن دستورالعملهای انتقال با بسط علامت و بارگذاری حافظه. برای CPU v4 و بالاتر فعال است.
- -mcpu=version
- مشخص
میکند که
کدام نسخه
از ISA متعلق
به eBPF هدف
قرار گیرد.
ممکن است
نسخههای
جدیدتر
توسط همه
هستهها
پشتیبانی
نشوند.
مقدار
پیشفرض v4
است.
مقادیر پشتیبانیشده برای version عبارتند از:
- v1
- نخستین ISA پایدار eBPF بدون قابلیتها یا افزونههای ویژه.
- v2
- پشتیبانی از افزونههای پرش، همانند -mjmpext.
- v3
- تمامی قابلیتهای v2، بهعلاوه:
- -<عملیاتهای پرش ۳۲ بیتی، مانند -mjmp32>
- -<عملیاتهای ALU ۳۲ بیتی، مانند -malu32>
- -<عملیاتهای اتمیک عمومی، مانند -mv3-atomics>
- v4
- تمامی قابلیتهای v3، بهعلاوه:
- -<دستورالعملهای جابهجایی بایت، مانند -mbswap>
- -<دستورالعملهای تقسیم علامتدار و باقیمانده، مانند -msdiv>
- -<دستورالعملهای انتقال با بسط علامت و بارگذاری حافظه، مانند -msmov>
- -mco-re
- فعال کردن پشتیبانی از BPF Compile Once - Run Everywhere (CO-RE). به -gbtf نیاز دارد و توسط آن بهطور ضمنی فعال میشود.
- -mno-co-re
- غیرفعال کردن پشتیبانی از BPF Compile Once - Run Everywhere (CO-RE). هنگام تولید اطلاعات اشکالزدایی BTF برای هدف BPF، پشتیبانی از BPF CO-RE بهطور پیشفرض فعال است.
- -mxbpf
- تولید کد برای نسخه گسترشیافتهای از BPF که برخی از محدودیتهای تحمیلشده توسط معماری BPF را کاهش میدهد:
- -<ذخیره و بازیابی ثباتهای callee-saved بهترتیب در ورود به تابع و>
- خروج از آن.
- -masm=dialect
- دستورالعملهای
اسمبلی را
با استفاده
از dialect (گویش)
انتخابشده
eBPF در خروجی
قرار
میدهد.
پیشفرض pseudoc
است.
مقادیر پشتیبانیشده برای dialect عبارتند از:
- -minline-memops-threshold=bytes
- آستانه اندازهای را بر حسب بایت تعیین میکند که در آن یا کمتر از آن، memmove، memcpy و memset همواره باید بهصورت درونخطی (inline) بسط داده شوند. عملیاتهایی با اندازههای بزرگتر از این آستانه باید بهجای بسط درونخطی با استفاده از یک فراخوانی کتابخانهای پیادهسازی شوند، اما از آنجا که BPF اجازه libcallها را نمیدهد، فراتر رفتن از این آستانه منجر به خطای زمان کامپایل میشود. مقدار پیشفرض 1024 بایت است..PP گزینههای FR30
این گزینهها بهطور خاص برای پورت FR30 تعریف شدهاند.
- -msmall-model
- استفاده از مدل فضای آدرسدهی کوچک. این گزینه میتواند کد کوچکتری تولید کند، اما فرض میکند که تمامی مقادیر و نشانیهای نمادین در یک محدودهٔ ۲۰ بیتی جای میگیرند.
- -mno-lsim
- فرض را بر این میگذارد که پشتیبانی زمان اجرا فراهم شده است و بنابراین نیازی به گنجاندن کتابخانهٔ شبیهساز (libsim.a) در خط فرمان پیونددهنده نیست.
گزینههای FT32
این گزینهها بهطور خاص برای پورت FT32 تعریف شدهاند.
- -msim
- مشخص میکند که برنامه روی شبیهساز اجرا خواهد شد. این امر موجب پیوند خوردن یک راهانداز زمان اجرا و کتابخانهٔ جایگزین میشود. هنگام تولید برنامههایی که روی سختافزار واقعی اجرا میشوند نباید از این گزینه استفاده کنید؛ باید کتابخانهٔ زمان اجرای خود را برای هر تابع ورودی/خروجی (I/O) مورد نیاز فراهم کنید.
- -mlra
- هیچ کاری انجام نمیدهد. برای سازگاری با نسخههای پیشین حفظ شده است.
- -mnodiv
- از دستورالعملهای div و mod استفاده نشود.
- -mft32b
- فعالسازی استفاده از دستورالعملهای گسترشیافتهٔ پردازندهٔ FT32B.
- -mcompress
- فشردهسازی تمام کدها با استفاده از طرح فشردهسازی کد FT32B.
- -mnopm
- کدی که حافظهٔ برنامه را میخواند تولید نشود.
گزینههای FRV
- -mgpr-32
- تنها از ۳۲ ثبات عمومی نخست استفاده شود.
- -mgpr-64
- استفاده از تمام ۶۴ ثبات عمومی.
- -mfpr-32
- تنها از ۳۲ ثبات ممیز شناور نخست استفاده شود.
- -mfpr-64
- استفاده از تمام ۶۴ ثبات ممیز شناور.
- -mhard-float
- استفاده از دستورالعملهای سختافزاری برای عملیات ممیز شناور.
- -msoft-float
- استفاده از توابع کتابخانهای برای عملیات ممیز شناور.
- -malloc-cc
- تخصیص پویای ثباتهای کد شرط.
- -mfixed-cc
- ثباتهای کد شرط بهصورت پویا تخصیص داده نشوند؛ تنها از "icc0" و "fcc0" استفاده شود.
- -mdword
- تغییر ABI برای استفاده از دستورالعملهای کلمه دوگانه (double word).
- -mno-dword
- از دستورالعملهای کلمه دوگانه استفاده نشود.
- -mdouble
- استفاده از دستورالعملهای ممیز شناور با دقت مضاعف (double).
- -mno-double
- از دستورالعملهای ممیز شناور با دقت مضاعف استفاده نشود.
- -mmedia
- استفاده از دستورالعملهای چندرسانهای (media).
- -mno-media
- از دستورالعملهای چندرسانهای استفاده نشود.
- -mmuladd
- استفاده از دستورالعملهای ضرب و جمع/تفریق.
- -mno-muladd
- از دستورالعملهای ضرب و جمع/تفریق استفاده نشود.
- -mfdpic
- انتخاب FDPIC ABI که از توصیفگرهای تابع برای نمایش اشارهگرها به توابع استفاده میکند. بدون هیچیک از گزینههای مرتبط با PIC/PIE، این گزینه متضمن -fPIE است. همراه با -fpic یا -fpie، فرض میکند که مدخلهای GOT و دادههای کوچک در یک محدودهٔ ۱۲ بیتی از نشانی پایهٔ GOT قرار دارند؛ همراه با -fPIC یا -fPIE، آفستهای GOT بهصورت ۳۲ بیتی محاسبه میشوند. در هدف bfin-elf، این گزینه متضمن -msim است.
- -minline-plt
- فعالسازی درونیسازی (inlining) مدخلهای PLT در فراخوانی توابعی که مشخص نیست بهصورت محلی پیوند میخورند. این گزینه بدون -mfdpic هیچ تأثیری ندارد. در صورت بهینهسازی برای سرعت و کامپایل برای کتابخانههای اشتراکی (یعنی -fPIC یا -fpic)، یا هنگامی که گزینهٔ بهینهسازی مانند -O3 یا بالاتر در خط فرمان مشخص شده باشد، بهطور پیشفرض فعال است.
- -mTLS
- هنگام تولید کد محلی رشته (thread-local)، قطعهٔ بزرگ TLS فرض شود.
- -mtls
- هنگام تولید کد محلی رشته، قطعهٔ بزرگ TLS فرض نشود.
- -mgprel-ro
- فعالسازی استفاده از بازنشانیهای "GPREL" در FDPIC ABI برای دادههایی که مشخصاً در بخشهای فقطخواندنی قرار دارند. این گزینه بهطور پیشفرض فعال است، به جز برای -fpic یا -fpie: حتی با اینکه ممکن است به کوچکتر شدن جدول آفست سراسری کمک کند، ۱ دستورالعمل را با ۴ دستورالعمل معاوضه میکند. همراه با -fPIC یا -fPIE، این گزینه ۳ دستورالعمل را با ۴ دستورالعمل معاوضه میکند که یکی از آنها ممکن است بین چندین نماد به اشتراک گذاشته شود، و از نیاز به مدخل GOT برای نماد ارجاعشده جلوگیری میکند؛ بنابراین به احتمال زیاد یک مزیت خواهد بود. در غیر این صورت، میتوان از -mno-gprel-ro برای غیرفعال کردن آن استفاده کرد.
- -multilib-library-pic
- پیوند با کتابخانههای pic (کتابخانهای، نه FD). این گزینه توسط -mlibrary-pic و همچنین توسط -fPIC و -fpic بدون -mfdpic بهطور ضمنی اعمال میشود. هرگز نباید نیازی به استفادهٔ صریح از آن داشته باشید.
- -mlinked-fp
- پیروی از الزامات EABI مبنی بر ایجاد همیشگی یک اشارهگر فریم هر زمان که یک فریم پشته تخصیص داده میشود. این گزینه بهطور پیشفرض فعال است و میتوان با -mno-linked-fp آن را غیرفعال کرد.
- -mlong-calls
- استفاده از آدرسدهی غیرمستقیم برای فراخوانی توابع خارج از واحد ترجمهٔ کنونی. این گزینه اجازه میدهد توابع در هر نقطهای از فضای آدرسدهی ۳۲ بیتی قرار گیرند.
- -malign-labels
- تلاش برای تراز کردن برچسبها با یک مرز ۸ بایتی از طریق درج NOPها در بستهٔ پیشین. این گزینه تنها زمانی تأثیر دارد که بستهبندی VLIW فعال باشد. بستههای جدیدی ایجاد نمیکند؛ صرفاً NOPها را به بستههای موجود اضافه میکند.
- -mlibrary-pic
- تولید کد مستقل از موقعیت بر پایهٔ EABI.
- -macc-4
- تنها از چهار ثبات نخست انباشتگر چندرسانهای استفاده شود.
- -macc-8
- استفاده از تمامی هشت ثبات انباشتگر چندرسانهای.
- -mpack
- بستهبندی دستورالعملهای VLIW.
- -mno-pack
- دستورالعملهای VLIW بستهبندی نشوند.
- -mno-eflags
- سوئیچهای ABI در e_flags علامتگذاری نشوند.
- -mcond-move
- فعالسازی
استفاده از
دستورالعملهای
انتقال
شرطی
(پیشفرض).
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mno-cond-move
- غیرفعالسازی
استفاده از
دستورالعملهای
انتقال
شرطی.
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد.
- -mscc
- فعالسازی
استفاده از
دستورالعملهای
مقداردهی
شرطی
(پیشفرض).
این سوئیچ عمدتاً برای اشکالزدایی کامپایلر است و احتمالاً در نسخههای آینده حذف خواهد شد..IP -mno-scc 4 غیرفعال کردن استفاده از دستورالعملهای مقداردهی شرطی (conditional 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 و simple.
گزینههای GNU/Linux
این گزینههای -m برای مقصدهای GNU/Linux تعریف شدهاند:
- -mglibc
- استفاده از کتابخانه سی گنو (GNU C library). این مقدار پیشفرض است مگر در مقصدهای *-*-linux-*uclibc*، *-*-linux-*musl* و *-*-linux-*android*.
- -muclibc
- استفاده از کتابخانه سی uClibc. این گزینه در مقصدهای *-*-linux-*uclibc* پیشفرض است.
- -mmusl
- استفاده از کتابخانه سی musl. این گزینه در مقصدهای *-*-linux-*musl* پیشفرض است.
- -mbionic
- استفاده از کتابخانه سی Bionic. این گزینه در مقصدهای *-*-linux-*android* پیشفرض است.
- -mandroid
- کامپایل کد
سازگار با
پلتفرم Android.
این گزینه
در مقصدهای
*-*-linux-*android*
پیشفرض
است.
هنگام کامپایل، این گزینه بهطور پیشفرض -mbionic، -fPIC، -fno-exceptions و -fno-rtti را فعال میکند. هنگام پیوند، این گزینه باعث میشود راهانداز GCC گزینههای مخصوص Android را به پیونددهنده ارسال کند. در نهایت، این گزینه باعث میشود ماکروی پیشپردازندهٔ "__ANDROID__" تعریف شود.
- -tno-android-cc
- غیرفعال کردن اثرات کامپایل -mandroid؛ یعنی عدم فعالسازی پیشفرض -mbionic، -fPIC، -fno-exceptions و -fno-rtti.
- -tno-android-ld
- غیرفعال کردن اثرات پیوند -mandroid؛ یعنی ارسال گزینههای پیوند استاندارد لینوکس به پیونددهنده.
گزینههای H8/300
این گزینههای -m برای پیادهسازیهای H8/300 تعریف شدهاند:
- -mrelax
- کوتاهتر کردن برخی از ارجاعات آدرس در زمان پیوند در صورت امکان؛ از گزینهٔ پیونددهندهٔ -relax استفاده میکند.
- -mh
- تولید کد برای H8/300H.
- -ms
- تولید کد برای H8S.
- -mn
- تولید کد برای H8S و H8/300H در حالت عادی (normal mode). این سوییچ باید همراه با -mh یا -ms استفاده شود.
- -ms2600
- تولید کد برای H8S/2600. این سوییچ باید همراه با -ms استفاده شود.
- -mexr
- ثباتهای گسترشیافته پیش از اجرای تابعی با صفت monitor روی پشته ذخیره میشوند. گزینهٔ پیشفرض -mexr است. این گزینه فقط برای مقصدهای H8S معتبر است.
- -mno-exr
- ثباتهای گسترشیافته پیش از اجرای تابعی با صفت monitor روی پشته ذخیره نمیشوند. گزینهٔ پیشفرض -mno-exr است. این گزینه فقط برای مقصدهای H8S معتبر است.
- -mint32
- تنظیم پیشفرض دادههای "int" روی ۳۲ بیت.
- -malign-300
- روی H8/300H و H8S، از همان قواعد ترازسازی مربوط به H8/300 استفاده میکند. پیشفرض برای H8/300H و H8S تراز کردن longها و floatها روی مرزهای ۴ بایتی است. -malign-300 باعث میشود آنها روی مرزهای ۲ بایتی تراز شوند. این گزینه تأثیری روی H8/300 ندارد.
گزینههای HPPA
این گزینههای -m برای خانوادهٔ رایانههای HPPA تعریف شدهاند:
- -march=architecture-type
- تولید کد برای معماری مشخصشده. انتخابها برای architecture-type عبارتند از 1.0 برای پردازندههای PA 1.0، مقدار 1.1 برای PA 1.1، و 2.0 برای پردازندههای PA 2.0. برای تعیین گزینهٔ معماری مناسب برای ماشین خود، به /usr/lib/sched.models در یک سیستم HP-UX مراجعه کنید. کدی که برای معماریهای با شماره پایینتر کامپایل شده است روی معماریهای با شماره بالاتر اجرا میشود، اما عکس آن ممکن نیست.
- -mpa-risc-1-0
- -mpa-risc-1-1
- -mpa-risc-2-0
- بهترتیب مترادفهایی برای -march=1.0، -march=1.1 و -march=2.0.
- -matomic-libcalls
- تولید
فراخوانیهای
کتابخانهای
(libcalls) برای
بارگذاریها
و
ذخیرهسازیهای
اتمیک در
صورت
غیرفعال
بودن
فراخوانیهای
همگامسازی
(sync). این گزینه
بهطور
پیشفرض
فعال است.
این گزینه
تنها بر
تولید
فراخوانیهای
کتابخانهای
اتمیک توسط
بکاند HPPA
تأثیر
میگذارد.
هر دو پیادهسازی فراخوانی کتابخانهای sync و libatomic از قفلگذاری استفاده میکنند. در نتیجه، ذخیرهسازیهای پردازنده نسبت به سایر عملیات اتمیک، اتمیک نیستند. بارگذاریهای پردازنده تا اندازهٔ DImode نسبت به سایر عملیات اتمیک، به شرطی که بهصورت یک دسترسی واحد پیادهسازی شوند، اتمیک هستند.
معماری PA-RISC در سختافزار از هیچ عملیات اتمیکی به جز دستورالعمل "ldcw" پشتیبانی نمیکند. از این رو، تمام پشتیبانی اتمیک با استفاده از فراخوانیهای کتابخانهای sync و atomic پیادهسازی میشود. پشتیبانی فراخوانی کتابخانهای sync در libgcc.a قرار دارد. پشتیبانی فراخوانی کتابخانهای atomic در libatomic قرار دارد.
این گزینه فراخوانیهای "__atomic_exchange" را برای ذخیرهسازیهای اتمیک تولید میکند. همچنین مدیریت ویژهای برای دسترسیهای اتمیک DImode روی مقصدهای ۳۲ بیتی ارائه میدهد..IP -mbig-switch 4 هیچ کاری انجام نمیدهد. برای سازگاری با نسخههای پیشین حفظ شده است.
- -mcaller-copies
- فراخواننده، آرگومانهای تابعی را که با ارجاع پنهان ارسال شدهاند کپی میکند. این گزینه باید با احتیاط استفاده شود چرا که با محیط زمان اجرای ۳۲-بیتی پیشفرض سازگار نیست. با این حال، تنها ساختارهای دادهای بزرگتر از هشت بایت از طریق ارجاع پنهان ارسال میشوند و این گزینه سازگاری بهتری با OpenMP فراهم میکند.
- -mcoherent-ldcw
- از راهنمای کنترل حافظهٔ نهان منسجم ldcw/ldcd استفاده میکند.
- -mdisable-fpregs
- رجیسترهای ممیز شناور را غیرفعال میکند. معادل "-msoft-float" است.
- -mdisable-indexing
- از استفادهٔ کامپایلر از حالتهای آدرسدهی نمایهسازی جلوگیری میکند. این کار مانع از بروز برخی مشکلات مبهم در هنگام کامپایل کدهای تولیدشده توسط MIG تحت MACH میشود.
- -mfast-indirect-calls
- کدی تولید
میکند که
فرض
میگیرد
فراخوانیها
هرگز از
مرزهای فضا
عبور
نمیکنند.
این به GCC
اجازه
میدهد کدی
تولید کند
که
فراخوانیهای
غیرمستقیم
را با سرعت
بیشتری
انجام دهد.
این گزینه در حضور کتابخانههای اشتراکی یا توابع تودرتو کار نمیکند.
- -mfixed-range=register-range
- کدی تولید میکند که بازهٔ رجیسترهای مشخصشده را به عنوان رجیسترهای ثابت در نظر میگیرد. یک رجیستر ثابت رجیستری است که تخصیصدهندهٔ رجیستر نمیتواند از آن استفاده کند. این قابلیت هنگام کامپایل کدهای هسته کاربردی است. یک بازهٔ رجیستر بهصورت دو رجیستر که با یک خط تیره از هم جدا شدهاند مشخص میشود. میتوان چندین بازهٔ رجیستر را با کاما از یکدیگر جدا و مشخص کرد.
- -mgas
- استفاده از دستورالعملهای اسمبلری را که فقط GAS متوجه آنها میشود، فعال میکند.
- -mgnu-ld
- از گزینههای مخصوص به GNU ld استفاده میکند. این کار هنگام ساخت یک کتابخانهٔ اشتراکی، -shared را به ld ارسال میکند. این حالت پیشفرض است زمانی که GCC بهطور صریح یا ضمنی با پیونددهندهٔ GNU پیکربندی شده باشد. این گزینه بر اینکه کدام ld فراخوانی شود تأثیری ندارد؛ بلکه تنها پارامترهایی را که به آن ld ارسال میشوند تغییر میدهد. پیونددهندهٔ ld فراخوانیشده توسط گزینهٔ پیکربندی --with-ld، مسیر جستجوی برنامههای GCC و در نهایت PATH کاربر تعیین میشود. پیونددهندهٔ مورداستفادهٔ GCC را میتوان با استفاده از which `gcc -print-prog-name=ld` چاپ کرد. این گزینه تنها در GCC ۶۴-بیتی HP-UX در دسترس است، یعنی نسخهای که با hppa*64*-*-hpux* پیکربندی شده باشد.
- -mhp-ld
- از گزینههای مخصوص به HP ld استفاده میکند. این کار هنگام ساخت یک کتابخانهٔ اشتراکی -b را به ld ارسال کرده و در تمامی پیوندها +Accept TypeMismatch را به ld میفرستد. این حالت پیشفرض است زمانی که GCC بهطور صریح یا ضمنی با پیونددهندهٔ HP پیکربندی شده باشد. این گزینه بر اینکه کدام ld فراخوانی شود تأثیری ندارد؛ بلکه تنها پارامترهایی را که به آن ld ارسال میشوند تغییر میدهد. پیونددهندهٔ ld فراخوانیشده توسط گزینهٔ پیکربندی --with-ld، مسیر جستجوی برنامههای GCC و در نهایت PATH کاربر تعیین میشود. پیونددهندهٔ استفادهشده توسط GCC را میتوان با دستور which `gcc -print-prog-name=ld` چاپ کرد. این گزینه تنها در GCC ۶۴-بیتی HP-UX در دسترس است، یعنی نسخهای که با hppa*64*-*-hpux* پیکربندی شده باشد.
- -mlinker-opt
- گذر بهینهسازی را در پیونددهندهٔ HP-UX فعال میکند. توجه داشته باشید که این کار اشکالزدایی نمادین را غیرممکن میسازد.
- -mlong-calls
- کدی تولید
میکند که
از
توالیهای
فراخوانی
طولانی
استفاده
میکند. این
کار تضمین
میکند که
یک
فراخوانی
همواره
قادر است به
خردکدهای
تولیدشده
توسط
پیونددهنده
دسترسی
پیدا کند.
پیشفرض
این است که
فراخوانیهای
طولانی
تنها زمانی
تولید شوند
که فاصلهٔ
محل
فراخوانی
تا آغاز
تابع یا
واحد ترجمه
(بسته به
مورد)، از
محدودیت از
پیش
تعریفشده
توسط نوع
شاخهبندی
مورداستفاده
فراتر رود.
این
محدودیتها
برای
فراخوانیهای
عادی به
ترتیب
۷٬۶۰۰٬۰۰۰
و ۲۴۰٬۰۰۰
بایت برای
معماریهای
PA 2.0 و PA 1.X است.
محدودیت
فراخوانیهای
همسطح (Sibcalls)
همواره روی
۲۴۰٬۰۰۰
بایت تنظیم
است.
هنگام استفاده از گزینهٔ -ffunction-sections، یا هنگام استفادهٔ همزمان از گزینههای -mgas و -mno-portable-runtime تحت HP-UX به همراه پیونددهندهٔ SOM، فاصلهها از ابتدای توابع سنجیده میشوند.
معمولاً استفاده از این گزینه مطلوب نیست چرا که کارایی را کاهش میدهد. با این حال، ممکن است در برنامههای بزرگ، بهویژه زمانی که از پیوند جزئی برای ساخت برنامه استفاده میشود، سودمند باشد.
انواع فراخوانیهای طولانی مورداستفاده به قابلیتهای اسمبلر و پیونددهنده و نوع کد در حال تولید بستگی دارد. تأثیر این مورد روی سیستمهایی که از فراخوانیهای مطلق طولانی و فراخوانیهای طولانی تفاوت نماد pic یا فراخوانیهای وابسته به pc پشتیبانی میکنند، باید نسبتاً اندک باشد. با این وجود، در سیستمهای ۳۲-بیتی ELF در کدهای pic از فراخوانی غیرمستقیم استفاده میشود که بسیار طولانی است.
- -mlong-load-store
- توالیهای بارگذاری و ذخیرهسازی ۳-دستوری را، همانگونه که گاهی توسط پیونددهندهٔ HP-UX 10 الزامی است، تولید میکند. این گزینه معادل گزینهٔ +k در کامپایلرهای HP است.
- -mjump-in-delay
- این گزینه نادیده گرفته میشود و صرفاً برای اهداف سازگاری ارائه شده است.
- -mno-space-regs
- کدی تولید
میکند که
فرض میکند
هدف فاقد
رجیسترهای
فضا است.
این موضوع
به GCC امکان
میدهد
فراخوانیهای
غیرمستقیم
سریعتری
تولید کرده
و از
حالتهای
آدرسدهی
نمایهای
مقیاسبندینشده
استفاده
کند.
چنین کدی برای هستهها و سیستمهای PA سطح ۰ مناسب است.
- -mordered
- فرض میکند ارجاعات حافظه مرتب هستند و نیازی به موانع حافظه نیست.
- -mportable-runtime
- از قراردادهای فراخوانی سازگار ارائهشده توسط HP برای سیستمهای ELF استفاده میکند.
- -mschedule=cpu-type
- کد را بر اساس محدودیتهای نوع ماشین cpu-type زمانبندی میکند. گزینههای انتخابی برای cpu-type عبارتاند از: 700، 7100، 7100LC، 7200، 7300 و 8000. برای تعیین گزینهٔ زمانبندی مناسب برای دستگاه خود، به /usr/lib/sched.models در سیستم HP-UX مراجعه کنید. زمانبندی پیشفرض 8000 است.
- -msio
- پیشتعریف "_SIO" را برای ورودی/خروجی سرور تولید میکند. پیشفرض -mwsio است. این پیشفرض، پیشتعریفهای "__hp9000s700"، "__hp9000s700__" و "_WSIO" را برای ورودی/خروجی ایستگاههای کاری ایجاد میکند. این گزینهها تحت HP-UX و HI-UX در دسترس هستند.
- -msoft-float
- خروجیای
تولید
میکند که
شامل
فراخوانیهای
کتابخانهای
برای
محاسبات
ممیز شناور
است. هشدار:
کتابخانههای
مورد نیاز
برای تمام
اهداف HPPA در
دسترس
نیستند.
بهطور
معمول از
امکانات
کامپایلر C
عادی سیستم
استفاده
میشود،
اما این کار
را
نمیتوان
مستقیماً
در کامپایل
متقاطع
انجام داد.
شما باید
تمهیدات
لازم را
برای
ارائهٔ
توابع
کتابخانهای
مناسب جهت
کامپایل
متقاطع
فراهم کنید.
گزینهٔ -msoft-float قراردادهای فراخوانی را در فایل خروجی تغییر میدهد؛ بنابراین تنها زمانی مفید است که تمامی یک برنامه را با این گزینه کامپایل کنید. بهویژه، لازم است کتابخانهٔ libgcc.a که همراه GCC ارائه میشود را با -msoft-float کامپایل کنید تا این قابلیت کار کند.
- -msoft-mult
- از ضرب عدد
صحیح
نرمافزاری
استفاده
میکند.
این گزینه استفاده از دستورالعمل "xmpyu" را غیرفعال میکند.
- -munix=unix-std
- پیشتعریفهای
کامپایلر
را تولید
کرده و یک
فایل
آغازین
برای
استاندارد
UNIX مشخصشده
انتخاب
میکند.
انتخابهای
موجود برای
unix-std
عبارتاند
از 93، 95 و 98.
گزینهٔ 93
در تمام
نسخههای HP-UX
پشتیبانی
میشود. 95
در HP-UX 10.10 و پس از
آن در دسترس
است. 98 در HP-UX 11.11 و
پس از آن
موجود است.
مقادیر
پیشفرض
شامل 93
برای HP-UX 10.00،
مقدار 95
برای HP-UX 10.10 تا
11.00، و 98 برای HP-UX
11.11 و پس از آن
است.
گزینهٔ -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 اثرگذار است. از این رو، در استفاده از این گزینه احتیاط بسیار زیادی لازم است.
کد کتابخانهای که قصد دارد با بیش از یک استاندارد UNIX سازگار باشد، باید متغیر "__xpg4_extended_mask" را بر حسب لزوم بررسی، مقداردهی و بازیابی کند. بیشتر نرمافزارهای GNU چنین قابلیتی را فراهم نمیکنند.
- -nolibdld
- هنگامی که گزینهٔ -static در HP-UX 10 و پس از آن مشخص شده باشد، از تولید گزینههای پیوندی که به دنبال libdld.sl میگردند جلوگیری میکند.
- -static
- پیادهسازی
setlocale در libc تحت HP-UX
به libdld.sl
وابستگی
دارد. هیچ
نسخهٔ
آرشیوی
(ایستا) از libdld.sl
وجود ندارد.
بنابراین،
هنگامی که
گزینهٔ -static
مشخص
میشود، به
گزینههای
پیوند خاصی
برای رفع
این
وابستگی
نیاز است.
در HP-UX 10 و پس از آن، درایور GCC در صورت تعیین گزینهٔ -static، گزینههای لازم برای پیوند با libdld.sl را اضافه میکند. این امر موجب میشود فایل باینری حاصل، پویا شود. در پورت ۶۴-بیتی، پیونددهندهها در هر حال بهطور پیشفرض باینریهای پویا تولید میکنند. از گزینهٔ -nolibdld میتوان برای جلوگیری از افزودن این گزینههای پیوند توسط درایور GCC استفاده کرد..IP -threads 4 افزودن پشتیبانی از چندنخی با کتابخانهٔ dce thread تحت HP-UX. این گزینه پرچمهایی را هم برای پیشپردازنده و هم برای پیونددهنده تنظیم میکند.
گزینههای IA-64
اینها گزینههای -m هستند که برای معماری Intel IA-64 تعریف شدهاند.
- -mbig-endian
- تولید کد برای یک هدف big-endian. این حالت پیشفرض برای HP-UX است.
- -mlittle-endian
- تولید کد برای یک هدف little-endian. این حالت پیشفرض برای AIX5 و GNU/Linux است.
- -mgnu-as
- -mno-gnu-as
- تولید (یا عدم تولید) کد برای اسمبلر GNU. این حالت پیشفرض است.
- -mgnu-ld
- -mno-gnu-ld
- تولید (یا عدم تولید) کد برای پیونددهندهٔ GNU. این حالت پیشفرض است.
- -mno-pic
- تولید کدی که از ثبات global pointer استفاده نمیکند. نتیجه، کد مستقل از موقعیت نبوده و با IA-64 ABI مغایرت دارد.
- -mvolatile-asm-stop
- -mno-volatile-asm-stop
- تولید (یا عدم تولید) یک stop bit بلافاصله قبل و بعد از عبارتهای volatile asm.
- -mregister-names
- -mno-register-names
- تولید (یا عدم تولید) نامهای ثبات in، loc و out برای ثباتهای پشتهای (stacked registers). این ممکن است خروجی اسمبلر را خواناتر کند.
- -mno-sdata
- -msdata
- غیرفعالسازی (یا فعالسازی) بهینهسازیهایی که از بخش دادهٔ کوچک (small data section) استفاده میکنند. این ممکن است برای دور زدن باگهای بهینهساز مفید باشد.
- -mconstant-gp
- تولید کدی که از یک مقدار ثابت تکی برای global pointer استفاده میکند. این گزینه هنگام کامپایل کردن کد کرنل مفید است.
- -mauto-pic
- تولید کدی که خودجابجاپذیر (self-relocatable) باشد. این گزینه مستلزم -mconstant-gp است. این مورد هنگام کامپایل کردن کد سفتافزار (firmware) مفید است.
- -minline-float-divide-min-latency
- تولید کد برای تقسیمهای درونخطی (inline) مقادیر ممیز شناور با استفاده از الگوریتم با حداقل تاخیر.
- -minline-float-divide-max-throughput
- تولید کد برای تقسیمهای درونخطی مقادیر ممیز شناور با استفاده از الگوریتم با حداکثر توان عملیاتی.
- -mno-inline-float-divide
- برای تقسیمهای مقادیر ممیز شناور کد درونخطی تولید نکن.
- -minline-int-divide-min-latency
- تولید کد برای تقسیمهای درونخطی مقادیر عدد صحیح با استفاده از الگوریتم با حداقل تاخیر.
- -minline-int-divide-max-throughput
- تولید کد برای تقسیمهای درونخطی مقادیر عدد صحیح با استفاده از الگوریتم با حداکثر توان عملیاتی.
- -mno-inline-int-divide
- برای تقسیمهای مقادیر عدد صحیح کد درونخطی تولید نکن.
- -minline-sqrt-min-latency
- تولید کد برای جذرهای درونخطی با استفاده از الگوریتم با حداقل تاخیر.
- -minline-sqrt-max-throughput
- تولید کد برای جذرهای درونخطی با استفاده از الگوریتم با حداکثر توان عملیاتی.
- -mno-inline-sqrt
- برای "sqrt" کد درونخطی تولید نکن.
- -mfused-madd
- -mno-fused-madd
- تولید (یا عدم تولید) کدی که از دستورالعملهای ضرب/جمع یا ضرب/تفریق ادغامشده (fused) استفاده میکند. حالت پیشفرض، استفاده از این دستورالعملها است.
- -mno-dwarf2-asm
- -mdwarf2-asm
- عدم تولید (یا تولید) کد اسمبلر برای اطلاعات دیباگ شماره خط DWARF. این گزینه ممکن است هنگام عدم استفاده از اسمبلر GNU مفید باشد.
- -mearly-stop-bits
- -mno-early-stop-bits
- اجازه میدهد stop bitها زودتر از محل بلافاصله قبل از دستورالعملی که stop bit را فعال کرده است، قرار گیرند. این کار میتواند زمانبندی دستورالعمل را بهبود بخشد، اما همواره چنین نیست.
- -mfixed-range=register-range
- تولید کدی که با محدودهٔ ثبات دادهشده به عنوان ثباتهای ثابت برخورد میکند. ثبات ثابت ثباتی است که تخصیصدهندهٔ ثبات نمیتواند از آن استفاده کند. این هنگام کامپایل کردن کد کرنل مفید است. محدودهٔ ثبات به صورت دو ثبات که با یک خط تیره جدا شدهاند تعیین میشود. چندین محدودهٔ ثبات را میتوان به صورت جداشده با کاما تعیین کرد.
- -mtls-size=tls-size
- تعیین اندازهٔ بیت آفستهای بیواسطهٔ (immediate) TLS. مقادیر معتبر عبارتند از 14، 22 و 64.
- -mtune=cpu-type
- تنظیم دقیق زمانبندی دستورالعمل برای یک پردازندهٔ خاص. مقادیر معتبر عبارتند از itanium، itanium1، merced، itanium2 و mckinley.
- -milp32
- -mlp64
- تولید کد برای یک محیط ۳۲بیتی یا ۶۴بیتی. محیط ۳۲بیتی int، long و pointer را روی ۳۲ بیت تنظیم میکند. محیط ۶۴بیتی int را روی ۳۲ بیت و long و pointer را روی ۶۴ بیت تنظیم میکند. اینها پرچمهای مختص HP-UX هستند.
- -mno-sched-br-data-spec
- -msched-br-data-spec
- (غیرفعال/فعالسازی) زمانبندی حدسی دادهها پیش از reload. این منجر به تولید دستورالعملهای "ld.a" و دستورالعملهای بررسی متناظر ("ld.c" / "chk.a") میشود. تنظیم پیشفرض، غیرفعال است.
- -msched-ar-data-spec
- -mno-sched-ar-data-spec
- (فعال/غیرفعالسازی) زمانبندی حدسی دادهها پس از reload. این منجر به تولید دستورالعملهای "ld.a" و دستورالعملهای بررسی متناظر ("ld.c" / "chk.a") میشود. تنظیم پیشفرض، فعال است.
- -mno-sched-control-spec
- -msched-control-spec
- (غیرفعال/فعالسازی) زمانبندی حدسی کنترلی. این ویژگی تنها در طول زمانبندی ناحیهای (یعنی پیش از reload) در دسترس است. این منجر به تولید دستورالعملهای "ld.s" و دستورالعملهای بررسی متناظر "chk.s" میشود. تنظیم پیشفرض، غیرفعال است..IP -msched-br-in-data-spec 4
- -mno-sched-br-in-data-spec
- فعال/غیرفعال کردن زمانبندی حدسی دستورالعملهایی که قبل از reload به بارگذاریهای حدسی داده (data speculative loads) وابسته هستند. این گزینه تنها در صورت فعال بودن -msched-br-data-spec مؤثر است. مقدار پیشفرض، فعال است.
- -msched-ar-in-data-spec
- -mno-sched-ar-in-data-spec
- فعال/غیرفعال کردن زمانبندی حدسی دستورالعملهایی که پس از reload به بارگذاریهای حدسی داده وابسته هستند. این گزینه تنها در صورت فعال بودن -msched-ar-data-spec مؤثر است. مقدار پیشفرض، فعال است.
- -msched-in-control-spec
- -mno-sched-in-control-spec
- فعال/غیرفعال کردن زمانبندی حدسی دستورالعملهایی که به بارگذاریهای حدسی کنترلی (control speculative loads) وابسته هستند. این گزینه تنها در صورت فعال بودن -msched-control-spec مؤثر است. مقدار پیشفرض، فعال است.
- -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
- در صورت فعال بودن، وابستگیهای حدسی در طول محاسبهٔ اولویت دستورالعملها در نظر گرفته میشوند. این کار استفاده از حدسزنی را کمی محافظهکارانهتر میکند. مقدار پیشفرض، غیرفعال است.
- -msched-spec-ldc
- استفاده از یک بررسی ساده برای حدس داده. این گزینه بهطور پیشفرض فعال است.
- -msched-control-spec-ldc
- استفاده از یک بررسی ساده برای حدس کنترلی. این گزینه بهطور پیشفرض فعال است.
- -msched-stop-bits-after-every-cycle
- قرار دادن یک بیت توقف (stop bit) پس از هر چرخه در هنگام زمانبندی. این گزینه بهطور پیشفرض فعال است.
- -msched-fp-mem-deps-zero-cost
- فرض میکند که بارگذاریها و ذخیرهسازیهای ممیز شناور در صورت قرارگیری در یک گروه دستورالعمل، احتمالاً باعث ایجاد تداخل نخواهند شد. این گزینه بهطور پیشفرض غیرفعال است.
- -msel-sched-dont-check-control-spec
- تولید بررسیها برای حدس کنترلی در زمانبندی انتخابی (selective scheduling). این پرچم بهطور پیشفرض غیرفعال است.
- -msched-max-memory-insns=max-insns
- محدود کردن تعداد دستورالعملهای حافظه در هر گروه دستورالعمل، با تخصیص اولویت پایینتر به دستورالعملهای حافظهٔ بعدی که تلاش میکنند در همان گروه دستورالعمل زمانبندی شوند. این گزینه اغلب برای جلوگیری از تداخل در بانکهای حافظهٔ نهان (cache bank conflicts) مفید است. مقدار پیشفرض ۱ است.
- -msched-max-memory-insns-hard-limit
- محدودیت مشخصشده توسط msched-max-memory-insns را به یک محدودیت سخت (hard limit) تبدیل میکند، بهطوری که وجود تعداد بیشتری از آن مقدار در یک گروه دستورالعمل غیرمجاز میشود. در غیر این صورت، محدودیت «نرم» (soft) است؛ بدین معنی که با رسیدن به حد نصاب، عملیاتهای غیر حافظهای ترجیح داده میشوند، اما همچنان ممکن است عملیاتهای حافظه زمانبندی شوند.
گزینههای LM32
این گزینههای -m برای معماری LatticeMico32 تعریف شدهاند:
- -mbarrel-shift-enabled
- فعالسازی دستورالعملهای barrel-shift (شیفت بشکهای).
- -mdivide-enabled
- فعالسازی دستورالعملهای تقسیم و باقیمانده (modulus).
- -mmultiply-enabled
- فعالسازی دستورالعملهای ضرب.
- -msign-extend-enabled
- فعالسازی دستورالعملهای بسط علامت (sign extend).
- -muser-enabled
- فعالسازی دستورالعملهای تعریفشده توسط کاربر.
گزینههای LoongArch
این گزینههای خط فرمان برای مقصدهای LoongArch تعریف شدهاند:
- -march=arch-type
- تولید
دستورالعملها
برای نوع
ماشین arch-type.
-march=arch-type به GCC
اجازه
میدهد کدی
تولید کند
که ممکن است
روی
پردازندههایی
غیر از
پردازندهٔ
مشخصشده
اصلاً اجرا
نشود.
گزینههای موجود برای arch-type عبارتند از:
- native
- نوع پردازندهٔ محلی شناساییشده توسط کامپایلر بومی.
- loongarch64
- پردازندهٔ ۶۴ بیتی عمومی LoongArch.
- la464
- پردازندهٔ مبتنی بر LoongArch LA464 به همراه LSX و LASX.
- la664
- پردازندهٔ مبتنی بر LoongArch LA664 به همراه LSX، LASX و تمام دستورالعملهای LoongArch v1.1.
- la64v1.0
- معماری مجموعه دستورالعمل LoongArch64 (ISA) نسخهٔ 1.0.
- la64v1.1
- معماری مجموعه دستورالعمل LoongArch64 (ISA) نسخهٔ 1.1.
اطلاعات بیشتر دربارهٔ نسخههای LoongArch ISA را میتوان در https://github.com/loongson/la-toolchain-conventions یافت.
- -mtune=tune-type
- بهینهسازی
کد
تولیدشده
برای
پردازندهٔ
مقصد
مشخصشده.
گزینههای موجود برای tune-type عبارتند از:
- native
- نوع پردازندهٔ محلی شناساییشده توسط کامپایلر بومی.
- generic
- پردازندهٔ عمومی LoongArch.
- loongarch64
- پردازندهٔ ۶۴ بیتی عمومی LoongArch.
- la464
- هستهٔ LoongArch LA464.
- la664
- هستهٔ LoongArch LA664.
- -mabi=base-abi-type
- تولید کد برای قرارداد فراخوانی (calling convention) مشخصشده. base-abi-type میتواند یکی از موارد زیر باشد:
- lp64d
- استفاده از ثباتهای ۶۴ بیتی عمومی و ثباتهای ۳۲/۶۴ بیتی ممیز شناور برای ارسال پارامترها. مدل داده LP64 است، که در آن int ۳۲ بیتی، و long int و اشارهگرها ۶۴ بیتی هستند..IP lp64f 4 برای ارسال پارامترها از ثباتهای همهمنظورهٔ ۶۴ بیتی و ثباتهای ممیز شناور ۳۲ بیتی استفاده میکند. مدل داده LP64 است، که در آن int برابر ۳۲ بیت و long int و اشارهگرها ۶۴ بیتی هستند.
- lp64s
- برای ارسال پارامترها از ثباتهای همهمنظورهٔ ۶۴ بیتی استفاده کرده و از ثباتهای ممیز شناور استفاده نمیکند. مدل داده LP64 است، که در آن int برابر ۳۲ بیت و long int و اشارهگرها ۶۴ بیتی هستند.
- -mfpu=fpu-type
- تولید کد برای نوع مشخصشدهٔ FPU، که میتواند یکی از موارد زیر باشد:
- 64
- اجازه دادن به استفاده از دستورالعملهای سختافزاری ممیز شناور برای عملیاتهای ۳۲ بیتی و ۶۴ بیتی.
- 32
- اجازه دادن به استفاده از دستورالعملهای سختافزاری ممیز شناور برای عملیاتهای ۳۲ بیتی.
- none
- 0
- جلوگیری از استفاده از دستورالعملهای سختافزاری ممیز شناور.
- -msimd=simd-type
- فعالسازی تولید دستورالعملهای SIMD برای LoongArch جهت برداریسازی و از طریق توابع توکار (builtin functions). این مقدار میتواند یکی از موارد زیر باشد:
- -msoft-float
- اجبار به -mfpu=none و جلوگیری از استفاده از ثباتهای ممیز شناور برای ارسال پارامترها. این گزینه ممکن است ABI هدف را تغییر دهد.
- -msingle-float
- اجبار به -mfpu=32 و مجاز دانستن استفاده از ثباتهای ممیز شناور ۳۲ بیتی برای ارسال پارامترها. این گزینه ممکن است ABI هدف را تغییر دهد.
- -mdouble-float
- اجبار به -mfpu=64 و مجاز دانستن استفاده از ثباتهای ممیز شناور ۳۲/۶۴ بیتی برای ارسال پارامترها. این گزینه ممکن است ABI هدف را تغییر دهد.
- -mlasx
- -mno-lasx
- -mlsx
- -mno-lsx
- محدودهٔ افزونههای SIMD (شامل none / LSX / LASX) را که توسط کامپایلر برای تولید کد قابل استفاده هستند، بهصورت تدریجی تنظیم میکند. فعالسازی LASX با mlasx بهطور خودکار LSX را فعال میکند، و غیرفعال کردن LSX با mno-lsx بهطور خودکار LASX را غیرفعال میسازد. این گزینههای مخصوص درایور بر روی وضعیت پیکربندی نهایی msimd اعمال میشوند و به ترتیبی که در خط فرمان درایور GCC ظاهر شدهاند تغییرات تدریجی ایجاد میکنند، تا گزینهٔ نهایی / استانداردسازیشدهٔ msimd را که به خود کامپایلر تحویل داده میشود استخراج کنند.
- -mbranch-cost=n
- هزینهٔ انشعابها را تقریباً برابر با n دستورالعمل تعیین میکند.
- -maddr-reg-reg-cost=n
- هزینهٔ ADDRESS_REG_REG را برابر با مقدار محاسبهشده توسط n قرار میدهد.
- -mcheck-zero-division
- -mno-check-zero-divison
- تلهگذاری (یا عدم تلهگذاری) هنگام تقسیم عدد صحیح بر صفر. مقدار پیشفرض برای -O0 یا -Og برابر -mcheck-zero-division، و برای سایر سطوح بهینهسازی -mno-check-zero-division است.
- -mcond-move-int
- -mno-cond-move-int
- انتقالهای شرطی برای دادههای صحیح در ثباتهای همهمنظوره فعال (غیرفعال) میشوند. پیشفرض -mcond-move-int است.
- -mcond-move-float
- -mno-cond-move-float
- انتقالهای شرطی برای ثباتهای ممیز شناور فعال (غیرفعال) میشوند. پیشفرض -mcond-move-float است.
- -mmemcpy
- -mno-memcpy
- اجبار (عدم اجبار) به استفاده از "memcpy" برای انتقال بلوکهای غیربدیهی. پیشفرض -mno-memcpy است که به GCC امکان میدهد بیشتر رونوشتهای با اندازهٔ ثابت را درونخطی کند. تنظیم سطح بهینهسازی به -Os نیز استفاده از "memcpy" را اجباری میکند، اما در صورت مشخص شدن صریح، -mno-memcpy بدون توجه به ترتیب این گزینهها در خط فرمان میتواند این رفتار را لغو کند.
- -mstrict-align
- -mno-strict-align
- اجتناب از یا مجاز دانستن تولید دسترسیهای حافظهای که ممکن است بر مرز طبیعی شیء، آنطور که در مشخصات معماری بیان شده، تراز نشده باشند. مقدار پیشفرض -mno-strict-align است.
- -G num
- قرار دادن دادههای سراسری و ایستا با اندازهٔ کوچکتر از num بایت در بخش دادههای کوچک (small data section). مقدار پیشفرض 0 است.
- -mmax-inline-memcpy-size=n
- درونخطیسازی تمامی انتقالهای بلوکی (مانند فراخوانیهای "memcpy" یا رونوشت ساختارها) با اندازهٔ کوچکتر یا مساوی n بایت. مقدار پیشفرض n برابر 1024 است.
- -mcmodel=code-model
- تنظیم مدل کد به یکی از موارد زیر:
- tiny-static (هنوز پیادهسازی نشده)
- tiny (هنوز پیادهسازی نشده)
- normal
- بخش کد (text segment) باید در فضای آدرسدهی 128MB باشد. بخش داده (data segment) باید در فضای آدرسدهی 2GB باشد.
- medium
- بخش کد و بخش داده باید در فضای آدرسدهی 2GB باشند.
- large (هنوز پیادهسازی نشده)
- extreme
- این حالت اندازهٔ بخش کد و بخش داده را محدود نمیکند. گزینهٔ -mcmodel=extreme با -fplt و/یا -mexplicit-relocs=none ناسازگار است.
مدل کد پیشفرض "normal" است.
- -mexplicit-relocs=style
- تعیین زمان استفاده از عملگرهای بازمکانی اسمبلر هنگام کار با آدرسهای نمادین. روش جایگزین، استفاده از ماکروهای اسمبلر به جای آنها است که ممکن است زمانبندی دستورالعملها را محدود کند اما امکان بهینهسازی پیونددهنده (linker relaxation) را فراهم میآورد. با -mexplicit-relocs=none همواره از ماکروهای اسمبلر استفاده میشود، با -mexplicit-relocs=always همواره عملگرهای بازمکانی اسمبلر به کار میروند، با -mexplicit-relocs=auto کامپایلر برای بهبود کیفیت کد در جایی که امکان بهینهسازی پیونددهنده وجود ندارد از عملگرهای بازمکانی و در جاهای دیگر از ماکروها استفاده میکند. مقدار پیشفرض این گزینه بر اساس قابلیتهای اسمبلر که هنگام ساخت GCC تشخیص داده شده و نیز تنظیمات -mrelax مشخص میشود: -mexplicit-relocs=none در صورتی که اسمبلر اصلاً از عملگرهای بازمکانی پشتیبانی نکند، -mexplicit-relocs=always در صورتی که اسمبلر از عملگرهای بازمکانی پشتیبانی کند اما -mrelax فعال نباشد، -mexplicit-relocs=auto در صورتی که اسمبلر از عملگرهای بازمکانی پشتیبانی کند و -mrelax فعال باشد..IP -mexplicit-relocs 4 نام مستعاری برای -mexplicit-relocs=always جهت سازگاری با نسخههای پیشین.
- -mno-explicit-relocs
- نام مستعاری برای -mexplicit-relocs=none جهت سازگاری با نسخههای پیشین.
- -mdirect-extern-access
- -mno-direct-extern-access
- عدم
استفاده یا
استفاده از
GOT برای
دسترسی به
نمادهای
خارجی (external symbols).
حالت
پیشفرض
-mno-direct-extern-access است:
از GOT برای
نمادهای
خارجی با
دیداری (visibility)
پیشفرض
استفاده
میشود،
اما برای
سایر
نمادهای
خارجی
استفاده
نمیشود.
با -mdirect-extern-access، از GOT استفاده نمیشود و همهٔ نمادهای خارجی به صورت نسبت به PC آدرسدهی میشوند. این گزینه فقط برای محیطهایی مناسب است که در آنها هیچ پیوند پویایی صورت نمیگیرد، مانند میانافزارها، هستههای سیستمعامل، یا فایلهای اجرایی پیوند خورده با -static یا -static-pie. گزینهٔ -mdirect-extern-access با -fPIC یا -fpic سازگار نیست.
- -mrelax
- -mno-relax
- بهرهگیری (عدم بهرهگیری) از بهینهسازیهای سادهسازی پیونددهنده (linker relaxations). اگر -mpass-mrelax-to-as فعال باشد، این گزینه به اسمبلر نیز فرستاده میشود. حالت پیشفرض در زمان ساخت GCC با تشخیص پشتیبانی اسمبلر مربوطه تعیین میشود: اگر اسمبلر از هر دوی گزینهٔ -mrelax و سادهسازی پرش شرطی پشتیبانی کند (این مورد لازم است، در غیر این صورت دستورهای ".align" و دستورهای پرش شرطی در کد اسمبلی خروجی GCC ممکن است به دلیل سرریز بازنشانی توسط اسمبلر رد شوند)، مقدار پیشفرض -mrelax خواهد بود، و در غیر این صورت -mno-relax است.
- -mpass-mrelax-to-as
- -mno-pass-mrelax-to-as
- ارسال (عدم ارسال) گزینهٔ -mrelax یا -mno-relax به اسمبلر. حالت پیشفرض در زمان ساخت GCC با تشخیص پشتیبانی اسمبلر مربوطه تعیین میشود: اگر اسمبلر از گزینهٔ -mrelax پشتیبانی کند، مقدار -mpass-mrelax-to-as خواهد بود، و در غیر این صورت -mno-pass-mrelax-to-as است. این گزینه بیشتر برای اشکالزدایی یا تعامل با اسمبلرهایی متفاوت از اسمبلر زمان ساخت کاربرد دارد.
- -mrecip
- این گزینه استفاده از دستورالعملهای تخمین معکوس و تخمین معکوس ریشهٔ دوم را با گامهای تکمیلی نیوتن-رافسون جهت افزایش دقت، به جای انجام تقسیم یا ریشهٔ دوم و تقسیم برای آرگومانهای ممیز شناور فعال میکند. این دستورالعملها تنها زمانی تولید میشوند که -funsafe-math-optimizations همراه با -ffinite-math-only و -fno-trapping-math فعال شده باشد. این گزینه به صورت پیشفرض غیرفعال است. پیش از استفاده از این گزینه، باید مطمئن شوید که پردازندهٔ مقصد از دستورهای frecipe و frsqrte پشتیبانی میکند. توجه داشته باشید که هرچند توان عملیاتی (throughput) این توالی دستورها بالاتر از توان عملیاتی دستورالعمل غیرمعکوس است، اما دقت توالی میتواند تا ۲ ulp کاهش یابد (یعنی معکوس 1.0 برابر با 0.99999994 خواهد شد).
- -mrecip=opt
- این گزینه تعیین میکند که کدام دستورالعملهای تخمین معکوس میتوانند استفاده شوند. opt فهرستی از گزینهها است که با کاما از هم جدا شدهاند و میتوان یک ! را برای معکوس کردن عملکرد گزینه در ابتدای آن قرار داد:
- all
- فعالسازی تمام دستورالعملهای تخمین.
- default
- فعالسازی دستورالعملهای پیشفرض، معادل با -mrecip.
- none
- غیرفعالسازی تمام دستورالعملهای تخمین، معادل با -mno-recip.
- div
- فعالسازی تقریب برای تقسیم اسکالر (عددی).
- vec-div
- فعالسازی تقریب برای تقسیم برداری.
- sqrt
- فعالسازی تقریب برای ریشهٔ دوم اسکالر.
- vec-sqrt
- فعالسازی تقریب برای ریشهٔ دوم برداری.
- rsqrt
- فعالسازی تقریب برای معکوس ریشهٔ دوم اسکالر.
- vec-rsqrt
- فعالسازی تقریب برای معکوس ریشهٔ دوم برداری.
بنابراین، به عنوان مثال، -mrecip=all,!sqrt تمام تقریبهای معکوس را به جز ریشهٔ دوم اسکالر فعال میکند.
- -mfrecipe
- -mno-frecipe
- استفاده (عدم استفاده) از دستورهای "frecipe.{s/d}" و "frsqrte.{s/d}". هنگام ساخت با -march=la664، این گزینه به صورت پیشفرض فعال است. حالت پیشفرض -mno-frecipe است.
- -mdiv32
- -mno-div32
- استفاده (عدم استفاده) از دستورهای "div.w[u]" و "mod.w[u]" با ورودیهایی که علامت آنها بسط داده نشده باشد (sign-extended نباشند). هنگام ساخت با -march=la664، این گزینه به صورت پیشفرض فعال است. حالت پیشفرض -mno-div32 است.
- -mlam-bh
- -mno-lam-bh
- استفاده (عدم استفاده) از دستورهای "am{swap/add}[_db].{b/h}". هنگام ساخت با -march=la664، این گزینه به صورت پیشفرض فعال است. حالت پیشفرض -mno-lam-bh است.
- -mlamcas
- -mno-lamcas
- استفاده (عدم استفاده) از دستورهای "amcas[_db].{b/h/w/d}". هنگام ساخت با -march=la664، این گزینه به صورت پیشفرض فعال است. حالت پیشفرض -mno-lamcas است.
- -mld-seq-sa
- -mno-ld-seq-sa
- نیاز یا عدم نیاز به یک مانع بارگذاری-بارگذاری با نشانی یکسان ("dbar 0x700"). هنگام ساخت با -march=la664، این گزینه به صورت پیشفرض فعال است. حالت پیشفرض -mno-ld-seq-sa است، که یعنی مانع بارگذاری-بارگذاری مورد نیاز است.
- -mtls-dialect=opt
- این گزینه مشخص میکند که کدام گویش TLS برای مدلهای TLS پویا عمومی (general dynamic) و پویا محلی (local dynamic) استفاده شود.
- -mannotate-tablejump
- -mno-annotate-tablejump
- ایجاد یک بخش حاشیهنویسی به نام ".discard.tablejump_annotate" جهت برقراری ارتباط میان دستور "jirl" و جدول پرش، در زمانی که از یک جدول پرش برای بهینهسازی عبارت "switch" استفاده میشود. برخی ابزارهای خارجی، برای مثال objtool در سامانهٔ ساخت هستهٔ لینوکس، برای تحلیل جریان کنترل به این حاشیهنویسی نیاز دارند. حالت پیشفرض -mno-annotate-tablejump است.
- --param loongarch-vect-unroll-limit=n
- بردارساز (vectorizer) از اطلاعات تنظیم کارایی موجود برای تشخیص اینکه آیا باز کردن حلقهٔ برداری اصلی سودمند است یا خیر و به چه میزان، استفاده خواهد کرد. این پارامتر کران بالای میزان باز کردن حلقهٔ اصلی توسط بردارساز را تعیین میکند. مقدار پیشفرض شش است..PP گزینههای M32C
- -mcpu=name
- پردازندهای را که کد برای آن تولید میشود انتخاب میکند. name میتواند یکی از مقادیر r8c برای سری R8C/Tiny، m16c برای سری M16C (تا 60/)، m32cm برای سری M16C/80، یا m32c برای سری M32C/80 باشد.
- -msim
- مشخص میکند که برنامه روی شبیهساز اجرا خواهد شد. این کار باعث پیوند خوردن یک کتابخانهٔ زمان اجرای جایگزین میشود که برای نمونه از ورودی/خروجی فایل پشتیبانی میکند. هنگام تولید برنامههایی که روی سختافزار واقعی اجرا خواهند شد نباید از این گزینه استفاده کنید؛ باید کتابخانهٔ زمان اجرای اختصاصی خود را برای هرگونه توابع ورودی/خروجی مورد نیاز ارائه دهید.
- -memregs=number
- تعداد شبهثباتهای مبتنی بر حافظه را که GCC هنگام تولید کد استفاده میکند مشخص میسازد. این شبهثباتها مانند ثباتهای واقعی استفاده میشوند، بنابراین موازنهای میان توانایی GCC در جا دادن کد در ثباتهای موجود و افت کاراییِ ناشی از استفاده از حافظه به جای ثباتها وجود دارد. توجه داشته باشید که تمام پودمانهای یک برنامه باید با مقدار یکسانی برای این گزینه همگردانی شوند. به همین دلیل، نباید از این گزینه همراه با کتابخانههای زمان اجرای پیشفرض GCC استفاده کنید.
گزینههای M32R/D
این گزینههای -m برای معماریهای Renesas M32R/D تعریف شدهاند:
- -m32r2
- تولید کد برای M32R/2.
- -m32rx
- تولید کد برای M32R/X.
- -m32r
- تولید کد برای M32R. این پیشفرض است.
- -mmodel=small
- فرض میکند
همهٔ اشیاء
در ۱۶
مگابایت
ابتدایی
حافظه قرار
دارند (به
طوری که
نشانی
آنها
بتواند با
دستورالعمل
"ld24"
بارگذاری
شود)، و فرض
میکند
تمام
زیرروالها
با
دستورالعمل
"bl" قابل
دسترسی
هستند. این
پیشفرض
است.
نشانیپذیری یک شیء خاص را میتوان با مشخصهٔ "model" تعیین کرد.
- -mmodel=medium
- فرض میکند اشیاء ممکن است در هر کجای فضای نشانی ۳۲ بیتی باشند (کامپایلر دستورالعملهای "seth/add3" را برای بارگذاری نشانیهای آنها تولید میکند)، و فرض میکند تمام زیرروالها با دستورالعمل "bl" قابل دسترسی هستند.
- -mmodel=large
- فرض میکند اشیاء ممکن است در هر کجای فضای نشانی ۳۲ بیتی باشند (کامپایلر دستورالعملهای "seth/add3" را برای بارگذاری نشانیهای آنها تولید میکند)، و فرض میکند زیرروالها ممکن است با دستورالعمل "bl" قابل دسترسی نباشند (کامپایلر دنباله دستورالعملهای بسیار کندترِ "seth/add3/jl" را تولید میکند).
- -msdata=none
- استفاده از
ناحیهٔ
دادههای
کوچک را
غیرفعال
میکند.
متغیرها در
یکی از
بخشهای
".data"،
".bss" یا
".rodata"
قرار
میگیرند
(مگر اینکه
مشخصهٔ
"section"
تعیین شده
باشد). این
پیشفرض
است.
ناحیهٔ دادههای کوچک شامل بخشهای ".sdata" و ".sbss" است. اشیاء را میتوان با مشخصهٔ "section" و با استفاده از یکی از این بخشها بهطور صریح در ناحیهٔ دادههای کوچک قرار داد.
- -msdata=sdata
- دادههای سراسری و ایستا کوچک را در ناحیهٔ دادههای کوچک قرار میدهد، اما کد خاصی برای ارجاع به آنها تولید نمیکند.
- -msdata=use
- دادههای سراسری و ایستا کوچک را در ناحیهٔ دادههای کوچک قرار میدهد و دستورالعملهای ویژهای برای ارجاع به آنها تولید میکند.
- -G num
- اشیاء
سراسری و
ایستا که
کوچکتر یا
مساوی num
بایت باشند
را به جای
بخشهای
عادی داده
یا BSS، در
بخشهای
دادههای
کوچک یا BSS
قرار
میدهد.
مقدار
پیشفرض num
برابر ۸
است. گزینهٔ
-msdata باید روی
یکی از
مقادیر sdata
یا use تنظیم
شده باشد تا
این گزینه
اثرگذار
شود.
همهٔ پودمانها باید با مقدار -G num یکسانی همگردانی شوند. همگردانی با مقادیر مختلف num ممکن است کار کند یا نکند؛ اگر کار نکند، پیونددهنده یک پیام خطا میدهد---کد نادرست تولید نمیشود.
- -mdebug
- باعث میشود کد ویژهٔ M32R در کامپایلر آمارههایی را نمایش دهد که ممکن است در اشکالزدایی برنامهها مفید باشد.
- -malign-loops
- تمام حلقهها را روی مرز ۳۲ بایتی تراز میکند.
- -mno-align-loops
- تراز ۳۲ بایتی را برای حلقهها اجباری نمیکند. این پیشفرض است.
- -missue-rate=number
- در هر چرخه number دستورالعمل صادر میکند. number تنها میتواند ۱ یا ۲ باشد.
- -mbranch-cost=number
- number تنها میتواند ۱ یا ۲ باشد. اگر ۱ باشد، انشعابها به کدهای شرطی ترجیح داده میشوند؛ اگر ۲ باشد، عکس آن اعمال میگردد.
- -mflush-trap=number
- شمارهٔ تلهای را که برای تخلیهٔ حافظهٔ نهان استفاده میشود مشخص میکند. پیشفرض ۱۲ است. شمارههای معتبر بین ۰ تا ۱۵ (شامل هر دو) هستند.
- -mno-flush-trap
- مشخص میکند که حافظهٔ نهان با استفاده از یک تله تخلیهپذیر نیست.
- -mflush-func=name
- نام تابع سیستمعامل را برای فراخوانی جهت تخلیهٔ حافظهٔ نهان مشخص میکند. پیشفرض _flush_cache است، اما فراخوانی تابع تنها در صورتی استفاده میشود که تله در دسترس نباشد.
- -mno-flush-func
- نشان میدهد که هیچ تابعی در سیستمعامل برای تخلیهٔ حافظهٔ نهان وجود ندارد.
گزینههای M680x0
اینها گزینههای -m تعریفشده برای پردازندههای M680x0 و ColdFire هستند. تنظیمات پیشفرض بستگی دارد به این که هنگام پیکربندی کامپایلر کدام معماری انتخاب شده باشد؛ پیشفرضهای مربوط به متداولترین گزینهها در زیر آمده است.
- -march=arch
- تولید کد
برای یک
معماری
مجموعه
دستورالعمل
خاصِ M680x0 یا ColdFire.
مقادیر
مجاز برای
arch در
معماریهای
M680x0 عبارتند
از: 68000، 68010،
68020، 68030، 68040،
68060 و cpu32.
معماریهای
ColdFire مطابق با
دستهبندی
ISA شرکت Freescale
انتخاب
میشوند و
مقادیر
مجاز
عبارتند از:
isaa، isaaplus، isab و
isac.
کامپایلر GCC هر زمان که کدی برای مقصد ColdFire تولید کند، ماکروی "__mcfarch__" را تعریف میکند. مقدار arch در این ماکرو یکی از آرگومانهای -march است که در بالا ذکر شد.
هنگامی که گزینههای -march و -mtune با هم استفاده شوند، کدی را انتخاب میکنند که روی خانوادهای از پردازندههای مشابه اجرا میشود اما برای یک ریزمعماری خاص بهینهسازی شده است.
- -mcpu=cpu
- تولید کد برای یک پردازندهٔ خاصِ M680x0 یا ColdFire. پردازندههای cpu در M680x0 عبارتند از: 68000، 68010، 68020، 68030، 68040، 68060، 68302، 68332 و cpu32. پردازندههای cpu در ColdFire در جدول زیر آورده شدهاند، که پردازندهها را در قالب خانوادهها نیز دستهبندی میکند:
- خانواده : آرگومانهای -mcpu
- 51 : 51 51ac 51ag 51cn 51em 51je 51jf 51jg 51jm 51mm 51qe 51qm
- 5206 : 5202 5204 5206
- 5206e : 5206e
- 5208 : 5207 5208
- 5211a : 5210a 5211a
- 5213 : 5211 5212 5213
- 5216 : 5214 5216
- 52235 : 52230 52231 52232 52233 52234 52235
- 5225 : 5224 5225
- 52259 : 52252 52254 52255 52256 52258 52259
- 5235 : 5232 5233 5234 5235 523x
- 5250 : 5250
- 5271 : 5270 5271
- 5272 : 5272
- 5275 : 5274 5275
- 5282 : 5280 5281 5282 528x
- 53017 : 53011 53012 53013 53014 53015 53016 53017
- 5307 : 5307
- 5329 : 5327 5328 5329 532x
- 5373 : 5372 5373 537x
- 5407 : 5407
- 5475 : 5470 5471 5472 5473 5474 5475 547x 5480 5481 5482 5483 5484 5485
در صورتی که arch با cpu سازگار باشد، -mcpu=cpu بر -march=arch اولویت یافته و جایگزین آن میشود. سایر ترکیبهای -mcpu و -march رد میشوند.
هنگامی که هدف ColdFire cpu انتخاب شود، GCC ماکروی "__mcf_cpu_cpu" را تعریف میکند. همچنین "__mcf_family_family" را نیز تعریف میکند که در آن مقدار family توسط جدول بالا مشخص شده است.
- -mtune=tune
- کد را برای
یک
ریزمعماری
خاص در
چارچوب
محدودیتهای
تعیینشده
توسط -march و -mcpu
بهینهسازی
(tune) میکند.
ریزمعماریهای
M680x0 عبارتند
از: 68000، 68010،
68020، 68030، 68040،
68060 و cpu32.
ریزمعماریهای
ColdFire عبارتند
از: cfv1، cfv2،
cfv3، cfv4 و cfv4e.
شما همچنین میتوانید از -mtune=68020-40 برای کدی استفاده کنید که لازم است به طور نسبتاً مناسبی روی اهداف 68020، 68030 و 68040 اجرا شود. -mtune=68020-60 نیز مشابه است اما اهداف 68060 را نیز شامل میشود. این دو گزینه به ترتیب همان تصمیمات بهینهسازی -m68020-40 و -m68020-60 را برمیگزینند.
هنگام بهینهسازی برای معماری 680x0 arch، GCC ماکروهای "__mcarch" و "__mcarch__" را تعریف میکند. همچنین ماکروی "mcarch" را نیز تعریف میکند، مگر آنکه گزینهٔ -ansi یا یک گزینهٔ غیر گنوی -std استفاده شده باشد. چنانچه GCC در حال بهینهسازی برای محدودهای از معماریها باشد (مانند آنچه توسط -mtune=68020-40 یا -mtune=68020-60 تعیین میشود)، ماکروها را برای تکتک معماریهای موجود در آن بازه تعریف خواهد کرد.
همچنین GCC هنگام بهینهسازی برای ریزمعماری ColdFire uarch، ماکروی "__muarch__" را تعریف میکند که در آن uarch یکی از آرگومانهای ارائهشده در بالا است.
- -m68000
- -mc68000
- تولید
خروجی برای
پردازندهٔ
68000. این حالت
پیشفرض در
زمانی است
که
کامپایلر
برای
سیستمهای
مبتنی بر 68000
پیکربندی
شده باشد.
این گزینه
معادل -march=68000
است.
از این گزینه برای میکروکنترلرهای دارای هستهٔ 68000 یا EC000 استفاده کنید، شامل 68008، 68302، 68306، 68307، 68322، 68328 و 68356.
- -m68010
- تولید خروجی برای پردازندهٔ 68010. این حالت پیشفرض در زمانی است که کامپایلر برای سیستمهای مبتنی بر 68010 پیکربندی شده باشد. این گزینه معادل -march=68010 است.
- -m68020
- -mc68020
- تولید خروجی برای پردازندهٔ 68020. این حالت پیشفرض در زمانی است که کامپایلر برای سیستمهای مبتنی بر 68020 پیکربندی شده باشد. این گزینه معادل -march=68020 است.
- -m68030
- تولید خروجی برای پردازندهٔ 68030. این حالت پیشفرض در زمانی است که کامپایلر برای سیستمهای مبتنی بر 68030 پیکربندی شده باشد. این گزینه معادل -march=68030 است.
- -m68040
- تولید
خروجی برای
پردازندهٔ
68040. این حالت
پیشفرض در
زمانی است
که
کامپایلر
برای
سیستمهای
مبتنی بر 68040
پیکربندی
شده باشد.
این گزینه
معادل -march=68040
است.
این گزینه از بهکارگیری دستورالعملهای 68881/68882 که باید در 68040 توسط نرمافزار شبیهسازی شوند جلوگیری میکند. اگر پردازندهٔ 68040 شما کدی برای شبیهسازی آن دستورالعملها ندارد، از این گزینه استفاده کنید.
- -m68060
- تولید
خروجی برای
پردازندهٔ
68060. این حالت
پیشفرض در
زمانی است
که
کامپایلر
برای
سیستمهای
مبتنی بر 68060
پیکربندی
شده باشد.
این گزینه
معادل -march=68060
است.
این گزینه از بهکارگیری دستورالعملهای 68020 و 68881/68882 که باید در 68060 توسط نرمافزار شبیهسازی شوند جلوگیری میکند. اگر پردازندهٔ 68060 شما کدی برای شبیهسازی آن دستورالعملها ندارد، از این گزینه استفاده کنید.
- -mcpu32
- تولید
خروجی برای
یک CPU32. این
حالت
پیشفرض در
زمانی است
که
کامپایلر
برای
سیستمهای
مبتنی بر CPU32
پیکربندی
شده باشد.
این گزینه
معادل -march=cpu32
است.
از این گزینه برای میکروکنترلرهای دارای هستهٔ CPU32 یا +CPU32 استفاده کنید، شامل 68330، 68331، 68332، 68333، 68334، 68336، 68340، 68341، 68349 و 68360.
- -m5200
- تولید
خروجی برای
یک
پردازندهٔ
ColdFire 520X. این حالت
پیشفرض در
زمانی است
که
کامپایلر
برای
سیستمهای
مبتنی بر 520X
پیکربندی
شده باشد.
این گزینه
معادل -mcpu=5206
است و اکنون
به نفع آن
گزینه
منسوخ شده
است.
از این گزینه برای میکروکنترلرهای دارای هستهٔ 5200 استفاده کنید، شامل MCF5202، MCF5203، MCF5204 و MCF5206.
- -m5206e
- تولید خروجی برای یک پردازندهٔ ColdFire 5206e. این گزینه اکنون به نفع گزینهٔ معادل -mcpu=5206e منسوخ شده است.
- -m528x
- تولید خروجی برای عضوی از خانوادهٔ ColdFire 528X. این گزینه اکنون به نفع گزینهٔ معادل -mcpu=528x منسوخ شده است.
- -m5307
- تولید خروجی برای یک پردازندهٔ ColdFire 5307. این گزینه اکنون به نفع گزینهٔ معادل -mcpu=5307 منسوخ شده است.
- -m5407
- تولید خروجی برای یک پردازندهٔ ColdFire 5407. این گزینه اکنون به نفع گزینهٔ معادل -mcpu=5407 منسوخ شده است.
- -mcfv4e
- تولید خروجی برای پردازندهای از خانوادهٔ ColdFire V4e (مانند 547x/548x). این شامل استفاده از دستورالعملهای سختافزاری ممیز شناور میشود. این گزینه معادل -mcpu=547x است و اکنون به نفع آن گزینه منسوخ شده است.
- -m68020-40
- تولید
خروجی برای
یک 68040، بدون
استفاده از
هیچیک از
دستورالعملهای
جدید. این
کار منجر به
تولید کدی
میشود که
میتواند
با کارایی
نسبتاً
مناسبی روی
68020/68881، 68030 یا 68040
اجرا شود.
کد
تولیدشده
از
دستورالعملهای
68881 که روی 68040
شبیهسازی
میشوند
استفاده
میکند.
این گزینه معادل -march=68020 -mtune=68020-40 است.
- -m68020-60
- تولید
خروجی برای
یک 68060، بدون
استفاده از
هیچیک از
دستورالعملهای
جدید. این
کار منجر به
تولید کدی
میشود که
میتواند
با کارایی
نسبتاً
مناسبی روی
68020/68881، 68030 یا 68040
اجرا شود.
کد
تولیدشده
از
دستورالعملهای
68881 که روی 68060
شبیهسازی
میشوند
استفاده
میکند.
این گزینه معادل -march=68020 -mtune=68020-60 است.
- -mhard-float
- -m68881
- تولید دستورالعملهای ممیز شناور. این حالت پیشفرض برای 68020 و بالاتر، و برای دستگاههای ColdFire دارای FPU است. این گزینه ماکروی "__HAVE_68881__" را روی اهداف M680x0 و ماکروی "__mcffpu__" را روی اهداف ColdFire تعریف میکند.
- -msoft-float
- عدم تولید دستورالعملهای ممیز شناور؛ به جای آن از فراخوانیهای کتابخانهای استفاده میکند. این حالت پیشفرض برای اهداف 68000، 68010 و 68832 است. همچنین پیشفرض برای دستگاههای ColdFire فاقد FPU محسوب میشود..IP -mdiv 4
- -mno-div
- دستورالعملهای
سختافزاری
تقسیم و
باقیمانده
ColdFire را تولید
میکند
(تولید
نمیکند).
اگر -march بدون
-mcpu استفاده
شود، مقدار
پیشفرض
برای
معماریهای
ColdFire برابر "on"
(روشن) و
برای
معماریهای
M680x0 برابر "off"
(خاموش) است.
در غیر این
صورت،
مقدار
پیشفرض از
پردازنده
هدف (یا
پردازنده
پیشفرض،
یا
پردازنده
مشخصشده
توسط -mcpu)
گرفته
میشود.
برای مثال،
مقدار
پیشفرض
برای -mcpu=5206
برابر "off" و
برای -mcpu=5206e
برابر "on"
است.
هنگامی که این گزینه فعال باشد، GCC ماکروی "__mcfhwdiv__" را تعریف میکند.
- -mshort
- نوع "int" را همانند "short int" دارای عرض ۱۶ بیتی در نظر میگیرد. علاوه بر این، پارامترهای ارسالشده روی پشته نیز در مرز ۱۶ بیتی تراز میشوند، حتی در اهدافی که API آنها ارتقا به ۳۲ بیتی را الزامی میکند.
- -mno-short
- نوع "int" را ۱۶ بیتی در نظر نمیگیرد. این مقدار پیشفرض است.
- -mnobitfield
- -mno-bitfield
- از دستورالعملهای بیتی (bit-field) استفاده نمیکند. گزینههای -m68000، -mcpu32 و -m5200 مستلزم -mnobitfield هستند.
- -mbitfield
- از دستورالعملهای بیتی استفاده میکند. گزینه -m68020 مستلزم -mbitfield است. اگر از پیکربندی طراحیشده برای 68020 استفاده کنید، این حالت پیشفرض است.
- -mrtd
- از یک
قرارداد
فراخوانی
تابع
متفاوت
استفاده
میکند که
در آن،
توابعی که
تعداد
ثابتی
آرگومان
میگیرند
با
دستورالعمل
"rtd"
بازمیگردند؛
این
دستورالعمل
آرگومانهای
آنها را
هنگام
بازگشت از
پشته
برمیدارد.
این کار یک
دستورالعمل
در
فراخواننده
صرفهجویی
میکند،
زیرا در
آنجا نیازی
به پاپ کردن
آرگومانها
نیست.
این قرارداد فراخوانی با قراردادی که معمولاً در Unix استفاده میشود ناسازگار است، بنابراین اگر نیاز به فراخوانی کتابخانههای کامپایلشده با کامپایلر Unix دارید، نمیتوانید از آن استفاده کنید.
همچنین، باید پیشنمونه تابع (prototype) را برای تمام توابعی که تعداد متغیری آرگومان میگیرند (از جمله "printf") ارائه دهید؛ در غیر این صورت برای فراخوانیهای آن توابع، کد نادرستی تولید میشود.
علاوه بر این، اگر تابعی را با آرگومانهای بیش از حد فراخوانی کنید، کد به شدت نادرستی تولید خواهد شد. (بهطور معمول، آرگومانهای اضافی بدون آسیب نادیده گرفته میشوند.)
دستورالعمل "rtd" توسط پردازندههای 68010، 68020، 68030، 68040، 68060 و CPU32 پشتیبانی میشود، اما توسط 68000 یا 5200 پشتیبانی نمیشود.
پیشفرض -mno-rtd است.
- -malign-int
- -mno-align-int
- کنترل
میکند که
آیا GCC
متغیرهای
"int"،
"long"،
"long long"،
"float"،
"double" و
"long double" را
روی مرز ۳۲
بیتی تراز
کند (-malign-int) یا
روی مرز ۱۶
بیتی (-mno-align-int).
تراز کردن
متغیرها
روی مرزهای
۳۲ بیتی، به
قیمت مصرف
حافظه
بیشتر، کدی
تولید
میکند که
روی
پردازندههای
دارای
گذرگاه ۳۲
بیتی تا
حدودی
سریعتر
اجرا
میشود.
هشدار: در صورت استفاده از گزینه -malign-int، کامپایلر GCC ساختارهای حاوی انواع فوق را به گونهای تراز میکند که با بیشتر مشخصات رابط باینری کاربردی (ABI) منتشرشده برای m68k متفاوت است.
به جای استفاده از جدول افست سراسری (GOT)، مستقیماً از حالت آدرسدهی وابسته به pc پردازنده 68000 استفاده میکند. در حال حاضر، این گزینه مستلزم -fpic است که حداکثر یک افست ۱۶ بیتی را برای آدرسدهی وابسته به pc مجاز میداند. در حال حاضر -fPIC به همراه -mpcrel پشتیبانی نمیشود، هرچند که این امکان برای پردازندههای 68020 و بالاتر میتواند پشتیبانی شود.
- -mno-strict-align
- -mstrict-align
- فرض نمیکند (فرض میکند) که ارجاعات حافظه ناتراز توسط سیستم مدیریت میشوند.
- -msep-data
- کدی تولید میکند که اجازه میدهد بخش داده (data segment) در ناحیهای از حافظه متفاوت از بخش کد (text segment) قرار گیرد. این امر اجرای درجا (execute-in-place) را در محیطهای بدون مدیریت حافظه مجازی امکانپذیر میسازد. این گزینه مستلزم -fPIC است.
- -mno-sep-data
- کدی تولید میکند که فرض میکند بخش داده بلافاصله پس از بخش کد قرار میگیرد. این حالت پیشفرض است.
- -mid-shared-library
- کدی تولید میکند که از طریق روش شناسه کتابخانه (library ID) از کتابخانههای اشتراکی پشتیبانی میکند. این ویژگی امکان اجرای درجا و استفاده از کتابخانههای اشتراکی را در محیطهای بدون مدیریت حافظه مجازی فراهم میسازد. این گزینه مستلزم -fPIC است.
- -mno-id-shared-library
- کدی تولید میکند که فرض نمیکند کتابخانههای اشتراکی مبتنی بر شناسه در حال استفاده هستند. این مقدار پیشفرض است.
- شماره شناسایی کتابخانه اشتراکی مبتنی بر شناسهای را که در حال کامپایل است مشخص میکند. تعیین مقدار 0 کد فشردهتری تولید میکند؛ تعیین مقادیر دیگر تخصیص آن شماره را به کتابخانه فعلی تحمیل میکند، اما از نظر فضا یا زمان کارآمدتر از نادیده گرفتن این گزینه نیست.
- -mxgot
- -mno-xgot
- هنگام
تولید کد
مستقل از
موقعیت (position-independent
code) برای ColdFire،
کدی تولید
میکند که
در صورت
داشتن بیش
از ۸۱۹۲
مدخل در
جدول GOT کار
کند. این کد
بزرگتر و
کندتر از کد
تولیدشده
بدون این
گزینه است.
در
پردازندههای
M680x0، این
گزینه مورد
نیاز نیست؛
-fPIC کفایت
میکند.
کامپایلر GCC معمولاً از یک دستورالعمل برای بارگذاری مقادیر از GOT استفاده میکند. اگرچه این روش نسبتاً کارآمد است، اما تنها در صورتی کار میکند که اندازه GOT کمتر از حدود 64k باشد. هر اندازهای بزرگتر از آن باعث میشود که پیونددهنده خطایی مانند زیر گزارش دهد:
relocation truncated to fit: R_68K_GOT16O foobar
در صورت وقوع این اتفاق، باید کد خود را با -mxgot دوباره کامپایل کنید. سپس باید با GOTهای بسیار بزرگ کار کند. با این حال، کد تولیدشده با -mxgot کارایی کمتری دارد، زیرا واکشی مقدار یک نماد سراسری ۴ دستورالعمل طول میکشد.
توجه داشته باشید که برخی از پیونددهندهها، از جمله نسخههای جدیدتر پیونددهنده GNU، میتوانند چندین GOT ایجاد کنند و مدخلهای GOT را مرتب نمایند. اگر چنین پیونددهندهای دارید، تنها زمانی نیاز به استفاده از -mxgot خواهید داشت که یک فایل شیء منفرد را کامپایل کنید که به بیش از ۸۱۹۲ مدخل GOT دسترسی داشته باشد. موارد بسیار کمی اینگونه هستند.
این گزینهها هیچ تاثیری ندارند مگر اینکه GCC در حال تولید کد مستقل از موقعیت باشد.
- -mlong-jump-table-offsets
- از افستهای ۳۲ بیتی در جدولهای "switch" استفاده میکند. پیشفرض استفاده از افستهای ۱۶ بیتی است.
گزینههای MCore
اینها گزینههای -m هستند که برای پردازندههای Motorola M*Core تعریف شدهاند.
- -mhardlit
- -mno-hardlit
- ثابتها را در جریان کد بهصورت درونخطی (inline) قرار میدهد اگر این کار در دو دستورالعمل یا کمتر امکانپذیر باشد.
- -mdiv
- -mno-div
- از دستورالعمل تقسیم استفاده میکند. (بهطور پیشفرض فعال است).
- -mrelax-immediate
- -mno-relax-immediate
- مقادیر بیواسطه (immediate) با اندازه دلخواه را در عملیات بیتی مجاز میشمارد.
- -mwide-bitfields
- -mno-wide-bitfields
- همیشه با میدانهای بیتی (bit-fields) به اندازهٔ "int" رفتار میکند.
- -m4byte-functions
- -mno-4byte-functions
- تراز شدن تمام توابع در مرز ۴ بایتی را اجباری میکند.
- -mcallgraph-data
- -mno-callgraph-data
- اطلاعات گراف فراخوانی (callgraph) را صادر میکند.
- -mslow-bytes
- -mno-slow-bytes
- هنگام خواندن مقادیر بایتی، دسترسی کلمهای (word access) را ترجیح میدهد.
- -mlittle-endian
- -mbig-endian
- کد را برای یک مقصد با ترتیب بایت کمارزش (little-endian) تولید میکند.
- -m210
- -m340
- کد را برای پردازندهٔ 210 تولید میکند.
- -mno-lsim
- فرض میکند که پشتیبانی زمان اجرا فراهم شده است، بنابراین کتابخانهٔ شبیهساز (libsim.a) را از خط فرمان پیونددهنده حذف میکند.
- -mstack-increment=size
- حداکثر مقدار برای یک عملیات افزایش پشته را تعیین میکند. مقادیر بزرگ میتوانند سرعت برنامههایی را که شامل توابعی با نیاز به فضای پشتهٔ زیاد هستند افزایش دهند، اما در صورتی که پشته بیش از اندازه گسترش یابد، میتوانند خطای دسترسی به حافظه (segmentation fault) نیز ایجاد کنند. مقدار پیشفرض 0x1000 است.
گزینههای MicroBlaze
- -msoft-float
- استفاده از شبیهسازی نرمافزاری برای ممیز شناور (پیشفرض).
- -mhard-float
- استفاده از دستورالعملهای سختافزاری ممیز شناور.
- -mmemcpy
- انتقال بلوکها را بهینهسازی نمیکند، از "memcpy" استفاده میکند.
- -mno-clearbss
- این گزینه منسوخ شده است. به جای آن از -fno-zero-initialized-in-bss استفاده کنید.
- -mcpu=cpu-type
- از ویژگیهای CPU مشخصشده استفاده کرده و کد را برای آن زمانبندی میکند. مقادیر پشتیبانیشده در قالب vX.YY.Z هستند، که در آن X نسخهٔ اصلی، YY نسخهٔ فرعی و Z کد سازگاری است. مقادیر نمونه عبارتند از v3.00.a، v4.00.b، v5.00.a، v5.00.b، v6.00.a.
- -mxl-soft-mul
- استفاده از شبیهسازی نرمافزاری ضرب (پیشفرض).
- -mxl-soft-div
- استفاده از شبیهسازی نرمافزاری تقسیم (پیشفرض).
- -mxl-barrel-shift
- استفاده از شیفتدهندهٔ بشکهای سختافزاری.
- -mxl-pattern-compare
- استفاده از دستورالعملهای مقایسهٔ الگو.
- -msmall-divides
- استفاده از بهینهسازی جدول جستجو برای تقسیم اعداد صحیح علامتدار کوچک.
- -mxl-stack-check
- این گزینه منسوخ شده است. به جای آن از -fstack-check استفاده کنید.
- -mxl-gp-opt
- استفاده از بخشهای ".sdata"/".sbss" وابسته به GP.
- -mxl-multiply-high
- استفاده از دستورالعملهای ضرب بالا برای بخش بالایی ضرب 32x32.
- -mxl-float-convert
- استفاده از دستورالعملهای سختافزاری تبدیل ممیز شناور.
- -mxl-float-sqrt
- استفاده از دستورالعمل سختافزاری جذر ممیز شناور.
- -mbig-endian
- کد را برای یک مقصد با ترتیب بایت پرارزش (big-endian) تولید میکند.
- -mlittle-endian
- کد را برای یک مقصد با ترتیب بایت کمارزش (little-endian) تولید میکند.
- -mxl-reorder
- استفاده از دستورالعملهای بازآرایی (swap و بارگذاری/ذخیرهسازی با بایت معکوس).
- -mxl-mode-app-model
- مدل برنامهٔ app-model را انتخاب میکند. مدلهای معتبر عبارتند از:
- executable
- برنامهٔ اجرایی معمولی (پیشفرض)، از کد راهاندازی crt0.o استفاده میکند.
- xmdstub
- برای استفاده با عامل اشکالزدای تهاجمی نرمافزاری مبتنی بر Xilinx Microprocessor Debugger (XMD) موسوم به xmdstub. این مدل از فایل راهاندازی crt1.o استفاده کرده و نشانی شروع برنامه را روی 0x800 تنظیم میکند.
- bootstrap
- برای برنامههایی که با استفاده از بارگذار بوت بارگذاری میشوند. این مدل از فایل راهاندازی crt2.o استفاده میکند که شامل گردانندهٔ بردار راهاندازی مجدد پردازنده نیست. این حالت برای واگذاری کنترل هنگام راهاندازی مجدد پردازنده به بارگذار بوت به جای برنامه مناسب است.
- novectors
- برای برنامههایی که به هیچیک از بردارهای MicroBlaze نیازی ندارند. این گزینه ممکن است برای برنامههایی که درون یک برنامهٔ نظارتی اجرا میشوند مفید باشد. این مدل از crt3.o به عنوان فایل راهاندازی استفاده میکند.
گزینهٔ -xl-mode-app-model یک نام مستعار منسوخ برای -mxl-mode-app-model است.
- -mpic-data-is-text-relative
- فرض میکند که جابهجایی بین بخشهای text و data در زمان پیوند ایستا ثابت است. این امر به دادهها اجازه میدهد به جای GOT، با آفست از نشانی شروع text ارجاع داده شوند؛ زیرا آدرسدهی وابسته به PC پشتیبانی نمیشود.
گزینههای MIPS
- -EB
- کد با ترتیب بایت پرارزش (big-endian) تولید میکند.
- -EL
- کد با ترتیب بایت کمارزش (little-endian) تولید میکند. این گزینه برای پیکربندیهای mips*el-*-* پیشفرض است.
- -march=arch
- کدی تولید
میکند که
روی arch اجرا
شود، که
میتواند
نام یک ISA
عمومی MIPS یا
نام یک
پردازندهٔ
خاص باشد.
نامهای ISA
عبارتند از:
mips1، mips2، mips3،
mips4، mips32، mips32r2،
mips32r3، mips32r5، mips32r6،
mips64، mips64r2، mips64r3،
mips64r5 و mips64r6.
نامهای
پردازنده
عبارتند از:
4kc، 4km، 4kp،
4ksc، 4kec، 4kem،
4kep، 4ksd، 5kc،
5kf، 20kc، 24kc،
24kf2_1، 24kf1_1، 24kec،
24kef2_1، 24kef1_1، 34kc،
34kf2_1، 34kf1_1، 34kn،
74kc، 74kf2_1، 74kf1_1،
74kf3_2، 1004kc، 1004kf2_1،
1004kf1_1، i6400، i6500،
interaptiv، loongson2e،
loongson2f، loongson3a، gs464،
gs464e، gs264e، m4k،
m14k، m14kc، m14ke،
m14kec، m5100، m5101،
octeon، octeon+، octeon2،
octeon3، orion، p5600،
p6600، r2000، r3000،
r3900، r4000، r4400،
r4600، r4650، r4700،
r5900، r6000، r8000،
rm7000، rm9000، r10000،
r12000، r14000، r16000،
sb1، sr71000، vr4100،
vr4111، vr4120، vr4130،
vr4300، vr5000، vr5400،
vr5500، xlr و xlp.
مقدار
ویژهٔ from-abi
سازگارترین
معماری را
برای ABI
انتخابشده
برمیگزیند
(یعنی mips1
برای ABIهای
۳۲ بیتی و mips3
برای ABIهای
۶۴ بیتی).
مجموعهابزار بومی Linux/GNU همچنین از مقدار native پشتیبانی میکند، که بهترین گزینهٔ معماری را برای پردازندهٔ میزبان انتخاب میکند. اگر GCC پردازنده را شناسایی نکند، -march=native هیچ تأثیری ندارد.
در نامهای پردازنده، 000 پایانی میتواند به صورت k خلاصه شود (برای مثال، -march=r2k). پیشوندها اختیاری هستند و vr ممکن است به صورت r نوشته شود.
نامهایی با قالب nf2_1 به پردازندههایی با FPUهایی اشاره دارند که با نیمی از فرکانس هسته کار میکنند، نامهایی با قالب nf1_1 به پردازندههایی با FPUهایی اشاره دارند که با همان فرکانس هسته کار میکنند، و نامهایی با قالب nf3_2 به پردازندههایی با FPUهایی اشاره دارند که نسبت فرکانس کلاک آنها با هسته ۳:۲ است. به دلایل سازگاری، nf به عنوان مترادفی برای nf2_1 پذیرفته میشود در حالی که nx و bfx به عنوان مترادفهایی برای nf1_1 پذیرفته میشوند.
کامپایلر GCC بر اساس مقدار این گزینه، دو ماکرو تعریف میکند. ماکروی اول "_MIPS_ARCH" است، که نام معماری هدف را به عنوان یک رشته ارائه میدهد. ماکروی دوم قالبی به صورت "_MIPS_ARCH_foo" دارد، که در آن foo مقدار بزرگنویسیشدهٔ "_MIPS_ARCH" است. برای مثال، -march=r2000 مقدار "_MIPS_ARCH" را روی "r2000" تنظیم کرده و ماکروی "_MIPS_ARCH_R2000" را تعریف میکند.
توجه داشته باشید که ماکروی "_MIPS_ARCH" از نامهای پردازندهٔ ارائهشده در بالا استفاده میکند. به عبارت دیگر، دارای پیشوند کامل بوده و 000 را به صورت k خلاصه نمیکند. در مورد from-abi، این ماکرو نام معماری حلشده (یا "mips1" یا "mips3") را مشخص میسازد. در حالتی که هیچ گزینهٔ -march مشخص نشده باشد، نام معماری پیشفرض را تعیین میکند..IP -mtune=arch 4 برای arch بهینهسازی میکند. در میان موارد دیگر، این گزینه نحوه زمانبندی دستورالعملها و هزینه برآوردشده عملیات حسابی را کنترل میکند. فهرست مقادیر arch مشابه با -march است.
هنگامی که این گزینه استفاده نشود، GCC برای پردازندهای که توسط -march مشخص شده بهینهسازی میکند. با استفاده همزمان از -march و -mtune، میتوان کدی تولید کرد که روی یک خانواده از پردازندهها اجرا شود، اما برای یکی از اعضای خاص آن خانواده بهینهسازی شده باشد.
گزینه -mtune ماکروهای "_MIPS_TUNE" و "_MIPS_TUNE_foo" را تعریف میکند که همانند ماکروهای -march که در بالا توضیح داده شد کار میکنند.
- -mips1
- معادل با -march=mips1 است.
- -mips2
- معادل با -march=mips2 است.
- -mips3
- معادل با -march=mips3 است.
- -mips4
- معادل با -march=mips4 است.
- -mips32
- معادل با -march=mips32 است.
- -mips32r3
- معادل با -march=mips32r3 است.
- -mips32r5
- معادل با -march=mips32r5 است.
- -mips32r6
- معادل با -march=mips32r6 است.
- -mips64
- معادل با -march=mips64 است.
- -mips64r2
- معادل با -march=mips64r2 است.
- -mips64r3
- معادل با -march=mips64r3 است.
- -mips64r5
- معادل با -march=mips64r5 است.
- -mips64r6
- معادل با -march=mips64r6 است.
- -mips16
- -mno-mips16
- کد MIPS16 تولید
میکند
(تولید
نمیکند).
اگر GCC یک
معماری MIPS32 یا
MIPS64 را هدف
قرار دهد،
از MIPS16e ASE
استفاده
میکند.
تولید کد MIPS16 میتواند به ازای هر تابع نیز به وسیله صفتهای "mips16" و "nomips16" کنترل شود.
- -mmips16e2
- -mno-mips16e2
- از MIPS16e2 ASE استفاده میکند (استفاده نمیکند). این گزینه رفتار گزینه -mips16 را به گونهای تغییر میدهد که MIPS16e2 ASE را هدف قرار دهد.
- -mflip-mips16
- تولید کد MIPS16 را به صورت یکدرمیان روی توابع انجام میدهد. این گزینه برای آزمون پسرفت (regression testing) تولید کد ترکیبی MIPS16/غیر-MIPS16 ارائه شده است، و برای استفاده عادی در کامپایل کد کاربر در نظر گرفته نشده است.
- -minterlink-compressed
- -mno-interlink-compressed
- الزام
میکند
(الزام
نمیکند) که
کدهای
استفادهکننده
از MIPS ISA
استاندارد
(فشردهنشده)
از نظر
پیوند با
کدهای MIPS16 و microMIPS
سازگار
باشند، و
بالعکس.
برای مثال، کدی که از کدگذاری ISA استاندارد استفاده میکند نمیتواند مستقیماً به کد MIPS16 یا microMIPS پرش کند؛ بلکه باید از یک فراخوانی یا یک پرش غیرمستقیم استفاده کند. بنابراین -minterlink-compressed پرشهای مستقیم را غیرفعال میکند، مگر اینکه GCC بداند مقصد پرش فشرده نیست.
- -minterlink-mips16
- -mno-interlink-mips16
- نامهای مستعار -minterlink-compressed و -mno-interlink-compressed هستند. این گزینهها پیش از microMIPS ASE وجود داشتهاند و برای سازگاری با گذشته حفظ شدهاند.
- -mabi=32
- -mabi=o64
- -mabi=n32
- -mabi=64
- -mabi=eabi
- برای ABI
دادهشده
کد تولید
میکند.
توجه داشته باشید که EABI دارای یک گونه ۳۲-بیتی و یک گونه ۶۴-بیتی است. GCC به طور معمول هنگام انتخاب یک معماری ۶۴-بیتی، کد ۶۴-بیتی تولید میکند، اما میتوانید به جای آن از -mgp32 برای دریافت کد ۳۲-بیتی استفاده کنید.
برای اطلاعات در مورد O64 ABI، به https://gcc.gnu.org/projects/mipso64-abi.html مراجعه کنید.
GCC از گونهای از o32 ABI پشتیبانی میکند که در آن ثباتهای ممیز شناور به جای ۳۲ بیت، ۶۴ بیت پهنا دارند. میتوانید این ترکیب را با -mabi=32 -mfp64 انتخاب کنید. این ABI به دستورالعملهای "mthc1" و "mfhc1" متکی است و بنابراین فقط برای پردازندههای MIPS32R2، MIPS32R3 و MIPS32R5 پشتیبانی میشود.
تخصیصهای ثبات برای آرگومانها و مقادیر بازگشتی یکسان باقی میماند، اما هر مقدار اسکالر به جای یک جفت ثبات ۳۲-بیتی، در یک ثبات منفرد ۶۴-بیتی ارسال میشود. برای مثال، مقادیر ممیز شناور اسکالر فقط در $f0 بازگردانده میشوند، نه در یک جفت $f0/$f1. مجموعه ثباتهای حفظشده در فراخوانی (call-saved) نیز از این جهت که ثباتهای زوج با دقت مضاعف ذخیره میشوند، یکسان باقی میماند.
دو گونه دیگر از o32 ABI برای امکانپذیر ساختن گذار از ثباتهای ۳۲-بیتی به ۶۴-بیتی پشتیبانی میشوند. اینها FPXX (-mfpxx) و FP64A (-mfp64 -mno-odd-spreg) هستند. افزونه FPXX الزام میکند که همه کدها هنگام اجرا با ثباتهای ۳۲-بیتی یا ۶۴-بیتی باید به درستی اجرا شوند. این کد میتواند با FP32 یا FP64 پیوند متقابل داشته باشد، اما نه با هر دو. افزونه FP64A شبیه به افزونه FP64 است اما استفاده از ثباتهای دقت منفرد فرد را ممنوع میکند. این گزینه میتواند در کنار حالت "FRE" در FPUهای پردازندههای MIPS32R5 استفاده شود و به هر دو کد FP32 و FP64A اجازه میدهد بدون تغییر حالتهای FPU، در یک فرایند پیوند یافته و اجرا شوند.
- -mabicalls
- -mno-abicalls
- کدی مناسب برای شیءهای پویا به سبک SVR4 تولید میکند (تولید نمیکند). گزینه -mabicalls پیشفرض برای سیستمهای مبتنی بر SVR4 است.
- -mno-shared
- کدی تولید
میکند
(تولید
نمیکند) که
کاملاً
مستقل از
موقعیت (position-independent)
است، و
بنابراین
میتواند
در
کتابخانههای
مشترک
پیوند داده
شود. این
گزینه فقط
بر -mabicalls اثر
میگذارد.
تمام کدهای -mabicalls به طور سنتی، صرفنظر از گزینههایی مانند -fPIC و -fpic، مستقل از موقعیت بودهاند. با این حال، به عنوان یک افزونه، زنجیره ابزار GNU به فایلهای اجرایی اجازه میدهد از دسترسیهای مطلق برای نمادهای با پیوند محلی استفاده کنند. همچنین میتواند از دنبالههای کوتاهتر مقداردهی اولیه GP استفاده کرده و فراخوانیهای مستقیم به توابع با تعریف محلی تولید کند. این حالت توسط -mno-shared انتخاب میشود.
گزینه -mno-shared به binutils نسخه 2.16 یا بالاتر وابسته است و شیءهایی تولید میکند که فقط توسط پیونددهنده GNU میتوانند پیوند داده شوند. با این حال، این گزینه بر ABI فایل اجرایی نهایی تأثیری ندارد؛ بلکه فقط بر ABI شیءهای بازآدرسپذیر تأثیر میگذارد. استفاده از -mno-shared عموماً فایلهای اجرایی را هم کوچکتر و هم سریعتر میکند.
گزینه -mshared پیشفرض است..IP -mplt 4
- -mno-plt
- فرض کردن
(یا فرض
نکردن)
اینکه
پیونددهندههای
ایستا و
پویا از PLTها
و
بازنشانیهای
کپی (copy relocations)
پشتیبانی
میکنند.
این گزینه
تنها بر -mno-shared
-mabicalls تأثیر
میگذارد.
برای n64 ABI، این
گزینه بدون
-msym32 هیچ
تأثیری
ندارد.
میتوانید با پیکربندی GCC با --with-mips-plt، گزینهٔ -mplt را پیشفرض کنید. در غیر این صورت، پیشفرض -mno-plt است.
- -mxgot
- -mno-xgot
- برداشتن (یا
برنداشتن)
محدودیتهای
معمول روی
اندازهٔ
جدول آفست
سراسری (GOT).
کامپایلر GCC معمولاً از یک تکدستورالعمل برای بارگذاری مقادیر از GOT استفاده میکند. اگرچه این کار نسبتاً کارآمد است، اما تنها زمانی کار میکند که GOT کوچکتر از حدود 64k باشد. هر اندازهای بزرگتر از آن باعث میشود پیونددهنده خطایی مانند زیر گزارش کند:
relocation truncated to fit: R_MIPS_GOT16 foobar
اگر این اتفاق رخ داد، باید کد خود را با -mxgot دوباره کامپایل کنید. این گزینه با GOTهای بسیار بزرگ کار میکند، گرچه کد تولیدی کارایی کمتری دارد، زیرا برای واکشی مقدار یک نماد سراسری به سه دستورالعمل نیاز است.
توجه داشته باشید که برخی پیونددهندهها میتوانند چندین GOT ایجاد کنند. اگر از چنین پیونددهندهای استفاده میکنید، تنها زمانی باید از -mxgot استفاده کنید که یک فایل شیء (object file) منفرد به بیش از 64k ورودی GOT دسترسی داشته باشد، که این مورد بسیار نادر است.
این گزینهها هیچ تأثیری ندارند مگر اینکه GCC در حال تولید کد مستقل از موقعیت باشد.
- -mgp32
- فرض کردن اینکه پهنای ثباتهای همهمنظوره ۳۲ بیت است.
- -mgp64
- فرض کردن اینکه پهنای ثباتهای همهمنظوره ۶۴ بیت است.
- -mfp32
- فرض کردن اینکه پهنای ثباتهای ممیز شناور ۳۲ بیت است.
- -mfp64
- فرض کردن اینکه پهنای ثباتهای ممیز شناور ۶۴ بیت است.
- -mfpxx
- در نظر نگرفتن هیچ پیشفرضی دربارهٔ پهنای ثباتهای ممیز شناور.
- -mhard-float
- استفاده از دستورالعملهای پردازندهٔ کمکی ممیز شناور.
- -msoft-float
- عدم استفاده از دستورالعملهای پردازندهٔ کمکی ممیز شناور. در عوض، پیادهسازی محاسبات ممیز شناور با استفاده از فراخوانیهای کتابخانهای انجام میشود.
- -mno-float
- معادل با -msoft-float، اما همچنین تضمین میکند برنامهٔ در حال کامپایل هیچگونه عملیات ممیز شناوری انجام ندهد. این گزینه در حال حاضر تنها در برخی پیکربندیهای MIPS برهنه (bare-metal) پشتیبانی میشود، جایی که ممکن است مجموعهٔ ویژهای از کتابخانهها را انتخاب کند که فاقد هرگونه پشتیبانی ممیز شناور هستند (برای نمونه، قالبهای ممیز شناور در "printf"). اگر کدی که با -mno-float کامپایل شده است به طور تصادفی شامل عملیات ممیز شناور باشد، احتمالاً در زمان پیوند یا زمان اجرا با شکست مواجه خواهد شد.
- -msingle-float
- فرض کردن اینکه پردازندهٔ کمکی ممیز شناور تنها از عملیات با دقت یگانه (single-precision) پشتیبانی میکند.
- -mdouble-float
- فرض کردن اینکه پردازندهٔ کمکی ممیز شناور از عملیات با دقت مضاعف (double-precision) پشتیبانی میکند. این پیشفرض است.
- -modd-spreg
- -mno-odd-spreg
- فعال کردن استفاده از ثباتهای ممیز شناور دقت یگانه با شمارههای فرد برای o32 ABI. این گزینه برای پردازندههایی که مشخصاً از این ثباتها پشتیبانی میکنند پیشفرض است. هنگام استفاده از o32 FPXX ABI، گزینهٔ -mno-odd-spreg به صورت پیشفرض فعال است.
- -mabs=2008
- -mabs=legacy
- این
گزینهها
نحوهٔ
رفتار با
دادههای
ممیز شناور
ویژهٔ
غیرعدد (NaN) در
IEEE 754 را توسط
دستورالعملهای
ماشینی
"abs.fmt"
و
"neg.fmt"
کنترل
میکنند.
به طور پیشفرض یا زمانی که از -mabs=legacy استفاده میشود، رفتار موروثی (legacy) انتخاب میشود. در این حالت این دستورالعملها حسابی در نظر گرفته میشوند و در جاهایی که عملکرد صحیح نیاز است و عملوند ورودی ممکن است یک NaN باشد، از آنها اجتناب میشود. در عوض توالی طولانیتری از دستورالعملها که بیت علامت دادهٔ ممیز شناور را به صورت دستی تغییر میدهند استفاده میشود، مگر اینکه گزینهٔ -ffinite-math-only نیز مشخص شده باشد.
گزینهٔ -mabs=2008 رفتار IEEE 754-2008 را انتخاب میکند. در این حالت این دستورالعملها غیرحسابی تلقی میشوند و بنابراین در تمام شرایط، از جمله بهویژه زمانی که عملوند ورودی یک NaN باشد، به درستی عمل میکنند. در نتیجه این دستورالعملها همواره برای عملیات مربوطه استفاده میشوند.
- -mnan=2008
- -mnan=legacy
- این
گزینهها
کدگذاری
دادههای
ممیز شناور
ویژهٔ
غیرعدد (NaN) در
IEEE 754 را کنترل
میکنند.
گزینهٔ -mnan=legacy کدگذاری موروثی را انتخاب میکند. در این حالت، NaNهای ساکت (qNaNs) با 0 بودن بیت اول فیلد معنادار انتهایی (trailing significand) نشان داده میشوند، در حالی که NaNهای علامتدهنده (sNaNs) با 1 بودن اولین بیت فیلد معنادار انتهایی مشخص میشوند.
گزینهٔ -mnan=2008 کدگذاری IEEE 754-2008 را انتخاب میکند. در این حالت، qNaNها با 1 بودن بیت اول فیلد معنادار انتهایی و sNaNها با 0 بودن اولین بیت فیلد معنادار انتهایی مشخص میگردند.
پیشفرض -mnan=legacy است، مگر اینکه GCC با --with-nan=2008 پیکربندی شده باشد.
- -mllsc
- -mno-llsc
- استفاده از
(یا عدم
استفاده از)
دستورالعملهای
ll، sc و sync
برای
پیادهسازی
توابع
توکار
حافظهٔ
اتمیک. اگر
هیچیک از
این
گزینهها
مشخص نشود،
چنانچه
معماری
مقصد از این
دستورالعملها
پشتیبانی
کند، GCC از
آنها
استفاده
خواهد کرد.
-mllsc در مواردی مفید است که محیط زمان اجرا بتواند این دستورالعملها را شبیهسازی کند، و -mno-llsc میتواند هنگام کامپایل برای ISAهای غیراستاندارد کاربرد داشته باشد. شما میتوانید با پیکربندی GCC به ترتیب با --with-llsc و --without-llsc هر یک از این گزینهها را به صورت پیشفرض درآورید. --with-llsc در برخی پیکربندیها پیشفرض است؛ برای جزئیات بیشتر به مستندات نصب مراجعه کنید.
- -mdsp
- -mno-dsp
- استفاده از (یا عدم استفاده از) نگارش ۱ افزونهٔ MIPS DSP ASE. این گزینه ماکروی پیشپردازندهٔ "__mips_dsp" را تعریف میکند. همچنین "__mips_dsp_rev" را برابر با 1 تعریف میکند.
- -mdspr2
- -mno-dspr2
- استفاده از (یا عدم استفاده از) نگارش ۲ افزونهٔ MIPS DSP ASE. این گزینه ماکروهای پیشپردازندهٔ "__mips_dsp" و "__mips_dspr2" را تعریف میکند. همچنین "__mips_dsp_rev" را برابر با 2 قرار میدهد.
- -msmartmips
- -mno-smartmips
- استفاده از (یا عدم استفاده از) MIPS SmartMIPS ASE.
- -mpaired-single
- -mno-paired-single
- استفاده از (یا عدم استفاده از) دستورالعملهای ممیز شناور paired-single. این گزینه نیازمند فعال بودن پشتیبانی سختافزاری از ممیز شناور است.
- -mdmx
- -mno-mdmx
- استفاده از (یا عدم استفاده از) دستورالعملهای MIPS Digital Media Extension. این گزینه فقط هنگام تولید کد ۶۴-بیتی قابل استفاده است و نیازمند فعال بودن پشتیبانی سختافزاری از ممیز شناور است.
- -mips3d
- -mno-mips3d
- استفاده از (یا عدم استفاده از) MIPS-3D ASE. گزینهٔ -mips3d مستلزم -mpaired-single است.
- -mmicromips
- -mno-micromips
- تولید (یا
عدم تولید)
کد microMIPS.
تولید کد MicroMIPS همچنین میتواند بر پایهٔ هر تابع بهطور جداگانه از طریق مشخصههای "micromips" و "nomicromips" کنترل شود.
- -mmt
- -mno-mt
- استفاده از (یا عدم استفاده از) دستورالعملهای چندنخی MT Multithreading.
- -mmcu
- -mno-mcu
- استفاده از (یا عدم استفاده از) دستورالعملهای MIPS MCU ASE.
- -meva
- -mno-eva
- استفاده از (یا عدم استفاده از) دستورالعملهای MIPS Enhanced Virtual Addressing.
- -mvirt
- -mno-virt
- استفاده از (یا عدم استفاده از) دستورالعملهای مجازیسازی MIPS Virtualization (VZ).
- -mxpa
- -mno-xpa
- استفاده از (یا عدم استفاده از) دستورالعملهای MIPS eXtended Physical Address (XPA).
- -mcrc
- -mno-crc
- استفاده از (یا عدم استفاده از) دستورالعملهای MIPS Cyclic Redundancy Check (CRC).
- -mginv
- -mno-ginv
- استفاده از (یا عدم استفاده از) دستورالعملهای MIPS Global INValidate (GINV).
- -mloongson-mmi
- -mno-loongson-mmi
- استفاده از (یا عدم استفاده از) دستورالعملهای چندرسانهای MIPS Loongson MultiMedia extensions Instructions (MMI).
- -mloongson-ext
- -mno-loongson-ext
- استفاده از (یا عدم استفاده از) دستورالعملهای MIPS Loongson EXTensions (EXT).
- -mloongson-ext2
- -mno-loongson-ext2
- استفاده از (یا عدم استفاده از) دستورالعملهای MIPS Loongson EXTensions r2 (EXT2).
- -mlong64
- اجبار انواع "long" به داشتن اندازهٔ ۶۴ بیتی. برای توضیح حالت پیشفرض و چگونگی تعیین اندازهٔ اشارهگرها، به -mlong32 مراجعه کنید.
- -mlong32
- اجبار
انواع
"long"،
"int" و
اشارهگر
به داشتن
اندازهٔ ۳۲
بیتی.
اندازهٔ پیشفرض "int"ها، "long"ها و اشارهگرها به ABI بستگی دارد. همهٔ ABIهای پشتیبانیشده از "int"های ۳۲-بیتی استفاده میکنند. ABI با نام n64 از "long"های ۶۴-بیتی استفاده میکند، مانند EABI ۶۴-بیتی؛ بقیه از "long"های ۳۲-بیتی استفاده میکنند. اشارهگرها هماندازه با "long"ها یا هماندازه با ثباتهای عدد صحیح (integer registers) هستند، هر کدام که کوچکتر باشد.
- -msym32
- -mno-sym32
- فرض کردن (یا عدم فرض) این که همهٔ نمادها صرفنظر از ABI انتخابشده دارای مقادیر ۳۲-بیتی هستند. این گزینه در ترکیب با -mabi=64 و -mno-abicalls مفید است زیرا به GCC اجازه میدهد ارجاعهای کوتاهتر و سریعتری به آدرسهای نمادین ایجاد کند.
- -G num
- قرار دادن
تعاریف
دادههای
با دید
بیرونی (externally-visible)
در یک بخش
دادههای
کوچک (small data section) در
صورتی که آن
دادهها
بزرگتر از
num بایت
نباشند. در
این حالت GCC
میتواند
دسترسیهای
کارآمدتری
به دادهها
تولید کند؛
برای
جزئیات به
-mgpopt مراجعه
کنید.
گزینهٔ -G پیشفرض به پیکربندی بستگی دارد.
- -mlocal-sdata
- -mno-local-sdata
- گسترش دادن
(یا ندادن)
رفتار -G به
دادههای
محلی،
مانند
متغیرهای static
در C. گزینهٔ
-mlocal-sdata در تمام
پیکربندیها
حالت
پیشفرض
است.
اگر پیونددهنده هشدار دهد که برنامه بیش از اندازه از دادههای کوچک استفاده میکند، میتوانید بازسازی بخشهایی را که از نظر کارایی کمتر حیاتی هستند با -mno-local-sdata امتحان کنید. همچنین ممکن است بخواهید کتابخانههای بزرگ را با -mno-local-sdata بسازید تا کتابخانهها فضای بیشتری برای برنامهٔ اصلی باقی بگذارند.
- -mextern-sdata
- -mno-extern-sdata
- فرض کردن
(یا عدم فرض)
این که
دادههای
با تعریف
بیرونی (externally-defined)
در صورت
قرار داشتن
اندازهشان
درون
محدودهٔ -G،
در یک بخش
دادههای
کوچک قرار
دارند. -mextern-sdata
برای تمام
پیکربندیها
حالت
پیشفرض
است.
اگر پودمان Mod را با -mextern-sdata -G num -mgpopt کامپایل کنید، و Mod به متغیر Var که بزرگتر از num بایت نیست ارجاع دهد، باید مطمئن شوید که Var در یک بخش دادههای کوچک قرار گرفته است. اگر Var توسط پودمان دیگری تعریف شده است، باید آن پودمان را یا با تنظیم -G بهاندازهٔ کافی بزرگ کامپایل کنید یا مشخصهٔ "section" را به تعریف Var ضمیمه نمایید. اگر Var مشترک (common) است، باید برنامه را با تنظیم -G بهاندازهٔ کافی بزرگ پیوند دهید.
سادهترین راه برای برآورده کردن این محدودیتها، کامپایل و پیوند دادن همهٔ پودمانها با گزینهٔ یکسان -G است. با این حال، ممکن است بخواهید کتابخانهای بسازید که از چندین حد مختلف دادههای کوچک پشتیبانی کند. میتوانید این کار را با کامپایل کتابخانه با بالاترین حد پشتیبانیشدهٔ -G و علاوهبر آن استفاده از -mno-extern-sdata برای جلوگیری از فرض کتابخانه دربارهٔ دادههای با تعریف بیرونی انجام دهید..IP -mgpopt 4
- -mno-gpopt
- استفاده
(عدم
استفاده) از
دسترسیهای
وابسته به GP
برای
نمادهایی
که مشخص است
در بخش
دادههای
کوچک (small data)
قرار
دارند؛
گزینههای
-G، -mlocal-sdata و -mextern-sdata
را ببینید.
گزینهٔ -mgpopt
پیشفرض
تمام
پیکربندیها
است.
گزینهٔ -mno-gpopt برای مواردی مفید است که رجیستر $gp ممکن است حاوی مقدار "_gp" نباشد. برای نمونه، اگر کد بخشی از کتابخانهای باشد که ممکن است در یک پایشگر راهاندازی (boot monitor) استفاده شود، برنامههایی که توابع پایشگر راهاندازی را فراخوانی میکنند مقداری نامشخص در $gp ارسال میکنند. (در چنین شرایطی، خودِ پایشگر راهاندازی معمولاً با -G0 کامپایل میشود.)
گزینهٔ -mno-gpopt مستلزم گزینههای -mno-local-sdata و -mno-extern-sdata است.
- -membedded-data
- -mno-embedded-data
- تخصیص متغیرها در صورت امکان ابتدا در بخش دادههای فقطخواندنی (read-only data section)، سپس در صورت امکان در بخش دادههای کوچک، و در غیر این صورت در بخش data. این کار کدی اندکی کُندتر از حالت پیشفرض تولید میکند، اما میزان RAM مورد نیاز هنگام اجرا را کاهش میدهد، و بنابراین ممکن است برای برخی از سامانههای تعبیهشده (embedded) ترجیح داده شود.
- -muninit-const-in-rodata
- -mno-uninit-const-in-rodata
- قرار دادن متغیرهای مقداردهینشدهٔ "const" در بخش دادههای فقطخواندنی. این گزینه تنها همراه با -membedded-data معنا دارد.
- -mcode-readable=setting
- مشخص میکند که آیا GCC مجاز است کدی تولید کند که از بخشهای قابلاجرا بخواند یا خیر. سه مقدار ممکن برای این تنظیم وجود دارد:
- -mcode-readable=yes
- دستورالعملها آزادند به بخشهای قابلاجرا دسترسی پیدا کنند. این تنظیمِ پیشفرض است.
- -mcode-readable=pcrel
- دستورالعملهای بارگذاری وابسته به PC در MIPS16 میتوانند به بخشهای قابلاجرا دسترسی داشته باشند، اما سایر دستورالعملها نباید چنین کنند. این گزینه روی پردازندههای 4KSc و 4KSd هنگامی که بیت Read Inhibit در TLBهای کد تنظیم شده باشد مفید است. همچنین روی پردازندههایی که میتوان آنها را برای داشتن رابط دوگانهٔ SRAM دستورالعمل/داده پیکربندی کرد و مانند M4K، بارگذاریهای وابسته به PC را بهطور خودکار به RAM دستورالعمل هدایت میکنند، کاربرد دارد.
- -mcode-readable=no
- دستورالعملها نباید به بخشهای قابلاجرا دسترسی داشته باشند. این گزینه میتواند در مقصدهایی مفید باشد که برای داشتن رابط دوگانهٔ SRAM دستورالعمل/داده پیکربندی شدهاند، اما (برخلاف M4K) بارگذاریهای وابسته به PC را بهطور خودکار به RAM دستورالعمل هدایت نمیکنند.
- -msplit-addresses
- -mno-split-addresses
- فعالسازی (غیرفعالسازی) استفاده از عملگرهای بازآرایی (relocation) اسمبلی %hi() و %lo(). این گزینه با -mexplicit-relocs جایگزین شده است، اما برای سازگاری با نسخههای پیشین حفظ شده است.
- -mexplicit-relocs=none
- -mexplicit-relocs=base
- -mexplicit-relocs=pcrel
- -mexplicit-relocs
- -mno-explicit-relocs
- این
گزینهها
استفاده از
بازآراییهای
صریح (مانند
%gp_rel) را
کنترل
میکنند.
مقدار
پیشفرض به
نسخهٔ GAS در
زمان
ساختهشدن
خودِ GCC
بستگی دارد.
پشتیبانی از بازآراییهای صریح "base" در سال 2001 به GAS اضافه شد. پشتیبانی از بازآراییهای صریح "pcrel" در سال 2014 به GAS اضافه شد که از %pcrel_hi و %pcrel_lo پشتیبانی میکند.
- -mcheck-zero-division
- -mno-check-zero-division
- ایجاد (عدم
ایجاد) تله (trap)
هنگام
تقسیم عدد
صحیح بر
صفر.
پیشفرض -mcheck-zero-division است.
- -mdivide-traps
- -mdivide-breaks
- سامانههای
MIPS تقسیم بر
صفر را با
تولید یک
تلهٔ شرطی
یا یک
دستورالعمل
break بررسی
میکنند.
استفاده از
trap منجر به
تولید کد
کوچکتری
میشود،
اما تنها در
MIPS II و
نسخههای
پس از آن
پشتیبانی
میشود.
همچنین،
برخی از
نسخههای
هستهٔ
لینوکس
دارای باگی
هستند که
مانع از
تولید
سیگنال
مناسب
("SIGFPE")
توسط تله
میشود.
برای مجاز
کردن
تلههای
شرطی روی
معماریهایی
که از آنها
پشتیبانی
میکنند از
-mdivide-traps و برای
اجبار به
استفاده از
breakها از -mdivide-breaks
استفاده
کنید.
پیشفرض معمولاً -mdivide-traps است، اما میتوان در زمان پیکربندی با استفاده از --with-divide=breaks آن را تغییر داد. بررسیهای تقسیم بر صفر را میتوان با استفاده از -mno-check-zero-division بهطور کامل غیرفعال کرد.
- -mload-store-pairs
- -mno-load-store-pairs
- فعالسازی (غیرفعالسازی) بهینهسازیای که دستورالعملهای متوالی بارگذاری (load) یا ذخیرهسازی (store) را جفت میکند تا پیوند بارگذاری/ذخیرهسازی (load/store bonding) فعال شود. این گزینه بهطور پیشفرض فعال است اما تنها زمانی اعمال میشود که مشخص باشد معماری انتخابشده از پیوند (bonding) پشتیبانی میکند.
- -mstrict-align
- -mno-strict-align
- -munaligned-access
- -mno-unaligned-access
- غیرفعالسازی (فعالسازی) دسترسی مستقیم ترازنشده (unaligned access) برای MIPS Release 6. معماری MIPSr6 به پشتیبانی از دسترسی ترازنشده برای بارگذاری/ذخیرهسازی نیاز دارد، چه توسط سختافزار یا از طریق trap&emulate. بنابراین ممکن است هسته به -mstrict-align نیاز داشته باشد. گزینههای -munaligned-access و -mno-unaligned-access منسوخ شدهاند و صرفاً برای سازگاری با گذشته هستند.
- -mmemcpy
- -mno-memcpy
- اجبار (عدم اجبار) به استفاده از "memcpy" برای جابهجاییهای بلوکیِ غیرجزئی. پیشفرض -mno-memcpy است که به GCC اجازه میدهد بیشتر کپیهای با اندازهٔ ثابت را درونخطی (inline) کند.
- -mlong-calls
- -mno-long-calls
- غیرفعالسازی
(عدم
غیرفعالسازی)
استفاده از
دستورالعمل
"jal".
فراخوانی
توابع با
استفاده از
"jal"
کارآمدتر
است اما
نیازمند آن
است که
فراخواننده
(caller) و
فراخواندهشده
(callee) در یک
بخشِ (segment)
یکسانِ 256
مگابایتی
قرار داشته
باشند.
این گزینه هیچ تأثیری بر کدهای abicalls ندارد. پیشفرض -mno-long-calls است.
- -mmad
- -mno-mad
- فعالسازی (غیرفعالسازی) استفاده از دستورالعملهای "mad"، "madu" و "mul"، به شکلی که توسط ISA پردازندهٔ R4650 ارائه شده است.
- -mimadd
- -mno-imadd
- فعالسازی (غیرفعالسازی) استفاده از دستورالعملهای اعداد صحیح "madd" و "msub". پیشفرض روی معماریهایی که از "madd" و "msub" پشتیبانی میکنند -mimadd است، بهجز در معماری 74k که مشخص شد در آن کدی کُندتر تولید میکند..IP -mfused-madd 4
- -mno-fused-madd
- استفاده از
دستورالعملهای
ضرب-انباشت
(multiply-accumulate) ممیز
شناور را در
صورت در
دسترس
بودن، فعال
(یا
غیرفعال)
میکند.
پیشفرض
-mfused-madd است.
روی پردازندهٔ R8000 هنگام استفاده از دستورالعملهای ضرب-انباشت، حاصلضرب میانی با دقت نامحدود محاسبه میشود و تابع بیت FCSR Flush to Zero نیست. این امر ممکن است در برخی شرایط نامطلوب باشد. در پردازندههای دیگر، نتیجه از نظر عددی با محاسبهٔ معادل با استفاده از دستورالعملهای جداگانهٔ ضرب، جمع، تفریق و نقیض یکسان است.
- -nocpp
- به اسمبلر MIPS میگوید هنگام اسمبل کردن فایلهای اسمبلی کاربر (با پسوند .s)، پیشپردازندهٔ خود را روی آنها اجرا نکند.
- -mfix-24k
- -mno-fix-24k
- خطای سختافزاری 24K E48 (از دست رفتن داده در ذخیرهسازیها هنگام بازپُر کردن) را دور میزند. این راهحلها بهجای GCC توسط اسمبلر پیادهسازی میشوند.
- -mfix-r4000
- -mno-fix-r4000
- برخی خطاهای سختافزاری پردازندهٔ R4000 را دور میزند:
- یک تغییر مکان (shift) کلمهٔ مضاعف یا متغیر، در صورتی که بلافاصله پس از شروع یک تقسیم عدد صحیح اجرا شود، ممکن است نتیجهٔ نادرستی تولید کند.
- یک تغییر مکان کلمهٔ مضاعف یا متغیر، در صورتی که در حین انجام یک ضرب عدد صحیح اجرا شود، ممکن است نتیجهٔ نادرستی تولید کند.
- یک تقسیم عدد صحیح در صورتی که در شکاف تاخیر (delay slot) یک انشعاب محققشده یا یک پرش آغاز شود، ممکن است نتیجهٔ نادرستی تولید کند.
- -mfix-r4400
- -mno-fix-r4400
- برخی خطاهای سختافزاری پردازندهٔ R4400 را دور میزند:
- -
- یک تغییر مکان کلمهٔ مضاعف یا متغیر، در صورتی که بلافاصله پس از شروع یک تقسیم عدد صحیح اجرا شود، ممکن است نتیجهٔ نادرستی تولید کند.
- -mfix-r10000
- -mno-fix-r10000
- برخی خطاهای سختافزاری R10000 را دور میزند:
- -
- توالیهای "ll"/"sc" ممکن است در بازبینیهای پیش از 3.0 رفتار اتمیک نداشته باشند. آنها در بازبینیهای 2.6 و قدیمیتر ممکن است دچار بنبست شوند.
این گزینه تنها زمانی قابل استفاده است که معماری هدف از دستورالعملهای branch-likely پشتیبانی کند. هنگام استفاده از -march=r10000، گزینهٔ -mfix-r10000 پیشفرض است؛ در غیر این صورت پیشفرض -mno-fix-r10000 خواهد بود.
- -mfix-r5900
- -mno-fix-r5900
- تلاشی برای زمانبندی دستورالعمل قبلی در شکاف تاخیر یک دستورالعمل انشعاب که در انتهای یک حلقهٔ کوتاه با شش یا کمتر از شش دستورالعمل قرار دارد انجام نمیدهد و در عوض همواره یک دستورالعمل "nop" را در آنجا زمانبندی میکند. باگ حلقهٔ کوتاه تحت شرایط خاصی به دلیل یک نقص سختافزاری در تراشهٔ R5900، باعث میشود حلقهها تنها یک یا دو بار اجرا شوند. این راهحل بهجای GCC توسط اسمبلر پیادهسازی میشود.
- -mfix-rm7000
- -mno-fix-rm7000
- خطاهای سختافزاری "dmult"/"dmultu" در RM7000 را دور میزند. این راهحلها بهجای GCC توسط اسمبلر پیادهسازی میشوند.
- -mfix-vr4120
- -mno-fix-vr4120
- برخی خطاهای سختافزاری VR4120 را دور میزند:
- دستور "dmultu" همیشه نتیجهٔ صحیح تولید نمیکند.
- دستورهای "div" و "ddiv" اگر یکی از عملوندها منفی باشد، همیشه نتیجهٔ صحیح تولید نمیکنند.
راهحلها برای خطاهای سختافزاری تقسیم به توابع ویژهای در libgcc.a وابسته هستند. در حال حاضر، این توابع فقط توسط پیکربندیهای "mips64vr*-elf" ارائه میشوند.
سایر خطاهای سختافزاری VR4120 مستلزم درج یک NOP میان جفتهای خاصی از دستورالعملها هستند. این خطاها توسط اسمبلر مدیریت میشوند، نه خود GCC.
- -mfix-vr4130
- خطاهای سختافزاری "mflo"/"mfhi" در VR4130 را دور میزند. این راهحلها بهجای GCC توسط اسمبلر پیادهسازی میشوند، هرچند اگر دستورالعملهای "macc"، "macchi"، "dmacc" و "dmacchi" در VR4130 در دسترس باشند، GCC از استفاده از "mflo" و "mfhi" خودداری میکند.
- -mfix-sb1
- -mno-fix-sb1
- برخی خطاهای سختافزاری هستهٔ پردازندهٔ SB-1 را دور میزند. (این پرچم در حال حاضر خطاهای سختافزاری ممیز شناور «F1» و «F2» در بازبینی ۲ پردازندهٔ SB-1 را دور میزند.)
- -mr10k-cache-barrier=setting
- مشخص
میکند که
آیا GCC باید
برای
جلوگیری از
عوارض
جانبی
اجرای
گمانهزنانه
(speculation) در
پردازندههای
R10K،
مانعهای
حافظهٔ
نهان (cache barriers) را
درج کند یا
خیر.
مشابه بسیاری از پردازندهها، R10K تلاش میکند نتیجهٔ یک انشعاب شرطی را پیشبینی کند و دستورالعملهای شاخهٔ اتخاذشده را بهصورت گمانهزنانه اجرا نماید. در صورتی که نتیجهٔ پیشبینیشده نادرست باشد، پردازنده بعداً این دستورالعملها را لغو میکند. با این حال، در R10K حتی دستورالعملهای لغوشده نیز میتوانند عوارض جانبی داشته باشند.
این مشکل تنها بر ذخیرهسازیهای هسته و بسته به سیستم، بر بارگذاریهای هسته تأثیر میگذارد. به عنوان مثال، یک ذخیرهسازی که بهصورت گمانهزنانه اجرا شده است ممکن است حافظهٔ مقصد را در حافظهٔ نهان بارگذاری کند و خط حافظهٔ نهان را به عنوان تغییریافته (dirty) علامت بزند، حتی اگر خودِ عملیات ذخیره بعداً لغو شود. اگر یک عملیات DMA پیش از تخلیه شدن خط «dirty» روی همان ناحیه از حافظه بنویسد، دادههای موجود در حافظهٔ نهان، دادههای نوشتهشده توسط DMA را بازنویسی خواهند کرد. برای توضیحات کامل، از جمله سایر مشکلات احتمالی، به دفترچهٔ راهنمای پردازندهٔ R10K مراجعه کنید.
یکی از راهحلها درج دستورالعملهای مانع حافظهٔ نهان پیش از هر دسترسی به حافظه است که ممکن است بهصورت گمانهزنانه اجرا شود و حتی در صورت لغو شدن نیز عوارض جانبی داشته باشد. گزینهٔ -mr10k-cache-barrier=setting پیادهسازی این راهحل توسط GCC را کنترل میکند. این گزینه فرض میکند دسترسیهای لغوشده به هر بایتی در نواحی زیر فاقد عوارض جانبی است:
- 1.
- حافظهٔ اشغالشده توسط فریم پشتهٔ تابع جاری؛
- 2.
- حافظهٔ اشغالشده توسط یک آرگومان ورودی پشته؛
- 3.
- حافظهٔ اشغالشده توسط شیئی با آدرس ثابت در زمان پیوند (link-time-constant).
اطمینان از ایمن بودن دسترسیهای گمانهزنانه به این نواحی بر عهدهٔ هسته است.
اگر
برنامهٔ
ورودی شامل
اعلان
تابعی
مانند زیر
باشد: void foo (void);
آنگاه پیادهسازی "foo" باید به "j foo" و "jal foo" اجازه دهد که بهصورت حدسی اجرا شوند. GCC این محدودیت را برای توابعی که خودش کامپایل میکند رعایت مینماید. این کامپایلر انتظار دارد توابع غیر GCC (مانند کدهای اسمبلی دستنویس) نیز همین کار را انجام دهند.
این گزینه دارای سه حالت است:
- -mr10k-cache-barrier=load-store
- درج یک حائل حافظه موقت (cache barrier) پیش از عملیات load یا store که ممکن است بهصورت حدسی اجرا شود و حتی در صورت لغو شدن نیز اثرات جانبی داشته باشد.
- -mr10k-cache-barrier=store
- درج یک حائل حافظه موقت پیش از عملیات store که ممکن است بهصورت حدسی اجرا شود و حتی در صورت لغو شدن نیز اثرات جانبی داشته باشد.
- -mr10k-cache-barrier=none
- غیرفعال کردن درج حائلهای حافظه موقت. این مقدار پیشفرض است.
- -mflush-func=func
- -mno-flush-func
- تابعی را برای فراخوانی جهت تخلیه حافظههای موقت I و D مشخص میکند، یا تعیین میکند که هیچ تابعی فراخوانی نشود. در صورت فراخوانی، تابع باید همان آرگومانهای تابع متداول "_flush_func" را بپذیرد، یعنی نشانی محدوده حافظهای که حافظه موقت آن تخلیه میشود، اندازه محدوده حافظه، و عدد ۳ (برای تخلیه هر دو حافظه موقت). مقدار پیشفرض به مقصدی که GCC برای آن پیکربندی شده بستگی دارد، اما معمولاً "_flush_func" یا "__cpu_flush" است.
- -mbranch-cost=num
- تنظیم هزینه پرشها تقریباً برابر با num دستورالعمل «ساده». این هزینه صرفاً یک تقریب (heuristic) است و تضمینی برای ایجاد نتایج یکسان در نگارشهای مختلف وجود ندارد. هزینه صفر بهطور اضافی مقدار پیشفرض را که بر اساس تنظیمات -mtune است انتخاب میکند.
- -mbranch-likely
- -mno-branch-likely
- فعال یا غیرفعال کردن استفاده از دستورالعملهای Branch Likely، صرفنظر از پیشفرض معماری انتخابشده. بهطور پیشفرض، اگر دستورالعملهای Branch Likely توسط معماری انتخابشده پشتیبانی شوند، ممکن است تولید شوند. یک استثنا برای معماریهای MIPS32 و MIPS64 و پردازندههایی است که این معماریها را پیادهسازی میکنند؛ برای آنها، دستورالعملهای Branch Likely بهطور پیشفرض تولید نمیشوند، زیرا معماریهای MIPS32 و MIPS64 صراحتاً استفاده از آنها را منسوخ اعلام کردهاند.
- -mcompact-branches=never
- -mcompact-branches=optimal
- -mcompact-branches=always
- این
گزینهها
شکل
پرشهای
تولیدی را
کنترل
میکنند.
مقدار
پیشفرض
-mcompact-branches=optimal است.
گزینه -mcompact-branches=never تضمین میکند که دستورالعملهای پرش فشرده هرگز تولید نشوند.
گزینه -mcompact-branches=always تضمین میکند که در صورت موجود بودن برای MIPS Release 6 به بعد، یک دستورالعمل پرش فشرده تولید شود. اگر دستورالعمل پرش فشرده در دسترس نباشد (یا در نسخههای پیش از R6)، بهجای آن شکلی از پرش با شکاف تأخیر (delay slot) استفاده خواهد شد.
اگر برای مقصدهای MIPS16/microMIPS استفاده شود، در حال حاضر نادیده گرفته خواهد شد. رفتار برای MIPS16/microMIPS ممکن است در آینده تغییر کند، چرا که آنها دارای برخی دستورالعملهای پرش فشرده هستند.
گزینه -mcompact-branches=optimal باعث میشود در صورتی که یک پرش با شکاف تأخیر در ISA فعلی موجود بوده و شکاف تأخیر با موفقیت پر شود، از آن استفاده گردد. اگر شکاف تأخیر پر نشود، در صورت موجود بودن، یک پرش فشرده انتخاب خواهد شد.
- -mfp-exceptions
- -mno-fp-exceptions
- مشخص
میکند که
آیا
استثناهای
ممیز شناور
(FP exceptions) فعال
هستند یا
خیر. این
گزینه بر
نحوه
زمانبندی
دستورالعملهای
FP برای برخی
پردازندهها
تأثیر
میگذارد.
پیشفرض
این است که
استثناهای
FP فعال
هستند.
برای نمونه در SB-1، اگر استثناهای FP غیرفعال باشند و کد ۶۴ بیتی تولید کنیم، میتوانیم از هر دو خطلوله (pipe) ممیز شناور استفاده کنیم. در غیر این صورت، تنها میتوان از یک خطلوله FP استفاده کرد.
- -mvr4130-align
- -mno-vr4130-align
- خطلوله
پردازنده VR4130
از نوع
سوپراسکالر
دوخطه (two-way superscalar)
است، اما
تنها در
صورتی
میتواند
دو
دستورالعمل
را همزمان
صادر کند که
دستورالعمل
نخست با مرز
۸ بایتی
تراز باشد.
با فعال
بودن این
گزینه، GCC
جفت
دستورالعملهایی
را که به
تشخیص آن
باید
بهطور
موازی اجرا
شوند تراز
میکند.
این گزینه تنها هنگام بهینهسازی برای VR4130 اثرگذار است. این گزینه معمولاً کد را سریعتر میکند، اما به قیمت افزایش حجم آن. این گزینه بهطور پیشفرض در سطح بهینهسازی -O3 فعال است.
- -msynci
- -mno-synci
- فعال
(غیرفعال)
کردن تولید
دستورالعملهای
"synci" در
معماریهایی
که از آن
پشتیبانی
میکنند.
دستورالعملهای
"synci" (در
صورت فعال
بودن) هنگام
کامپایل
"__builtin___clear_cache"
تولید
میشوند.
پیشفرض این گزینه -mno-synci است، اما این مقدار پیشفرض میتواند با پیکربندی GCC با --with-synci بازنویسی شود.
هنگام کامپایل کد برای سیستمهای تکپردازندهای، استفاده از "synci" عموماً ایمن است. با این حال، در بسیاری از سیستمهای چندهستهای (SMP)، این دستورالعمل حافظه موقت دستورالعمل را روی تمام هستهها نامعتبر (invalidate) نمیکند و ممکن است به رفتار تعریفنشده بینجامد.
- -mrelax-pic-calls
- -mno-relax-pic-calls
- تلاش برای
تبدیل
فراخوانیهای
PIC که
معمولاً از
طریق ثبات
$25 ارسال
میشوند،
به
فراخوانیهای
مستقیم. این
کار تنها در
صورتی ممکن
است که
پیونددهنده
بتواند
مقصد را در
زمان پیوند
حل و فصل
کند و مقصد
در محدوده
مجاز برای
یک
فراخوانی
مستقیم
باشد.
در صورتی که GCC برای استفاده از یک اسمبلر و پیونددهندهای پیکربندی شده باشد که از دستور اسمبلی ".reloc" پشتیبانی میکنند و -mexplicit-relocs برقرار باشد، -mrelax-pic-calls پیشفرض خواهد بود. با -mno-explicit-relocs، این بهینهسازی میتواند تنها توسط اسمبلر و پیونددهنده بدون کمک کامپایلر انجام شود.
- -mmcount-ra-address
- -mno-mcount-ra-address
- تولید (عدم تولید) کدی که به "_mcount" امکان میدهد نشانی بازگشت تابع فراخواننده را تغییر دهد. با فعال بودن، این گزینه رابط معمول "_mcount" را با یک پارامتر جدید ra-address گسترش میدهد که دارای نوع "intptr_t *" بوده و در ثبات $12 ارسال میشود. آنگاه "_mcount" میتواند با انجام هر دو مورد زیر، نشانی بازگشت را تغییر دهد:
- بازگرداندن نشانی جدید در ثبات $31.
- ذخیره نشانی جدید در "*ra-address"، در صورتی که ra-address غیرتهی باشد.
پیشفرض -mno-mcount-ra-address است.
- -mframe-header-opt
- -mno-frame-header-opt
- فعال
(غیرفعال)
کردن
بهینهسازی
سرآیند
فریم (frame header) در o32 ABI.
هنگام
استفاده از
o32 ABI، توابع
فراخواننده
۱۶ بایت روی
پشته برای
تابع
فراخوانیشده
تخصیص
میدهند تا
آرگومانهای
ثبات را
بنویسد. با
فعال بودن،
در صورتی که
مشخص شود
سرآیند
فریم بدون
استفاده
است، این
بهینهسازی
از تخصیص آن
جلوگیری
خواهد کرد.
این بهینهسازی بهطور پیشفرض در تمام سطوح بهینهسازی خاموش است..IP -mlxc1-sxc1 4
- -mno-lxc1-sxc1
- در صورت امکان، تولید دستورالعملهای "lwxc1"، "swxc1"، "ldxc1" و "sdxc1" را فعال (غیرفعال) میکند. بهطور پیشفرض فعال است.
- -mmadd4
- -mno-madd4
- در صورت امکان، تولید دستورالعملهای ۴-عملوندی "madd.s"، "madd.d" و دستورالعملهای مرتبط را فعال (غیرفعال) میکند. بهطور پیشفرض فعال است.
گزینههای MMIX
این گزینهها برای MMIX تعریف شدهاند:
- -mlibfuncs
- -mno-libfuncs
- مشخص میکند که توابع ذاتی کتابخانه در حال کامپایل هستند، که تمام مقادیر را بدون توجه به اندازهشان در ثباتها ارسال میکند.
- -mepsilon
- -mno-epsilon
- دستورالعملهای مقایسه ممیز شناور را تولید میکند که با توجه به ثبات اپسیلون "rE" مقایسه را انجام میدهند.
- -mabi=mmixware
- -mabi=gnu
- کدی تولید میکند که پارامترهای تابع و مقادیر بازگشتی را بهگونهای ارسال میکند که (در تابع فراخوانیشده) به صورت ثباتهای $0 به بالا دیده میشوند، در مقابل GNU ABI که از ثباتهای سراسری $231 به بالا استفاده میکند.
- -mzero-extend
- -mno-zero-extend
- هنگام خواندن دادهها از حافظه در اندازههای کوچکتر از ۶۴ بیت، بهطور پیشفرض به جای دستورالعملهای بارگذاری گسترش با علامت، از دستورالعملهای بارگذاری گسترش با صفر استفاده میکند (استفاده نمیکند).
- -mknuthdiv
- -mno-knuthdiv
- باعث میشود علامت باقیمانده حاصل از تقسیم با علامت مقسومعلیه یکسان باشد. در حالت پیشفرض، یعنی -mno-knuthdiv، علامت باقیمانده از علامت مقسوم پیروی میکند. هر دو روش از نظر محاسباتی معتبر هستند، اما روش دوم تقریباً بهطور اختصاصی استفاده میشود.
- -mtoplevel-symbols
- -mno-toplevel-symbols
- یک : را به ابتدای تمام نمادهای سراسری اضافه میکند (اضافه نمیکند)، تا کد اسمبلی بتواند با دستور اسمبلی "PREFIX" استفاده شود.
- -melf
- یک فایل اجرایی در قالب ELF تولید میکند، به جای قالب پیشفرض mmo که توسط شبیهساز mmix استفاده میشود.
- -mbranch-predict
- -mno-branch-predict
- هنگامی که پیشبینی ایستان انشعاب یک انشعاب محتمل را نشان میدهد، از دستورالعملهای انشعاب محتمل استفاده میکند (استفاده نمیکند).
- -mbase-addresses
- -mno-base-addresses
- کدی تولید میکند (تولید نمیکند) که از آدرسهای پایه استفاده میکند. استفاده از یک آدرس پایه بهطور خودکار درخواستی را (که توسط اسمبلر و پیونددهنده رسیدگی میشود) برای تنظیم یک مقدار ثابت در یک ثبات سراسری تولید میکند. این ثبات برای یک یا چند درخواست آدرس پایه در محدوده ۰ تا ۲۵۵ از مقدار نگهداریشده در ثبات استفاده میشود. این کار عموماً منجر به کدی کوتاهتر و سریعتر میشود، اما تعداد دادههای مختلفی که میتوان آدرسدهی کرد محدود است. این بدان معناست که برنامهای که از دادههای ایستان زیادی استفاده میکند ممکن است به -mno-base-addresses نیاز داشته باشد.
- -msingle-exit
- -mno-single-exit
- کد تولیدشده را مجبور میکند (مجبور نمیکند) که در هر تابع تنها یک نقطه خروج داشته باشد.
گزینههای MN10300
این گزینههای -m برای معماریهای Matsushita MN10300 تعریف شدهاند:
- -mmult-bug
- کدی تولید میکند که از باگهای موجود در دستورالعملهای ضرب برای پردازندههای MN10300 جلوگیری کند. این حالت پیشفرض است.
- -mno-mult-bug
- کدی برای جلوگیری از باگهای موجود در دستورالعملهای ضرب برای پردازندههای MN10300 تولید نمیکند.
- -mam33
- با استفاده از ویژگیهای خاص پردازنده AM33 کد تولید میکند.
- -mno-am33
- با استفاده از ویژگیهای خاص پردازنده AM33 کد تولید نمیکند. این حالت پیشفرض است.
- -mam33-2
- با استفاده از ویژگیهای خاص پردازنده AM33/2.0 کد تولید میکند.
- -mam34
- با استفاده از ویژگیهای خاص پردازنده AM34 کد تولید میکند.
- -mtune=cpu-type
- هنگام زمانبندی دستورالعملها، از ویژگیهای زمانبندی نوع CPU مشخصشده استفاده میکند. این کار نوع پردازنده هدف را تغییر نمیدهد. نوع CPU باید یکی از mn10300، am33، am33-2 یا am34 باشد.
- -mreturn-pointer-on-d0
- هنگام تولید تابعی که یک اشارهگر را برمیگرداند، اشارهگر را در هر دو ثبات "a0" و "d0" برمیگرداند. در غیر این صورت، اشارهگر فقط در "a0" بازگردانده میشود، و تلاش برای فراخوانی چنین توابعی بدون پیشنمونه منجر به خطا خواهد شد. توجه داشته باشید که این گزینه بهطور پیشفرض فعال است؛ برای غیرفعال کردن آن از -mno-return-pointer-on-d0 استفاده کنید.
- -mno-crt0
- فایل شیء مقداردهی اولیه زمان اجرای C را پیوند نمیزند.
- -mrelax
- به
پیونددهنده
اعلام
میکند که
باید یک
مرحله
بهینهسازی
بازآرایی
(relaxation) را برای
کوتاه کردن
انشعابها،
فراخوانیها
و آدرسهای
حافظه مطلق
انجام دهد.
این گزینه
فقط زمانی
تأثیر دارد
که در خط
فرمان برای
مرحله
نهایی
پیوند
استفاده
شود.
این گزینه اشکالزدایی نمادین را غیرممکن میکند.
- -mliw
- به کامپایلر اجازه میدهد در صورتی که هدف AM33 یا جدیدتر باشد، دستورالعملهای کلمه دستورالعمل طولانی (LIW) را تولید کند. این حالت پیشفرض است. این گزینه ماکروی پیشپردازنده "__LIW__" را تعریف میکند.
- -mno-liw
- به کامپایلر اجازه نمیدهد دستورالعملهای کلمه دستورالعمل طولانی (LIW) را تولید کند. این گزینه ماکروی پیشپردازنده "__NO_LIW__" را تعریف میکند.
- -msetlb
- به کامپایلر اجازه میدهد در صورتی که هدف AM33 یا جدیدتر باشد، دستورالعملهای SETLB و Lcc را تولید کند. این حالت پیشفرض است. این گزینه ماکروی پیشپردازنده "__SETLB__" را تعریف میکند.
- -mno-setlb
- به کامپایلر اجازه نمیدهد دستورالعملهای SETLB یا Lcc را تولید کند. این گزینه ماکروی پیشپردازنده "__NO_SETLB__" را تعریف میکند.
گزینههای Moxie
- -meb
- کد بزرگپایان (big-endian) تولید میکند. این حالت پیشفرض برای پیکربندیهای moxie-*-* است..IP -mel 4 تولید کد little-endian.
- -mmul.x
- دستورالعملهای mul.x و umul.x را تولید میکند. این گزینه در پیکربندیهای moxiebox-*-* حالت پیشفرض است.
- -mno-crt0
- فایل شیء راهاندازی زمان اجرای C را پیوند نمیزند.
گزینههای MSP430
این گزینهها برای MSP430 تعریف شدهاند:
- -masm-hex
- خروجی اسمبلی را وادار میکند تا همیشه از ثابتهای هگزادسیمال استفاده کند. بهطور معمول چنین ثابتهایی بهصورت دهدهی علامتدار هستند، اما این گزینه برای مجموعهٔ آزمون (testsuite) و/یا مقاصد زیباییشناختی در دسترس است.
- -mmcu=
- انتخاب MCU
هدف. از این
گزینه برای
ایجاد یک
نماد
پیشپردازندهٔ
C بر پایهٔ
نام MCU
استفاده
میشود که
به حروف
بزرگ تبدیل
شده و
پیشوند و
پسوند __ به
آن اضافه
میشود. این
نماد به
نوبهٔ خود
توسط فایل
سرآیند msp430.h
برای
انتخاب یک
فایل
سرآیند
تکمیلی
مختص به آن MCU
به کار
میرود.
این گزینه همچنین ISA مورد استفاده را تعیین میکند. اگر نام MCU از مواردی باشد که مشخصاً تنها از 430 ISA پشتیبانی میکند، همان انتخاب میشود؛ در غیر این صورت 430X ISA انتخاب خواهد شد. نام عمومی MCU بهصورت msp430 نیز میتواند برای انتخاب 430 ISA استفاده شود. به همین ترتیب، نام عمومی msp430x برای MCU، معماری 430X ISA را انتخاب میکند.
علاوه بر این، یک اسکریپت پیونددهندهٔ مختص MCU به خط فرمان پیونددهنده اضافه میشود. نام اسکریپت همان نام MCU همراه با پسوند .ld است. بنابراین تعیین -mmcu=xxx در خط فرمان gcc، نماد پیشپردازندهٔ C با عنوان "__XXX__" را تعریف کرده و باعث میشود پیونددهنده به دنبال اسکریپتی به نام xxx.ld بگردد.
پشتیبانی از ISA و ضرب سختافزاری برای MCUهای مختلف بهصورت درونکد (hard-coded) در GCC گنجانده شده است. با این حال، میتوان از یک فایل خارجی devices.csv برای گسترش پشتیبانی از دستگاهها فراتر از موارد درونکد شده استفاده کرد.
برنامهٔ GCC فایل devices.csv را با استفاده از روشهای زیر و با رعایت ترتیب اولویت جستجو میکند، بهطوری که روش اول بر روش دوم و روش دوم بر روش سوم اولویت دارد.
- مسیر include مشخصشده با "-I" و "-L"
- فایل devices.csv در هر یک از دایرکتوریهای مشخصشده توسط مسیرهای include و مسیرهای جستجوی کتابخانهٔ پیونددهنده جستجو میشود.
- مسیر مشخصشده توسط متغیر محیطی MSP430_GCC_INCLUDE_DIR
- مقدار متغیر محیطی سراسری MSP430_GCC_INCLUDE_DIR را برابر با مسیر کامل دایرکتوری حاوی devices.csv تنظیم کنید تا GCC این دایرکتوری را برای devices.csv جستجو کند. اگر devices.csv پیدا شود، این دایرکتوری همچنین به عنوان مسیر include و مسیر کتابخانهٔ پیونددهنده ثبت میشود. بنابراین فایلهای سرآیند و اسکریپتهای پیونددهنده در این دایرکتوری میتوانند بدون تعیین دستی "-I" و "-L" در خط فرمان استفاده شوند.
- دایرکتوری msp430-elf{,bare}/include/devices
- در نهایت، GCC مسیر msp430-elf{,bare}/include/devices را از دایرکتوری ریشهٔ زنجیره ابزار بررسی میکند. این دایرکتوری در نصب پیشفرض وجود ندارد، اما اگر کاربر آن را ایجاد کرده و devices.csv را در آنجا کپی کرده باشد، دادههای MCU خوانده میشوند. همانند بالا، این دایرکتوری نیز به عنوان مسیر include و مسیر کتابخانهٔ پیونددهنده ثبت میشود.
اگر هیچیک از روشهای جستجوی بالا فایل devices.csv را پیدا نکنند، دادههای درونکد شدهٔ MCU استفاده میشوند.
- -mwarn-mcu
- -mno-warn-mcu
- این گزینه هشدارهای مربوط به تداخل میان نام MCU مشخصشده توسط گزینهٔ -mmcu و ISA تعیینشده با گزینهٔ -mcpu و/یا پشتیبانی از ضرب سختافزاری تعیینشده با گزینهٔ -mhwmult را فعال یا غیرفعال میکند. همچنین هشدارهای مربوط به نامهای ناشناختهٔ MCU را تغییر وضعیت میدهد. این گزینه بهطور پیشفرض فعال است.
- -mcpu=
- معماری ISA مورد استفاده را مشخص میکند. مقادیر پذیرفتهشده عبارتند از msp430، msp430x و msp430xv2. این گزینه منسوخ شده است. برای انتخاب ISA باید از گزینهٔ -mmcu= استفاده شود.
- -msim
- پیوند به کتابخانههای زمان اجرای شبیهساز و اسکریپت پیونددهنده. این گزینه هر اسکریپتی را که توسط گزینهٔ -mmcu= انتخاب شود نادیده میگیرد و جایگزین میکند.
- -mlarge
- استفاده از آدرسدهی مدل بزرگ (اشارهگرهای ۲۰ بیتی، "size_t" ۲۰ بیتی).
- -msmall
- استفاده از آدرسدهی مدل کوچک (اشارهگرهای ۱۶ بیتی، "size_t" ۱۶ بیتی).
- -mrelax
- این گزینه به اسمبلر و پیونددهنده ارسال میشود و به پیونددهنده اجازه میدهد تا بهینهسازیهای خاصی را که تا زمان پیوند نهایی قابل انجام نیستند، اعمال کند.
- mhwmult=
- نوع ضرب
سختافزاری
پشتیبانیشده
توسط هدف را
مشخص
میکند.
مقادیر
پذیرفتهشده
عبارتند از
none برای عدم
وجود ضرب
سختافزاری،
16bit برای ضرب
اولیه و
صرفاً ۱۶
بیتی
پشتیبانیشده
در MCUهای
نخستین، 32bit
برای ضرب
۱۶/۳۲ بیتی
پشتیبانیشده
در MCUهای
بعدی و f5series
برای ضرب
۱۶/۳۲ بیتی
پشتیبانیشده
در MCUهای سری F5.
مقدار auto
نیز
میتواند
داده شود؛
این مقدار
به GCC اعلام
میکند تا
پشتیبانی
ضرب
سختافزاری
را بر اساس
نام MCU
مشخصشده
با گزینهٔ
-mmcu استنتاج
کند. اگر
هیچ گزینهٔ
-mmcu مشخص
نشده باشد
یا نام MCU
شناسایی
نشود، هیچ
پشتیبانی
سختافزاری
برای ضرب
فرض نخواهد
شد. مقدار
"auto"
تنظیم
پیشفرض
است.
عملیات ضرب سختافزاری معمولاً با فراخوانی یک روال کتابخانهای انجام میشود. این کار در فضای کد تولیدشده صرفهجویی میکند. با این حال هنگام کامپایل با -O3 یا بالاتر، ضرب سختافزاری بهصورت درونخطی (inline) فراخوانی میشود. این امر کدی حجیمتر اما سریعتر تولید میکند.
روالهای ضرب سختافزاری هنگام اجرا وقفهها را غیرفعال کرده و پس از اتمام، وضعیت پیشین وقفه را بازمیگردانند. این ویژگی استفاده از آنها را هم درون گردانندههای وقفه و هم در کدهای عادی ایمن میسازد.
- -minrt
- فعالسازی استفاده از محیط زمان اجرای کمینه - بدون مقداردهندههای اولیه یا سازندههای ایستا (static). این گزینه برای دستگاههای با محدودیت شدید حافظه در نظر گرفته شده است. کامپایلر نمادهای خاصی را در برخی اشیاء میگنجاند که به پیونددهنده و زمان اجرا اعلام میکنند کدام قطعههای کد مورد نیاز هستند.
- -mtiny-printf
- فعالسازی
توابع
کتابخانهای
"printf" و
"puts" با
حجم کد
کاهشیافته.
پیادهسازیهای
tiny این
توابع
بازبستهناپذیر
(non-reentrant) هستند،
بنابراین
در
برنامههای
چندنخی
باید با
احتیاط
استفاده
شوند.
پشتیبانی از جریانها (streams) حذف شده است و رشتهای که باید چاپ شود همواره از طریق فراخوانی سیستمی "write" به stdout ارسال خواهد شد. این رشته پیش از ارسال به write بافر نمیشود.
این گزینه به Newlib Nano IO نیاز دارد، بنابراین GCC باید با --enable-newlib-nano-formatted-io پیکربندی شده باشد.
- -mmax-inline-shift=
- این گزینه
یک عدد صحیح
بین ۰ تا ۶۴
(شامل هر دو)
دریافت
میکند و
حداکثر
تعداد
دستورالعملهای
شیفت
درونخطی
را که باید
برای انجام
عملیات
شیفت با
مقداری
ثابت صادر
شوند،
تعیین
میکند.
هنگامی که
نیاز به
فراتر رفتن
از این
مقدار
باشد،
بهجای آن
از یک تابع
کمکی mspabi
استفاده
میشود.
مقدار
پیشفرض ۴
است.
این ویژگی تنها بر مواردی اثر میگذارد که شیفت به چندین موقعیت نتواند با یک دستور واحد انجام شود (مانند همهٔ شیفتهای >1 در 430 ISA).
شیفتهای یک مقدار ۳۲ بیتی دستکم دو برابر هزینهبرتر هستند، بنابراین مقدار دادهشده به این گزینه بر ۲ تقسیم شده و مقدار حاصل استفاده میشود.
- -mcode-region=
- -mdata-region=
- این گزینهها به کامپایلر اعلام میکنند توابع و دادههایی را که فاقد یکی از مشخصههای "lower"، "upper"، "either" یا "section" هستند، در کجا قرار دهد. مقادیر ممکن عبارتند از "lower"، "upper"، "either" یا "any". سه مقدار نخست مانند مشخصهٔ متناظر خود عمل میکنند. چهارمین مقدار ممکن - "any" - حالت پیشفرض است. این مقدار، جایگذاری را کاملاً به اسکریپت پیونددهنده و نحوهٔ تخصیص بخشهای استاندارد (".text"، ".data" و غیره) به نواحی حافظه واگذار میکند.
- -msilicon-errata=
- این گزینه درخواستی را به اسمبلر ارسال میکند تا اصلاحات مربوط به اشکالات سختافزاری تراشه (silicon errata) مشخصشده را فعال سازد.
- -msilicon-errata-warn=
- این گزینه درخواستی را به اسمبلر ارسال میکند تا پیامهای هشدار را در مواردی که ممکن است نیاز به اعمال یک اصلاح اشکال سختافزاری تراشه (silicon errata) باشد، فعال کند.
- -mwarn-devices-csv
- -mno-warn-devices-csv
- اگر devices.csv یافت نشود یا مشکلی در تجزیه آن وجود داشته باشد، هشدار میدهد (پیشفرض: فعال).
گزینههای NDS32
این گزینهها برای پیادهسازیهای NDS32 تعریف شدهاند:
- -mbig-endian
- تولید کد در حالت big-endian.
- -mlittle-endian
- تولید کد در حالت little-endian.
- -mreduced-regs
- استفاده از مجموعه کاهشیافته ثباتها برای تخصیص ثبات.
- -mfull-regs
- استفاده از مجموعه کامل ثباتها برای تخصیص ثبات.
- -mcmov
- تولید دستورالعملهای انتقال شرطی.
- -mno-cmov
- عدم تولید دستورالعملهای انتقال شرطی.
- -mext-perf
- تولید دستورالعملهای افزونه کارایی.
- -mno-ext-perf
- عدم تولید دستورالعملهای افزونه کارایی.
- -mext-perf2
- تولید دستورالعملهای افزونه کارایی ۲.
- -mno-ext-perf2
- عدم تولید دستورالعملهای افزونه کارایی ۲.
- -mext-string
- تولید دستورالعملهای افزونه رشته.
- -mno-ext-string
- عدم تولید دستورالعملهای افزونه رشته.
- -mv3push
- تولید دستورالعملهای push25/pop25 در نسخه v3.
- -mno-v3push
- عدم تولید دستورالعملهای push25/pop25 در نسخه v3.
- -m16-bit
- تولید دستورالعملهای ۱۶ بیتی.
- -mno-16-bit
- عدم تولید دستورالعملهای ۱۶ بیتی.
- -misr-vector-size=num
- اندازه هر بردار وقفه را مشخص میکند، که باید ۴ یا ۱۶ باشد.
- -mcache-block-size=num
- اندازه هر بلوک حافظه موقت (cache block) را مشخص میکند، که باید توانی از ۲ بین ۴ و ۵۱۲ باشد.
- -march=arch
- نام معماری مقصد را مشخص میکند.
- -mcmodel=code-model
- مدل کد را روی یکی از موارد زیر تنظیم میکند:
- small
- همه بخشهای داده و بخشهای داده فقطخواندنی باید در فضای آدرسدهی ۵۱۲ کیلوبایت باشند. بخش کد (text segment) باید در فضای آدرسدهی ۱۶ مگابایت باشد.
- medium
- بخش داده باید در محدوده ۵۱۲ کیلوبایت باشد در حالی که بخش داده فقطخواندنی میتواند در فضای آدرسدهی ۴ گیگابایت قرار گیرد. بخش کد همچنان باید در فضای آدرسدهی ۱۶ مگابایت باشد.
- large
- همه بخشهای داده و کد میتوانند در فضای آدرسدهی ۴ گیگابایت قرار گیرند.
- -mctor-dtor
- قابلیت سازنده/ویرانگر (constructor/destructor) را فعال میکند.
- -mrelax
- پیونددهنده (linker) را برای تخفیف (relax) دستورالعملها هدایت میکند.
گزینههای Nvidia PTX
این گزینهها برای Nvidia PTX تعریف شدهاند:
- -m64
- نادیده گرفته میشود، اما برای سازگاری عقبروی حفظ شده است. تنها ABI شصت و چهار بیتی پشتیبانی میشود.
- -march=architecture-string
- تولید کد
برای
معماری
مقصد PTX ISA
مشخصشده.
رشتههای
معماری
معتبر
عبارتند از:
sm_30، sm_35، sm_37،
sm_52، sm_53، sm_61،
sm_70، sm_75، sm_80، و
sm_89. مقدار
پیشفرض
بستگی به
نحوه
پیکربندی
کامپایلر
دارد، به
--with-arch مراجعه
کنید.
این گزینه مقدار ماکروی پیشپردازنده "__PTX_SM__" را تنظیم میکند؛ به عنوان مثال، برای sm_35 مقدار 350 را دارد.
- -misa=architecture-string
- نام مستعار -march=.
- -march-map=architecture-string
- نزدیکترین مقدار ممکن برای -march= را انتخاب میکند که توانمندتر از مقدار مشخصشده نباشد. برای نمونه، برای -march-map=sm_50 مقدار -march=sm_37 و برای -march-map=sm_53 مقدار -march=sm_53 انتخاب میشود.
- -mptx=version-string
- تولید کد
برای نسخه
مشخصشده PTX ISA.
رشتههای
نسخه معتبر
عبارتند از:
3.1، 4.1، 4.2،
5.0، 6.0، 6.3،
7.0، 7.3، و 7.8.
نسخه
پیشفرض PTX ISA
نسخهای
است که
پشتیبانی
از معماری
مقصد PTX ISA
انتخابشده
را افزوده
است (به -march=
مراجعه
کنید)، اما
دستکم 6.3،
یا برای -march=sm_52
و بالاتر
حداقل 7.3
خواهد بود.
این گزینه مقادیر ماکروهای پیشپردازنده "__PTX_ISA_VERSION_MAJOR__" و "__PTX_ISA_VERSION_MINOR__" را تعیین میکند؛ به عنوان مثال، برای 3.1 این ماکروها به ترتیب مقادیر 3 و 1 را خواهند داشت.
- -mmainkernel
- کد مورد نیاز برای یک کرنل __main را پیوند میدهد. این مورد برای اجرای مستقل (stand-alone) به جای اجرای باراندازیشده (offloading) به کار میرود.
- -moptimize
- بهینهسازیهای اجرای تفکیکشده (partitioned execution) را اعمال میکند. در صورت انتخاب هر سطحی از بهینهسازی، این گزینه به عنوان پیشفرض فعال است.
- -msoft-stack
- -mno-soft-stack
- در صورت
استفاده از
-mno-soft-stack (حالت
پیشفرض،
مگر آنکه -mgomp
مشخص شده
باشد)، از
پشتههای
«محلی» (native) در
PTX استفاده
میشود،
یعنی کدی
تولید
میشود که
از حافظه
".local" یا
دستور
"alloca" در PTX
به صورت
مستقیم
برای
ذخیرهسازی
پشته
استفاده
میکند. مگر
اینکه -mptx=7.3 یا
بالاتر و
-march=sm_52 یا
بالاتر
فعال
باشند،
آرایههای
با طول
متغیر و
تخصیص
پویای
حافظه روی
پشته با
استفاده از
"alloca"
پشتیبانی
نمیشوند.
در صورت استفاده از -msoft-stack (که توسط -mgomp به طور ضمنی اعمال میشود)، کدی تولید میشود که از حافظه ".local" یا دستور "alloca" در PTX به صورت مستقیم برای ذخیرهسازی پشته استفاده نمیکند. در عوض، یک اشارهگر پشته به ازای هر warp به صورت صریح نگهداری میشود. این کار امکان تخصیص پشته با طول متغیر (با آرایههای با طول متغیر یا "alloca") را فراهم میآورد، و هنگامی که از حافظه سراسری (global memory) برای ذخیرهسازی پایهای استفاده شود، دسترسی به متغیرهای خودکار را از طریق سایر رشتهها یا با دستورالعملهای اتمیک ممکن میسازد. این شیوه تولید کد برای باراندازی (offloading) در OpenMP استفاده میشود، اما این گزینه به منظور آزمایش کامپایلر به صورت مجزا نیز در دسترس قرار گرفته است؛ برای تولید کد مناسب جهت پیوند در برنامههایی که از باراندازی OpenMP استفاده میکنند، گزینه -mgomp را به کار ببرید.
- -muniform-simt
- به شیوه تولید کدی تغییر وضعیت میدهد که به تمام رشتهها در هر warp اجازه اجرا میدهد، در حالی که وضعیت حافظه و عوارض جانبی را طوری حفظ میکند که گویی تنها یک رشته در هر warp در خارج از نواحی OpenMP SIMD فعال است. تمام عملیاتهای اتمیک و فراخوانیهای زمان اجرا (مانند malloc، free، vprintf) به صورت مشروط اجرا میشوند (تنها در صورتی که شاخص lane جاری با شاخص lane اصلی برابر باشد)، و ثباتی که مقداردهی میشود، از طریق دستورالعمل shuffle از lane اصلی کپی میشود. در خارج از نواحی SIMD، مقدار lane 0 به عنوان اصلی عمل میکند؛ در درون آن، هر رشته خود را به عنوان اصلی تلقی میکند. آرایه حافظه اشتراکی "int __nvptx_uni[]" ماسکهای بیتی سراسر-صفر یا سراسر-یک را برای هر warp نگهداری میکند که نشاندهنده حالت فعلی است (۰ در خارج از نواحی SIMD). هر رشته میتواند ماسک بیتی واقع در موقعیت "tid.y" را با شاخص lane جاری AND بیتی کند تا شاخص lane اصلی محاسبه شود..IP -mgomp 4 تولید کد برای استفاده در برونسپاری محاسبات به OpenMP: گزینههای -msoft-stack و -muniform-simt را فعال کرده و گونهٔ چندکتابخانهای (multilib) متناظر را برمیگزیند.
گزینههای OpenRISC
این گزینهها برای OpenRISC تعریف شدهاند:
- -mboard=name
- پیکربندی محیط زمان اجرای ویژهٔ برد. این مقدار برای پیوند زدن کتابخانهٔ برد newlib به پیونددهنده ارسال خواهد شد. پیشفرض "or1ksim" است.
- -mnewlib
- این گزینه نادیده گرفته میشود؛ و صرفاً برای اهداف سازگاری است. این گزینه قبلاً گزینههای پیونددهنده و پیشپردازنده را برای استفاده با newlib انتخاب میکرد.
- -msoft-div
- -mhard-div
- انتخاب دستورالعملهای تقسیم نرمافزاری یا سختافزاری ("l.div"، "l.divu"). پیشفرض، تقسیم سختافزاری است.
- -msoft-mul
- -mhard-mul
- انتخاب دستورالعملهای ضرب نرمافزاری یا سختافزاری ("l.mul"، "l.muli"). پیشفرض، ضرب سختافزاری است.
- -msoft-float
- -mhard-float
- انتخاب حالت نرمافزاری یا سختافزاری برای عملیات ممیز شناور. پیشفرض، نرمافزاری است.
- -mdouble-float
- هنگامی که -mhard-float انتخاب شده باشد، تولید دستورالعملهای ممیز شناور با دقت مضاعف (double-precision) را فعال میکند. بهطور پیشفرض از توابع موجود در libgcc برای انجام عملیاتهای ممیز شناور با دقت مضاعف استفاده میشود.
- -munordered-float
- هنگامی که -mhard-float انتخاب شده باشد، تولید دستورالعملهای مقایسهٔ نامرتب ممیز شناور و تنظیم پرچم ("lf.sfun*") را فعال میکند. بهطور پیشفرض از توابع موجود در libgcc برای انجام عملیات مقایسهٔ نامرتب ممیز شناور و تنظیم پرچم استفاده میشود.
- -mcmov
- فعالسازی تولید دستورالعملهای انتقال شرطی ("l.cmov"). بهطور پیشفرض معادل آن با استفاده از تنظیم و پرش (set and branch) تولید خواهد شد.
- -mror
- فعالسازی تولید دستورالعملهای چرخش به راست ("l.ror"). بهطور پیشفرض از توابع libgcc برای انجام عملیاتهای چرخش به راست استفاده میشود.
- -mrori
- فعالسازی تولید دستورالعملهای چرخش به راست با مقدار بیواسطه ("l.rori"). بهطور پیشفرض از توابع libgcc برای انجام عملیات چرخش به راست با مقدار بیواسطه استفاده میشود.
- -msext
- فعالسازی تولید دستورالعملهای بسط علامت ("l.ext*"). بهطور پیشفرض از بارگذاریهای حافظه برای انجام بسط علامت استفاده میشود.
- -msfimm
- فعالسازی تولید دستورالعملهای مقایسه و تنظیم پرچم با مقدار بیواسطه ("l.sf*i"). بهطور پیشفرض دستورالعملهای اضافهای تولید میشوند تا ابتدا مقدار بیواسطه را در یک ثبات ذخیره کنند.
- -mshftimm
- فعالسازی تولید دستورالعملهای شیفت با مقدار بیواسطه ("l.srai"، "l.srli"، "l.slli"). بهطور پیشفرض دستورالعملهای اضافهای تولید میشوند تا ابتدا مقدار بیواسطه را در یک ثبات ذخیره کنند.
- -mcmodel=small
- تولید کد OpenRISC برای مدل کوچک (small): جدول GOT به 64k محدود است. این مدل پیشفرض است.
- -mcmodel=large
- تولید کد OpenRISC برای مدل بزرگ (large): اندازهٔ جدول GOT میتواند تا 4G رشد کند.
گزینههای PDP-11
این گزینهها برای PDP-11 تعریف شدهاند:
- -mfpu
- استفاده از ممیز شناور سختافزاری FPP. این پیشفرض است. (ممیز شناور FIS در PDP-11/40 پشتیبانی نمیشود.) مستلزم -m45 است.
- -msoft-float
- عدم استفاده از ممیز شناور سختافزاری.
- -mac0
- بازگرداندن نتایج ممیز شناور در ac0 (در نحو اسمبلر Unix معادل fr0 است).
- -mno-ac0
- بازگرداندن نتایج ممیز شناور در حافظه. این پیشفرض است.
- -m40
- تولید کد برای یک PDP-11/40. مستلزم -msoft-float -mno-split است.
- -m45
- تولید کد برای یک PDP-11/45. این پیشفرض است.
- -m10
- تولید کد برای یک PDP-11/10. مستلزم -msoft-float -mno-split است.
- -mint16
- -mno-int32
- استفاده از "int" ۱۶-بیتی. این پیشفرض است.
- -mint32
- -mno-int16
- استفاده از "int" ۳۲-بیتی.
- -msplit
- مقصد دارای فضای دستورالعمل و دادهٔ تفکیکشده (split) است. مستلزم -m45 است.
- -munix-asm
- استفاده از نحو اسمبلر Unix.
- -mdec-asm
- استفاده از نحو اسمبلر DEC.
- -mgnu-asm
- استفاده از نحو اسمبلر GNU. این پیشفرض است.
- -mlra
- استفاده از تخصیصدهندهٔ جدید ثبات LRA. بهطور پیشفرض، تخصیصدهندهٔ قدیمی “reload” به کار میرود.
گزینههای PowerPC
این موارد در بخش زیر فهرست شدهاند
گزینههای PRU
این گزینههای خط فرمان برای معماری مقصد PRU تعریف شدهاند:
- -minrt
- پیوند با
حداقل محیط
زمان اجرا.
این کار
میتواند
اندازهٔ
باینری
نهایی ELF را
به طور
چشمگیری
کاهش دهد،
اما برخی از
ویژگیهای
استاندارد
زمان اجرای
C حذف
میشوند.
این گزینه پشتیبانی از مقداردهندههای اولیه و سازندههای ایستا را غیرفعال میکند. آگاه باشید که کامپایلر همچنان ممکن است کدی با مقداردهندههای اولیه و سازندههای ایستا تولید کند. این وظیفه برنامهنویس است که اطمینان حاصل کند برنامهٔ مبدأ از این قابلیتها استفاده نمیکند.
کد راهاندازی حداقلی آرگومانهای "argc" و "argv" را به "main" منتقل نمیکند، بنابراین تابع اخیر باید به صورت "int main (void)" اعلان شود. این موضوع در اکثر پروژههای سفتافزار (firmware) یک قاعدهٔ معمول است.
- -mmcu=mcu
- گونهٔ
سختافزاری
PRU مورد
استفاده را
مشخص
میکند. یک
پروندهٔ
مشخصات (spec) با
نام متناظر
بارگذاری
خواهد شد که
اندازههای
ناحیهٔ
حافظه را به
پیونددهنده
ارسال کرده
و ماکروهای
C ویژهٔ
سختافزار
را تعریف
میکند.
کتابخانهٔ Newlib تنها مشخصهٔ "sim" را فراهم میکند که برای اجرای آزمونهای پسرفت (regression) با استفاده از یک شبیهساز در نظر گرفته شده است. مشخصات مربوط به سختافزار واقعی را میتوان با نصب بستهٔ GnuPruMcu ("https://github.com/dinuxbg/gnuprumcu") به دست آورد.
- -mno-relax
- باعث میشود GCC بهجای گزینهٔ --relax، گزینهٔ خط فرمان --no-relax را به پیونددهنده ارسال کند..IP -mloop 4 به GCC اجازه میدهد (یا نمیدهد) که از دستورالعمل LOOP استفاده کند.
- -mabi=variant
- گونهٔ ABI را برای تولید کد خروجی مشخص میکند. گزینهٔ -mabi=ti گونهٔ دستنخوردهٔ TI ABI را انتخاب میکند، در حالی که -mabi=gnu گونهای از GNU را برمیگزیند که با فرضیات خاص GCC سازگاری طبیعیتری دارد. تفاوتها از این قرارند:
- اندازهٔ اشارهگر تابع
- مشخصات TI ABI تعیین میکند که اشارهگرهای تابع (کد) ۱۶ بیتی هستند، در حالی که GNU فقط از اشارهگرهای داده و کد ۳۲ بیتی پشتیبانی میکند.
- اشارهگر اختیاری مقدار بازگشتی
- مقادیر بازگشتی تابع که بزرگتر از ۶۴ بیت باشند، با استفاده از یک اشارهگر پنهان به عنوان نخستین آرگومان تابع ارسال میشوند. با این حال، TI ABI الزامی میکند که اگر فراخواننده از مقدار بازگشتی استفاده نکند، این اشارهگر میتواند NULL باشد. GNU همواره یک اشارهگر معتبر برای مقدار بازگشتی ارسال کرده و انتظار دارد.
پیادهسازی فعلی -mabi=ti هنگام شناسایی هر یک از ساختارهای کد بالا، صرفاً یک خطای کامپایل ایجاد میکند. در نتیجه، کتابخانهٔ استاندارد C قابل ساخت نبوده و هنگام پیوند دادن (link) با -mabi=ti کنار گذاشته میشود.
ویژگی Relaxation قابلیتی در GNU است و به دلایل ایمنی هنگام استفاده از -mabi=ti غیرفعال میشود. زنجیره ابزار TI بازنشانیها (relocations) را برای دستورالعملهای QBBx تولید نمیکند، بنابراین پیونددهندهٔ GNU هنگام کوتاه کردن دستورالعملهای شبهکد LDI32 مجاور، نمیتواند آنها را تطبیق دهد.
گزینههای RISC-V
این گزینههای خط فرمان برای مقصدهای RISC-V تعریف شدهاند:
- -mbranch-cost=n
- هزینهٔ انشعابها را تقریباً برابر با n دستورالعمل تعیین میکند.
- -mplt
- -mno-plt
- هنگام تولید کد PIC، اجازهٔ استفاده از PLTها را میدهد یا نمیدهد. برای کدهای غیر PIC نادیده گرفته میشود. مقدار پیشفرض -mplt است.
- -mabi=ABI-string
- قرارداد
فراخوانی
اعداد صحیح
و ممیز
شناور را
مشخص
میکند.
رشتهٔ ABI-string
شامل دو بخش
است:
اندازهٔ
انواع
صحیح، و
ثباتهای
مورد
استفاده
برای انواع
ممیز شناور.
برای
نمونه، -march=rv64ifd
-mabi=lp64d به این
معناست که
long و
اشارهگرها
۶۴ بیتی
هستند (که
بهطور
ضمنی int را
۳۲ بیتی
تعریف
میکند)، و
مقادیر
ممیز شناور
تا پهنای ۶۴
بیت در
ثباتهای F
منتقل
میشوند.
این را
مقایسه
کنید با -march=rv64ifd
-mabi=lp64f، که
همچنان به
کامپایلر
اجازه
میدهد کدی
تولید کند
که از
افزونههای
F و D استفاده
میکند،
اما تنها به
مقادیر
ممیز شناور
با طول
حداکثر ۳۲
بیت اجازهٔ
انتقال در
ثباتها را
میدهد؛ یا
-march=rv64ifd -mabi=lp64، که در
آن هیچ
آرگومان
ممیز
شناوری در
ثباتها
منتقل
نخواهد شد.
پیشفرض این آرگومان وابسته به سیستم است؛ کاربرانی که خواهان قرارداد فراخوانی خاصی هستند باید آن را صراحتاً مشخص کنند. قراردادهای فراخوانی معتبر عبارتند از: ilp32، ilp32f، ilp32d، lp64، lp64f و lp64d. پیادهسازی برخی از قراردادهای فراخوانی روی بعضی از ISAها غیرممکن است: برای نمونه، -march=rv32if -mabi=ilp32d نامعتبر است زیرا این ABI الزامی میکند مقادیر ۶۴ بیتی در ثباتهای F منتقل شوند، در حالی که ثباتهای F تنها ۳۲ بیت پهنا دارند. همچنین ABIهای ilp32e وجود دارند که فقط با معماری rv32e قابل استفادهاند و lp64e که فقط با rv64e میتواند استفاده شود. این ABIها در حال حاضر بهخوبی استانداردسازی نشدهاند و دستخوش تغییر هستند.
- -mfdiv
- -mno-fdiv
- از دستورالعملهای سختافزاری تقسیم و جذر ممیز شناور استفاده میکند یا نمیکند. این امر نیازمند افزونههای F یا D برای ثباتهای ممیز شناور است. حالت پیشفرض در صورتی که معماری مشخصشده دارای این دستورالعملها باشد، استفاده از آنهاست.
- -mfence-tso
- -mno-fence-tso
- از دستورالعمل fence.tso استفاده میکند یا نمیکند؛ این دستورالعمل در برخی پردازندهها (از جمله پردازندههای شرکت T-Head) پیادهسازی نشده است. اگر دستورالعمل fence.tso در دسترس نباشد، بهجای آن از یک fence قویتر استفاده میشود.
- -mdiv
- -mno-div
- از دستورالعملهای سختافزاری برای تقسیم اعداد صحیح استفاده میکند یا نمیکند. این امر نیازمند افزونهٔ M است. حالت پیشفرض در صورتی که معماری مشخصشده دارای این دستورالعملها باشد، استفاده از آنهاست.
- -misa-spec=ISA-spec-string
- نسخهٔ مشخصات ISA غیرممتاز RISC-V (پیشتر سطح کاربر یا User-Level) را مشخص میکند تا کد مطابق با آن تولید شود. مقادیر ممکن برای ISA-spec-string عبارتند از:
- 2.2
- تولید کد منطبق بر نسخهٔ 2.2.
- 20190608
- تولید کد منطبق بر نسخهٔ 20190608.
- 20191213
- تولید کد منطبق بر نسخهٔ 20191213.
پیشفرض -misa-spec=20191213 است، مگر آنکه GCC با گزینهٔ --with-isa-spec= برای تعیین نسخهٔ پیشفرض متفاوتی پیکربندی شده باشد.
- -march=ISA-string
- برای ISA
مشخصشدهٔ
RISC-V (مانند rv64im)
کد تولید
میکند.
رشتههای ISA
باید با
حروف کوچک
باشند.
نمونهها
شامل rv64i، rv32g،
rv32e و rv32imaf
هستند.
علاوه بر
این، مقدار
ویژهٔ help (-march=help)
برای فهرست
کردن تمام
افزونههای
پشتیبانیشده
پذیرفته
میشود.
نحو رشتهٔ ISA به صورت زیر تعریف میشود:
- "رشته باید با rv32 یا rv64 آغاز شود، و به دنبال آن"
- i، e، یا g بیاید، که به عنوان ISA پایه نامیده میشود.
- "بخش بعدی رشته، فهرستی از نامهای افزونه است. نامهای"
- افزونه میتوانند به صورت چندحرفی (مانند zba) و تکحرفی (مانند v) دستهبندی شوند. افزونههای تکحرفی میتوانند پشت سر هم ظاهر شوند، اما افزونههای چندحرفی باید با زیرخط (underscore) از یکدیگر جدا شوند.
- "یک خط زیر (underscore) میتواند در هر جایی پس از ISA پایه بیاید. این نویسه اثر"
- خاصی ندارد، اما برای بهبود خوانایی استفاده میشود و میتواند به عنوان یک جداکننده عمل کند.
- "نامهای افزونه ممکن است شامل یک شماره نسخهٔ اختیاری باشند، که از ساختار"
- نحوی <major>p<minor> یا <major> پیروی میکند (مانند m2p1 یا m2).
افزونههای پشتیبانیشده در زیر فهرست شدهاند:
- نام افزونه : نسخهٔ پشتیبانیشده : توضیحات
- i
- @tab 2.0, 2.1 @tab افزونهٔ پایهٔ اعداد صحیح.
- e
- @tab 2.0 @tab افزونهٔ پایهٔ کاهشیافتهٔ اعداد صحیح.
- g
- @tab - @tab افزونهٔ پایهٔ محاسبات همهمنظوره؛ g به i، m، a، f، d، zicsr و zifencei گسترش مییابد.
- m
- @tab 2.0 @tab افزونهٔ ضرب و تقسیم اعداد صحیح.
- a
- @tab 2.0, 2.1 @tab افزونهٔ اتمیک..IP f 4 @tab 2.0, 2.2 @tab افزونهٔ ممیز شناور با دقت یگانه.
- d
- @tab 2.0, 2.2 @tab افزونهٔ ممیز شناور با دقت مضاعف.
- c
- @tab 2.0 @tab افزونهٔ فشرده.
- h
- @tab 1.0 @tab افزونهٔ هایپروایزر.
- v
- @tab 1.0 @tab افزونهٔ برداری.
- zicsr
- @tab 2.0 @tab افزونهٔ دسترسی به ثبات کنترل و وضعیت.
- zifencei
- @tab 2.0 @tab افزونهٔ سد واکشی دستورالعمل.
- zicond
- @tab 1.0 @tab افزونهٔ عملیاتهای شرطی عدد صحیح.
- za64rs
- @tab 1.0 @tab اندازهٔ مجموعهٔ رزرو ۶۴ بایت.
- za128rs
- @tab 1.0 @tab اندازهٔ مجموعهٔ رزرو ۱۲۸ بایت.
- zawrs
- @tab 1.0 @tab افزونهٔ درنگ روی مجموعهٔ رزرو.
- zba
- @tab 1.0 @tab افزونهٔ محاسبات آدرس.
- zbb
- @tab 1.0 @tab افزونهٔ دستکاری بیت پایه.
- zbc
- @tab 1.0 @tab افزونهٔ ضرب بدون رقم نقلی.
- zbs
- @tab 1.0 @tab افزونهٔ عملیات تکبیتی.
- zfinx
- @tab 1.0 @tab افزونهٔ ممیز شناور با دقت یگانه در ثباتهای عدد صحیح.
- zdinx
- @tab 1.0 @tab افزونهٔ ممیز شناور با دقت مضاعف در ثباتهای عدد صحیح.
- zhinx
- @tab 1.0 @tab افزونهٔ ممیز شناور با نیمدقت در ثباتهای عدد صحیح.
- zhinxmin
- @tab 1.0 @tab افزونهٔ ممیز شناور حداقلی با نیمدقت در ثباتهای عدد صحیح.
- zbkb
- @tab 1.0 @tab افزونهٔ دستکاری بیت برای رمزنگاری.
- zbkc
- @tab 1.0 @tab افزونهٔ ضرب بدون رقم نقلی برای رمزنگاری.
- zbkx
- @tab 1.0 @tab افزونهٔ جایگشت متقاطع برای رمزنگاری.
- zkne
- @tab 1.0 @tab افزونهٔ رمزگذاری AES.
- zknd
- @tab 1.0 @tab افزونهٔ رمزگشایی AES.
- zknh
- @tab 1.0 @tab افزونهٔ تابع درهمسازی.
- zkr
- @tab 1.0 @tab افزونهٔ منبع آنتروپی.
- zksed
- @tab 1.0 @tab افزونهٔ رمز قالبی SM4.
- zksh
- @tab 1.0 @tab افزونهٔ تابع درهمسازی SM3.
- zkt
- @tab 1.0 @tab افزونهٔ زمان اجرای مستقل از داده.
- zk
- @tab 1.0 @tab افزونهٔ استاندارد رمزنگاری اسکالر.
- zkn
- @tab 1.0 @tab افزونهٔ مجموعه الگوریتمهای NIST.
- zks
- @tab 1.0 @tab افزونهٔ مجموعه الگوریتمهای ShangMi.
- zihintntl
- @tab 1.0 @tab افزونهٔ راهنماهای محلیبودن غیرزمانی.
- zihintpause
- @tab 1.0 @tab افزونهٔ راهنمای مکث.
- zicboz
- @tab 1.0 @tab افزونهٔ صفرسازی بلوک حافظهٔ نهان.
- zicbom
- @tab 1.0 @tab افزونهٔ مدیریت بلوک حافظهٔ نهان.
- zicbop
- @tab 1.0 @tab افزونهٔ پیشواکشی بلوک حافظهٔ نهان.
- zic64b
- @tab 1.0 @tab اندازهٔ بلوک حافظهٔ نهان ۶۴ بایت است.
- ziccamoa
- @tab 1.0 @tab حافظهٔ اصلی از تمام عملیاتهای اتمی در A پشتیبانی میکند.
- ziccif
- @tab 1.0 @tab حافظهٔ اصلی از واکشی دستورالعمل با نیازمندی اتمیبودن پشتیبانی میکند.
- zicclsm
- @tab 1.0 @tab حافظهٔ اصلی از بارگذاریها/ذخیرهسازیهای غیرهمتراز پشتیبانی میکند.
- ziccrse
- @tab 1.0 @tab حافظهٔ اصلی از پیشرفت رو به جلو در توالیهای LR/SC پشتیبانی میکند.
- zicntr
- @tab 2.0 @tab افزونهٔ استاندارد برای شمارندهها و زمانسنجهای پایه.
- zihpm
- @tab 2.0 @tab افزونهٔ استاندارد برای شمارندههای عملکرد سختافزاری.
- ztso
- @tab 1.0 @tab افزونهٔ ترتیب کلی ذخیرهسازی..IP zve32x 4 @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده.
- zve32f
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده.
- zve64x
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده.
- zve64f
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده.
- zve64d
- @tab 1.0 @tab افزونههای برداری برای پردازندههای تعبیهشده.
- zvl32b
- @tab 1.0 @tab افزونههای استاندارد کمینهٔ طول بردار.
- zvl64b
- @tab 1.0 @tab افزونههای استاندارد کمینهٔ طول بردار.
- zvl128b
- @tab 1.0 @tab افزونههای استاندارد کمینهٔ طول بردار.
- zvl256b
- @tab 1.0 @tab افزونههای استاندارد کمینهٔ طول بردار.
- zvl512b
- @tab 1.0 @tab افزونههای استاندارد کمینهٔ طول بردار.
- zvl1024b
- @tab 1.0 @tab افزونههای استاندارد کمینهٔ طول بردار.
- zvl2048b
- @tab 1.0 @tab افزونههای استاندارد کمینهٔ طول بردار.
- zvl4096b
- @tab 1.0 @tab افزونههای استاندارد کمینهٔ طول بردار.
- zvbb
- @tab 1.0 @tab افزونهٔ برداری دستکاری بیتی پایه.
- zvbc
- @tab 1.0 @tab افزونهٔ برداری ضرب بدون رقم نقلی.
- zvkb
- @tab 1.0 @tab افزونهٔ برداری دستکاری بیتی رمزنگاری.
- zvkg
- @tab 1.0 @tab افزونهٔ برداری GCM/GMAC.
- zvkned
- @tab 1.0 @tab افزونهٔ برداری رمز قالبی AES.
- zvknha
- @tab 1.0 @tab افزونهٔ برداری درهمسازی امن SHA-2.
- zvknhb
- @tab 1.0 @tab افزونهٔ برداری درهمسازی امن SHA-2.
- zvksed
- @tab 1.0 @tab افزونهٔ برداری رمز قالبی SM4.
- zvksh
- @tab 1.0 @tab افزونهٔ برداری درهمسازی امن SM3.
- zvkn
- @tab 1.0 @tab افزونهٔ برداری مجموعه الگوریتم NIST؛ zvkn به zvkned، zvknhb، zvkb و zvkt بسط مییابد.
- zvknc
- @tab 1.0 @tab افزونهٔ برداری مجموعه الگوریتم NIST با ضرب بدون رقم نقلی؛ zvknc به zvkn و zvbc بسط مییابد.
- zvkng
- @tab 1.0 @tab افزونهٔ برداری مجموعه الگوریتم NIST با GCM؛ zvkng به zvkn و zvkg بسط مییابد.
- zvks
- @tab 1.0 @tab افزونهٔ برداری مجموعه الگوریتم ShangMi؛ zvks به zvksed، zvksh، zvkb و zvkt بسط مییابد.
- zvksc
- @tab 1.0 @tab افزونهٔ برداری مجموعه الگوریتم ShangMi با ضرب بدون رقم نقلی؛ zvksc به zvks و zvbc بسط مییابد.
- zvksg
- @tab 1.0 @tab افزونهٔ برداری مجموعه الگوریتم ShangMi با GCM؛ zvksg به zvks و zvkg بسط مییابد.
- zvkt
- @tab 1.0 @tab افزونهٔ برداری تأخیر اجرای مستقل از داده.
- zfh
- @tab 1.0 @tab افزونهٔ ممیز شناور با دقت نیمه.
- zfhmin
- @tab 1.0 @tab افزونهٔ کمینهٔ ممیز شناور با دقت نیمه.
- zvfh
- @tab 1.0 @tab افزونهٔ برداری ممیز شناور با دقت نیمه.
- zvfhmin
- @tab 1.0 @tab افزونهٔ برداری کمینهٔ ممیز شناور با دقت نیمه.
- zvfbfmin
- @tab 1.0 @tab افزونهٔ برداری تبدیلهای BF16.
- zfa
- @tab 1.0 @tab افزونهٔ ممیز شناور اضافی.
- zmmul
- @tab 1.0 @tab افزونهٔ ضرب عدد صحیح.
- zca
- @tab 1.0 @tab افزونهٔ دستورهای فشردهٔ عدد صحیح.
- zcf
- @tab 1.0 @tab افزونهٔ بارگذاریها و ذخیرهسازیهای فشردهٔ ممیز شناور با دقت یگانه.
- zcd
- @tab 1.0 @tab افزونهٔ بارگذاریها و ذخیرهسازیهای فشردهٔ ممیز شناور با دقت دوگانه.
- zcb
- @tab 1.0 @tab افزونهٔ دستورهای فشردهٔ ساده.
- zce
- @tab 1.0 @tab افزونههای دستورهای فشرده برای پردازندههای تعبیهشده.
- zcmp
- @tab 1.0 @tab افزونهٔ push و pop فشرده.
- zcmt
- @tab 1.0 @tab افزونهٔ دستور پرش جدول.
- smaia
- @tab 1.0 @tab افزونهٔ معماری وقفهٔ پیشرفته..IP smepmp 4 @tab 1.0 @tab بهبودهای PMP برای دسترسی به حافظه و جلوگیری از اجرا در Machine mode.
- smstateen
- @tab 1.0 @tab افزونهٔ فعالسازی وضعیت (State enable).
- ssaia
- @tab 1.0 @tab افزونهٔ معماری پیشرفتهٔ وقفه برای supervisor-mode.
- sscofpmf
- @tab 1.0 @tab افزونهٔ شمارش سرریز و فیلترگذاری.
- ssstateen
- @tab 1.0 @tab افزونهٔ فعالسازی وضعیت برای supervisor-mode.
- sstc
- @tab 1.0 @tab افزونهٔ وقفههای زمانسنج supervisor-mode.
- svinval
- @tab 1.0 @tab افزونهٔ ابطال دقیق حافظهٔ پنهانِ ترجمهٔ آدرس (Fine-grained).
- svnapot
- @tab 1.0 @tab افزونهٔ پیوستگی ترجمهٔ NAPOT.
- svpbmt
- @tab 1.0 @tab افزونهٔ انواع حافظهٔ مبتنی بر صفحه.
- xcvmac
- @tab 1.0 @tab افزونهٔ ضرب و انباشت (multiply-accumulate) در Core-V.
- xcvalu
- @tab 1.0 @tab افزونهٔ عملیات متفرقهٔ ALU در Core-V.
- xcvelw
- @tab 1.0 @tab افزونهٔ بارگذاری کلمهٔ رخداد (event load word) در Core-V.
- xtheadba
- @tab 1.0 @tab افزونهٔ محاسبهٔ آدرس T-head.
- xtheadbb
- @tab 1.0 @tab افزونهٔ پایهای دستکاری بیت T-head.
- xtheadbs
- @tab 1.0 @tab افزونهٔ دستورالعملهای تکبیتی T-head.
- xtheadcmo
- @tab 1.0 @tab افزونهٔ عملیات مدیریت حافظهٔ پنهان T-head.
- xtheadcondmov
- @tab 1.0 @tab افزونهٔ انتقال شرطی T-head.
- xtheadfmemidx
- @tab 1.0 @tab افزونهٔ عملیات حافظهٔ نمایهشده برای ثباتهای ممیز شناور T-head.
- xtheadfmv
- @tab 1.0 @tab افزونهٔ انتقال دادههای بیتهای بالایی ممیز شناور با دقت مضاعف T-head.
- xtheadint
- @tab 1.0 @tab افزونهٔ شتابدهی به وقفهٔ T-head.
- xtheadmac
- @tab 1.0 @tab افزونهٔ ضرب و انباشت T-head.
- xtheadmemidx
- @tab 1.0 @tab افزونهٔ عملیات حافظهٔ نمایهشدهٔ T-head.
- xtheadmempair
- @tab 1.0 @tab افزونهٔ عملیات حافظهٔ دو-GPR در T-head.
- xtheadsync
- @tab 1.0 @tab افزونهٔ همگامسازی چندهستهای T-head.
- xventanacondops
- @tab 1.0 @tab افزونهٔ عملیات شرطی اعداد صحیح Ventana.
هنگامی که -march= مشخص نشده باشد، از تنظیمات تعیینشده در -mcpu استفاده میشود.
اگر هر دو گزینهٔ -march و -mcpu= مشخص نشده باشند، مقدار پیشفرض این آرگومان وابسته به سیستم است؛ کاربرانی که خواهان افزونههای معماری خاصی هستند باید آن را بهطور صریح مشخص کنند.
هنگامی که مشخصات RISC-V یک افزونه را وابسته به افزونههای دیگر تعریف کرده باشد، چنانچه این افزونههای وابسته بهطور صریح اضافه نشده باشند، GCC آنها را بهطور ضمنی به مجموعه افزونههای فعالشده میافزاید.
- -mcpu=processor-string
- استفاده از
معماری
پردازندهٔ
ارائهشده
و
بهینهسازی
خروجی برای
آن، که با
نام
پردازندهٔ
خاص (CPU) مشخص
میشود.
مقادیر
مجاز برای
این گزینه
عبارتند از:
sifive-e20، sifive-e21،
sifive-e24، sifive-e31،
sifive-e34، sifive-e76،
sifive-s21، sifive-s51،
sifive-s54، sifive-s76،
sifive-u54، sifive-u74،
sifive-x280، sifive-xp450،
sifive-x670، thead-c906،
tt-ascalon-d8، xiangshan-nanhu.
توجه داشته باشید که -mcpu گزینههای -march یا -mtune را لغو و بازنویسی نمیکند.
- -mtune=processor-string
- بهینهسازی
خروجی برای
پردازندهٔ
ارائهشده،
که بر اساس
ریزمعماری
یا نام
پردازندهٔ
خاص مشخص
میشود.
مقادیر
مجاز برای
این گزینه
عبارتند از:
generic-ooo، rocket،
sifive-3-series، sifive-5-series،
sifive-7-series، size،
sifive-p400-series، sifive-p600-series و
تمام
گزینههای
معتبر برای
-mcpu=.
هنگامی که -mtune= مشخص نشده باشد، از تنظیمات -mcpu استفاده میشود؛ در صورتی که هیچکدام مشخص نشده باشند، پیشفرض rocket است.
انتخاب size برای استفاده توسط کاربران نهایی در نظر گرفته نشده است. این مورد زمانی استفاده میشود که -Os مشخص شده باشد. این انتخاب اطلاعات هزینهٔ دستورالعملها را که توسط -mtune= ارائه میشود بازنویسی میکند، اما اطلاعات خط لوله (pipeline) را بازنویسی نمیکند. این قابلیت به کاهش حجم کد ضمن حفظ عملکرد مناسب کمک میکند.
- -mpreferred-stack-boundary=num
- تلاش برای
نگهداشتن
تراز مرز
پشته بر روی
مرز ۲ به
توان num
بایت. اگر
-mpreferred-stack-boundary مشخص
نشده باشد،
مقدار
پیشفرض 4
است (۱۶
بایت یا ۱۲۸
بیت).
هشدار: اگر از این گزینه استفاده میکنید، باید تمام پودمانها از جمله هرگونه کتابخانه را با همین مقدار بسازید. این امر شامل کتابخانههای سیستم و پودمانهای راهاندازی (startup) نیز میشود.
- -msmall-data-limit=n
- قرار دادن دادههای سراسری و ایستا که کوچکتر از n بایت هستند در یک بخش (section) ویژه (در برخی هدفها).
- -msave-restore
- -mno-save-restore
- استفاده یا عدم استفاده از کد کوچکتر اما کندترِ مقدمه (prologue) و مؤخره (epilogue) که از فراخوانی توابع کتابخانهای بهره میبرد. مقدار پیشفرض استفاده از مقدمه و مؤخرههای سریعِ درونخطی (inline) است.
- -mmovcc
- -mno-movcc
- تولید یا عدم تولید توالیهای کدِ انتقال شرطی بدون انشعاب (branchless)، حتی در هدفهایی که دستورالعملهای خاصی برای عملیات شرطی ندارند. در صورت فعال بودن، در جاهایی که سودمند باشد توالیهایی از عملیات ALU با استفاده از دستورالعملهای پایهٔ عدد صحیح ISA تولید میشود.
- -minline-atomics
- -mno-inline-atomics
- استفاده یا عدم استفاده از کد کوچکتر اما کندترِ شبیهسازی اتمیک زیرکلمه (subword atomic) که از فراخوانی توابع libatomic استفاده میکند. پیشفرض، استفاده از عملیات اتمیک زیرکلمهٔ سریع درونخطی است که نیازی به libatomic ندارند..IP -minline-strlen 4
- -mno-inline-strlen
- تلاش برای درونخطیسازی فراخوانیهای strlen در صورت امکان، یا عدم انجام آن. درونخطیسازی تنها زمانی انجام میشود که رشته بهدرستی تراز شده باشد و دستورالعملهای پردازش شتابیافته در دسترس باشند. حالت پیشفرض، درونخطی نکردن فراخوانیهای strlen است.
- -minline-strcmp
- -mno-inline-strcmp
- تلاش برای
درونخطیسازی
فراخوانیهای
strcmp در صورت
امکان، یا
عدم انجام
آن.
درونخطیسازی
تنها زمانی
انجام
میشود که
رشتهها
بهدرستی
تراز شده
باشند و
دستورالعملهای
پردازش
شتابیافته
در دسترس
باشند. حالت
پیشفرض،
درونخطی
نکردن
فراخوانیهای
strcmp است.
پارامتر --param riscv-strcmp-inline-limit=n حداکثر تعداد بایتهای مقایسهشده توسط کد درونخطی را کنترل میکند. مقدار پیشفرض 64 است.
- -minline-strncmp
- -mno-inline-strncmp
- تلاش برای
درونخطیسازی
فراخوانیهای
strncmp در صورت
امکان، یا
عدم انجام
آن.
درونخطیسازی
تنها زمانی
انجام
میشود که
رشتهها
بهدرستی
تراز شده
باشند و
دستورالعملهای
پردازش
شتابیافته
در دسترس
باشند. حالت
پیشفرض،
درونخطی
نکردن
فراخوانیهای
strncmp است.
پارامتر --param riscv-strcmp-inline-limit=n حداکثر تعداد بایتهای مقایسهشده توسط کد درونخطی را کنترل میکند. مقدار پیشفرض 64 است.
- -mshorten-memrefs
- -mno-shorten-memrefs
- تلاش برای استفاده بیشتر از دستورالعملهای بارگذاری/ذخیرهسازی (load/store) فشردهشده، یا عدم انجام آن، با جایگزین کردن یک بارگذاری/ذخیره از نوع 'base register + large offset' با یک بارگذاری/ذخیره جدید از نوع 'new base + small offset'. اگر پایه جدید در یک ثبات فشردهشده ذخیره شود، آنگاه بارگذاری/ذخیره جدید میتواند فشرده شود. در حال حاضر فقط بارگذاری/ذخیرهسازیهای عدد صحیح ۳۲ بیتی را هدف قرار میدهد.
- -mstrict-align
- -mno-strict-align
- تولید نکردن یا تولید کردن دسترسیهای حافظه ناتراز. حالت پیشفرض بسته به اینکه پردازندهای که برای آن بهینهسازی میکنیم از دسترسی سریع ناتراز پشتیبانی میکند یا خیر تعیین میشود.
- -mscalar-strict-align
- -mno-scalar-strict-align
- تولید نکردن یا تولید کردن دسترسیهای حافظه ناتراز. حالت پیشفرض بسته به اینکه پردازندهای که برای آن بهینهسازی میکنیم از دسترسی سریع ناتراز پشتیبانی میکند یا خیر تعیین میشود. این یک نام مستعار برای -mstrict-align است.
- -mvector-strict-align
- -mno-vector-strict-align
- تولید نکردن یا تولید کردن دسترسیهای برداری ناتراز به حافظه. مقدار پیشفرض غیرفعال است، مگر اینکه پردازندهای که برای آن بهینهسازی میکنیم صراحتاً از دسترسی برداری به حافظه با عناصر ناتراز پشتیبانی کند.
- -mcmodel=medlow
- تولید کد برای مدل کد medium-low. برنامه و نمادهای تعریفشده بهصورت ایستا باید در یک بازه آدرس ۲ گیبیبایتی (2 GiB) قرار بگیرند و باید بین آدرسهای مطلق -2 GiB و +2 GiB باشند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند داده شوند. این مدل کد پیشفرض است مگر اینکه GCC با گزینه --with-cmodel= مشخصکننده یک مدل کد پیشفرض دیگر پیکربندی شده باشد.
- -mcmodel=medany
- تولید کد
برای مدل کد
medium-any. برنامه و
نمادهای
تعریفشده
بهصورت
ایستا باید
در هر بازه
آدرس منفرد
۲
گیبیبایتی
قرار
بگیرند.
برنامهها
میتوانند
بهصورت
ایستا یا
پویا پیوند
داده شوند.
کد تولیدشده توسط مدل کد medium-any مستقل از موقعیت است، اما تضمین نمیشود هنگام پیوند در فایلهای اجرایی یا کتابخانههای مستقل از موقعیت بهدرستی کار کند.
- -mcmodel=large
- تولید کد برای مدل کد بزرگ (large)، که هیچ محدودیتی در اندازه یا جایابی نمادها ندارد.
- -mexplicit-relocs
- -mno-exlicit-relocs
- استفاده یا عدم استفاده از عملگرهای بازآرایی اسمبلر هنگام کار با آدرسهای نمادین. روش جایگزین، استفاده از ماکروهای اسمبلر است که ممکن است بهینهسازی را محدود کند.
- -mrelax
- -mno-relax
- بهرهگیری از سادهسازیهای پیونددهنده (linker relaxations) برای کاهش تعداد دستورالعملهای مورد نیاز جهت تحقق آدرسهای نمادین. حالت پیشفرض، بهرهگیری از سادهسازیهای پیونددهنده است.
- -mriscv-attribute
- -mno-riscv-attribute
- درج کردن (درج نکردن) مشخصه RISC-V برای ثبت اطلاعات اضافی در اشیاء ELF. این قابلیت حداقل به binutils 2.32 نیاز دارد.
- -mcsr-check
- -mno-csr-check
- بررسی CSR را فعال یا غیرفعال میکند.
- -malign-data=type
- کنترل نحوه تراز کردن متغیرها و مقادیر ثابت انواع آرایه، ساختار یا اجتماع توسط GCC. مقادیر پشتیبانیشده برای type عبارتند از xlen که از عرض ثبات x بهعنوان مقدار تراز استفاده میکند، و natural که از تراز طبیعی بهره میبرد. xlen مقدار پیشفرض است.
- -mbig-endian
- تولید کد با ترتیب بایت بزرگپایان (big-endian). این حالت پیشفرض است زمانی که GCC برای یک هدف riscv64be-*-* یا riscv32be-*-* پیکربندی شده باشد.
- -mlittle-endian
- تولید کد با ترتیب بایت کوچکپایان (little-endian). این حالت پیشفرض است زمانی که GCC برای یک هدف riscv64-*-* یا riscv32-*-* پیکربندی شده باشد اما برای اهداف riscv64be-*-* یا riscv32be-*-* نباشد.
- -mstack-protector-guard=guard
- -mstack-protector-guard-reg=reg
- -mstack-protector-guard-offset=offset
- تولید کد
محافظت از
پشته با
استفاده از
قناری در guard.
مکانهای
پشتیبانیشده
عبارتند از
global برای یک
قناری
سراسری یا
tls برای
قناری به
ازای هر
رشته در
بلوک TLS.
با انتخاب حالت دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset علاوه بر این مشخص میکنند که از کدام ثبات بهعنوان ثبات پایه برای خواندن قناری استفاده شود، و از چه آفستی نسبت به آن ثبات پایه. هیچ ثبات یا آفست پیشفرضی وجود ندارد چرا که این گزینه کاملاً برای استفاده درون هسته لینوکس در نظر گرفته شده است.
- -mtls-dialect=desc
- استفاده از توصیفکنندههای TLS به عنوان سازوکار ذخیرهسازی محلی رشته (TLS) برای دسترسیهای پویا به متغیرهای TLS.
- -mtls-dialect=trad
- استفاده از TLS سنتی به عنوان سازوکار ذخیرهسازی محلی رشته برای دسترسیهای پویا به متغیرهای TLS. این مقدار پیشفرض است.
گزینههای RL78
- -msim
- کتابخانههای هدف اضافی را برای پشتیبانی از عملکرد درون یک شبیهساز پیوند میدهد.
- -mmul=none
- -mmul=g10
- -mmul=g13
- -mmul=g14
- -mmul=rl78
- نوع
پشتیبانی
سختافزاری
از ضرب و
تقسیم را
برای
استفاده
مشخص
میکند.
سادهترین
حالت "none"
است که از
نرمافزار
برای هر دو
عمل ضرب و
تقسیم بهره
میبرد. این
حالت
پیشفرض
است. مقدار
"g13"
مربوط به
جانبی
سختافزاری
ضرب/تقسیم
موجود در
اهداف RL78/G13
(هسته S2) است.
مقدار
"g14"
استفاده از
دستورالعملهای
ضرب و تقسیم
پشتیبانیشده
توسط قطعات
RL78/G14 (هسته S3) را
انتخاب
میکند.
مقدار
"rl78" نام
مستعاری
برای "g14"
و مقدار
"mg10" نام
مستعاری
برای "none"
است.
علاوه بر این، بر اساس تنظیم این گزینه یک ماکروی پیشپردازندهٔ C تعریف میشود. مقادیر ممکن عبارتند از: "__RL78_MUL_NONE__"، "__RL78_MUL_G13__" یا "__RL78_MUL_G14__".
- -mcpu=g10
- -mcpu=g13
- -mcpu=g14
- -mcpu=rl78
- هستهٔ RL78 هدف
را مشخص
میکند.
پیشفرض
هستهٔ G14 است
که به عنوان
هستهٔ S3 یا
صرفاً RL78 نیز
شناخته
میشود.
هستهٔ G13 یا S2
دستورالعملهای
ضرب یا
تقسیم
ندارد،
بلکه برای
این عملیات
از یک جانبی
سختافزاری
استفاده
میکند.
هستهٔ G10 یا S1
فاقد
بانکهای
ثبات است،
بنابراین
از یک
قرارداد
فراخوانی (calling
convention) متفاوت
استفاده
میکند.
اگر این گزینه تنظیم شود، نوع پشتیبانی ضرب سختافزاری مورد استفاده را نیز مشخص میکند، مگر اینکه با یک گزینهٔ صریح -mmul=none در خط فرمان لغو شود. بدین ترتیب، مشخص کردن -mcpu=g13 استفاده از جانبی سختافزاری ضرب G13 را فعال میکند و مشخص کردن -mcpu=g10 استفاده از ضربهای سختافزاری را بهطور کامل غیرفعال میسازد.
توجه داشته باشید گرچه هستهٔ RL78/G14 هدف پیشفرض است، مشخص کردن -mcpu=g14 یا -mcpu=rl78 در خط فرمان رفتار زنجیرهابزار را تغییر میدهد چرا که پشتیبانی ضرب سختافزاری G14 را نیز فعال میکند. اگر این گزینهها در خط فرمان مشخص نشوند، حتی با وجود اینکه کد هستهٔ RL78 را هدف قرار میدهد، از روتینهای ضرب نرمافزاری استفاده خواهد شد. این امر به منظور سازگاری پسرو با زنجیرهابزارهای قدیمیتر است که پشتیبانی ضرب و تقسیم سختافزاری را نداشتند.
علاوه بر این، بر اساس تنظیم این گزینه یک ماکروی پیشپردازندهٔ C تعریف میشود. مقادیر ممکن عبارتند از: "__RL78_G10__"، "__RL78_G13__" یا "__RL78_G14__".
- -mg10
- -mg13
- -mg14
- -mrl78
- اینها نامهای مستعاری برای گزینهٔ متناظر -mcpu= هستند. آنها برای سازگاری پسرو ارائه شدهاند.
- -mallregs
- به کامپایلر اجازه میدهد از همهٔ ثباتهای در دسترس استفاده کند. بهطور پیشفرض ثباتهای "r24..r31" برای استفاده در گردانندههای وقفه رزرو شدهاند. با فعال بودن این گزینه، این ثباتها میتوانند در توابع معمولی نیز استفاده شوند.
- -m64bit-doubles
- -m32bit-doubles
- اندازه نوع دادهٔ "double" را ۶۴ بیت (-m64bit-doubles) یا ۳۲ بیت (-m32bit-doubles) قرار میدهد. پیشفرض -m32bit-doubles است.
- -msave-mduc-in-interrupts
- -mno-save-mduc-in-interrupts
- مشخص میکند که توابع گردانندهٔ وقفه باید ثباتهای MDUC را حفظ کنند. این امر تنها در صورتی ضروری است که کدهای عادی ممکن است از ثباتهای MDUC استفاده کنند، برای مثال به این دلیل که عملیات ضرب و تقسیم را انجام میدهند. پیشفرض نادیده گرفتن ثباتهای MDUC است زیرا این کار گردانندههای وقفه را سریعتر میکند. برای کارکرد این قابلیت باید گزینهٔ هدف -mg13 ارسال شود چرا که این ویژگی تنها روی هدف G13 (هسته S2) در دسترس است. ثباتهای MDUC تنها در صورتی ذخیره خواهند شد که گردانندهٔ وقفه یک عملیات ضرب یا تقسیم انجام دهد یا تابع دیگری را فراخوانی کند.
گزینههای IBM RS/6000 و PowerPC
این گزینههای -m برای IBM RS/6000 و PowerPC تعریف شدهاند:
- -mpowerpc-gpopt
- -mno-powerpc-gpopt
- -mpowerpc-gfxopt
- -mno-powerpc-gfxopt
- -mpowerpc64
- -mno-powerpc64
- -mmfcrf
- -mno-mfcrf
- -mpopcntb
- -mno-popcntb
- -mpopcntd
- -mno-popcntd
- -mfprnd
- -mno-fprnd
- -mcmpb
- -mno-cmpb
- -mhard-dfp
- -mno-hard-dfp
- شما از این
گزینهها
برای مشخص
کردن
اینکه
کدام
دستورالعملها
روی
پردازندهٔ
مورد
استفاده
شما در
دسترس
هستند،
بهره
میبرید.
مقدار
پیشفرض
این
گزینهها
هنگام
پیکربندی GCC
تعیین
میشود.
مشخص کردن
-mcpu=cpu_type
مشخصات این
گزینهها
را لغو
میکند.
توصیه
میکنیم به
جای
گزینههای
فهرستشده
در بالا از
گزینهٔ
-mcpu=cpu_type
استفاده
کنید.
مشخص کردن -mpowerpc-gpopt به GCC اجازه میدهد از دستورالعملهای اختیاری معماری PowerPC در گروه کاربرد عمومی (General Purpose)، از جمله جذر ممیز شناور استفاده کند. مشخص کردن -mpowerpc-gfxopt به GCC امکان میدهد از دستورالعملهای اختیاری معماری PowerPC در گروه گرافیک، از جمله انتخاب ممیز شناور استفاده کند.
گزینهٔ -mmfcrf به GCC اجازه میدهد دستورالعمل «انتقال از فیلد ثبات وضعیت» (move from condition register field) را که روی پردازندهٔ POWER4 و دیگر پردازندههای پشتیبانیکننده از معماری PowerPC V2.01 پیادهسازی شده است، تولید کند. گزینهٔ -mpopcntb به GCC اجازه میدهد دستورالعمل popcount و تخمین معکوس ممیز شناور با دقت مضاعف را که روی پردازندهٔ POWER5 و دیگر پردازندههای پشتیبانیکننده از معماری PowerPC V2.02 پیادهسازی شده است، تولید کند. گزینهٔ -mpopcntd به GCC اجازه میدهد دستورالعمل popcount را که روی پردازندهٔ POWER7 و دیگر پردازندههای پشتیبانیکننده از معماری PowerPC V2.06 پیادهسازی شده است، تولید کند. گزینهٔ -mfprnd به GCC اجازه میدهد دستورالعملهای گرد کردن ممیز شناور به عدد صحیح را که روی پردازندهٔ +POWER5 و دیگر پردازندههای پشتیبانیکننده از معماری PowerPC V2.03 پیادهسازی شده است، تولید کند. گزینهٔ -mcmpb به GCC اجازه میدهد دستورالعمل مقایسهٔ بایتها را که روی پردازندهٔ POWER6 و دیگر پردازندههای پشتیبانیکننده از معماری PowerPC V2.05 پیادهسازی شده است، تولید کند. گزینهٔ -mhard-dfp به GCC اجازه میدهد دستورالعملهای ممیز شناور دهدهی را که روی برخی پردازندههای POWER پیادهسازی شده است، تولید کند.
گزینهٔ -mpowerpc64 به GCC امکان میدهد دستورالعملهای ۶۴ بیتی اضافی موجود در معماری کامل PowerPC64 را تولید کند و با ثباتهای همهمنظوره (GPRها) به عنوان مقادیر ۶۴ بیتی و کلمهمضاعف (doubleword) رفتار کند. پیشفرض GCC گزینهٔ -mno-powerpc64 است..IP -mcpu=cpu_type 4 تنظیم نوع معماری، نحوهٔ استفاده از ثباتها، و پارامترهای زمانبندی دستورالعملها برای نوع ماشین cpu_type. مقادیر پشتیبانیشده برای cpu_type عبارتند از 401، 403، 405، 405fp، 440، 440fp، 464، 464fp، 476، 476fp، 505، 601، 602، 603، 603e، 604، 604e، 620، 630، 740، 7400، 7450، 750، 801، 821، 823، 860، 970، 8540، a2، e300c2، e300c3، e500mc، e500mc64، e5500، e6500، ec603e، G3، G4، G5، titan، power3، power4، power5، power5+، power6، power6x، power7، power8، power9، power10، power11، powerpc، powerpc64، powerpc64le، rs64، و native.
گزینههای -mcpu=powerpc، -mcpu=powerpc64، و -mcpu=powerpc64le انواع ماشین با معماری PowerPC خالص ۳۲-بیتی (هر ترتیب بایتی)، PowerPC ۶۴-بیتی big endian و PowerPC ۶۴-بیتی little endian را مشخص میکنند، که یک مدل پردازندهٔ عمومی و مناسب برای اهداف زمانبندی برای آنها فرض میشود.
مشخص کردن native به عنوان نوع پردازنده، گزینهٔ معماری مربوط به پردازندهٔ میزبان سامانهٔ انجامدهندهٔ کامپایل را شناسایی و انتخاب میکند. اگر GCC پردازنده را شناسایی نکند، -mcpu=native هیچ اثری ندارد.
گزینههای دیگر یک پردازندهٔ خاص را مشخص میکنند. کدی که تحت این گزینهها تولید میشود روی همان پردازنده بهترین اجرا را دارد و ممکن است روی پردازندههای دیگر اصلاً اجرا نشود.
گزینههای -mcpu بهطور خودکار گزینههای زیر را فعال یا غیرفعال میکنند:
-maltivec -mfprnd -mhard-float -mmfcrf -mmultiple -mpopcntb -mpopcntd -mpowerpc64 -mpowerpc-gpopt -mpowerpc-gfxopt -mmulhw -mdlmzb -mmfpgpr -mvsx -mcrypto -mhtm -mpower8-fusion -mquad-memory -mquad-memory-atomic -mfloat128 -mfloat128-hardware -mprefixed -mpcrel -mmma -mrop-protect
گزینههای خاص تنظیمشده برای هر پردازندهٔ مشخص بین نسخههای مختلف کامپایلر متفاوت است، بسته به این که چه تنظیمی به نظر میرسد کد بهینهای برای آن پردازنده تولید میکند؛ این لزوماً نشاندهندهٔ تواناییهای واقعی سختافزار نیست. اگر میخواهید یک گزینهٔ منفرد را روی مقدار خاصی تنظیم کنید، میتوانید آن را پس از گزینهٔ -mcpu مشخص کنید، مانند -mcpu=970 -mno-altivec.
در AIX، در حال حاضر گزینههای -maltivec و -mpowerpc64 توسط گزینهٔ -mcpu فعال یا غیرفعال نمیشوند، چرا که AIX پشتیبانی کاملی از این گزینهها ندارد. اگر مطمئن هستید که در محیط شما کار خواهد کرد، همچنان میتوانید آنها را بهطور جداگانه فعال یا غیرفعال کنید.
- -mtune=cpu_type
- پارامترهای زمانبندی دستورالعملها را برای نوع ماشین cpu_type تنظیم میکند، اما برخلاف -mcpu=cpu_type نوع معماری یا نحوهٔ استفاده از ثباتها را تنظیم نمیکند. همان مقادیر cpu_type که برای -mcpu استفاده میشوند برای -mtune نیز به کار میروند. اگر هر دو مشخص شوند، کد تولیدشده از معماری و ثباتهای تعیینشده توسط -mcpu استفاده میکند، اما پارامترهای زمانبندی تنظیمشده توسط -mtune را اعمال میکند.
- -mcmodel=small
- کد PowerPC64 را برای مدل کوچک (small) تولید میکند: جدول TOC به 64k محدود میشود.
- -mcmodel=medium
- کد PowerPC64 را برای مدل متوسط (medium) تولید میکند: جدول TOC و سایر دادههای ایستا میتوانند در مجموع تا 4G حجم داشته باشند. این پیشفرض برای لینوکس ۶۴-بیتی است.
- -mcmodel=large
- کد PowerPC64 را برای مدل بزرگ (large) تولید میکند: جدول TOC میتواند تا حجم 4G باشد. سایر دادهها و کد تنها توسط فضای آدرسدهی ۶۴-بیتی محدود میشوند.
- -maltivec
- -mno-altivec
- کدی تولید
میکند که
از
دستورالعملهای
AltiVec استفاده
میکند (یا
نمیکند)، و
همچنین
استفاده از
توابع
توکار (built-in) را
فعال
میکند که
اجازهٔ
دسترسی
مستقیمتر
به مجموعه
دستورالعملهای
AltiVec را
میدهند.
همچنین
ممکن است
لازم باشد
-mabi=altivec را برای
تنظیم ABI
کنونی با
قابلیتهای
افزودهٔ AltiVec ABI
تعیین کنید.
هنگامی که -maltivec استفاده میشود، ترتیب عناصر برای توابع درونی AltiVec مانند "vec_splat"، "vec_extract"، و "vec_insert" با ترتیب عناصر آرایه متناسب با ترتیب بایت (endianness) مقصد مطابقت دارد. بدین معنا که هنگام هدف قرار دادن پلتفرم big-endian، عنصر صفر نشاندهندهٔ چپترین عنصر در یک ثبات برداری است، و هنگام هدف قرار دادن پلتفرم little-endian، عنصر صفر نشاندهندهٔ راستترین عنصر در یک ثبات برداری است.
- -mvrsave
- -mno-vrsave
- تولید دستورالعملهای VRSAVE هنگام تولید کد AltiVec.
- -msecure-plt
- کدی تولید میکند که به ld و ld.so اجازه میدهد فایلهای اجرایی و کتابخانههای اشتراکی را با بخشهای غیرقابلاجرای ".plt" و ".got" ایجاد کنند. این یک گزینهٔ PowerPC 32-bit SYSV ABI است.
- -mbss-plt
- کدی تولید میکند که از یک بخش BSS ".plt" استفاده میکند که ld.so آن را پر میکند، و به بخشهای ".plt" و ".got" نیاز دارد که هم قابل نوشتن و هم قابل اجرا باشند. این یک گزینهٔ PowerPC 32-bit SYSV ABI است.
- -msplit-patch-nops
- هنگام افزودن NOPها برای یک ناحیهٔ وصلهپذیر از طریق گزینهٔ -fpatchable-function-entry، دستورهای NOP «قبل» را پیش از نقطهٔ ورود سراسری (global entry point) و NOPهای «بعد» را پس از نقطهٔ ورود محلی (local entry point) قرار میدهد. این کار باعث میشود در صورت تولید نقطهٔ ورود سراسری، توالی NOPها پشتسرهم نباشد. بدون این گزینه، NOPها مستقیماً قبل و بعد از نقطهٔ ورود محلی قرار میگیرند که آنها را متوالی میکند اما نقطهٔ ورود سراسری و محلی را از یکدیگر دورتر میسازد. اگر فقط یک نقطهٔ ورود تولید شده باشد، این گزینه هیچ اثری ندارد.
- -misel
- -mno-isel
- این سوئیچ تولید دستورالعملهای ISEL را فعال یا غیرفعال میکند.
- -mvsx
- -mno-vsx
- کدی تولید میکند که از دستورالعملهای برداری/اسکالر (VSX) استفاده میکند (یا نمیکند)، و همچنین استفاده از توابع توکار را که دسترسی مستقیمتر به مجموعه دستورالعملهای VSX را ممکن میسازند، فعال میکند.
- -mcrypto
- -mno-crypto
- فعال کردن (یا غیرفعال کردن) استفاده از توابع توکار که اجازهٔ دسترسی مستقیم به دستورالعملهای رمزنگاری که در نسخهٔ 2.07 از PowerPC ISA اضافه شدهاند را میدهند.
- -mhtm
- -mno-htm
- فعال کردن (یا غیرفعال کردن) استفاده از توابع توکار که اجازهٔ دسترسی مستقیم به دستورالعملهای حافظهٔ تراکنشی سختافزاری (HTM) که در نسخهٔ 2.07 از PowerPC ISA اضافه شدهاند را میدهند.
- -mpower8-fusion
- -mno-power8-fusion
- کدی تولید میکند که برخی از عملیات اعداد صحیح را کنار هم نگه میدارد (یا نگه نمیدارد) تا این دستورالعملها بتوانند در پردازندههای power8 و بعد از آن با یکدیگر ادغام شوند.
- -mquad-memory
- -mno-quad-memory
- کدی تولید میکند که از دستورالعملهای غیراتمیک حافظه با کلمهٔ چهارتایی (quad word) استفاده میکند (یا نمیکند). گزینهٔ -mquad-memory نیازمند استفاده از حالت ۶۴-بیتی است..IP -mquad-memory-atomic 4
- -mno-quad-memory-atomic
- تولید کدی که از دستورالعملهای حافظهٔ اتمیک چهارکلمهای (quad word) استفاده میکند (یا نمیکند). گزینهٔ -mquad-memory-atomic نیازمند استفاده از حالت 64-bit است.
- -mfloat128
- -mno-float128
- فعال/غیرفعال
کردن
کلیدواژهٔ
__float128 برای
ممیز شناور
128 بیتی IEEE و
استفاده از
شبیهسازی
نرمافزاری
یا
دستورالعملهای
سختافزاری
برای ممیز
شناور 128
بیتی IEEE.
مجموعه دستورالعمل VSX (-mvsx) برای استفاده از پشتیبانی ممیز شناور 128 بیتی IEEE باید فعال باشد. ممیز شناور 128 بیتی IEEE تنها روی Linux پشتیبانی میشود.
مقدار پیشفرض برای -mfloat128 روی سیستمهای PowerPC Linux با استفاده از مجموعه دستورالعمل VSX فعال، و روی سایر سیستمها غیرفعال است.
اگر از مجموعه دستورالعمل ISA 3.0 (-mcpu=power9) روی یک سیستم ۶۴ بیتی استفاده کنید، پشتیبانی ممیز شناور 128 بیتی IEEE همچنین تولید دستورالعملهای سختافزاری ممیز شناور 128 بیتی IEEE در ISA 3.0 را فعال خواهد کرد. در غیر این صورت، چنانچه تولید دستورالعملهای ISA 3.0 را مشخص نکنید یا یک سیستم ۳۲ بیتی big-endian را هدف قرار دهید، ممیز شناور 128 بیتی IEEE با شبیهسازی نرمافزاری انجام خواهد شد.
- -mfloat128-hardware
- -mno-float128-hardware
- فعال/غیرفعال
کردن
استفاده از
دستورالعملهای
سختافزاری
ISA 3.0 برای
پشتیبانی
از نوع
دادهٔ __float128.
مقدار پیشفرض برای -mfloat128-hardware روی سیستمهای PowerPC Linux با استفاده از مجموعه دستورالعمل ISA 3.0 فعال، و روی سایر سیستمها غیرفعال است.
- -m32
- -m64
- تولید کد برای محیطهای ۳۲ بیتی یا ۶۴ بیتی مقصدهای Darwin و SVR4 (شامل GNU/Linux). محیط ۳۲ بیتی int، long و pointer را روی ۳۲ بیت تنظیم میکند و کدی تولید میکند که روی هر گونهای از PowerPC اجرا میشود. محیط ۶۴ بیتی int را روی ۳۲ بیت و long و pointer را روی ۶۴ بیت تنظیم کرده و کدی برای PowerPC64 تولید میکند، مانند -mpowerpc64.
- -mfull-toc
- -mno-fp-in-toc
- -mno-sum-in-toc
- -mminimal-toc
- تغییر
شیوهٔ
تولید TOC
(جدول
محتویات)،
که برای هر
فایل
اجرایی
ایجاد
میشود.
گزینهٔ -mfull-toc
بهطور
پیشفرض
انتخاب شده
است. در این
حالت، GCC
حداقل یک
مدخل TOC برای
هر ارجاع
یکتای
متغیر
غیرخودکار
(non-automatic) در
برنامهٔ
شما تخصیص
میدهد. GCC
همچنین
مقادیر
ثابت ممیز
شناور را در
TOC قرار
میدهد. با
این حال،
تنها
۱۶٬۳۸۴
مدخل در TOC در
دسترس است.
اگر پیام خطایی از پیونددهنده دریافت کردید مبنی بر این که فضای موجود TOC سرریز شده است، میتوانید مقدار فضای مصرفی TOC را با گزینههای -mno-fp-in-toc و -mno-sum-in-toc کاهش دهید. گزینهٔ -mno-fp-in-toc مانع از قرار دادن مقادیر ثابت ممیز شناور در TOC توسط GCC میشود و -mno-sum-in-toc کامپایلر GCC را وادار میکند تا به جای قرار دادن مجموع یک آدرس و یک مقدار ثابت در TOC، کدی برای محاسبهٔ آن در زمان اجرا تولید کند. میتوانید یک یا هر دوی این گزینهها را مشخص کنید. هر کدام باعث میشوند GCC به بهای صرفهجویی در فضای TOC، کدی اندکی کندتر و حجیمتر تولید کند.
اگر حتی با مشخص کردن هر دوی این گزینهها همچنان فضای TOC تمام شد، به جای آن -mminimal-toc را مشخص کنید. این گزینه باعث میشود GCC فقط یک مدخل TOC برای هر فایل ایجاد کند. با مشخص کردن این گزینه، GCC کدی کندتر و بزرگتر تولید میکند که البته فضای بسیار ناچیزی از TOC را مصرف مینماید. شاید ترجیح دهید از این گزینه فقط برای فایلهایی استفاده کنید که شامل کدهای با اجرای کمتر هستند.
- -maix64
- -maix32
- فعال کردن ABI و قرارداد فراخوانی ۶۴ بیتی AIX: اشارهگرهای ۶۴ بیتی، نوع "long" شصت و چهار بیتی، و زیرساخت لازم برای پشتیبانی از آنها. مشخص کردن -maix64 مستلزم -mpowerpc64 است، در حالی که -maix32 رابط ABI شصت و چهار بیتی را غیرفعال کرده و مستلزم -mno-powerpc64 است. پیشفرض GCC بر روی -maix32 است.
- -mxl-compat
- -mno-xl-compat
- تولید کدی
که در هنگام
استفاده از
ABI سازگار با
AIX، تطابق
بیشتری با
معناشناسی
کامپایلر IBM XL
داشته باشد.
ارسال
آرگومانهای
ممیز شناور
به توابع
دارای
پیشنمونه
علاوه بر
FPRهای
آرگومان،
روی پشته و
فراتر از
ناحیهٔ
ذخیرهٔ
ثبات (RSA). عدم
فرض این که
باارزشترین
double در مقدار long
double صد و بیست و
هشت بیتی
هنگام
مقایسهٔ
مقادیر و
تبدیل به double
بهدرستی
گرد شده
است.
استفاده از
نام
نمادهای XL
برای
روالهای
پشتیبانی long
double.
قرارداد فراخوانی AIX برای مدیریت یک حالت مبهم در K&R C که تابعی آدرس آرگومانهایش را با آرگومانهای کمتری نسبت به آنچه اعلان شده میگیرد، توسعه یافت اما در ابتدا مستندسازی نشد. کامپایلرهای IBM XL زمانی که یک زیرروال بدون بهینهسازی کامپایل میشود، به آرگومانهای ممیز شناوری که در RSA جا نمیشوند از روی پشته دسترسی پیدا میکنند. از آنجا که ذخیره همیشگی آرگومانهای ممیز شناور روی پشته ناکارآمد بوده و بهندرت مورد نیاز است، این گزینه بهطور پیشفرض فعال نیست و تنها هنگام فراخوانی زیرروالهای کامپایلشده توسط کامپایلرهای IBM XL بدون بهینهسازی ضرورت دارد.
- -mpe
- پشتیبانی از IBM RS/6000 SP Parallel Environment (PE). پیوند دادن برنامهای که برای استفاده از تبادل پیام (message passing) با کد راهاندازی خاصی نوشته شده است تا برنامه بتواند اجرا شود. سیستم باید PE را در محل استاندارد (/usr/lpp/ppe.poe/) نصب داشته باشد، یا فایل specs باید با گزینهٔ -specs= جهت مشخص کردن مسیر دایرکتوری مناسب بازنویسی شود. محیط Parallel Environment از ریسهها (threads) پشتیبانی نمیکند، بنابراین گزینهٔ -mpe و گزینهٔ -pthread ناسازگار هستند.
- -malign-natural
- -malign-power
- در AIX، سیستم
۳۲ بیتی Darwin و
سیستم ۶۴
بیتی PowerPC GNU/Linux،
گزینهٔ -malign-natural
تراز
تعریفشده
در ABI برای
انواع
بزرگتر،
مانند doubleهای
ممیز شناور
را لغو کرده
و آنها را
بر اساس مرز
اندازهٔ
طبیعیشان
تراز
میکند.
گزینهٔ -malign-power
به GCC دستور
میدهد از
قواعد تراز
مشخصشده
در ABI پیروی
کند.
پیشفرض GCC
تراز
استاندارد
تعریفشده
در ABI است.
در Darwin شصت و چهار بیتی، تراز طبیعی حالت پیشفرض است و -malign-power پشتیبانی نمیشود.
- -msoft-float
- -mhard-float
- تولید کدی که از مجموعه ثباتهای ممیز شناور استفاده نمیکند (استفاده میکند). در صورتی که از گزینهٔ -msoft-float استفاده کرده و هنگام پیوند دادن این گزینه را به GCC ارسال کنید، شبیهسازی نرمافزاری ممیز شناور فراهم میشود.
- -mmultiple
- -mno-multiple
- تولید کدی که از دستورالعملهای بارگذاری چندکلمهای (load multiple word) و ذخیرهٔ چندکلمهای (store multiple word) استفاده میکند (یا نمیکند). این دستورالعملها بهطور پیشفرض روی سیستمهای POWER تولید میشوند، و روی سیستمهای PowerPC تولید نمیشوند. از -mmultiple روی سیستمهای PowerPC با ترتیب بایت little-endian استفاده نکنید، زیرا این دستورالعملها هنگامی که پردازنده در حالت little-endian است کار نمیکنند. استثناها PPC740 و PPC750 هستند که این دستورالعملها را در حالت little-endian مجاز میدانند.
- -mupdate
- -mno-update
- تولید کدی که از دستورالعملهای بارگذاری یا ذخیرهای استفاده میکند (یا نمیکند) که ثبات پایه (base register) را به آدرس مکان محاسبهشده در حافظه بهروزرسانی میکنند. این دستورالعملها بهطور پیشفرض تولید میشوند. اگر از -mno-update استفاده کنید، شکاف زمانی کوتاهی بین زمان بهروزرسانی اشارهگر پشته و زمان ذخیرهٔ آدرس فریم قبلی وجود دارد، بدین معنا که کدی که فریم پشته را در هنگام وقفهها یا سیگنالها پیمایش میکند ممکن است دادههای نامعتبر دریافت نماید..IP -mavoid-indexed-addresses 4
- -mno-avoid-indexed-addresses
- کدی تولید میکند که سعی در اجتناب (عدم اجتناب) از استفاده از دستورالعملهای بارگذاری یا ذخیرهسازی نمایهشده (indexed load/store) دارد. این دستورالعملها ممکن است در پردازندههای Power6 در شرایط خاصی، مانند پیمایش در آرایههای بزرگی که از مرز 16M عبور میکنند، باعث افت کارایی شوند. این گزینه بهطور پیشفرض هنگام هدفگذاری Power6 فعال و در غیر این صورت غیرفعال است.
- -mfused-madd
- -mno-fused-madd
- کدی تولید میکند که از دستورالعملهای ضرب و انباشت (multiply and accumulate) ممیز شناور استفاده میکند (استفاده نمیکند). این دستورالعملها در صورت استفاده از ممیز شناور سختافزاری بهطور پیشفرض تولید میشوند. گزینه وابسته به ماشین -mfused-madd اکنون به گزینه مستقل از ماشین -ffp-contract=fast نگاشت شده است، و -mno-fused-madd به -ffp-contract=off نگاشت میشود.
- -mmulhw
- -mno-mulhw
- کدی تولید میکند که از دستورالعملهای ضرب و ضرب-انباشت نیمکلمه (half-word) روی پردازندههای IBM 405، 440، 464 و 476 استفاده میکند (استفاده نمیکند). این دستورالعملها بهطور پیشفرض هنگام هدفگذاری این پردازندهها تولید میشوند.
- -mdlmzb
- -mno-dlmzb
- کدی تولید میکند که از دستورالعمل جستجوی رشتهای dlmzb روی پردازندههای IBM 405، 440، 464 و 476 استفاده میکند (استفاده نمیکند). این دستورالعمل بهطور پیشفرض هنگام هدفگذاری این پردازندهها تولید میشود.
- -mno-bit-align
- -mbit-align
- در
سیستمهای
System V.4 و
سامانههای
توکار PowerPC
ساختارها و
اجتماعهایی
(unions) که دارای
میدانهای
بیتی (bit-fields)
هستند را
مجبور به
تراز شدن با
نوع پایه
میدان بیتی
نمیکند
(میکند).
بهعنوان مثال، بهطور پیشفرض ساختاری که تنها شامل ۸ میدان بیتی "unsigned" به طول ۱ است در یک مرز ۴ بایتی تراز شده و اندازهای برابر با ۴ بایت دارد. با استفاده از -mno-bit-align، این ساختار در یک مرز ۱ بایتی تراز شده و اندازه آن ۱ بایت خواهد بود.
- -mno-strict-align
- -mstrict-align
- در سیستمهای System V.4 و سامانههای توکار PowerPC فرض نمیکند (میکند) که ارجاعات حافظه ترازنشده توسط سیستم مدیریت میشوند.
- -mrelocatable
- -mno-relocatable
- کدی تولید میکند که به یک فایل اجرایی ایستا اجازه بازآرایی (relocate) به یک آدرس دیگر در زمان اجرا را میدهد (نمیدهد). یک بارگذار ساده در سامانه توکار PowerPC باید کل محتویات ".got2" و موقعیتهای ۴ بایتی فهرستشده در بخش ".fixup" (جدولی از آدرسهای ۳۲ بیتی که توسط این گزینه تولید شده است) را بازآرایی کند. برای کارکرد صحیح، تمام اشیای پیوندخورده باید با -mrelocatable یا -mrelocatable-lib کامپایل شوند. کد -mrelocatable پشته را در یک مرز ۸ بایتی تراز میکند.
- -mrelocatable-lib
- -mno-relocatable-lib
- همانند -mrelocatable، گزینه -mrelocatable-lib یک بخش ".fixup" برای امکان بازآرایی فایلهای اجرایی ایستا در زمان اجرا تولید میکند، اما -mrelocatable-lib از تراز پشته کوچکتر -mrelocatable استفاده نمیکند. اشیای کامپایلشده با -mrelocatable-lib ممکن است با اشیایی که با هر ترکیبی از گزینههای -mrelocatable کامپایل شدهاند پیوند داده شوند.
- -mno-toc
- -mtoc
- در سیستمهای System V.4 و سامانههای توکار PowerPC فرض نمیکند (میکند) که ثبات ۲ حاوی اشارهگری به یک ناحیه سراسری است که به آدرسهای مورد استفاده در برنامه اشاره دارد.
- -mlittle
- -mlittle-endian
- در سیستمهای System V.4 و سامانههای توکار PowerPC کد را برای پردازنده در حالت ریزانتهایی (little-endian) کامپایل میکند. گزینه -mlittle-endian مشابه -mlittle است.
- -mbig
- -mbig-endian
- در سیستمهای System V.4 و سامانههای توکار PowerPC کد را برای پردازنده در حالت کلانانتهایی (big-endian) کامپایل میکند. گزینه -mbig-endian مشابه -mbig است.
- -mdynamic-no-pic
- در سیستمهای Darwin / macOS، کد را به نحوی کامپایل میکند که خود قابل بازآرایی نباشد، اما ارجاعات خارجی آن قابل بازآرایی باشند. کد حاصل برای برنامههای کاربردی مناسب است، اما برای کتابخانههای اشتراکی مناسب نیست.
- -msingle-pic-base
- با ثبات مورد استفاده برای آدرسدهی PIC به عنوان فقطخواندنی رفتار میکند، به جای اینکه در مقدمه (prologue) هر تابع بارگذاری شود. سامانه زمان اجرا مسئول مقداردهی اولیه این ثبات با یک مقدار مناسب پیش از شروع اجرا است.
- -mprioritize-restricted-insns=priority
- این گزینه اولویتی را کنترل میکند که در طی دومین دور زمانبندی به دستورالعملهای دارای محدودیت در شیار ارسال (dispatch-slot restricted) اختصاص مییابد. آرگومان priority مقادیر 0، 1 یا 2 را دریافت میکند تا به ترتیب هیچ، بالاترین، یا دومین اولویت بالا را به این دستورالعملها اختصاص دهد.
- -msched-costly-dep=dependence_type
- این گزینه کنترل میکند که کدام وابستگیها در حین زمانبندی دستورالعملها توسط هدف پرهزینه در نظر گرفته شوند. آرگومان dependence_type یکی از مقادیر زیر را میپذیرد:
- no
- هیچ وابستگیای پرهزینه نیست.
- all
- تمام وابستگیها پرهزینه هستند.
- true_store_to_load
- وابستگی واقعی (true dependence) از ذخیره به بارگذاری پرهزینه است.
- store_to_load
- هرگونه وابستگی از ذخیره به بارگذاری پرهزینه است.
- number
- هر وابستگی که تأخیر (latency) آن بزرگتر یا مساوی با number باشد پرهزینه است.
- -minsert-sched-nops=scheme
- این گزینه کنترل میکند که کدام طرح درج NOP در طی دومین دور زمانبندی استفاده شود. آرگومان scheme یکی از مقادیر زیر را میپذیرد:
- no
- هیچ NOP درج نشود.
- pad
- طبق گروهبندی زمانبند، هر گروه ارسالی که دارای شیارهای صدور خالی باشد با NOP پر شود.
- regroup_exact
- دستورهای NOP را برای انتقال اجباری دستورالعملهای دارای وابستگی پرهزینه به گروههای جداگانه درج کند. دقیقاً به تعداد لازم NOP درج میشود تا بر اساس گروهبندی تخمینی پردازنده، دستور به یک گروه جدید رانده شود..IP number 4 درج دستورهای NOP برای راندن دستورالعملهای وابستهٔ هزینهبر به گروههای مجزا. درج number دستور NOP برای مجبور کردن یک دستورالعمل به رفتن به یک گروه جدید.
- -mcall-sysv
- در سامانههای System V.4 و PowerPC تعبیهشده (embedded)، کد را با استفاده از قراردادهای فراخوانی (calling conventions) منطبق بر پیشنویس مارس ۱۹۹۵ از رابط باینری کاربردی System V (System V Application Binary Interface)، ضمیمهٔ پردازندهٔ PowerPC کامپایل میکند. این حالت پیشفرض است مگر اینکه GCC را با استفاده از powerpc-*-eabiaix پیکربندی کرده باشید.
- -mcall-sysv-eabi
- -mcall-eabi
- مشخص کردن هر دو گزینهٔ -mcall-sysv و -meabi.
- -mcall-sysv-noeabi
- مشخص کردن هر دو گزینهٔ -mcall-sysv و -mno-eabi.
- -mcall-aixdesc
- در سامانههای System V.4 و PowerPC تعبیهشده، کد را برای سیستمعامل AIX کامپایل میکند.
- -mcall-linux
- در سامانههای System V.4 و PowerPC تعبیهشده، کد را برای سامانهٔ GNU مبتنی بر Linux کامپایل میکند.
- -mcall-freebsd
- در سامانههای System V.4 و PowerPC تعبیهشده، کد را برای سیستمعامل FreeBSD کامپایل میکند.
- -mcall-netbsd
- در سامانههای System V.4 و PowerPC تعبیهشده، کد را برای سیستمعامل NetBSD کامپایل میکند.
- -mcall-openbsd
- در سامانههای System V.4 و PowerPC تعبیهشده، کد را برای سیستمعامل OpenBSD کامپایل میکند.
- -mtraceback=traceback_type
- انتخاب نوع جدول traceback. مقادیر معتبر برای traceback_type عبارتند از full، part و no.
- -maix-struct-return
- بازگرداندن تمام ساختارها در حافظه (همانطور که توسط ABI سیستمعامل AIX مشخص شده است).
- -msvr4-struct-return
- بازگرداندن ساختارهای کوچکتر از ۸ بایت در ثباتها (همانطور که توسط SVR4 ABI مشخص شده است).
- -mabi=abi-type
- گسترش ABI فعلی با یک افزونهٔ خاص، یا حذف چنین افزونهای. مقادیر معتبر عبارتند از: altivec، no-altivec، ibmlongdouble، ieeelongdouble، elfv1، elfv2، و برای AIX: vec-extabi، vec-default.
- -mabi=ibmlongdouble
- تغییر ABI فعلی برای استفاده از long double با دقت گسترشیافتهٔ IBM. اگر سامانهٔ شما بهطور پیشفرض از long double با دقت گسترشیافتهٔ IEEE استفاده کند، بعید است این گزینه کار کند. اگر نوع long double را از دقت گسترشیافتهٔ IEEE تغییر دهید، کامپایلر هشداری صادر میکند مگر اینکه از گزینهٔ -Wno-psabi استفاده کنید. نیازمند فعال بودن -mlong-double-128 است.
- -mabi=ieeelongdouble
- تغییر ABI فعلی برای استفاده از long double با دقت گسترشیافتهٔ IEEE. اگر سامانهٔ شما بهطور پیشفرض از long double با دقت گسترشیافتهٔ IBM استفاده کند، بعید است این گزینه کار کند. اگر نوع long double را از دقت گسترشیافتهٔ IBM تغییر دهید، کامپایلر هشداری صادر میکند مگر اینکه از گزینهٔ -Wno-psabi استفاده کنید. نیازمند فعال بودن -mlong-double-128 است.
- -mabi=elfv1
- تغییر ABI فعلی برای استفاده از ELFv1 ABI. این ABI پیشفرض برای سامانههای ۶۴ بیتی big-endian مبتنی بر معماری PowerPC در Linux است. نادیدهگرفتن ABI پیشفرض نیازمند پشتیبانی ویژه در سامانه بوده و به احتمال قوی منجر به خطاهای فاحش خواهد شد.
- -mabi=elfv2
- تغییر ABI فعلی برای استفاده از ELFv2 ABI. این ABI پیشفرض برای سامانههای ۶۴ بیتی little-endian مبتنی بر معماری PowerPC در Linux است. نادیدهگرفتن ABI پیشفرض نیازمند پشتیبانی ویژه در سامانه بوده و به احتمال قوی منجر به خطاهای فاحش خواهد شد.
- -mgnu-attribute
- -mno-gnu-attribute
- تولید دستورالعملهای اسمبلی .gnu_attribute برای تنظیم جفتهای برچسب/مقدار در یک بخش .gnu.attributes که تغییرات ABI را در پارامترهای تابع یا مقادیر بازگشتی مشخص میکند.
- -mprototype
- -mno-prototype
- در سامانههای System V.4 و PowerPC تعبیهشده، فرض میکند که تمام فراخوانیهای توابع با تعداد متغیر آرگومان به درستی پیشنمونهسازی (prototyped) شدهاند. در غیر این صورت، کامپایلر باید پیش از هر فراخوانی فاقد پیشنمونه، یک دستورالعمل برای تنظیم یا پاک کردن بیت ۶ از ثبات کد وضعیت ("CR") درج کند تا مشخص شود آیا در صورت پذیرش آرگومانهای متغیر توسط تابع، مقادیر ممیز شناور در ثباتهای ممیز شناور ارسال شدهاند یا خیر. با -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 انجام میشود.
- -memb
- در سامانههای تعبیهشدهٔ PowerPC، بیت "PPC_EMB" را در سرآیند پرچمهای ELF تنظیم میکند تا نشان دهد از بازآراییهای (relocations) گسترشیافتهٔ eabi استفاده شده است.
- -meabi
- -mno-eabi
- در سامانههای System V.4 و PowerPC تعبیهشده، از رابط باینری کاربردی تعبیهشده (EABI) که مجموعهای از اصلاحات بر مشخصات System V.4 است، پیروی میکند (یا نمیکند). انتخاب -meabi به این معنی است که پشته بر روی یک مرز ۸ بایتی همتراز میشود، تابع "__eabi" از تابع "main" برای آمادهسازی محیط EABI فراخوانی میشود، و گزینهٔ -msdata میتواند از هر دو ثبات "r2" و "r13" برای اشاره به دو ناحیهٔ دادهٔ کوچک (small data) مجزا استفاده کند. انتخاب -mno-eabi به این معنی است که پشته بر روی یک مرز ۱۶ بایتی همتراز میشود، هیچ تابع مقداردهی اولیهٔ EABI از "main" فراخوانی نمیشود، و گزینهٔ -msdata تنها از "r13" برای اشاره به یک ناحیهٔ دادهٔ کوچکِ واحد استفاده میکند. اگر GCC را با استفاده از یکی از گزینههای powerpc*-*-eabi* پیکربندی کرده باشید، گزینهٔ -meabi بهطور پیشفرض فعال است.
- -msdata=eabi
- در سامانههای System V.4 و PowerPC تعبیهشده، دادههای عمومی و ایستای کوچکِ مقداردهیشده از نوع "const" را در بخش ".sdata2" قرار میدهد که توسط ثبات "r2" به آن اشاره میشود. دادههای عمومی و ایستای کوچکِ مقداردهیشدهٔ غیر-"const" را در بخش ".sdata" قرار میدهد که توسط ثبات "r13" به آن اشاره میشود. دادههای عمومی و ایستای کوچکِ مقداردهینشده را در بخش ".sbss" قرار میدهد که مجاور بخش ".sdata" است. گزینهٔ -msdata=eabi با گزینهٔ -mrelocatable ناسازگار است. گزینهٔ -msdata=eabi همچنین گزینهٔ -memb را فعال میکند.
- -msdata=sysv
- در سامانههای System V.4 و PowerPC تعبیهشده، دادههای عمومی و ایستای کوچک را در بخش ".sdata" قرار میدهد که توسط ثبات "r13" به آن اشاره میشود. دادههای عمومی و ایستای کوچکِ مقداردهینشده را در بخش ".sbss" قرار میدهد که مجاور بخش ".sdata" است. گزینهٔ -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" قرار میدهد.
- -mreadonly-in-sdata
- اشیای فقطخواندنی را نیز در بخش ".sdata" قرار میدهد. این رفتار پیشفرض است.
- -mblock-move-inline-limit=num
- تمامی انتقالهای بلوکی (مانند فراخوانیهای "memcpy" یا رونوشتهای ساختار) که کمتر یا مساوی num بایت باشند را درونخطی میکند. کمینهٔ مقدار برای num در مقصدهای ۳۲ بیتی برابر با ۳۲ بایت و در مقصدهای ۶۴ بیتی برابر با ۶۴ بایت است. مقدار پیشفرض وابسته به معماری مقصد است.
- -mblock-compare-inline-limit=num
- برای تمامی مقایسههای بلوکی (مانند فراخوانیهای "memcmp" یا مقایسههای ساختار) که کمتر یا مساوی num بایت باشند، کد درونخطی بدون حلقه تولید میکند. اگر num برابر با ۰ باشد، تمامی بسطهای درونخطی (حلقهای و بدون حلقه) برای مقایسهٔ بلوک غیرفعال میشوند. مقدار پیشفرض وابسته به معماری مقصد است.
- -mblock-compare-inline-loop-limit=num
- یک بسط درونخطی با استفاده از کد حلقهای برای تمامی مقایسههای بلوکی تولید میکند که کمتر یا مساوی num بایت بوده، اما از حد بسط مقایسهٔ بلوکی درونخطیِ بدون حلقه بزرگتر باشند. اگر طول بلوک ثابت نباشد، حداکثر num بایت پیش از فراخوانی "memcmp" جهت مقایسهٔ باقیماندهٔ بلوک مقایسه خواهد شد. مقدار پیشفرض وابسته به معماری مقصد است.
- -mstring-compare-inline-limit=num
- حداکثر num بایت از رشته را با کد درونخطی مقایسه میکند. اگر تفاوت یا پایان رشته در انتهای مقایسهٔ درونخطی یافت نشود، یک فراخوانی به "strcmp" یا "strncmp" باقیماندهٔ مقایسه را انجام خواهد داد. مقدار پیشفرض ۶۴ بایت است.
- -G num
- در سامانههای PowerPC تعبیهشده، مؤلفههای سراسری و ایستای کمتر یا مساوی num بایت را بهجای بخشهای عادی داده یا BSS، در بخشهای دادهٔ کوچک یا BSS قرار میدهد. بهطور پیشفرض، num برابر با ۸ است. گزینهٔ -G num به پیونددهنده نیز ارسال میشود. تمامی ماژولها باید با یک مقدار یکسان برای -G num کامپایل شوند.
- -mregnames
- -mno-regnames
- در سامانههای System V.4 و PowerPC تعبیهشده، نام ثباتها را در خروجی زبان اسمبلی با قالبهای نمادین درج میکند (درج نمیکند).
- -mlongcall
- -mno-longcall
- بهطور
پیشفرض
فرض میکند
تمام
فراخوانیها
دوردست
هستند،
بهگونهای
که به یک
دنبالهٔ
فراخوانی
طولانیتر
و
پرهزینهتر
نیاز است.
این امر
برای
فراخوانیهای
دورتر از ۳۲
مگابایت
(۳۳٬۵۵۴٬۴۳۲
بایت) از
مکان جاری
الزامی است.
اگر
کامپایلر
بداند که
فراخوانی
نمیتواند
تا این حد
دور باشد،
یک
فراخوانی
کوتاه
تولید
میشود. این
تنظیم را
میتوان
توسط صفت
تابع
"shortcall" یا
بهوسیلهٔ
#pragma longcall(0) لغو
کرد.
برخی پیونددهندهها قادر به تشخیص فراخوانیهای خارج از محدوده و تولید بیدرنگ کد واسط (glue code) هستند. در این سامانهها، فراخوانیهای دوردست غیرضروری بوده و کد کندتری تولید میکنند. در زمان نگارش این متن، پیونددهندهٔ AIX و همچنین پیونددهندهٔ GNU برای PowerPC/64 قادر به انجام این کار هستند. برنامهریزی شده است که این قابلیت به پیونددهندهٔ GNU برای سامانههای ۳۲ بیتی PowerPC نیز افزوده شود.
در سامانههای PowerPC64 ELFv2 و سامانههای ۳۲ بیتی PowerPC با پیونددهندههای جدیدتر GNU، ابزار GCC میتواند فراخوانیهای دوردست را با استفاده از یک دنبالهٔ فراخوانی درونخطی PLT تولید کند (گزینهٔ -mpltseq را ببینید). معماری PowerPC با -mbss-plt و PowerPC64 ELFv1 (موتور بزرگ یا big-endian) از فراخوانیهای درونخطی PLT پشتیبانی نمیکنند.
در سامانههای Darwin/PPC، دستور "#pragma longcall" عبارت "jbsr callee, L42" را به همراه یک branch island (کد واسط) تولید میکند. این دو نشانی مقصد نشاندهندهٔ تابع فراخواندهشده و جزیرهٔ انشعاب هستند. پیونددهندهٔ Darwin/PPC نشانی اول را ترجیح میدهد و چنانچه دستور "bl" در PPC مستقیماً به تابع فراخواندهشده برسد، دستور "bl callee" را تولید میکند؛ در غیر این صورت، پیونددهنده "bl L42" را برای فراخوانی جزیرهٔ انشعاب تولید خواهد کرد. جزیرهٔ انشعاب به بدنهٔ تابع فراخواننده ضمیمه میشود؛ این بخش نشانی کامل ۳۲ بیتی تابع فراخواندهشده را محاسبه کرده و به آن پرش میکند.
در سامانههای Mach-O (Darwin)، این گزینه کامپایلر را هدایت میکند تا برای هر فراخوانی مستقیم کد واسط را درج کند، و پیونددهندهٔ Darwin تصمیم میگیرد که از آن استفاده کند یا آن را کنار بگذارد.
در آینده، زمانی که مشخص باشد پیونددهنده کد واسط را تولید میکند، ممکن است GCC تمام مشخصههای longcall را نادیده بگیرد.
- -mpltseq
- -mno-pltseq
- پیادهسازی (عدم پیادهسازی) -fno-plt و فراخوانیهای دوردست با استفاده از دنبالهٔ فراخوانی PLT درونخطی که از پیوند تنبل (lazy linking) و فراخوانیهای دوردست به توابع در کتابخانههای اشتراکی بارگذاریشده با dlopen پشتیبانی میکند. فراخوانیهای PLT درونخطی تنها در سامانههای PowerPC64 ELFv2 و سامانههای ۳۲ بیتی PowerPC با پیونددهندههای جدیدتر GNU پشتیبانی میشوند، و چنانچه در زمان پیکربندی GCC پشتیبانی از آن شناسایی شود بهطور پیشفرض فعال هستند؛ همچنین در مورد PowerPC ۳۲ بیتی، در صورتی که GCC با --enable-secureplt پیکربندی شده باشد فعال خواهند بود. کدهای -mpltseq و اشیای بازنشانیپذیر ۳۲ بیتی PowerPC با -mbss-plt را نباید با یکدیگر پیوند داد.
- -mtls-markers
- -mno-tls-markers
- نشانهگذاری (عدم نشانهگذاری) فراخوانیهای "__tls_get_addr" با یک بازنشانی (relocation) که آرگومان تابع را مشخص میکند. بازنشانی به پیونددهنده اجازه میدهد تا برای بهینهسازی TLS، فراخوانی تابع را بهطور مطمئن با دستورهای آمادهسازی آرگومان مرتبط سازد، که این امر به نوبهٔ خود به GCC اجازه میدهد ترتیب اجرای دنباله را بهتر زمانبندی کند.
- -mrecip
- -mno-recip
- این گزینه استفاده از دستورالعملهای تخمین معکوس و تخمین ریشهٔ دوم معکوس با مراحل اضافی نیوتن-رافسون را برای افزایش دقت، بهجای انجام تقسیم یا ریشهٔ دوم و تقسیم برای آرگومانهای ممیز شناور فعال میکند. هنگام استفاده از -mrecip باید از گزینهٔ -ffast-math (یا دستکم -funsafe-math-optimizations، -ffinite-math-only، -freciprocal-math و -fno-trapping-math) استفاده کنید. توجه داشته باشید در حالی که توان عملیاتی دنباله بهطور کلی بیشتر از توان عملیاتی دستورالعملهای غیرمعکوس است، دقت دنباله برای ریشههای دوم معکوس میتواند تا 2 ulp کاهش یابد (بهعنوان مثال، معکوس 1.0 برابر با 0.99999994 خواهد بود).
- -mrecip=opt
- این گزینه کنترل میکند که کدام دستورالعملهای تخمین معکوس میتوانند استفاده شوند. opt فهرستی از گزینهها است که با کاما از هم جدا شدهاند، و ممکن است یک "!" در ابتدای آنها برای معکوس کردن حالت گزینه قرار گیرد:
- all
- تمامی دستورالعملهای تخمین را فعال میکند.
- default
- دستورالعملهای پیشفرض را فعال میکند که معادل با -mrecip است.
- none
- تمامی دستورالعملهای تخمین را غیرفعال میکند که معادل با -mno-recip است.
- div
- دستورالعملهای تقریب معکوس را برای هر دو دقت یگانه و دقت مضاعف فعال میکند.
- divf
- دستورالعملهای تقریب معکوس با دقت یگانه را فعال میکند.
- divd
- دستورالعملهای تقریب معکوس با دقت مضاعف را فعال میکند.
- rsqrt
- دستورالعملهای تقریب ریشهٔ دوم معکوس را برای هر دو دقت یگانه و دقت مضاعف فعال میکند..IP rsqrtf 4 دستورالعملهای تقریب جذر معکوس با دقت یگانه را فعال میکند.
- rsqrtd
- دستورالعملهای تقریب جذر معکوس با دقت دوگانه را فعال میکند.
بنابراین، برای مثال، -mrecip=all,!rsqrtd تمام دستورالعملهای تخمین معکوس را به جز دستورالعملهای "FRSQRTE"، "XSRSQRTEDP" و "XVRSQRTEDP" که محاسبات جذر معکوس با دقت دوگانه را مدیریت میکنند، فعال میسازد.
- -mrecip-precision
- -mno-recip-precision
- فرض میکند (فرض نمیکند) که دستورالعملهای تخمین معکوس، تخمینهایی با دقت بالاتر از آنچه توسط ABI در PowerPC تعیین شده ارائه میدهند. انتخاب -mcpu=power6، -mcpu=power7 یا -mcpu=power8 به طور خودکار -mrecip-precision را فعال میکند. دستورالعملهای تخمین جذر با دقت دوگانه به طور پیشفرض روی ماشینهای با دقت پایین تولید نمیشوند، زیرا تخمینی ارائه نمیدهند که پس از سه مرحله همگرا شود.
- -mveclibabi=type
- نوع ABI مورد استفاده برای برداریسازی توابع درونی (intrinsics) با استفاده از یک کتابخانه خارجی را مشخص میکند. در حال حاضر تنها نوع پشتیبانیشده mass است که استفاده از کتابخانههای زیرسیستم شتابدهی ریاضی شرکت IBM (موسوم به MASS) را برای برداریسازی توابع درونی با استفاده از کتابخانههای خارجی تعیین میکند. در حال حاضر GCC هنگام تولید کد برای power7، فراخوانیهایی را به "acosd2"، "acosf4"، "acoshd2"، "acoshf4"، "asind2"، "asinf4"، "asinhd2"، "asinhf4"، "atan2d2"، "atan2f4"، "atand2"، "atanf4"، "atanhd2"، "atanhf4"، "cbrtd2"، "cbrtf4"، "cosd2"، "cosf4"، "coshd2"، "coshf4"، "erfcd2"، "erfcf4"، "erfd2"، "erff4"، "exp2d2"، "exp2f4"، "expd2"، "expf4"، "expm1d2"، "expm1f4"، "hypotd2"، "hypotf4"، "lgammad2"، "lgammaf4"، "log10d2"، "log10f4"، "log1pd2"، "log1pf4"، "log2d2"، "log2f4"، "logd2"، "logf4"، "powd2"، "powf4"، "sind2"، "sinf4"، "sinhd2"، "sinhf4"، "sqrtd2"، "sqrtf4"، "tand2"، "tanf4"، "tanhd2" و "tanhf4" صادر میکند. هر دو گزینه -ftree-vectorize و -funsafe-math-optimizations نیز باید فعال باشند. کتابخانههای MASS باید در زمان پیوند مشخص شوند.
- -mfriz
- -mno-friz
- دستورالعمل "friz" را هنگامی که از گزینه -funsafe-math-optimizations برای بهینهسازی گرد کردن مقادیر ممیز شناور به عدد صحیح ۶۴ بیتی و بازگشت به ممیز شناور استفاده میشود، تولید میکند (تولید نمیکند). اگر عدد ممیز شناور برای جا شدن در یک عدد صحیح بیش از حد بزرگ باشد، دستورالعمل "friz" مقدار یکسانی را بازنمیگرداند.
- -mpointers-to-nested-functions
- -mno-pointers-to-nested-functions
- کدی را برای بارگذاری ثبات زنجیره ایستا ("r11") هنگام فراخوانی از طریق یک اشارهگر در سیستمهای AIX و لینوکس ۶۴ بیتی تولید میکند (تولید نمیکند)؛ جایی که یک اشارهگر تابع به یک توصیفگر ۳ کلمهای حاوی آدرس تابع، مقدار TOC برای بارگذاری در ثبات "r2"، و مقدار زنجیره ایستا برای بارگذاری در ثبات "r11" اشاره دارد. گزینه -mpointers-to-nested-functions به طور پیشفرض فعال است. اگر از -mno-pointers-to-nested-functions استفاده کنید، نمیتوانید از طریق اشارهگرها به توابع تودرتو یا اشارهگرها به توابعی که در سایر زبانها کامپایل شده و از زنجیره ایستا استفاده میکنند، فراخوانی انجام دهید.
- -msave-toc-indirect
- -mno-save-toc-indirect
- در صورتی که تابع در سیستمهای AIX و لینوکس ۶۴ بیتی از طریق یک اشارهگر فراخوانی کند، کدی برای ذخیره مقدار TOC در مکان رزروشده پشته در پیشدرآمد تابع (prologue) تولید میکند (تولید نمیکند). اگر مقدار TOC در پیشدرآمد ذخیره نشود، دقیقاً پیش از فراخوانی از طریق اشارهگر ذخیره خواهد شد. گزینه -mno-save-toc-indirect پیشفرض است.
- -mcompat-align-parm
- -mno-compat-align-parm
- کدی را برای
ارسال
پارامترهای
ساختار با
حداکثر
تراز ۶۴
بیتی، جهت
سازگاری با
نسخههای
قدیمیتر GCC
تولید
میکند
(تولید
نمیکند).
نسخههای قدیمیتر GCC (پیش از 4.9.0) زمانی که یک ساختار شامل عضوی نیازمند تراز ۱۲۸ بیتی بود، به اشتباه پارامتر ساختار را روی مرز ۱۲۸ بیتی تراز نمیکردند. این مورد در نسخههای جدیدتر GCC اصلاح شده است. این گزینه میتواند برای تولید کدی استفاده شود که با توابع کامپایلشده توسط نسخههای قدیمیتر GCC سازگار است.
گزینه -mno-compat-align-parm پیشفرض است.
- -mstack-protector-guard=guard
- -mstack-protector-guard-reg=reg
- -mstack-protector-guard-offset=offset
- کد محافظت
از پشته را
با استفاده
از قناری در
guard تولید
میکند.
مکانهای
پشتیبانیشده
عبارتند از
global برای
قناری
سراسری یا
tls برای
قناری به
ازای هر
ریسه در
بلوک TLS
(پیشفرض در
GNU libc نسخه 2.4 یا
بالاتر).
با انتخاب مورد دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset افزون بر این مشخص میکنند که از کدام ثبات به عنوان ثبات پایه برای خواندن قناری، و از چه آفستی نسبت به آن ثبات پایه استفاده شود. مقدار پیشفرض آنها همان است که در ABI مربوطه مشخص شده است.
- -mpcrel
- -mno-pcrel
- آدرسدهی وابسته به شمارنده برنامه (pc-relative) را تولید میکند (تولید نمیکند). گزینه -mpcrel نیازمند فعال بودن گزینههای مدل کد متوسط (-mcmodel=medium) و آدرسدهی پیشوندی (-mprefixed) است.
- -mprefixed
- -mno-prefixed
- حالتهای آدرسدهی را با استفاده از دستورالعملهای بارگذاری و ذخیرهسازی پیشوندی تولید میکند (تولید نمیکند). گزینه -mprefixed مستلزم فعال بودن گزینه -mcpu=power10 (یا جدیدتر) است.
- -mmma
- -mno-mma
- دستورالعملهای MMA را تولید میکند (تولید نمیکند). گزینه -mma مستلزم فعال بودن گزینه -mcpu=power10 (یا جدیدتر) است.
- -mrop-protect
- -mno-rop-protect
- دستورالعملهای محافظت در برابر ROP را در صورتی که پردازنده هدف از آنها پشتیبانی کند، تولید میکند (تولید نمیکند). در حال حاضر این گزینه بهینهسازی shrink-wrap (-fshrink-wrap) را غیرفعال میکند.
- -mprivileged
- -mno-privileged
- کدی را تولید میکند (تولید نمیکند) که در وضعیت ممتاز (privileged state) اجرا خواهد شد.
- -mblock-ops-unaligned-vsx
- -mno-block-ops-unaligned-vsx
- بارگذاریها و ذخیرهسازیهای ترازنشده vsx را برای بسط درونخطی توابع "memcpy" و "memmove" تولید میکند (تولید نمیکند).
- --param rs6000-vect-unroll-limit=
- بردارساز با بررسی اطلاعات هدف تعیین میکند که آیا باز کردن حلقه اصلی برداریشده سودمند خواهد بود یا خیر و به چه میزان. این پارامتر کران بالای میزان باز کردن حلقه اصلی توسط بردارساز را تعیین میکند. مقدار پیشفرض چهار است..PP گزینههای RX
این گزینههای خط فرمان برای مقصدهای RX تعریف شدهاند:
- -m64bit-doubles
- -m32bit-doubles
- اندازه نوع دادهٔ "double" را ۶۴ بیتی (-m64bit-doubles) یا ۳۲ بیتی (-m32bit-doubles) میکند. پیشفرض -m32bit-doubles است. نکته: سختافزار ممیز شناور RX تنها روی مقادیر ۳۲ بیتی کار میکند، به همین دلیل پیشفرض -m32bit-doubles است.
- -fpu
- -nofpu
- استفاده از
سختافزار
ممیز شناور
RX را فعال (-fpu)
یا غیرفعال
(-nofpu) میکند.
پیشفرض
برای سری RX600
فعال و برای
سری RX200
غیرفعال
است.
با این حال، دستورالعملهای ممیز شناور فقط برای مقادیر ممیز شناور ۳۲ بیتی تولید میشوند، بنابراین اگر از گزینهٔ -m64bit-doubles استفاده شود، سختافزار FPU برای doubleها استفاده نمیشود.
نکته: اگر گزینهٔ -fpu فعال باشد، -funsafe-math-optimizations نیز بهطور خودکار فعال میشود. دلیل این امر این است که دستورالعملهای FPU در RX ذاتاً ناامن هستند.
- -mcpu=name
- نوع
پردازندهٔ
RX مورد نظر
برای
هدفگیری
را انتخاب
میکند. در
حال حاضر سه
نوع
پشتیبانی
میشوند:
سختافزار
عمومی سری
RX600 و RX200، و
پردازندهٔ
خاص RX610.
پیشفرض RX600
است.
تنها تفاوت بین RX600 و RX610 این است که RX610 از دستورالعمل "MVTIPL" پشتیبانی نمیکند.
سری RX200 دارای واحد سختافزاری ممیز شناور نیست و بنابراین هنگام انتخاب این نوع، -nofpu بهطور پیشفرض فعال است.
- -mbig-endian-data
- -mlittle-endian-data
- دادهها (نه کد) را در قالب big-endian ذخیره میکند. پیشفرض -mlittle-endian-data است، یعنی ذخیره دادهها در قالب little-endian.
- -msmall-data-limit=N
- حداکثر
اندازه (بر
حسب بایت)
متغیرهای
سراسری و
ایستا را که
میتوانند
در ناحیهٔ
دادههای
کوچک (small data area)
قرار گیرند
مشخص
میکند.
استفاده از
ناحیهٔ
دادههای
کوچک
میتواند
به کدی
کوچکتر و
سریعتر
منجر شود،
اما
اندازهٔ
این ناحیه
محدود است و
بر عهدهٔ
برنامهنویس
است که
اطمینان
حاصل کند
ناحیه
سرریز نشود.
همچنین
هنگامی که
از ناحیهٔ
دادههای
کوچک
استفاده
میشود،
یکی از
ثباتهای RX
(معمولاً
"r13") برای
اشاره به
این ناحیه
رزرو
میشود،
بنابراین
دیگر برای
استفاده
توسط
کامپایلر
در دسترس
نیست. این
امر در
صورتی که
متغیرها به
جای
نگهداری در
این ثبات به
درون پشته
فرستاده
شوند،
میتواند
منجر به کدی
کُندتر و/یا
بزرگتر
شود.
توجه: متغیرهای عمومی (متغیرهایی که مقداردهی اولیه نشدهاند) و ثابتها در ناحیهٔ دادههای کوچک قرار نمیگیرند، چرا که به بخشهای دیگر در فایل اجرایی خروجی تخصیص داده میشوند.
مقدار پیشفرض صفر است که این ویژگی را غیرفعال میکند. توجه داشته باشید این ویژگی با سطوح بهینهسازی بالاتر (-O2 و غیره) بهطور پیشفرض فعال نمیشود، زیرا رزرو یک ثبات اثرات مخرب احتمالی دارد. این به عهدهٔ برنامهنویس است که آزمایش کرده و دریابد آیا این ویژگی به نفع برنامهٔ اوست یا خیر. برای شرح نحوهٔ انتخاب ثبات واقعی جهت نگهداری اشارهگر ناحیهٔ دادههای کوچک، توضیحات گزینهٔ -mpid را ببینید.
- -msim
- -mno-sim
- از زمان اجرای شبیهساز (simulator runtime) استفاده میکند. پیشفرض، استفاده از زمان اجرای خاصِ برد libgloss است.
- -mas100-syntax
- -mno-as100-syntax
- هنگام تولید خروجی اسمبلی، از نحو سازگار با اسمبلر AS100 شرکت Renesas استفاده میکند. این نحو توسط اسمبلر GAS نیز قابل پردازش است، اما محدودیتهایی دارد، بنابراین بهطور پیشفرض تولید نمیشود.
- -mmax-constant-size=N
- حداکثر
اندازه (بر
حسب بایت)
ثابتی را
مشخص
میکند که
میتواند
به عنوان یک
عملوند در
یک
دستورالعمل
RX استفاده
شود. اگرچه
مجموعه
دستورالعملهای
RX اجازه
میدهد
ثابتهایی
با طول
حداکثر ۴
بایت در
دستورالعملها
استفاده
شوند،
مقدار
طولانیتر
معادل با
دستورالعمل
طولانیتر
است.
بنابراین
در برخی
شرایط
محدود کردن
اندازهٔ
ثابتهای
مورد
استفاده در
دستورالعملها
میتواند
سودمند
باشد.
ثابتهایی
که بیش از
حد بزرگ
هستند، در
عوض در یک
مخزن ثابت
(constant pool) قرار
گرفته و از
طریق ارجاع
باواسطهٔ
ثبات به
آنها
دسترسی
پیدا
میشود.
مقدار N میتواند بین ۰ و ۴ باشد. مقدار ۰ (پیشفرض) یا ۴ بدان معناست که ثابتها با هر اندازهای مجاز هستند.
- -mrelax
- بازآرایی پیونددهنده (linker relaxation) را فعال میکند. بازآرایی پیونددهنده فرآیندی است که طی آن پیونددهنده تلاش میکند با یافتن نگارشهای کوتاهترِ دستورالعملهای گوناگون، حجم برنامه را کاهش دهد. بهطور پیشفرض غیرفعال است.
- -mint-register=N
- تعداد ثباتهای رزرو شده برای توابع گردانندهٔ وقفهٔ سریع را مشخص میکند. مقدار N میتواند بین ۰ و ۴ باشد. مقدار ۱ بدین معناست که ثبات "r13" برای استفادهٔ اختصاصی گردانندههای وقفهٔ سریع رزرو میشود. مقدار ۲ ثباتهای "r13" و "r12" را رزرو میکند. مقدار ۳ ثباتهای "r13"، "r12" و "r11"، و مقدار ۴ ثباتهای "r13" تا "r10" را رزرو میکند. مقدار ۰ که پیشفرض است، هیچ ثباتی را رزرو نمیکند.
- -msave-acc-in-interrupts
- مشخص میکند که توابع گردانندهٔ وقفه باید ثبات انباشتگر (accumulator) را حفظ کنند. این امر تنها در صورتی لازم است که کد عادی ممکن باشد از ثبات انباشتگر استفاده کند، به عنوان مثال چون ضربهای ۶۴ بیتی انجام میدهد. پیشفرض نادیده گرفتن انباشتگر است زیرا این کار گردانندههای وقفه را سریعتر میکند.
- -mpid
- -mno-pid
- تولید
دادههای
مستقل از
موقعیت (position independent
data) را فعال
میکند.
هنگام فعال
بودن،
هرگونه
دسترسی به
دادههای
ثابت از
طریق آفست
نسبت به یک
آدرس پایهٔ
نگهداریشده
در یک ثبات
انجام
میشود. این
امکان
میدهد
مکان
دادههای
ثابت در
زمان اجرا
بدون نیاز
به
بازنشانی
(relocate) فایل
اجرایی
تعیین شود،
که مزیتی
برای
برنامههای
تعبیهشده
با
محدودیتهای
شدید حافظه
است.
دادههایی
که قابل
اصلاح
هستند تحت
تأثیر این
گزینه قرار
نمیگیرند.
توجه: استفاده از این ویژگی یک ثبات، معمولاً "r13"، را برای آدرس پایهٔ دادههای ثابت رزرو میکند. این میتواند منجر به کدی کُندتر و/یا بزرگتر، بهویژه در توابع پیچیده، شود.
ثبات واقعیِ انتخابشده برای نگهداری آدرس پایهٔ دادههای ثابت به این بستگی دارد که آیا گزینههای خط فرمان -msmall-data-limit و/یا -mint-register فعال هستند یا خیر. تخصیص ثباتها از ثبات "r13" آغاز شده و رو به پایین ادامه مییابد؛ ابتدا برای برآورده کردن نیازمندیهای -mint-register، سپس -mpid و در نهایت -msmall-data-limit تخصیص مییابند. بنابراین اگر هر دو گزینهٔ -mint-register=4 و -mpid در خط فرمان مشخص شده باشند، ممکن است ثبات ناحیهٔ دادههای کوچک "r8" باشد.
این ویژگی بهطور پیشفرض فعال نیست. مقدار پیشفرض را میتوان از طریق گزینهٔ خط فرمان -mno-pid بازگرداند.
- -mno-warn-multiple-fast-interrupts
- -mwarn-multiple-fast-interrupts
- از صدور پیام هشدار توسط GCC در صورتی که هنگام کامپایل یک فایل بیش از یک گردانندهٔ وقفهٔ سریع پیدا کند، جلوگیری میکند. پیشفرض این است که به ازای هر گردانندهٔ وقفهٔ سریع اضافیِ یافتشده یک هشدار صادر شود، زیرا RX تنها از یک وقفه از این نوع پشتیبانی میکند.
- -mallow-string-insns
- -mno-allow-string-insns
- استفاده از
دستورالعملهای
دستکاری
رشتهٔ
"SMOVF"،
"SCMPU"،
"SMOVB"،
"SMOVU"،
"SUNTIL"،
"SWHILE" و
همچنین
دستورالعمل
"RMPA" را
فعال یا
غیرفعال
میکند. این
دستورالعملها
ممکن است
دادهها را
از پیش
واکشی (prefetch)
کنند که در
صورت
دسترسی به
یک ثبات I/O
ایمن نیست.
(برای
اطلاعات
بیشتر به
بخش 12.2.7 در RX62N Group User's Manual
مراجعه
کنید).
پیشفرض مجاز بودن این دستورالعملها است، اما برای GCC ممکن نیست که همهٔ شرایطی را که ممکن است از یک دستورالعمل رشته برای دسترسی به یک ثبات I/O استفاده شود بهطور مطمئن تشخیص دهد، بنابراین استفاده از آنها نمیتواند بهطور خودکار غیرفعال شود. در عوض به برنامهنویس واگذار شده است که در صورت دسترسی برنامهاش به فضای I/O، از گزینهٔ -mno-allow-string-insns استفاده کند.
هنگامی که این دستورالعملها فعال هستند، GCC نماد پیشپردازندهٔ C با نام "__RX_ALLOW_STRING_INSNS__" را تعریف میکند، و در غیر این صورت نماد "__RX_DISALLOW_STRING_INSNS__" را تعریف مینماید..IP -mjsr 4
- -mno-jsr
- فقط (یا نه فقط) از دستورالعملهای "JSR" برای دسترسی به توابع استفاده میکند. این گزینه را میتوان زمانی استفاده کرد که اندازه کد از دامنه دستورالعملهای "BSR" فراتر میرود. توجه داشته باشید که -mno-jsr به معنای عدم استفاده از "JSR" نیست، بلکه بدین معناست که از هر نوع انشعابی میتوان استفاده کرد.
نکته: گزینه خط فرمان عمومی GCC با عنوان -ffixed-reg در صورت استفاده با ویژگی تابع "interrupt" اهمیت خاصی برای پورت RX دارد. این ویژگی نشاندهنده تابعی است که برای پردازش وقفههای سریع در نظر گرفته شده است. GCC تضمین میکند که تنها از ثباتهای "r10"، "r11"، "r12" و/یا "r13" استفاده کند و این تنها در صورتی است که استفاده معمول از ثباتهای متناظر از طریق گزینههای خط فرمان -ffixed-reg یا -mint-register محدود شده باشد.
گزینههای S/390 و zSeries
اینها گزینههای -m هستند که برای معماری S/390 و zSeries تعریف شدهاند.
- -mhard-float
- -msoft-float
- برای عملیات ممیز شناور از دستورالعملها و ثباتهای ممیز شناور سختافزاری استفاده میکند (یا نمیکند). وقتی -msoft-float مشخص شود، از توابع موجود در libgcc.a برای انجام عملیات ممیز شناور استفاده میشود. وقتی -mhard-float مشخص شود، کامپایلر دستورالعملهای ممیز شناور IEEE را تولید میکند. این حالت پیشفرض است.
- -mhard-dfp
- -mno-hard-dfp
- برای عملیات ممیز شناور دهدهی از دستورالعملهای ممیز شناور دهدهی سختافزاری استفاده میکند (یا نمیکند). وقتی -mno-hard-dfp مشخص شود، از توابع موجود در libgcc.a برای انجام عملیات ممیز شناور دهدهی استفاده میشود. وقتی -mhard-dfp مشخص شود، کامپایلر دستورالعملهای سختافزاری ممیز شناور دهدهی تولید میکند. این حالت پیشفرض برای -march=z9-ec یا بالاتر است.
- -mlong-double-64
- -mlong-double-128
- این سوئیچها اندازه نوع "long double" را کنترل میکنند. اندازه ۶۴ بیت باعث میشود نوع "long double" معادل نوع "double" شود. این حالت پیشفرض است.
- -mbackchain
- -mno-backchain
- آدرس فریم
فراخواننده
را به عنوان
اشارهگر
زنجیره
بازگشتی (backchain
pointer) در فریم
پشته
فراخواندهشده
ذخیره
میکند (یا
نمیکند).
ممکن است
برای امکان
اشکالزدایی
با استفاده
از
ابزارهایی
که اطلاعات
فریم
فراخوانی DWARF
را درک
نمیکنند،
یک backchain مورد
نیاز باشد.
هنگامی که
-mno-packed-stack فعال
باشد،
اشارهگر backchain
در انتهای
فریم پشته
ذخیره
میشود؛
هنگامی که
-mpacked-stack فعال
باشد، backchain در
بالاترین
کلمه ناحیه
ذخیره ثبات
۹۶/۱۶۰
بایتی قرار
میگیرد.
به طور کلی، کدی که با -mbackchain کامپایل شده است، با کدی که با -mno-backchain کامپایل شده از نظر فراخوانی سازگار است؛ با این حال، استفاده از backchain برای اهداف اشکالزدایی معمولاً نیازمند آن است که کل باینری با -mbackchain ساخته شود. توجه داشته باشید که ترکیب -mbackchain، -mpacked-stack و -mhard-float پشتیبانی نمیشود. برای ساخت کرنل لینوکس از -msoft-float استفاده کنید.
پیشفرض این است که backchain نگهداری نشود.
- -mpacked-stack
- -mno-packed-stack
- از
طرحبندی
پشته فشرده
(packed stack layout)
استفاده
میکند (یا
نمیکند).
وقتی -mno-packed-stack
مشخص شود،
کامپایلر
از تمام
فیلدهای
ناحیه
ذخیره ثبات
۹۶/۱۶۰
بایتی تنها
برای هدف
پیشفرض
آنها
استفاده
میکند؛
فیلدهای
بلااستفاده
همچنان
فضای پشته
را اشغال
میکنند.
وقتی -mpacked-stack
مشخص شود،
شیارهای
ذخیره ثبات
به طور
متراکم در
بالای
ناحیه
ذخیره ثبات
بستهبندی
میشوند؛
فضای
استفادهنشده
برای اهداف
دیگر
مجدداً
استفاده
میشود و
امکان
استفاده
بهینهتر
از فضای
پشته در
دسترس را
فراهم
میکند. با
این حال،
هنگامی که
-mbackchain نیز
فعال باشد،
بالاترین
کلمه ناحیه
ذخیره
همیشه برای
ذخیره backchain
استفاده
میشود و
ثبات آدرس
بازگشت
همیشه دو
کلمه
پایینتر
از backchain ذخیره
میشود.
تا زمانی که از backchain فریم پشته استفاده نشود، کد تولید شده با -mpacked-stack با کد تولید شده با -mno-packed-stack از نظر فراخوانی سازگار است. توجه داشته باشید که برخی از نسخههای غیر FSF از GCC 2.95 برای S/390 یا zSeries کدی تولید میکردند که از backchain فریم پشته در زمان اجرا استفاده میکرد، نه صرفاً برای اهداف اشکالزدایی. چنین کدی با کد کامپایل شده با -mpacked-stack از نظر فراخوانی سازگار نیست. همچنین، توجه داشته باشید که ترکیب -mbackchain، -mpacked-stack و -mhard-float پشتیبانی نمیشود. برای ساخت کرنل لینوکس از -msoft-float استفاده کنید.
پیشفرض این است که از طرحبندی پشته فشرده استفاده نشود.
- -msmall-exec
- -mno-small-exec
- کدی تولید میکند (یا تولید نمیکند) که از دستورالعمل "bras" برای فراخوانی زیرروالها استفاده میکند. این کار تنها در صورتی با قابلیت اطمینان کار میکند که اندازه کل فایل اجرایی از 64k فراتر نرود. پیشفرض این است که به جای آن از دستورالعمل "basr" استفاده شود که این محدودیت را ندارد.
- -m64
- -m31
- هنگامی که -m31 مشخص شود، کدی مطابق با ABI گنو/لینوکس برای S/390 تولید میکند. هنگامی که -m64 مشخص شود، کدی مطابق با ABI گنو/لینوکس برای zSeries تولید میکند. این امر به ویژه به GCC اجازه میدهد دستورالعملهای ۶۴ بیتی تولید کند. برای مقصدهای s390، پیشفرض -m31 است، در حالی که مقصدهای s390x به طور پیشفرض روی -m64 هستند.
- -mzarch
- -mesa
- هنگامی که -mzarch مشخص شود، کدی را با استفاده از دستورالعملهای موجود در z/Architecture تولید میکند. هنگامی که -mesa مشخص شود، کدی را با استفاده از دستورالعملهای موجود در ESA/390 تولید میکند. توجه داشته باشید که -mesa همراه با -m64 امکانپذیر نیست. هنگام تولید کد سازگار با ABI گنو/لینوکس برای S/390، پیشفرض -mesa است. هنگام تولید کد سازگار با ABI گنو/لینوکس برای zSeries، پیشفرض -mzarch است.
- -mhtm
- -mno-htm
- گزینه -mhtm مجموعهای از توابع درونی را فعال میکند که از دستورالعملهای موجود در امکانات اجرای تراکنشی معرفیشده با نسل ماشین IBM zEnterprise EC12 بهره میبرند (بخش S/390 System z Built-in Functions). -mhtm هنگام استفاده از -march=zEC12 به طور پیشفرض فعال است.
- -mvx
- -mno-vx
- هنگامی که -mvx مشخص شود، کدی را با استفاده از دستورالعملهای موجود در امکانات افزونه برداری معرفیشده با نسل ماشین IBM z13 تولید میکند. این گزینه ABI را برای برخی از مقادیر نوع برداری با توجه به همترازی و قراردادهای فراخوانی تغییر میدهد. در صورتی که مقادیر نوع برداری در زمینهای مرتبط با ABI استفاده شوند، یک دستور GAS با نام .gnu_attribute برای نشانهگذاری باینری حاصل با ABI مورد استفاده اضافه خواهد شد. -mvx هنگام استفاده از -march=z13 به طور پیشفرض فعال است.
- -mzvector
- -mno-zvector
- گزینه -mzvector افزونههای زبانی برداری و توابع درونی را با استفاده از دستورالعملهای موجود در امکانات افزونه برداری معرفیشده با نسل ماشین IBM z13 فعال میکند. این گزینه امکان استفاده از vector را به عنوان کلمه کلیدی برای تعریف متغیرها و آرگومانهای نوع برداری اضافه میکند. vector تنها زمانی در دسترس است که افزونههای GNU فعال باشند. در صورت درخواست انطباق دقیق با استاندارد مثلاً با -std=c99، بسط داده نخواهد شد. علاوه بر توابع درونی سطح پایین GCC، گزینه -mzvector مجموعهای از توابع درونی اضافهشده برای سازگاری با پیادهسازیهای سبک AltiVec مانند Power و Cell را نیز فعال میکند. برای استفاده از این توابع درونی، فایل سرآیند vecintrin.h باید گنجانده شود. -mzvector به طور پیشفرض غیرفعال است..IP -mmvcle 4
- -mno-mvcle
- تولید (یا عدم تولید) کدی که از دستور "mvcle" برای انجام جابهجاییهای بلوکی استفاده میکند. هنگامی که -mno-mvcle مشخص شده باشد، به جای آن از یک حلقهٔ "mvc" استفاده میشود. این حالت پیشفرض است مگر اینکه بهینهسازی برای اندازه فعال باشد.
- -mdebug
- -mno-debug
- چاپ کردن (یا عدم چاپ) اطلاعات اشکالزدایی اضافی هنگام کامپایل. حالت پیشفرض، عدم چاپ اطلاعات اشکالزدایی است.
- -march=cpu-type
- تولید کدی
که بر روی cpu-type
اجرا
میشود، که
نام سیستمی
است که نوع
خاصی از
پردازنده
را نشان
میدهد.
مقادیر
ممکن برای
cpu-type عبارتند
از z900/arch5،
z990/arch6، z9-109،
z9-ec/arch7، z10/arch8،
z196/arch9، zEC12،
z13/arch11، z14/arch12،
z15/arch13، z16/arch14،
z17/arch15، و native.
مقدار پیشفرض -march=z900 است.
مشخص کردن native به عنوان نوع پردازنده میتواند برای انتخاب بهترین گزینهٔ معماری برای پردازندهٔ میزبان استفاده شود. در صورتی که GCC پردازنده را شناسایی نکند، -march=native هیچ اثری ندارد.
- -mtune=cpu-type
- میزانسازی تمام جنبههای ممکن در کد تولیدشده متناسب با cpu-type، به جز ABI و مجموعه دستورالعملهای دردسترس. فهرست مقادیر ممکن برای cpu-type همانند -march است. مقدار پیشفرض همان مقداری است که برای -march استفاده شده است.
- -mtpf-trace
- -mno-tpf-trace
- تولید کدی که انشعابهای اختصاصی TPF OS را به روتینهای ردیابی در سیستمعامل اضافه میکند (یا اضافه نمیکند). این گزینه به صورت پیشفرض غیرفعال است، حتی هنگام کامپایل برای TPF OS.
- -mtpf-trace-skip
- -mno-tpf-trace-skip
- تولید کدی که مقصدهای انشعاب پیشفرضِ فعالشده توسط -mtpf-trace را تغییر میدهد (یا تغییر نمیدهد) تا به روتینهای ردیابی تخصصی اشاره کنند که امکان نادیده گرفتن انتخابیِ مدخلهای ردیابی تابع را برای TPF OS فراهم میسازند. این گزینه به صورت پیشفرض غیرفعال است، حتی هنگام کامپایل برای TPF OS و مشخص کردن -mtpf-trace.
- -mfused-madd
- -mno-fused-madd
- تولید کدی که از دستورالعملهای ضرب و جمع ممیز شناور (multiply and accumulate) استفاده میکند (یا استفاده نمیکند). در صورت استفاده از ممیز شناور سختافزاری، این دستورالعملها به صورت پیشفرض تولید میشوند.
- -mwarn-framesize=framesize
- ارائه یک هشدار در صورتی که تابع جاری از اندازهٔ فریم دادهشده فراتر رود. از آنجا که این بررسی در زمان کامپایل انجام میشود، لزوماً به این معنی نیست که هنگام اجرای برنامه مشکلی واقعی رخ خواهد داد. هدف از آن شناسایی توابعی است که به احتمال زیاد باعث سرریز پشته (stack overflow) میشوند. این گزینه برای استفاده در محیطهایی با اندازهٔ پشتهٔ محدود، مانند هسته لینوکس، کاربردی است.
- -mwarn-dynamicstack
- ارائه یک هشدار در صورتی که تابع "alloca" را فراخوانی کند یا از آرایههای با اندازهٔ پویا استفاده نماید. این کار معمولاً در شرایطی با اندازهٔ پشتهٔ محدود، ایدهٔ نامناسبی است.
- -mstack-guard=stack-guard
- -mstack-size=stack-size
- اگر این گزینهها مشخص شوند، بکاند S/390 دستورالعملهای اضافهای در مقدمهٔ تابع صادر میکند که در صورتی که اندازهٔ پشته stack-guard بایت فراتر از stack-size باشد، یک تله (trap) ایجاد میکنند (به یاد داشته باشید که پشته در S/390 رو به پایین رشد میکند). اگر گزینهٔ stack-guard مشخص نشود، کوچکترین توان ۲ بزرگتر از اندازهٔ فریم تابع کامپایلشده انتخاب میشود. این گزینهها برای کمک به اشکالزدایی مشکلات سرریز پشته در نظر گرفته شدهاند. کد اضافی تولیدشده سربار اندکی ایجاد میکند و بنابراین میتواند در سیستمهای مشابه محیط عملیاتی نیز بدون افت چشمگیر کارایی استفاده شود. مقادیر دادهشده باید دقیقاً توانی از ۲ باشند و stack-size باید بزرگتر از stack-guard باشد بدون اینکه از 64k تجاوز کند. به منظور دستیابی به کارایی مناسب، کد اضافی این فرض را در نظر میگیرد که پشته در آدرسی همتراز با مقدار ارائهشده توسط stack-size آغاز میشود. گزینهٔ stack-guard تنها همراه با stack-size قابل استفاده است.
- -mhotpatch=pre-halfwords,post-halfwords
- اگر گزینهٔ
hotpatch فعال
باشد، یک
مقدمهٔ
تابع برای
«وصلهزنی
زنده» (hot-patching)
برای تمام
توابع
موجود در
واحد ترجمه
تولید
میشود. قبل
از برچسب
تابع،
تعداد
مشخصی از
دستورالعملهای
دو بایتی NOP
قرار
میگیرد
(pre-halfwords،
حداکثر
۱۰۰۰۰۰۰).
پس از
برچسب، با
استفاده از
بزرگترین
دستورالعملهای
شبیه به NOP که
معماری
اجازه
میدهد، به
میزان 2 * post-halfwords
بایت اضافه
میشود
(حداکثر
۱۰۰۰۰۰۰).
اگر هر دو آرگومان صفر باشند، وصلهزنی زنده غیرفعال میشود.
این گزینه میتواند برای توابع مجزا با استفاده از صفت "hotpatch" بازنویسی شود.
گزینههای SH
این گزینههای -m برای پیادهسازیهای SH تعریف شدهاند:
- -m1
- تولید کد برای SH1.
- -m2
- تولید کد برای SH2.
- -m2e
- تولید کد برای SH2e.
- -m2a-nofpu
- تولید کد برای SH2a بدون FPU، یا برای یک SH2a-FPU به گونهای که از واحد ممیز شناور استفاده نشود.
- -m2a-single-only
- تولید کد برای SH2a-FPU به گونهای که هیچ عملیات ممیز شناور با دقت مضاعف (double-precision) استفاده نشود.
- -m2a-single
- تولید کد برای SH2a-FPU با این فرض که واحد ممیز شناور به صورت پیشفرض در حالت دقت یگانه (single-precision) است.
- -m2a
- تولید کد برای SH2a-FPU با این فرض که واحد ممیز شناور به صورت پیشفرض در حالت دقت مضاعف است.
- -m3
- تولید کد برای SH3.
- -m3e
- تولید کد برای SH3e.
- -m4-nofpu
- تولید کد برای SH4 بدون واحد ممیز شناور.
- -m4-single-only
- تولید کد برای SH4 با واحد ممیز شناوری که تنها از محاسبات دقت یگانه پشتیبانی میکند.
- -m4-single
- تولید کد برای SH4 با این فرض که واحد ممیز شناور به صورت پیشفرض در حالت دقت یگانه است.
- -m4
- تولید کد برای SH4.
- -m4-100
- تولید کد برای SH4-100.
- -m4-100-nofpu
- تولید کد برای SH4-100 به گونهای که از واحد ممیز شناور استفاده نشود.
- -m4-100-single
- تولید کد برای SH4-100 با این فرض که واحد ممیز شناور به صورت پیشفرض در حالت دقت یگانه است.
- -m4-100-single-only
- تولید کد برای SH4-100 به گونهای که هیچ عملیات ممیز شناور با دقت مضاعف استفاده نشود.
- -m4-200
- تولید کد برای SH4-200..IP -m4-200-nofpu 4 تولید کد برای SH4-200 به گونهای که از واحد ممیز شناور استفاده نشود.
- -m4-200-single
- تولید کد برای SH4-200 با این فرض که واحد ممیز شناور بهطور پیشفرض در حالت دقت منفرد (single-precision) قرار دارد.
- -m4-200-single-only
- تولید کد برای SH4-200 به گونهای که هیچ عملیات ممیز شناور با دقت مضاعف (double-precision) استفاده نشود.
- -m4-300
- تولید کد برای SH4-300.
- -m4-300-nofpu
- تولید کد برای SH4-300 به گونهای که از واحد ممیز شناور استفاده نشود.
- -m4-300-single
- تولید کد برای SH4-300 به گونهای که هیچ عملیات ممیز شناور با دقت مضاعف استفاده نشود.
- -m4-300-single-only
- تولید کد برای SH4-300 به گونهای که هیچ عملیات ممیز شناور با دقت مضاعف استفاده نشود.
- -m4-340
- تولید کد برای SH4-340 (بدون MMU، بدون FPU).
- -m4-500
- تولید کد برای SH4-500 (بدون FPU). گزینهٔ -isa=sh4-nofpu را به اسمبلر منتقل میکند.
- -m4a-nofpu
- تولید کد برای SH4al-dsp یا برای یک SH4a به گونهای که از واحد ممیز شناور استفاده نشود.
- -m4a-single-only
- تولید کد برای SH4a، به گونهای که هیچ عملیات ممیز شناور با دقت مضاعف استفاده نشود.
- -m4a-single
- تولید کد برای SH4a با این فرض که واحد ممیز شناور بهطور پیشفرض در حالت دقت منفرد قرار دارد.
- -m4a
- تولید کد برای SH4a.
- -m4al
- مشابه -m4a-nofpu، به جز اینکه بهطور ضمنی -dsp را به اسمبلر ارسال میکند. GCC در حال حاضر هیچ دستورالعمل DSP تولید نمیکند.
- -mb
- کامپایل کد برای پردازنده در حالت بزرگپایان (big-endian).
- -ml
- کامپایل کد برای پردازنده در حالت کوچکپایان (little-endian).
- -mdalign
- تراز کردن متغیرهای double در مرزهای ۶۴ بیتی. توجه داشته باشید که این کار قراردادهای فراخوانی (calling conventions) را تغییر میدهد و بنابراین برخی از توابع کتابخانهٔ استاندارد C کار نخواهند کرد، مگر اینکه ابتدا آن را با -mdalign دوباره کامپایل کنید.
- -mrelax
- کوتاهتر کردن برخی از ارجاعات آدرس در زمان پیوند، در صورت امکان؛ از گزینهٔ لینکر -relax استفاده میکند.
- -mbigtable
- استفاده از آفستهای ۳۲ بیتی در جدولهای "switch". پیشفرض استفاده از آفستهای ۱۶ بیتی است.
- -mbitops
- فعالسازی استفاده از دستورالعملهای دستکاری بیتی روی SH2A.
- -mfmovd
- فعالسازی استفاده از دستورالعمل "fmovd". برای محدودیتهای ترازسازی، -mdalign را بررسی کنید.
- -mrenesas
- پیروی از قراردادهای فراخوانی تعریفشده توسط Renesas.
- -mno-renesas
- پیروی از قراردادهای فراخوانی تعریفشده برای GCC پیش از دردسترس قرار گرفتن قراردادهای Renesas. این گزینه پیشفرض برای همهٔ مقصدهای زنجیره ابزار SH است.
- -mnomacsave
- علامتگذاری ثبات "MAC" به عنوان call-clobbered، حتی اگر -mrenesas مشخص شده باشد.
- -mieee
- -mno-ieee
- کنترل انطباق با استاندارد IEEE در مقایسههای ممیز شناور، که بر نحوهٔ مدیریت مواردی که نتیجه مقایسه نامرتب (unordered) است تأثیر میگذارد. بهطور پیشفرض -mieee بهصورت ضمنی فعال است. اگر -ffinite-math-only فعال باشد، -mno-ieee بهطور ضمنی تنظیم میشود که منجر به مقایسههای ممیز شناور سریعتر برای بزرگتر یا مساوی و کوچکتر یا مساوی میگردد. تنظیمات ضمنی را میتوان با تعیین -mieee یا -mno-ieee بازنویسی کرد.
- -minline-ic_invalidate
- درونخطسازی (Inline) کد برای بیاعتبار کردن مدخلهای حافظهٔ نهان دستورالعمل پس از برپایی ترامپولینهای توابع تو در تو. این گزینه در صورتی که -musermode اعمال شده باشد و گزینهٔ تولید کدِ انتخابشده (مانند -m4) اجازهٔ استفاده از دستورالعمل "icbi" را ندهد، هیچ اثری ندارد. اگر گزینهٔ تولید کدِ انتخابشده اجازهٔ استفاده از دستورالعمل "icbi" را ندهد و -musermode اعمال نشده باشد، کدِ درونخطشده مستقیماً آرایهٔ آدرس حافظهٔ نهان دستورالعمل را با یک نوشتن انجمنی دستکاری میکند. این کار نهتنها در زمان اجرا به حالت ممتاز (privileged mode) نیاز دارد، بلکه اگر خط کَش از طریق TLB نگاشت شده و سپس نگاشت آن حذف شده باشد، با شکست مواجه میشود.
- -misize
- تخلیه اندازه و مکان دستورالعمل در کد اسمبلی.
- -mpadstruct
- این گزینه منسوخ شده است. این گزینه ساختارها را به مضربی از ۴ بایت تراز/پد (pad) میکند، که با ABI معماری SH ناسازگار است.
- -matomic-model=model
- مدل عملیات اتمی و پارامترهای اضافی را به صورت فهرستی جداشده با کاما تعیین میکند. برای جزئیات در مورد توابع درونی (built-in) اتمی، به __atomic Builtins مراجعه کنید. مدلها و پارامترهای زیر پشتیبانی میشوند:
- none
- غیرفعال کردن توالیهای اتمیِ تولیدشده توسط کامپایلر و تولید فراخوانیهای کتابخانهای برای عملیات اتمی. این حالت در صورتی که مقصد "sh*-*-linux*" نباشد پیشفرض است.
- soft-gusa
- تولید توالیهای نرمافزاری اتمی gUSA سازگار با GNU/Linux برای توابع درونی اتمی. توالیهای اتمی تولیدشده نیاز به پشتیبانی اضافی از کد مدیریت وقفه/استثنای سیستم دارند و فقط برای سیستمهای تکهستهای SH3* و SH4* مناسب هستند. این گزینه زمانی که مقصد "sh*-*-linux*" و SH3* یا SH4* باشد، بهطور پیشفرض فعال است. هنگامی که مقصد SH4A باشد، این گزینه همچنین به منظور ایجاد کدی بهینهتر، تا حدی از دستورالعملهای سختافزاری اتمی "movli.l" و "movco.l" بهره میبرد، مگر اینکه strict تعیین شده باشد.
- soft-tcb
- تولید توالیهای نرمافزاری اتمی که از یک متغیر در بلوک کنترل نخ (thread control block) استفاده میکنند. این گزینهای دگرگونشده از توالیهای gUSA است که میتواند روی مقصدهای SH1* و SH2* نیز استفاده شود. توالیهای اتمی تولیدشده نیاز به پشتیبانی اضافی از سوی کد مدیریت وقفه/استثنای سیستم دارند و فقط برای سیستمهای تکهستهای مناسب هستند. هنگام استفاده از این مدل، پارامتر gbr-offset= نیز باید مشخص شود.
- soft-imask
- تولید توالیهای نرمافزاری اتمی که با تنظیم "SR.IMASK = 1111" بهطور موقت وقفهها را غیرفعال میکنند. این مدل تنها زمانی کار میکند که برنامه در حالت ممتاز (privileged mode) اجرا شود و فقط برای سیستمهای تکهستهای مناسب است. پشتیبانی اضافی از کد مدیریت وقفه/استثنای سیستم مورد نیاز نیست. این مدل زمانی که مقصد "sh*-*-linux*" و SH1* یا SH2* باشد بهطور پیشفرض فعال است.
- hard-llcs
- تولید توالیهای سختافزاری اتمی صرفاً با استفاده از دستورالعملهای "movli.l" و "movco.l". این مورد فقط در SH4A موجود است و برای سیستمهای چندهستهای مناسب است. از آنجا که دستورالعملهای سختافزاری فقط از متغیرهای اتمی ۳۲ بیتی پشتیبانی میکنند، دسترسی به متغیرهای ۸ یا ۱۶ بیتی با دسترسیهای ۳۲ بیتی شبیهسازی (emulate) میشود. کد کامپایلشده با این گزینه، در صورت اجرا روی سیستم SH4A، با سیستمهای مدیریت وقفه/استثنای دیگر مدلهای نرمافزاری اتمی نیز سازگار است. برای این مدل پشتیبانی اضافی از کد مدیریت وقفه/استثنای سیستم لازم نیست.
- gbr-offset=
- این پارامتر آفست (بر حسب بایت) متغیر موجود در ساختار بلوک کنترل نخ را مشخص میکند که باید توسط توالیهای اتمی تولیدشده در صورت انتخاب مدل soft-tcb مورد استفاده قرار گیرد. برای سایر مدلها این پارامتر نادیده گرفته میشود. مقدار مشخصشده باید یک مضرب صحیح از چهار و در محدودهٔ ۰-۱۰۲۰ باشد.
- strict
- این پارامتر از استفادهٔ ترکیبی چندین مدل اتمی، حتی در صورت سازگاری، جلوگیری میکند و کامپایلر را وادار میسازد تا توالیهای اتمی را فقط طبق مدل تعیینشده تولید کند.
- -mprefergot
- هنگام تولید کد مستقل از موقعیت، فراخوانیهای توابع را به جای جدول پیوند رویه (PLT) با استفاده از جدول آفست سراسری (GOT) صادر میکند.
- -musermode
- -mno-usermode
- به کامپایلر اجازه تولید کد حالت ممتازه (privileged mode) را نمیدهد (اجازه میدهد). تعیین -musermode همچنین در صورتی که کد درونخطیشده در حالت کاربر کار نکند، مستلزم -mno-inline-ic_invalidate است. هنگامی که هدف "sh*-*-linux*" باشد، -musermode پیشفرض است. اگر هدف *SH1 یا *SH2 باشد، گزینه -musermode هیچ تأثیری ندارد، زیرا حالت کاربر وجود ندارد.
- -multcost=number
- هزینه فرضی برای یک دستور ضرب را تعیین میکند.
- -mdiv=strategy
- راهبرد تقسیم مورد استفاده برای عملیات تقسیم عدد صحیح را تعیین میکند. strategy میتواند یکی از موارد زیر باشد:
- call-div1
- تابعی از کتابخانه را فراخوانی میکند که از دستور تقسیم تکمرحلهای "div1" برای انجام عملیات استفاده میکند. تقسیم بر صفر نتیجهای نامشخص محاسبه کرده و تله (trap) ایجاد نمیکند. این حالت پیشفرض است، مگر برای SH4، SH2A و SHcompact.
- call-fp
- تابعی از کتابخانه را فراخوانی میکند که عملیات را با ممیز شناور با دقت مضاعف انجام میدهد. تقسیم بر صفر باعث ایجاد یک استثنای ممیز شناور میشود. این حالت پیشفرض برای SHcompact دارای FPU است. تعیین این گزینه برای اهدافی که FPU با دقت مضاعف ندارند، به طور پیشفرض به "call-div1" تغییر مییابد.
- call-table
- تابعی از کتابخانه را فراخوانی میکند که از یک جدول جستجو برای مقسومعلیههای کوچک و از دستور "div1" با تفکیک حالات برای مقسومعلیههای بزرگتر استفاده میکند. تقسیم بر صفر نتیجهای نامشخص محاسبه کرده و trap ایجاد نمیکند. این حالت پیشفرض برای SH4 است. تعیین این گزینه برای اهدافی که دستورهای شیفت پویا ندارند، به طور پیشفرض به "call-div1" برمیگردد.
هنگامی که راهبرد تقسیم مشخص نشده باشد، راهبرد پیشفرض بر اساس هدف جاری انتخاب میشود. برای SH2A، راهبرد پیشفرض استفاده از دستورهای "divs" و "divu" به جای فراخوانیهای توابع کتابخانهای است.
- -maccumulate-outgoing-args
- فضا را برای آرگومانهای خروجی یک بار در مقدمه تابع (function prologue) رزرو میکند، نه در اطراف هر فراخوانی. این کار به طور کلی برای کارایی و اندازه کد مفید است. همچنین برای باز کردن پشته (unwinding) جهت جلوگیری از تغییر چارچوب پشته در اطراف کدهای شرطی مورد نیاز است.
- -mdivsi3_libfunc=name
- نام تابع کتابخانهای مورد استفاده برای تقسیم علامتدار ۳۲ بیتی را روی name تنظیم میکند. این گزینه فقط بر نام استفادهشده در راهبردهای تقسیم call تأثیر میگذارد و کامپایلر همچنان انتظار همان مجموعههای ثباتهای ورودی/خروجی/تخریبشده (clobbered) را دارد که گویی این گزینه وجود نداشته است.
- -mfixed-range=register-range
- کدی تولید میکند که با محدوده ثباتهای ارائهشده به عنوان ثباتهای ثابت برخورد میکند. یک ثبات ثابت ثباتی است که تخصیصدهنده ثبات (register allocator) نمیتواند از آن استفاده کند. این گزینه هنگام کامپایل کد هسته کاربرد دارد. یک محدوده ثبات به صورت دو ثبات جدا شده با خط تیره مشخص میشود. چندین محدوده ثبات را میتوان با کاما از یکدیگر جدا کرد.
- -mbranch-cost=num
- مقدار num را به عنوان هزینه یک دستور پرش (branch) در نظر میگیرد. مقادیر بالاتر باعث میشوند کامپایلر تلاش کند در صورت امکان کدهای بدون پرش بیشتری تولید کند. در صورت عدم تعیین، این مقدار بسته به نوع پردازندهای که برای آن کامپایل انجام میشود، انتخاب میگردد.
- -mzdcbranch
- -mno-zdcbranch
- فرض میکند (فرض نمیکند) که دستورهای پرش شرطی با جابهجایی صفر (zero displacement) "bt" و "bf" سریع هستند. اگر -mzdcbranch مشخص شود، کامپایلر توالیهای کد پرش با جابهجایی صفر را ترجیح میدهد. این گزینه هنگام تولید کد برای SH4 و SH4A به طور پیشفرض فعال است. میتوان آن را با تعیین صریح -mno-zdcbranch غیرفعال کرد.
- -mcbranch-force-delay-slot
- استفاده از شکافهای تأخیر (delay slots) را برای پرشهای شرطی اجباری میکند؛ که در صورت پیدا نشدن دستور مناسب، شکاف تأخیر را با یک "nop" پر میکند. به طور پیشفرض این گزینه غیرفعال است. میتوان آن را برای دور زدن اشکالات سختافزاری مانند آنچه در SH7055 اصلی یافت میشود فعال کرد.
- -mfused-madd
- -mno-fused-madd
- کدی تولید میکند که از دستورهای ضرب و جمع ممیز شناور استفاده میکند (استفاده نمیکند). در صورت استفاده از ممیز شناور سختافزاری، این دستورها به طور پیشفرض تولید میشوند. گزینه وابسته به ماشین -mfused-madd اکنون به گزینه مستقل از ماشین -ffp-contract=fast و -mno-fused-madd به -ffp-contract=off نگاشت شده است.
- -mfsca
- -mno-fsca
- به کامپایلر اجازه میدهد یا نمیدهد که دستور "fsca" را برای تقریب سینوس و کسینوس صادر کند. گزینه -mfsca باید در ترکیب با -funsafe-math-optimizations استفاده شود. این گزینه به طور پیشفرض هنگام تولید کد برای SH4A فعال است. استفاده از -mno-fsca تقریبهای سینوس و کسینوس را غیرفعال میکند، حتی اگر -funsafe-math-optimizations اعمال شده باشد.
- -mfsrra
- -mno-fsrra
- به کامپایلر اجازه میدهد یا نمیدهد که دستور "fsrra" را برای تقریب جذر معکوس (reciprocal square root) صادر کند. گزینه -mfsrra باید در ترکیب با -funsafe-math-optimizations و -ffinite-math-only استفاده شود. این گزینه به طور پیشفرض هنگام تولید کد برای SH4A فعال است. استفاده از -mno-fsrra تقریب جذر معکوس را غیرفعال میکند حتی اگر -funsafe-math-optimizations و -ffinite-math-only اعمال شده باشند.
- -mpretend-cmove
- پرشهای شرطی با جابهجایی صفر را برای الگوهای دستور انتقال شرطی (conditional move) ترجیح میدهد. این امر میتواند منجر به کدهای سریعتر در پردازنده SH4 شود.
- -mfdpic
- کد را با استفاده از ABI مربوط به FDPIC تولید میکند.
گزینههای Solaris 2
این گزینههای -m در Solaris 2 پشتیبانی میشوند:
- -mclear-hwcap
- گزینه -mclear-hwcap به کامپایلر اعلام میکند قابلیتهای سختافزاری تولیدشده توسط اسمبلر Solaris را حذف کند. این گزینه فقط زمانی ضروری است که فایلهای شیء از افزونههای معماری مجموعه دستورات (ISA) استفاده کنند که توسط ماشین فعلی پشتیبانی نمیشود، اما در زمان اجرا بررسی میکنند که آیا باید از آنها استفاده شود یا خیر.
- -mimpure-text
- گزینه -mimpure-text
که علاوه بر
-shared استفاده
میشود، به
کامپایلر
میگوید
هنگام
پیوند یک
شیء
اشتراکی، -z
text را به
پیونددهنده
ارسال نکند.
با استفاده
از این
گزینه،
میتوانید
کدهای
وابسته به
موقعیت را
در یک شیء
اشتراکی
پیوند دهید.
گزینه -mimpure-text پیام خطای پیونددهنده مبنی بر "relocations remain against allocatable but non-writable sections" را سرکوب میکند. با این حال، بازنشانیهای ضروری باعث فعال شدن رونویسی در زمان نوشتن (copy-on-write) میشوند و شیء اشتراکی در واقع بین فرایندها به اشتراک گذاشته نمیشود. به جای استفاده از -mimpure-text، باید تمام کد منبع را با -fpic یا -fPIC کامپایل کنید.
علاوه بر موارد بالا، این سوئیچها در Solaris 2 پشتیبانی میشوند:
- -pthreads
- این یک مترادف برای -pthread است.
گزینههای SPARC
این گزینههای -m در SPARC پشتیبانی میشوند:
- -mno-app-regs
- مشخص کردن
-mapp-regs باعث
تولید
خروجی با
استفاده از
ثباتهای
سراسری (global registers)
۲ تا ۴
میشود، که
SPARC SVR4 ABI آنها را
برای
برنامههای
کاربردی
رزرو کرده
است. مشابه
ثبات
سراسری ۱،
هر یک از
ثباتهای
سراسری ۲ تا
۴ به عنوان
یک ثبات
قابلتخصیص
در نظر
گرفته
میشوند که
فراخوانی
توابع
مقدار
آنها را
بازنویسی (clobber)
میکند. این
حالت
پیشفرض
است.
برای سازگاری کامل با SVR4 ABI به قیمت مقداری افت کارایی، گزینه -mno-app-regs را مشخص کنید. شما باید کتابخانهها و نرمافزارهای سیستمی را با این گزینه کامپایل کنید.
- -mflat
- -mno-flat
- با -mflat،
کامپایلر
دستورالعملهای
save/restore را تولید
نمیکند و
از یک مدل
«مسطح» (flat) یا
پنجره ثبات
تکی
استفاده
میکند. این
مدل با مدل
پنجره ثبات
معمولی
سازگار است.
ثباتهای
محلی و
ثباتهای
ورودی (۰--۵)
همچنان به
عنوان
ثباتهای
«حفظشده
در
فراخوانی»
(call-saved) در نظر
گرفته
میشوند و
در صورت
نیاز روی
پشته ذخیره
میشوند.
با -mno-flat (حالت پیشفرض)، کامپایلر دستورالعملهای save/restore را (به جز برای توابع برگ یا leaf) تولید میکند. این حالت کارکرد عادی است.
- -mfpu
- -mhard-float
- تولید خروجیِ حاوی دستورالعملهای ممیز شناور (floating-point). این حالت پیشفرض است.
- -mno-fpu
- -msoft-float
- تولید
خروجیِ
حاوی
فراخوانیهای
کتابخانهای
برای ممیز
شناور.
هشدار:
کتابخانههای
مورد نیاز
برای تمام
اهداف SPARC در
دسترس
نیستند. به
طور معمول
از امکانات
کامپایلر C
پیشفرض
ماشین
استفاده
میشود،
اما این کار
در کامپایل
متقاطع (cross-compilation)
به طور
مستقیم
امکانپذیر
نیست. برای
کامپایل
متقاطع،
باید
تمهیدات
لازم را
برای ارائه
توابع
کتابخانهای
مناسب
فراهم کنید.
اهداف
توکار (embedded)
شامل sparc-*-aout و
sparclite-*-* از ممیز
شناور
نرمافزاری
پشتیبانی
میکنند.
گزینه -msoft-float شیوه فراخوانی (calling convention) را در فایل خروجی تغییر میدهد؛ بنابراین، تنها در صورتی مفید است که تمام برنامه را با این گزینه کامپایل کنید. به ویژه، برای کارکرد درست لازم است libgcc.a (کتابخانهای که همراه GCC ارائه میشود) را با -msoft-float کامپایل کنید.
- -mhard-quad-float
- تولید خروجیِ حاوی دستورالعملهای ممیز شناور چهارکلمهای (quad-word یا long double).
- -msoft-quad-float
- تولید
خروجیِ
حاوی
فراخوانیهای
کتابخانهای
برای
دستورالعملهای
ممیز شناور
چهارکلمهای
(quad-word یا long double).
توابع
فراخوانیشده
همانهایی
هستند که در
SPARC ABI مشخص
شدهاند.
این حالت
پیشفرض
است.
تا زمان نگارش این متن، هیچ پیادهسازی از SPARC وجود ندارد که پشتیبانی سختافزاری از دستورالعملهای ممیز شناور quad-word داشته باشد. همه آنها برای چنین دستورالعملهایی یک گرداننده تله (trap handler) را فراخوانی میکنند، و سپس گرداننده تله اثر دستورالعمل را شبیهسازی میکند. به دلیل سربار گرداننده تله، این روش بسیار کندتر از فراخوانی توابع کتابخانهای ABI است. بنابراین گزینه -msoft-quad-float پیشفرض است.
- -mno-unaligned-doubles
- -munaligned-doubles
- فرض میکند
که مقادیر double
همترازی
(alignment) ۸ بایتی
دارند. این
حالت
پیشفرض
است.
با -munaligned-doubles، کامپایلر GCC تنها زمانی فرض میکند که مقادیر double همترازی ۸ بایتی دارند که در نوع داده دیگری قرار گرفته باشند، یا دارای آدرس مطلق باشند. در غیر این صورت، فرض میکند که همترازی ۴ بایتی دارند. تعیین این گزینه از برخی مشکلات نادر سازگاری با کدهای تولیدشده توسط کامپایلرهای دیگر جلوگیری میکند. این گزینه به عنوان پیشفرض نیست زیرا باعث افت کارایی، به ویژه برای کدهای ممیز شناور، میشود.
- -muser-mode
- -mno-user-mode
- کدی را که فقط میتواند در حالت ناظر (supervisor mode) اجرا شود، تولید نمیکند. این موضوع فقط برای دستورالعمل "casa" که برای پردازنده LEON3 صادر میشود صدق میکند. این حالت پیشفرض است.
- -mfaster-structs
- -mno-faster-structs
- با -mfaster-structs، کامپایلر فرض میکند که ساختارها (structures) باید همترازی ۸ بایتی داشته باشند. این امر استفاده از جفتدستورالعملهای "ldd" و "std" را برای کپیها در انتساب ساختار، به جای دو برابر جفتهای "ld" و "st" ممکن میسازد. با این حال، استفاده از این همترازیِ تغییریافته مستقیماً SPARC ABI را نقض میکند. از این رو، این گزینه فقط برای اهدافی در نظر گرفته شده است که توسعهدهنده میداند کد حاصل مستقیماً با قواعد ABI مطابقت ندارد.
- -mstd-struct-return
- -mno-std-struct-return
- با -mstd-struct-return،
کامپایلر
کدهای
کنترلی را
در توابعی
که ساختار
(structure) یا
اجتماع (union)
برمیگردانند
تولید
میکند تا
بر اساس ABI ۳۲
بیتی، عدم
تطابق
اندازه
میان دو طرف
فراخوانی
تابع را
تشخیص دهد.
حالت پیشفرض -mno-std-struct-return است. این گزینه در حالت ۶۴ بیتی هیچ تاثیری ندارد.
- -mcpu=cpu_type
- مجموعه
دستورالعمل،
مجموعه
ثباتها و
پارامترهای
زمانبندی
دستورالعمل
را برای نوع
ماشین cpu_type
تنظیم
میکند.
مقادیر
پشتیبانیشده
برای cpu_type
عبارتند از:
v7، cypress، v8،
supersparc، hypersparc، leon،
leon3، leon3v7، leon5،
sparclite، f930، f934،
sparclite86x، sparclet، tsc701،
v9، ultrasparc، ultrasparc3،
niagara، niagara2، niagara3،
niagara4، niagara7 و m8.
زنجیره ابزارهای بومی Solaris و GNU/Linux از مقدار native نیز پشتیبانی میکنند، که بهترین گزینه معماری را برای پردازنده میزبان انتخاب میکند. اگر GCC پردازنده را شناسایی نکند، -mcpu=native تاثیری نخواهد داشت.
برای مقادیری که یک معماری و نه یک پیادهسازی را انتخاب میکنند، از پارامترهای پیشفرض زمانبندی دستورالعمل استفاده میشود. این مقادیر عبارتند از: v7، v8، sparclite، sparclet، v9.
در اینجا فهرستی از هر یک از معماریهای پشتیبانیشده و پیادهسازیهای مربوط به آنها آورده شده است:
به طور پیشفرض (مگر اینکه به شکل دیگری پیکربندی شده باشد)، GCC کدی برای نسخه V7 از معماری SPARC تولید میکند. با -mcpu=cypress، کامپایلر علاوه بر آن، کد را برای تراشه Cypress CY7C602 (که در سری SPARCStation/SPARCServer 3xx به کار رفته) بهینهسازی میکند. این مقدار برای سیستمهای قدیمیتر مانند SPARCStation 1، 2، IPX و غیره نیز مناسب است.
با -mcpu=v8، کامپایلر GCC کد را برای نسخه V8 از معماری SPARC تولید میکند. تنها تفاوت آن با کد V7 در این است که کامپایلر دستورالعملهای ضرب عدد صحیح و تقسیم عدد صحیح را صادر میکند که در SPARC-V8 وجود دارند اما در SPARC-V7 نیستند. با -mcpu=supersparc، کامپایلر علاوه بر آن، کد را برای تراشه SuperSPARC (که در سری SPARCStation 10، 1000 و 2000 استفاده شده) بهینهسازی میکند.
با -mcpu=sparclite، کامپایلر GCC کد را برای نسخه SPARClite از معماری SPARC تولید میکند. این گزینه دستورالعملهای ضرب عدد صحیح، گام تقسیم عدد صحیح (integer divide step) و پویش ("ffs") را اضافه میکند که در SPARClite موجودند اما در SPARC-V7 نیستند. با -mcpu=f930، کامپایلر علاوه بر آن، کد را برای تراشه Fujitsu MB86930 (که همان SPARClite اصلی و فاقد FPU است) بهینهسازی میکند. با -mcpu=f934، کامپایلر علاوه بر آن، کد را برای تراشه Fujitsu MB86934 (که SPARClite جدیدتر و دارای FPU است) بهینهسازی میکند.
با -mcpu=sparclet، کامپایلر GCC کد را برای نسخه SPARClet از معماری SPARC تولید میکند. این گزینه دستورالعملهای ضرب عدد صحیح، ضرب/انباشت (multiply/accumulate)، گام تقسیم عدد صحیح و پویش ("ffs") را اضافه میکند که در SPARClet وجود دارند اما در SPARC-V7 نیستند. با -mcpu=tsc701، کامپایلر علاوه بر آن، کد را برای تراشه TEMIC SPARClet بهینهسازی میکند.
با -mcpu=v9، کامپایلر GCC کد را برای نسخه V9 از معماری SPARC تولید میکند. این گزینه دستورالعملهای انتقال ۶۴ بیتی عدد صحیح و ممیز شناور، ۳ ثبات کد وضعیت ممیز شناور اضافی، و دستورالعملهای انتقال شرطی را اضافه میکند. با -mcpu=ultrasparc، کامپایلر علاوه بر آن، کد را برای تراشههای Sun UltraSPARC I/II/IIi بهینهسازی میکند. با -mcpu=ultrasparc3، کامپایلر علاوه بر آن، کد را برای تراشههای Sun UltraSPARC III/III+/IIIi/IIIi+/IV/IV+ بهینهسازی میکند. با -mcpu=niagara، کامپایلر علاوه بر آن، کد را برای تراشههای Sun UltraSPARC T1 بهینهسازی میکند. با -mcpu=niagara2، کامپایلر علاوه بر آن، کد را برای تراشههای Sun UltraSPARC T2 بهینهسازی میکند. با -mcpu=niagara3، کامپایلر علاوه بر آن، کد را برای تراشههای Sun UltraSPARC T3 بهینهسازی میکند. با -mcpu=niagara4، کامپایلر علاوه بر آن، کد را برای تراشههای Sun UltraSPARC T4 بهینهسازی میکند. با -mcpu=niagara7، کامپایلر علاوه بر آن، کد را برای تراشههای Oracle SPARC M7 بهینهسازی میکند. با -mcpu=m8، کامپایلر علاوه بر آن، کد را برای تراشههای Oracle M8 بهینهسازی میکند. پارامترهای زمانبندی دستورالعمل را برای نوع ماشین cpu_type تنظیم میکند، اما بر خلاف گزینهٔ -mcpu=cpu_type، مجموعه دستورالعملها یا مجموعه ثباتها را تغییر نمیدهد.
همان مقادیر مجاز برای -mcpu=cpu_type میتوانند برای -mtune=cpu_type نیز استفاده شوند، اما تنها مقادیر مفید آنهایی هستند که یک پیادهسازی خاص از پردازنده را انتخاب میکنند. این مقادیر عبارتند از cypress، supersparc، hypersparc، leon، leon3، leon3v7، leon5، f930، f934، sparclite86x، tsc701، ultrasparc، ultrasparc3، niagara، niagara2، niagara3، niagara4، niagara7 و m8. در زنجیرهابزارهای بومی Solaris و GNU/Linux، میتوان از مقدار native نیز استفاده کرد.
- -mv8plus
- -mno-v8plus
- با فعال بودن -mv8plus، کامپایلر GCC برای ABI مربوط به SPARC-V8+ کد تولید میکند. تفاوت آن با V8 ABI در این است که ثباتهای سراسری (global) و خروجی (out) بهصورت ۶۴ بیتی در نظر گرفته میشوند. این گزینه بهطور پیشفرض در Solaris در حالت ۳۲ بیتی برای تمام پردازندههای SPARC-V9 فعال است.
- -mvis
- -mno-vis
- با فعال بودن -mvis، کامپایلر GCC کدی تولید میکند که از افزونههای مجموعه دستورالعملهای بصری (Visual Instruction Set) در UltraSPARC بهره میبرد. مقدار پیشفرض -mno-vis است.
- -mvis2
- -mno-vis2
- با فعال بودن -mvis2، کامپایلر GCC کدی تولید میکند که از نسخهٔ 2.0 افزونههای مجموعه دستورالعملهای بصری UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند (مانند UltraSPARC-III و جدیدتر)، مقدار پیشفرض -mvis2 است. فعالسازی -mvis2 همچنین باعث فعال شدن -mvis نیز میشود.
- -mvis3
- -mno-vis3
- با فعال بودن -mvis3، کامپایلر GCC کدی تولید میکند که از نسخهٔ 3.0 افزونههای مجموعه دستورالعملهای بصری UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند (مانند niagara-3 و جدیدتر)، مقدار پیشفرض -mvis3 است. فعالسازی -mvis3 همچنین باعث فعال شدن -mvis2 و -mvis میشود.
- -mvis3b
- -mno-vis3b
- با فعال بودن -mvis3b، کامپایلر GCC کدی تولید میکند که علاوه بر نسخهٔ 3.0 افزونههای مجموعه دستورالعملهای بصری UltraSPARC، از دستورالعملهای الحاقی VIS معرفیشده در Oracle SPARC Architecture 2011 نیز بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند (مانند niagara-7 و جدیدتر)، مقدار پیشفرض -mvis3b است. فعالسازی -mvis3b همچنین باعث فعال شدن -mvis3، -mvis2 و -mvis میشود.
- -mvis4
- -mno-vis4
- با فعال بودن -mvis4، کامپایلر GCC کدی تولید میکند که از نسخهٔ 4.0 افزونههای مجموعه دستورالعملهای بصری UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند (مانند niagara-7 و جدیدتر)، مقدار پیشفرض -mvis4 است. فعالسازی -mvis4 همچنین باعث فعال شدن -mvis3b، -mvis3، -mvis2 و -mvis میشود.
- -mvis4b
- -mno-vis4b
- با فعال بودن -mvis4b، کامپایلر GCC کدی تولید میکند که علاوه بر نسخهٔ 4.0 افزونههای مجموعه دستورالعملهای بصری UltraSPARC، از دستورالعملهای الحاقی VIS معرفیشده در Oracle SPARC Architecture 2017 نیز بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند (مانند m8 و جدیدتر)، مقدار پیشفرض -mvis4b است. فعالسازی -mvis4b همچنین باعث فعال شدن -mvis4، -mvis3b، -mvis3، -mvis2 و -mvis میشود.
- -mcbcond
- -mno-cbcond
- با فعال بودن -mcbcond، کامپایلر GCC کدی تولید میکند که از دستورالعملهای مقایسه و انشعاب شرطی (Compare-and-Branch-on-Condition) در UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند (مانند Niagara-4 و جدیدتر)، مقدار پیشفرض -mcbcond است.
- -mfmaf
- -mno-fmaf
- با فعال بودن -mfmaf، کامپایلر GCC کدی تولید میکند که از دستورالعملهای ممیز شناور ضرب-جمع ادغامشده (Fused Multiply-Add Floating-point) در UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعملها پشتیبانی میکند (مانند Niagara-3 و جدیدتر)، مقدار پیشفرض -mfmaf است.
- -mfsmuld
- -mno-fsmuld
- با فعال بودن -mfsmuld، کامپایلر GCC کدی تولید میکند که از دستورالعمل ضرب ممیز شناور دقتتکی به دقتمضاعف (FsMULd) بهره میبرد. مقدار پیشفرض هنگام هدف قرار دادن پردازندهای که از نسخههای معماری V8 یا V9 با FPU پشتیبانی میکند، به جز در مورد -mcpu=leon، برابر با -mfsmuld است.
- -mpopc
- -mno-popc
- با فعال بودن -mpopc، کامپایلر GCC کدی تولید میکند که از دستورالعمل شمارش تعداد بیتهای فعال (Population Count) در UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعمل پشتیبانی میکند (مانند Niagara-2 و جدیدتر)، مقدار پیشفرض -mpopc است.
- -msubxc
- -mno-subxc
- با فعال بودن -msubxc، کامپایلر GCC کدی تولید میکند که از دستورالعمل تفریق گسترشیافته با رقم نقلی (Subtract-Extended-with-Carry) در UltraSPARC بهره میبرد. هنگام هدف قرار دادن پردازندهای که از این دستورالعمل پشتیبانی میکند (مانند Niagara-7 و جدیدتر)، مقدار پیشفرض -msubxc است.
- -mfix-at697f
- راهکار مستندشده برای رفع تکنقص سختافزاری (erratum) پردازندهٔ Atmel AT697F (که متناظر با نقص شمارهٔ ۱۳ پردازندهٔ AT697E است) را فعال میکند.
- -mfix-ut699
- راهکارهای مستندشده برای رفع نقایص سختافزاری ممیز شناور و نقایص باطلسازی حافظهٔ نهان داده (data cache nullify) در پردازندهٔ UT699 را فعال میکند.
- -mfix-ut700
- راهکار مستندشده برای رفع نقایص سختافزاری ذخیرهسازی متوالی (back-to-back store) در پردازندهٔ UT699E/UT700 را فعال میکند.
- -mfix-gr712rc
- راهکار مستندشده برای رفع نقایص سختافزاری ذخیرهسازی متوالی (back-to-back store) در پردازندهٔ GR712RC را فعال میکند.
علاوه بر موارد بالا، گزینههای -m زیر نیز در پردازندههای SPARC-V9 در محیطهای ۶۴ بیتی پشتیبانی میشوند:
- -m32
- -m64
- تولید کد برای یک محیط ۳۲ بیتی یا ۶۴ بیتی. محیط ۳۲ بیتی اندازههای int، long و اشارهگر را روی ۳۲ بیت تنظیم میکند. محیط ۶۴ بیتی اندازهٔ int را ۳۲ بیت و اندازههای long و اشارهگر را روی ۶۴ بیت تنظیم مینماید.
- -mcmodel=which
- مدل کد را روی یکی از موارد زیر تنظیم میکند:
- medlow
- مدل کد Medium/Low: آدرسهای ۶۴ بیتی، برنامهها باید در ۳۲ بیت پایینی حافظه پیوند (link) داده شوند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند شوند..IP medmid 4 مدل کد Medium/Middle: آدرسهای ۶۴ بیتی، برنامهها باید در ۴۴ بیت پایینی حافظه پیوند یابند، اندازه قطعههای text و data باید کمتر از ۲ گیگابایت باشد و قطعه data باید در فاصله حداکثر ۲ گیگابایتی از قطعه text قرار گیرد.
- medany
- مدل کد Medium/Anywhere: آدرسهای ۶۴ بیتی، برنامهها میتوانند در هر کجای حافظه پیوند یابند، اندازه قطعههای text و data باید کمتر از ۲ گیگابایت باشد و قطعه data باید در فاصله حداکثر ۲ گیگابایتی از قطعه text قرار گیرد.
- embmedany
- مدل کد Medium/Anywhere برای سامانههای تعبیهشده: آدرسهای ۶۴ بیتی، اندازه قطعههای text و data باید کمتر از ۲ گیگابایت باشد و هر دو میتوانند از هر کجای حافظه آغاز شوند (تعیینشده در زمان پیوند). ثبات سراسری %g4 به ابتدای قطعه data اشاره میکند. برنامهها بهصورت ایستا پیوند داده میشوند و PIC پشتیبانی نمیشود.
- -mmemory-model=mem-model
- مدل حافظه فعال روی پردازنده را روی یکی از موارد زیر تنظیم میکند:
این مدلهای حافظه بهطور رسمی در پیوست D راهنمای معماری SPARC-V9، همانطور که در فیلد "PSTATE.MM" پردازنده مقداردهی میشود، تعریف شدهاند.
- -mstack-bias
- -mno-stack-bias
- با فعال بودن -mstack-bias، کامپایلر GCC فرض میکند که اشارهگر پشته (stack pointer)، و اشارهگر فریم در صورت وجود، دارای آفست -2047 هستند که هنگام ارجاع به فریم پشته باید مجدداً اضافه شود. این حالت در حالت ۶۴ بیتی پیشفرض است. در غیر این صورت، فرض میشود که چنین آفستی وجود ندارد.
گزینههای System V
این گزینههای اضافی در System V Release 4 برای سازگاری با سایر کامپایلرها در آن سیستمها در دسترس هستند:
- -G
- ایجاد یک شیء اشتراکی (shared object). توصیه میشود در عوض از -symbolic یا -shared استفاده شود.
- -Qy
- نسخههای هر ابزار استفادهشده توسط کامپایلر را در یک دستورالعمل اسمبلی ".ident" در خروجی مشخص میکند.
- -Qn
- از افزودن دستورالعملهای ".ident" به فایل خروجی خودداری میکند (این حالت پیشفرض است).
- -YP,dirs
- برای کتابخانههای مشخصشده با -l، تنها دایرکتوریهای dirs را جستجو میکند و دایرکتوریهای دیگر را نادیده میگیرد.
- -Ym,dir
- برای یافتن پیشپردازنده M4 در دایرکتوری dir جستجو میکند. اسمبلر از این گزینه استفاده میکند.
گزینههای V850
این گزینههای -m برای پیادهسازیهای V850 تعریف شدهاند:
- -mlong-calls
- -mno-long-calls
- تمام فراخوانیها را به عنوان دوردست (نزدیک) در نظر میگیرد. اگر فرض شود فراخوانیها دوردست هستند، کامپایلر همیشه آدرس تابع را در یک ثبات بارگذاری کرده و بهصورت غیرمستقیم از طریق اشارهگر فراخوانی میکند.
- -mno-ep
- -mep
- بلوکهای پایهای را که از یک اشارهگر شاخص یکسان ۴ بار یا بیشتر استفاده میکنند بهینهسازی نمیکند (میکند) تا اشارهگر در ثبات "ep" کپی شده و از دستورالعملهای کوتاهتر "sld" و "sst" استفاده شود. گزینه -mep در صورت بهینهسازی بهطور پیشفرض فعال است.
- -mno-prolog-function
- -mprolog-function
- از توابع خارجی برای ذخیره و بازیابی ثباتها در مقدمه (prologue) و مؤخره (epilogue) تابع استفاده نمیکند (استفاده میکند). توابع خارجی کندتر هستند، اما اگر بیش از یک تابع تعداد یکسانی از ثباتها را ذخیره کنند، فضای کد کمتری مصرف میکنند. گزینه -mprolog-function در صورت بهینهسازی بهطور پیشفرض فعال است.
- -mspace
- تلاش میکند تا حجم کد تا حد امکان کوچک شود. در حال حاضر، این گزینه صرفاً گزینههای -mep و -mprolog-function را فعال میکند.
- -mtda=n
- متغیرهای ایستا یا سراسری را که اندازه آنها n بایت یا کمتر است در ناحیه داده بسیار کوچک (tiny data area) که ثبات "ep" به آن اشاره میکند، قرار میدهد. ناحیه داده بسیار کوچک در مجموع میتواند تا ۲۵۶ بایت را در خود جای دهد (۱۲۸ بایت برای ارجاعات بایتی).
- -msda=n
- متغیرهای ایستا یا سراسری را که اندازه آنها n بایت یا کمتر است در ناحیه داده کوچک (small data area) که ثبات "gp" به آن اشاره میکند، قرار میدهد. ناحیه داده کوچک میتواند تا ۶۴ کیلوبایت را در خود جای دهد.
- -mzda=n
- متغیرهای ایستا یا سراسری را که اندازه آنها n بایت یا کمتر است در ۳۲ کیلوبایت اول حافظه قرار میدهد.
- -mv850
- مشخص میکند که پردازنده هدف V850 است.
- -mv850e3v5
- مشخص میکند که پردازنده هدف V850E3V5 است. در صورت استفاده از این گزینه، ثابت پیشپردازنده "__v850e3v5__" تعریف میشود.
- -mv850e2v4
- مشخص میکند که پردازنده هدف V850E3V5 است. این یک نام مستعار برای گزینه -mv850e3v5 است.
- -mv850e2v3
- مشخص میکند که پردازنده هدف V850E2V3 است. در صورت استفاده از این گزینه، ثابت پیشپردازنده "__v850e2v3__" تعریف میشود.
- -mv850e2
- مشخص میکند که پردازنده هدف V850E2 است. در صورت استفاده از این گزینه، ثابت پیشپردازنده "__v850e2__" تعریف میشود.
- -mv850e1
- مشخص میکند که پردازنده هدف V850E1 است. در صورت استفاده از این گزینه، ثابتهای پیشپردازنده "__v850e1__" و "__v850e__" تعریف میشوند.
- -mv850es
- مشخص میکند که پردازنده هدف V850ES است. این یک نام مستعار برای گزینه -mv850e1 است.
- -mv850e
- مشخص
میکند که
پردازنده
هدف V850E است. در
صورت
استفاده از
این گزینه،
ثابت
پیشپردازنده
"__v850e__"
تعریف
میشود.
اگر هیچیک از گزینههای -mv850، -mv850e، -mv850e1، -mv850e2، -mv850e2v3 و -mv850e3v5 مشخص نشده باشند، یک پردازنده هدف پیشفرض انتخاب شده و ثابت پیشپردازنده مربوطه __v850*__ تعریف میشود.
ثابتهای پیشپردازنده "__v850" و "__v851__" فارغ از اینکه کدام گونه پردازنده هدف باشد، همیشه تعریف میشوند.
- -mdisable-callt
- -mno-disable-callt
- این گزینه
از تولید
دستورالعمل
"CALLT" برای
گونههای
v850e، v850e1، v850e2، v850e2v3 و v850e3v5
از معماری v850
جلوگیری
میکند.
این گزینه هنگام استفاده از ABI مربوط به RH850 بهطور پیشفرض فعال است (نگاه کنید به -mrh850-abi)، و هنگام استفاده از ABI مربوط به GCC بهطور پیشفرض غیرفعال است. اگر دستورالعملهای "CALLT" تولید شوند، نماد پیشپردازندهٔ سی "__V850_CALLT__" تعریف میشود.
- -mrelax
- -mno-relax
- گزینهٔ خط فرمان -mrelax را به اسمبلر منتقل میکند (یا منتقل نمیکند).
- -mlong-jumps
- -mno-long-jumps
- تولید دستورالعملهای پرش وابسته به PC را غیرفعال (یا دوباره فعال) میکند.
- -msoft-float
- -mhard-float
- تولید دستورالعملهای ممیز شناور سختافزاری را غیرفعال (یا دوباره فعال) میکند. این گزینه تنها زمانی اهمیت دارد که معماری مقصد V850E2V3 یا بالاتر باشد. اگر دستورالعملهای ممیز شناور سختافزاری تولید شوند، نماد پیشپردازندهٔ سی "__FPU_OK__" تعریف میشود؛ در غیر این صورت نماد "__NO_FPU__" تعریف خواهد شد.
- -mloop
- استفاده از دستورالعمل LOOP در e3v5 را فعال میکند. هنگام انتخاب معماری e3v5 استفاده از این دستورالعمل بهطور پیشفرض فعال نیست، زیرا بهکارگیری آن هنوز آزمایشی است.
- -mrh850-abi
- -mghs
- پشتیبانی از نسخهٔ RH850 رابط باینری برنامه (ABI) مربوط به V850 را فعال میکند. این حالت پیشفرض است. با این نسخه از ABI، قواعد زیر اعمال میشوند:
- ساختارها و اجتماعهای هماندازه با عدد صحیح، بهجای ثبات، از طریق یک اشارهگر حافظه بازگردانده میشوند.
- ساختارها و اجتماعهای بزرگ (با اندازهٔ بیشتر از ۸ بایت) از طریق مقدار (by value) ارسال میشوند.
- توابع روی مرزهای ۱۶-بیتی همتراز میشوند.
- گزینهٔ خط فرمان -m8byte-align پشتیبانی میشود.
- گزینهٔ خط فرمان -mdisable-callt بهطور پیشفرض فعال است. گزینهٔ خط فرمان -mno-disable-callt پشتیبانی نمیشود.
هنگامی که این نسخه از ABI فعال باشد، نماد پیشپردازندهٔ سی "__V850_RH850_ABI__" تعریف میشود.
- -mgcc-abi
- پشتیبانی از نسخهٔ قدیمی GCC رابط باینری برنامه (ABI) مربوط به V850 را فعال میکند. با این نسخه از ABI، قواعد زیر اعمال میشوند:
- ساختارها و اجتماعهای هماندازه با عدد صحیح در ثبات "r10" بازگردانده میشوند.
- ساختارها و اجتماعهای بزرگ (با اندازهٔ بیشتر از ۸ بایت) از طریق ارجاع (by reference) ارسال میشوند.
- توابع روی مرزهای ۳۲-بیتی همتراز میشوند، مگر آنکه بهینهسازی برای اندازه انجام شود.
- گزینهٔ خط فرمان -m8byte-align پشتیبانی نمیشود.
- گزینهٔ خط فرمان -mdisable-callt پشتیبانی میشود اما بهطور پیشفرض فعال نیست.
هنگامی که این نسخه از ABI فعال باشد، نماد پیشپردازندهٔ سی "__V850_GCC_ABI__" تعریف میشود.
- -m8byte-align
- -mno-8byte-align
- پشتیبانی از همترازی انواع "double" و "long long" روی مرزهای ۸-بایتی را فعال میکند. حالت پیشفرض، محدود کردن همترازی تمام اشیاء به حداکثر ۴-بایت است. هنگامی که -m8byte-align در حال اجرا باشد، نماد پیشپردازندهٔ سی "__V850_8BYTE_ALIGN__" تعریف میشود.
- -mbig-switch
- کد مناسب برای جدولهای سوئیچ بزرگ تولید میکند. تنها زمانی از این گزینه استفاده کنید که اسمبلر یا پیونددهنده در مورد انشعابهای خارج از محدوده در یک جدول switch خطا دهد.
- -mapp-regs
- این گزینه باعث میشود که r2 و r5 در کدهای تولیدشده توسط کامپایلر استفاده شوند. این تنظیم حالت پیشفرض است.
- -mno-app-regs
- این گزینه باعث میشود که با r2 و r5 به عنوان ثباتهای ثابت رفتار شود.
گزینههای VAX
این گزینههای -m برای VAX تعریف شدهاند:
- -munix
- از درج برخی دستورالعملهای پرش خاص (مانند "aobleq" و غیره) که اسمبلر Unix برای VAX نمیتواند آنها را در دامنههای طولانی مدیریت کند، خودداری میکند.
- -mgnu
- با فرض اینکه از اسمبلر GNU استفاده میشود، آن دستورالعملهای پرش را تولید میکند.
- -md
- -md-float
- بهجای G_floating، از قالب دادهای D_floating برای اعداد ممیز شناور با دقت مضاعف استفاده میکند.
- -mg
- -mg-float
- بهجای D_floating، از قالب دادهای G_floating برای اعداد ممیز شناور با دقت مضاعف استفاده میکند.
- -mlra
- -mno-lra
- تخصیص محلی ثباتها (Local Register Allocation) را فعال میکند. این قابلیت برای VAX هنوز در مرحلهٔ آزمایشی است، بنابراین کامپایلر بهطور پیشفرض از reload استاندارد استفاده میکند.
گزینههای Visium
- -mdebug
- برنامهای که ورودی/خروجی فایل انجام میدهد و قرار است روی یک مقصد MCM اجرا شود، باید با این گزینه پیوند داده شود. این کار باعث میشود کتابخانههای libc.a و libdebug.a پیوند یابند. برنامه باید روی مقصد و تحت کنترل استاب اشکالزدایی از راه دور GDB اجرا شود.
- -msim
- برنامهای که ورودی/خروجی فایل انجام میدهد و قرار است روی شبیهساز اجرا شود، باید با این گزینه پیوند داده شود. این کار باعث پیوند خوردن کتابخانههای libc.a و libsim.a میشود.
- -mfpu
- -mhard-float
- کدهایی حاوی دستورالعملهای ممیز شناور تولید میکند. این حالت پیشفرض است.
- -mno-fpu
- تولید کد
حاوی
فراخوانیهای
کتابخانهای
برای ممیز
شناور (floating-point).
گزینهٔ -msoft-float شیوهٔ فراخوانی (calling convention) را در فایل خروجی تغییر میدهد؛ بنابراین تنها زمانی کاربرد دارد که تمام برنامه را با این گزینه کامپایل کنید. بهویژه، برای اینکه این قابلیت به درستی کار کند، لازم است کتابخانهٔ libgcc.a (کتابخانهای که همراه GCC ارائه میشود) را با -msoft-float کامپایل کنید.
- -mcpu=cpu_type
- مجموعه
دستورالعملها،
مجموعه
ثباتها و
پارامترهای
زمانبندی
دستورالعمل
را برای نوع
ماشین cpu_type
تنظیم
میکند.
مقادیر
پشتیبانیشده
برای cpu_type
عبارتند از
mcm، gr5 و gr6.
مقدار mcm هممعنی gr5 است که به منظور سازگاری رو به عقب در نظر گرفته شده است.
بهطور پیشفرض (مگر اینکه به گونهای دیگر پیکربندی شده باشد)، GCC کدی برای گونهٔ GR5 از معماری Visium تولید میکند.
با گزینهٔ -mcpu=gr6، کامپایلر GCC برای گونهٔ GR6 از معماری Visium کد تولید میکند. تنها تفاوت با کد GR5 در این است که کامپایلر دستورالعملهای انتقال بلوکی (block move) را نیز تولید خواهد کرد.
- -mtune=cpu_type
- پارامترهای زمانبندی دستورالعمل را برای نوع ماشین cpu_type تنظیم میکند، اما بر خلاف گزینهٔ -mcpu=cpu_type، مجموعه دستورالعمل یا مجموعه ثباتها را تغییر نمیدهد.
- -msv-mode
- تولید کد برای حالت ناظر (supervisor mode)، جایی که هیچ محدودیتی در دسترسی به ثباتهای عمومی وجود ندارد. این حالت پیشفرض است.
- -muser-mode
- تولید کد برای حالت کاربر (user mode)، جایی که دسترسی به برخی از ثباتهای عمومی ممنوع است: روی GR5، ثباتهای r24 تا r31 در این حالت قابل دسترسی نیستند؛ روی GR6، تنها ثباتهای r29 تا r31 متأثر میشوند.
گزینههای VMS
این گزینههای -m برای پیادهسازیهای VMS تعریف شدهاند:
- -mvms-return-codes
- بازگرداندن کدهای وضعیت VMS از تابع "main". پیشفرض، بازگرداندن کدهای وضعیت (مانند خطا) به سبک POSIX است.
- -mdebug-main=prefix
- اولین روالی را که نام آن با prefix آغاز میشود، به عنوان روال اصلی برای اشکالزدا (debugger) نشانهگذاری میکند.
- -mmalloc64
- استفاده از روالهای تخصیص حافظهٔ ۶۴ بیتی به عنوان پیشفرض.
- -mpointer-size=size
- تنظیم اندازهٔ پیشفرض اشارهگرها. مقادیر ممکن برای size عبارتند از 32 یا short برای اشارهگرهای ۳۲ بیتی، 64 یا long برای اشارهگرهای ۶۴ بیتی، و no برای پشتیبانی انحصاری از اشارهگرهای ۳۲ بیتی. گزینهٔ آخر دستور "pragma pointer_size" را غیرفعال میکند.
گزینههای VxWorks
گزینههای این بخش برای تمامی مقصدهای VxWorks تعریف شدهاند. گزینههای خاص سختافزار مقصد، به همراه دیگر گزینههای مربوط به آن مقصد فهرست شدهاند.
- -mrtp
- کامپایلر GCC میتواند برای هر دو هستهٔ VxWorks و فرآیندهای بیدرنگ (RTPها) کد تولید کند. این گزینه حالت را از مورد نخست به دومی تغییر میدهد. همچنین ماکروی پیشپردازندهٔ "__RTP__" را تعریف میکند.
- -msmp
- انتخاب زمانهای اجرای (runtimes) چندپردازشی متقارن (SMP) برای پیوند دادن. روی معماریهایی غیر از PowerPC و همچنین در VxWorks نسخهٔ ۷ به بعد موجود نیست؛ در این موارد، این انتخاب بخشی از پیکربندی ساخت VxWorks بوده و مسیرهای کتابخانهای برای هر دو گزینه یکسان هستند.
- -non-static
- پیوند دادن یک فایل اجرایی RTP با کتابخانههای مشترک (shared) به جای کتابخانههای ایستا (static). گزینههای -static و -shared را نیز میتوان برای RTPها به کار برد؛ گزینهٔ -static پیشفرض است.
- -Bstatic
- -Bdynamic
- این گزینهها به پیونددهنده (linker) ارسال میشوند و برای سازگاری با Diab تعریف شدهاند.
- -Xbind-lazy
- فعالسازی مقیدسازی تنبل (lazy binding) فراخوانی توابع. این گزینه معادل -Wl,-z,now است و برای سازگاری با Diab تعریف شده است.
- -Xbind-now
- غیرفعالسازی مقیدسازی تنبل فراخوانی توابع. این گزینه پیشفرض است و برای سازگاری با Diab تعریف شده است.
گزینههای x86
این گزینههای -m برای خانوادهٔ رایانههای x86 تعریف شدهاند.
- -march=cpu-type
- تولید
دستورالعملها
برای نوع
ماشین cpu-type. بر
خلاف -mtune=cpu-type
که صرفاً کد
تولیدشده
را برای cpu-type
مشخصشده
بهینهسازی
(tune) میکند،
گزینهٔ
-march=cpu-type به GCC
امکان
میدهد کدی
تولید کند
که ممکن است
روی
پردازندههایی
غیر از نوع
مشخصشده
اصلاً اجرا
نشود. مشخص
کردن -march=cpu-type
به معنای
اعمال -mtune=cpu-type
نیز هست،
مگر مواردی
که خلاف آن
تصریح شده
باشد.
انتخابهای موجود برای cpu-type عبارتند از:
- native
- این گزینه با تشخیص نوع پردازندهٔ ماشین کامپایلکننده در هنگام کامپایل، پردازندهٔ مقصد برای تولید کد را انتخاب میکند. استفاده از -march=native تمام زیرمجموعههای دستورالعملی را که توسط ماشین محلی پشتیبانی میشوند فعال میکند (از این رو ممکن است خروجی روی ماشینهای دیگر اجرا نشود). استفاده از -mtune=native کدی بهینهشده برای ماشین محلی در چارچوب محدودیتهای مجموعه دستورالعمل انتخابشده تولید میکند.
- x86-64
- یک پردازندهٔ عمومی با افزونههای ۶۴ بیتی و پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2 و FXSR.
- x86-64-v2
- x86-64-v3
- x86-64-v4
- این
گزینهها
برای cpu-type،
سطح
ریزمعماری
متناظر را
از psABI مربوط
به x86-64
برمیگزینند.
در ABIهایی
غیر از psABI
برای x86-64، این
گزینهها
همان
ویژگیهای
پردازندهای
را انتخاب
میکنند که
اسناد psABI
مربوط به x86-64
برای آن سطح
ریزمعماری
خاص مشخص
کردهاند.
از آنجا که این مقادیر cpu-type تنظیم متناظری در -mtune ندارند، استفاده از -march با این مقادیر، بهینهسازی عمومی (generic tuning) را فعال میکند. بهینهسازی خاص را میتوان با استفاده از گزینهٔ -mtune=other-cpu-type به همراه مقدار مناسب other-cpu-type فعال کرد.
- i386
- پردازندهٔ اصلی Intel i386.
- i486
- پردازندهٔ Intel i486. (هیچ زمانبندی دستورالعملی برای این تراشه پیادهسازی نشده است.)
- i586
- pentium
- پردازندهٔ Intel Pentium بدون پشتیبانی از MMX.
- lakemont
- میکروکنترلر Intel Lakemont، مبتنی بر پردازندهٔ Intel Pentium.
- pentium-mmx
- پردازندهٔ Intel Pentium MMX، مبتنی بر هستهٔ Pentium به همراه پشتیبانی از مجموعه دستورالعمل MMX.
- pentiumpro
- پردازندهٔ Intel Pentium Pro بدون پشتیبانی از MMX.
- i686
- هنگامی که همراه با -march به کار رود، مجموعه دستورالعمل Pentium Pro استفاده میشود، در نتیجه کد روی تمامی تراشههای خانوادهٔ i686 اجرا خواهد شد. هنگامی که با -mtune استفاده شود، مفهومی مشابه با generic دارد.
- pentium2
- پردازندهٔ Intel Pentium II، مبتنی بر هستهٔ Pentium Pro با پشتیبانی از مجموعه دستورالعملهای MMX و FXSR.
- pentium3
- پردازنده Intel Pentium III، مبتنی بر هسته Pentium Pro با پشتیبانی از مجموعهدستورالعملهای MMX، FXSR و SSE.
- pentium-m
- پردازنده Intel Pentium M؛ نسخه کممصرف پردازنده Intel Pentium III با پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2 و FXSR. مورد استفاده در نوتبوکهای Centrino.
- pentium4
- pentium4m
- پردازنده Intel Pentium 4 با پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2 و FXSR.
- prescott
- نسخه بهبودیافته پردازنده Intel Pentium 4 با پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3 و FXSR.
- nocona
- نسخه بهبودیافته پردازنده Intel Pentium 4 با افزونههای 64 بیتی و پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3 و FXSR.
- core2
- پردازنده Intel Core 2 با افزونههای 64 بیتی و پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، CX16، SAHF و FXSR.
- nehalem
- corei7
- پردازنده Intel Nehalem با افزونههای 64 بیتی و پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF و FXSR.
- westmere
- پردازنده Intel Westmere با افزونههای 64 بیتی و پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR و PCLMUL.
- sandybridge
- corei7-avx
- پردازنده Intel Sandy Bridge با افزونههای 64 بیتی و پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE و PCLMUL.
- ivybridge
- core-avx-i
- پردازنده Intel Ivy Bridge با افزونههای 64 بیتی و پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND و F16C.
- haswell
- core-avx2
- پردازنده Intel Haswell با افزونههای 64 بیتی و پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE و HLE.
- broadwell
- پردازنده Intel Broadwell با افزونههای 64 بیتی و پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX و PREFETCHW.
- skylake
- پردازنده Intel Skylake با افزونههای 64 بیتی و پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES و SGX.
- skylake-avx512
- پردازنده سرور Intel Skylake با افزونههای 64 بیتی و پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، CLWB، AVX512VL، AVX512BW، AVX512DQ و AVX512CD.
- cascadelake
- پردازنده Intel Cascade Lake با افزونههای 64 بیتی و پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، CLWB، AVX512VL، AVX512BW، AVX512DQ، AVX512CD و AVX512VNNI.
- cannonlake
- پردازنده سرور Intel Cannon Lake با افزونههای 64 بیتی و پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA و SHA.
- cooperlake
- پردازنده Intel Cooper Lake با افزونههای 64 بیتی و پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، CLWB، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، AVX512VNNI و AVX512BF16.
- icelake-client
- پردازنده کلاینت Intel Ice Lake با افزونههای 64 بیتی و پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID و AVX512VPOPCNTDQ.
- icelake-server
- پردازنده سرور Intel Ice Lake با افزونههای 64 بیتی و پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، PCONFIG، WBNOINVD و CLWB.
- tigerlake
- پردازنده Intel Tiger Lake با افزونههای 64 بیتی و پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، MOVDIRI، MOVDIR64B، CLWB، AVX512VP2INTERSECT و KEYLOCKER.
- rocketlake
- پردازنده Intel Rocket Lake با افزونههای 64 بیتی و پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID و AVX512VPOPCNTDQ.
- alderlake
- raptorlake
- meteorlake
- gracemont
- پردازندههای Intel Alder Lake/Raptor Lake/Meteor Lake/Gracemont با افزونههای 64 بیتی و پشتیبانی از مجموعهدستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL و AVX-VNNI.
- arrowlake
- پردازنده Intel Arrow Lake با افزونههای 64 بیتی و پشتیبانی از مجموعهدستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL، AVX-VNNI، UINTR، AVXIFMA، AVXVNNIINT8، AVXNECONVERT و CMPCCXADD.
- arrowlake-s
- lunarlake
- پردازندههای Intel Arrow Lake S/Lunar Lake با افزونههای 64 بیتی و پشتیبانی از مجموعهدستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL، AVX-VNNI، UINTR، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، AVXVNNIINT16، SHA512، SM3 و SM4..IP pantherlake 4 پردازنده Intel Panther Lake با افزونههای 64-bit و پشتیبانی از مجموعهدستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، AVX-VNNI، UINTR، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، AVXVNNIINT16، SHA512، SM3، SM4 و PREFETCHI.
- sapphirerapids
- emeraldrapids
- پردازنده Intel Sapphire Rapids/Emerald Rapids با افزونههای 64-bit و پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، PCONFIG، WBNOINVD، CLWB، MOVDIRI، MOVDIR64B، ENQCMD، CLDEMOTE، PTWRITE، WAITPKG، SERIALIZE، TSXLDTRK، UINTR، AMX-BF16، AMX-TILE، AMX-INT8، AVX-VNNI، AVX512-FP16 و AVX512BF16.
- graniterapids
- پردازنده Intel Granite Rapids با افزونههای 64-bit و پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، PCONFIG، WBNOINVD، CLWB، MOVDIRI، MOVDIR64B، ENQCMD، CLDEMOTE، PTWRITE، WAITPKG، SERIALIZE، TSXLDTRK، UINTR، AMX-BF16، AMX-TILE، AMX-INT8، AVX-VNNI، AVX512-FP16، AVX512BF16، AMX-FP16 و PREFETCHI.
- graniterapids-d
- پردازنده Intel Granite Rapids D با افزونههای 64-bit و پشتیبانی از مجموعهدستورالعملهای MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، PCONFIG، WBNOINVD، CLWB، MOVDIRI، MOVDIR64B، ENQCMD، CLDEMOTE، PTWRITE، WAITPKG، SERIALIZE، TSXLDTRK، UINTR، AMX-BF16، AMX-TILE، AMX-INT8، AVX-VNNI، AVX512FP16، AVX512BF16، AMX-FP16، PREFETCHI و AMX-COMPLEX.
- diamondrapids
- پردازنده Intel Diamond Rapids با افزونههای 64-bit و پشتیبانی از مجموعهدستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، AVX، XSAVE، PCLMUL، FSGSBASE، RDRND، F16C، AVX2، BMI، BMI2، LZCNT، FMA، MOVBE، HLE، RDSEED، ADCX، PREFETCHW، AES، CLFLUSHOPT، XSAVEC، XSAVES، SGX، AVX512F، AVX512VL، AVX512BW، AVX512DQ، AVX512CD، PKU، AVX512VBMI، AVX512IFMA، SHA، AVX512VNNI، GFNI، VAES، AVX512VBMI2، VPCLMULQDQ، AVX512BITALG، RDPID، AVX512VPOPCNTDQ، PCONFIG، WBNOINVD، CLWB، MOVDIRI، MOVDIR64B، ENQCMD، CLDEMOTE، PTWRITE، WAITPKG، SERIALIZE، TSXLDTRK، UINTR، AMX-BF16، AMX-TILE، AMX-INT8، AVX-VNNI، AVX512FP16، AVX512BF16، AMX-FP16، PREFETCHI، AMX-COMPLEX، AVX10.1-512، AVX-IFMA، AVX-NE-CONVERT، AVX-VNNI-INT16، AVX-VNNI-INT8، CMPccXADD، SHA512، SM3، SM4، AVX10.2-512، APX_F، AMX-AVX512، AMX-FP8، AMX-TF32، AMX-TRANSPOSE، MOVRS، AMX-MOVRS و USER_MSR.
- bonnell
- atom
- پردازنده Intel Bonnell با افزونههای 64-bit و پشتیبانی از مجموعهدستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3 و SSSE3.
- silvermont
- slm
- پردازنده Intel Silvermont با افزونههای 64-bit و پشتیبانی از مجموعهدستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، PCLMUL، PREFETCHW و RDRND.
- goldmont
- پردازنده Intel Goldmont با افزونههای 64-bit و پشتیبانی از مجموعهدستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، PCLMUL، PREFETCHW، RDRND، AES، SHA، RDSEED، XSAVE، XSAVEC، XSAVES، XSAVEOPT، CLFLUSHOPT و FSGSBASE.
- goldmont-plus
- پردازنده Intel Goldmont Plus با افزونههای 64-bit و پشتیبانی از مجموعهدستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، PCLMUL، PREFETCHW، RDRND، AES، SHA، RDSEED، XSAVE، XSAVEC، XSAVES، XSAVEOPT، CLFLUSHOPT، FSGSBASE، PTWRITE، RDPID و SGX.
- tremont
- پردازنده Intel Tremont با افزونههای 64-bit و پشتیبانی از مجموعهدستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، CX16، SAHF، FXSR، PCLMUL، PREFETCHW، RDRND، AES، SHA، RDSEED، XSAVE، XSAVEC، XSAVES، XSAVEOPT، CLFLUSHOPT، FSGSBASE، PTWRITE، RDPID، SGX، CLWB، GFNI-SSE، MOVDIRI، MOVDIR64B، CLDEMOTE و WAITPKG.
- sierraforest
- پردازنده Intel Sierra Forest با افزونههای 64-bit و پشتیبانی از مجموعهدستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، CLDEMOTE، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL، AVX-VNNI، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، ENQCMD و UINTR.
- grandridge
- پردازنده Intel Grand Ridge با افزونههای 64-bit و پشتیبانی از مجموعهدستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، CLDEMOTE، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، KL، WIDEKL، AVX-VNNI، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، ENQCMD و UINTR.
- clearwaterforest
- پردازنده Intel Clearwater Forest با افزونههای 64-bit و پشتیبانی از مجموعهدستورالعملهای MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PREFETCHW، PCLMUL، RDRND، XSAVE، XSAVEC، XSAVES، XSAVEOPT، FSGSBASE، PTWRITE، RDPID، SGX، GFNI-SSE، CLWB، MOVDIRI، MOVDIR64B، CLDEMOTE، WAITPKG، ADCX، AVX، AVX2، BMI، BMI2، F16C، FMA، LZCNT، PCONFIG، PKU، VAES، VPCLMULQDQ، SERIALIZE، HRESET، AVX-VNNI، ENQCMD، UINTR، AVXIFMA، AVXVNNIINT8، AVXNECONVERT، CMPCCXADD، AVXVNNIINT16، SHA512، SM3، SM4، USER_MSR و PREFETCHI.
- k6
- پردازنده AMD K6 با پشتیبانی از مجموعهدستورالعمل MMX.
- k6-2
- k6-3
- نسخههای بهبودیافته پردازنده AMD K6 با پشتیبانی از مجموعهدستورالعملهای MMX و 3DNow!.
- athlon
- athlon-tbird
- پردازنده AMD Athlon با پشتیبانی از مجموعهدستورالعملهای MMX، 3dNOW!، enhanced 3DNow! و دستورالعملهای پیشواکشی SSE.
- athlon-4
- athlon-xp
- athlon-mp
- پردازنده بهبودیافته AMD Athlon با پشتیبانی از مجموعهدستورالعملهای MMX، 3DNow!، enhanced 3DNow! و پشتیبانی کامل از مجموعهدستورالعمل SSE.
- k8
- opteron
- athlon64
- athlon-fx
- پردازندههای مبتنی بر هسته AMD K8 با پشتیبانی از مجموعهدستورالعمل x86-64، شامل پردازندههای AMD Opteron، Athlon 64 و Athlon 64 FX. (این مورد ابرمجموعهای از MMX، SSE، SSE2، 3DNow!، enhanced 3DNow! و افزونههای مجموعهدستورالعمل 64-bit است.)
- k8-sse3
- opteron-sse3
- athlon64-sse3
- نسخههای بهبودیافته هستههای AMD K8 با پشتیبانی از مجموعهدستورالعمل SSE3.
- amdfam10
- barcelona
- پردازندههای مبتنی بر هستههای AMD Family 10h با پشتیبانی از مجموعهدستورالعمل x86-64. (این مورد ابرمجموعهای از MMX، SSE، SSE2، SSE3، SSE4A، 3DNow!، enhanced 3DNow!، ABM و افزونههای مجموعهدستورالعمل 64-bit است.).IP bdver1 4 پردازندههای مبتنی بر هستههای AMD Family 15h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه ابرمجموعهای از FMA4، AVX، XOP، LWP، AES، PCLMUL، CX16، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM و افزونههای مجموعه دستورالعملهای 64-bit است.)
- bdver2
- پردازندههای مبتنی بر هستهٔ AMD Family 15h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه ابرمجموعهای از BMI، TBM، F16C، FMA، FMA4، AVX، XOP، LWP، AES، PCLMUL، CX16، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM و افزونههای مجموعه دستورالعملهای 64-bit است.)
- bdver3
- پردازندههای مبتنی بر هستهٔ AMD Family 15h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه ابرمجموعهای از BMI، TBM، F16C، FMA، FMA4، FSGSBASE، AVX، XOP، LWP، AES، PCLMUL، CX16، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM و افزونههای مجموعه دستورالعملهای 64-bit است.)
- bdver4
- پردازندههای مبتنی بر هستهٔ AMD Family 15h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه ابرمجموعهای از BMI، BMI2، TBM، F16C، FMA، FMA4، FSGSBASE، AVX، AVX2، XOP، LWP، AES، PCLMUL، CX16، MOVBE، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM و افزونههای مجموعه دستورالعملهای 64-bit است.)
- znver1
- پردازندههای مبتنی بر هستهٔ AMD Family 17h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه ابرمجموعهای از BMI، BMI2، F16C، FMA، FSGSBASE، AVX، AVX2، ADCX، RDSEED، MWAITX، SHA، CLZERO، AES، PCLMUL، CX16، MOVBE، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM، XSAVEC، XSAVES، CLFLUSHOPT، POPCNT و افزونههای مجموعه دستورالعملهای 64-bit است.)
- znver2
- پردازندههای مبتنی بر هستهٔ AMD Family 17h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه ابرمجموعهای از BMI، BMI2، CLWB، F16C، FMA، FSGSBASE، AVX، AVX2، ADCX، RDSEED، MWAITX، SHA، CLZERO، AES، PCLMUL، CX16، MOVBE، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM، XSAVEC، XSAVES، CLFLUSHOPT، POPCNT، RDPID، WBNOINVD و افزونههای مجموعه دستورالعملهای 64-bit است.)
- znver3
- پردازندههای مبتنی بر هستهٔ AMD Family 19h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه ابرمجموعهای از BMI، BMI2، CLWB، F16C، FMA، FSGSBASE، AVX، AVX2، ADCX، RDSEED، MWAITX، SHA، CLZERO، AES، PCLMUL، CX16، MOVBE، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM، XSAVEC، XSAVES، CLFLUSHOPT، POPCNT، RDPID، WBNOINVD، PKU، VPCLMULQDQ، VAES و افزونههای مجموعه دستورالعملهای 64-bit است.)
- znver4
- پردازندههای مبتنی بر هستهٔ AMD Family 19h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه ابرمجموعهای از BMI، BMI2، CLWB، F16C، FMA، FSGSBASE، AVX، AVX2، ADCX، RDSEED، MWAITX، SHA، CLZERO، AES، PCLMUL، CX16، MOVBE، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM، XSAVEC، XSAVES، CLFLUSHOPT، POPCNT، RDPID، WBNOINVD، PKU، VPCLMULQDQ، VAES، AVX512F، AVX512DQ، AVX512IFMA، AVX512CD، AVX512BW، AVX512VL، AVX512BF16، AVX512VBMI، AVX512VBMI2، AVX512VNNI، AVX512BITALG، AVX512VPOPCNTDQ، GFNI و افزونههای مجموعه دستورالعملهای 64-bit است.)
- znver5
- پردازندههای مبتنی بر هستهٔ AMD Family 1ah با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه ابرمجموعهای از BMI، BMI2، CLWB، F16C، FMA، FSGSBASE، AVX، AVX2، ADCX، RDSEED، MWAITX، SHA، CLZERO، AES، PCLMUL، CX16، MOVBE، MMX، SSE، SSE2، SSE3، SSE4A، SSSE3، SSE4.1، SSE4.2، ABM، XSAVEC، XSAVES، CLFLUSHOPT، POPCNT، RDPID، WBNOINVD، PKU، VPCLMULQDQ، VAES، AVX512F، AVX512DQ، AVX512IFMA، AVX512CD، AVX512BW، AVX512VL، AVX512BF16، AVX512VBMI، AVX512VBMI2، AVX512VNNI، AVX512BITALG، AVX512VPOPCNTDQ، GFNI، AVXVNNI، MOVDIRI، MOVDIR64B، AVX512VP2INTERSECT، PREFETCHI و افزونههای مجموعه دستورالعملهای 64-bit است.)
- btver1
- پردازندههای مبتنی بر هستههای AMD Family 14h با پشتیبانی از مجموعه دستورالعملهای x86-64. (این گزینه ابرمجموعهای از MMX، SSE، SSE2، SSE3، SSSE3، SSE4A، CX16، ABM و افزونههای مجموعه دستورالعملهای 64-bit است.)
- btver2
- پردازندههای مبتنی بر هستههای AMD Family 16h با پشتیبانی از مجموعه دستورالعملهای x86-64. این شامل MOVBE، F16C، BMI، AVX، PCLMUL، AES، SSE4.2، SSE4.1، CX16، ABM، SSE4A، SSSE3، SSE3، SSE2، SSE، MMX و افزونههای مجموعه دستورالعملهای 64-bit میشود.
- winchip-c6
- پردازندهٔ IDT WinChip C6، که همانند i486 به همراه پشتیبانی بیشتر از مجموعه دستورالعملهای MMX با آن رفتار میشود.
- winchip2
- پردازندهٔ IDT WinChip 2، که همانند i486 به همراه پشتیبانی بیشتر از مجموعه دستورالعملهای MMX و 3DNow! با آن رفتار میشود.
- c3
- پردازندهٔ VIA C3 با پشتیبانی از مجموعه دستورالعملهای MMX و 3DNow!. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- c3-2
- پردازندهٔ VIA C3-2 (Nehemiah/C5XL) با پشتیبانی از مجموعه دستورالعملهای MMX و SSE. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- c7
- پردازندهٔ VIA C7 (Esther) با پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2 و SSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- samuel-2
- پردازندهٔ VIA Eden Samuel 2 با پشتیبانی از مجموعه دستورالعملهای MMX و 3DNow!. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nehemiah
- پردازندهٔ VIA Eden Nehemiah با پشتیبانی از مجموعه دستورالعملهای MMX و SSE. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- esther
- پردازندهٔ VIA Eden Esther با پشتیبانی از مجموعه دستورالعملهای MMX، SSE، SSE2 و SSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- eden-x2
- پردازندهٔ VIA Eden X2 با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2 و SSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- eden-x4
- پردازندهٔ VIA Eden X4 با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX و AVX2. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano
- پردازندهٔ عمومی VIA Nano با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3 و SSSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano-1000
- پردازندهٔ VIA Nano 1xxx با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3 و SSSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano-2000
- پردازندهٔ VIA Nano 2xxx با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3 و SSSE3. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano-3000
- پردازندهٔ VIA Nano 3xxx با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3، SSSE3 و SSE4.1. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano-x2
- پردازندهٔ VIA Nano Dual Core با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3، SSSE3 و SSE4.1. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- nano-x4
- پردازندهٔ VIA Nano Quad Core با پشتیبانی از مجموعه دستورالعملهای x86-64، MMX، SSE، SSE2، SSE3، SSSE3 و SSE4.1. (هیچ زمانبندیای برای این تراشه پیادهسازی نشده است.)
- lujiazui
- پردازندهٔ ZHAOXIN lujiazui با پشتیبانی از مجموعه دستورالعملهای x86-64، MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، POPCNT، AES، PCLMUL، RDRND، XSAVE، XSAVEOPT، FSGSBASE، CX16، ABM، BMI، BMI2، FXSR، RDSEED. اگرچه این پردازندهها از AVX و F16C پشتیبانی میکنند، اما به دلایل کارایی توسط "-march=lujiazui" فعال نشدهاند.
- yongfeng
- پردازندهٔ ZHAOXIN yongfeng با پشتیبانی از مجموعه دستورالعملهای x86-64، MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، POPCNT، AES، PCLMUL، RDRND، XSAVE، XSAVEOPT، FSGSBASE، CX16، ABM، BMI، BMI2، F16C، FXSR، RDSEED، AVX2، FMA، SHA، LZCNT.
- shijidadao
- پردازندهٔ ZHAOXIN shijidadao با پشتیبانی از مجموعه دستورالعملهای x86-64، MOVBE، MMX، SSE، SSE2، SSE3، SSSE3، SSE4.1، SSE4.2، AVX، POPCNT، AES، PCLMUL، RDRND، XSAVE، XSAVEOPT، FSGSBASE، CX16، ABM، BMI، BMI2، F16C، FXSR، RDSEED، AVX2، FMA، SHA، LZCNT.
- geode
- پردازندهٔ توکار AMD Geode با پشتیبانی از مجموعه دستورالعملهای MMX و 3DNow!.
- -mtune=cpu-type
- همهٔ موارد
قابلاعمال
در کد
تولیدشده،
بهجز ABI و
مجموعهٔ
دستورالعملهای
دردسترس را
برای cpu-type
بهینهسازی
میکند. در
حالی که
انتخاب یک
cpu-type خاص
زمانبندی
را متناسب
با آن
تراشهٔ
ویژه تنظیم
میکند،
کامپایلر
هیچ کدی
تولید
نمیکند که
نتواند روی
نوع ماشین
پیشفرض
اجرا شود،
مگر اینکه
از گزینهٔ
-march=cpu-type
استفاده
کنید. برای
مثال، اگر GCC
برای i686-pc-linux-gnu
پیکربندی
شده باشد،
گزینهٔ -mtune=pentium4
کدی تولید
میکند که
برای Pentium 4
بهینهسازی
شده اما
همچنان روی
ماشینهای
i686 اجرا
میشود.
گزینههای قابلانتخاب برای cpu-type مشابه با گزینههای -march هستند. علاوه بر این، -mtune از ۲ گزینهٔ اضافی دیگر برای cpu-type پشتیبانی میکند:
با ورود پردازندههای جدید به بازار، رفتار این گزینه تغییر خواهد کرد. بنابراین، اگر به نسخه جدیدتری از GCC ارتقا دهید، تولید کد هدایتشده توسط این گزینه تغییر خواهد کرد تا منعکسکننده پردازندههایی باشد که در زمان انتشار آن نسخه از GCC بیشترین عمومیت را دارند.
گزینهای به نام -march=generic وجود ندارد، چرا که -march مشخصکننده مجموعه دستورالعملهایی است که کامپایلر میتواند استفاده کند، و هیچ مجموعه دستورالعمل عمومی (generic) که برای همه پردازندهها قابل اعمال باشد وجود ندارد. در مقابل، -mtune پردازنده (یا در این حالت، مجموعهای از پردازندهها) را تعیین میکند که کد برای آن بهینهسازی میشود.
- intel
- تولید کد
بهینهسازیشده
برای
جدیدترین
پردازندههای
Intel، که برای
این نسخه از
GCC شامل Haswell و Silvermont
هستند. اگر
پردازندهای
را که کد
شما روی آن
اجرا خواهد
شد
میشناسید،
باید به جای
-mtune=intel از
گزینه
متناظر -mtune
یا -march
استفاده
کنید. اما
اگر
میخواهید
برنامهتان
روی هر دوی Haswell
و Silvermont عملکرد
بهتری
داشته
باشد، باید
از این
گزینه
استفاده
کنید.
با عرضه پردازندههای جدید Intel در بازار، رفتار این گزینه تغییر خواهد کرد. بنابراین، اگر به نسخه جدیدتری از GCC ارتقا دهید، تولید کد هدایتشده توسط این گزینه برای بازتاب جدیدترین پردازندههای Intel در زمان انتشار آن نسخه از GCC تغییر خواهد کرد.
گزینهای به نام -march=intel وجود ندارد زیرا -march نشاندهنده مجموعه دستورالعملهایی است که کامپایلر مجاز به استفاده از آنهاست، و هیچ مجموعه دستورالعمل مشترکی که برای همه پردازندهها معتبر باشد وجود ندارد. در مقابل، -mtune پردازنده (یا در این مورد، مجموعهای از پردازندهها) را تعیین میکند که کد برای آن بهینهسازی شده است.
- -mcpu=cpu-type
- یک مترادف منسوخشده برای -mtune.
- -mfpmath=unit
- تولید محاسبات ممیز شناور برای واحد انتخابشده unit. گزینههای قابل انتخاب برای unit عبارتند از:
- 387
- استفاده از
کمکپردازنده
ممیز شناور
استاندارد
387 موجود روی
اکثر
تراشهها
که در غیر
این صورت
شبیهسازی
میشود. کدی
که با این
گزینه
کامپایل
شود
تقریباً در
همهجا
اجرا
میگردد.
نتایج موقت
به جای دقت
تعیینشده
توسط نوع
داده، با
دقت ۸۰ بیتی
محاسبه
میشوند که
منجر به
نتایجی با
تفاوت اندک
در مقایسه
با اکثر
تراشههای
دیگر
میشود.
برای
توضیحات
دقیقتر،
-ffloat-store را
ببینید.
این گزینه پیشفرض برای اهداف غیرِ Darwin روی x86-32 است.
- sse
- استفاده از
دستورالعملهای
ممیز شناور
اسکالر (scalar)
موجود در
مجموعه
دستورالعمل
SSE. این
مجموعه
دستورالعمل
توسط Pentium III و
تراشههای
جدیدتر، و
در خانواده
AMD توسط
تراشههای
Athlon-4، Athlon XP و Athlon MP
پشتیبانی
میشود.
نسخه اولیه
مجموعه
دستورالعمل
SSE تنها از
محاسبات با
دقت یگانه
(single-precision)
پشتیبانی
میکند،
بنابراین
محاسبات با
دقت مضاعف (double)
و دقت
بسطیافته
(extended-precision) همچنان
با استفاده
از 387 انجام
میگیرند.
نسخه بعدی،
که تنها در
پردازندههای
Pentium 4 و AMD x86-64 موجود
است، از
محاسبات با
دقت مضاعف
نیز
پشتیبانی
میکند.
برای کامپایلر x86-32، باید از سوئیچهای -march=cpu-type، -msse یا -msse2 استفاده کنید تا افزونههای SSE فعال شده و این گزینه اثرگذار شود. برای کامپایلر x86-64، این افزونهها به طور پیشفرض فعال هستند.
کد حاصل در بیشتر موارد به طور قابلتوجهی سریعتر خواهد بود و از مشکلات ناپایداری محاسباتی کد 387 دوری میجوید، اما ممکن است برخی کدهای موجود را که انتظار دارند متغیرهای موقت ۸۰ بیتی باشند دچار مشکل کند.
این گزینه پیشفرض برای کامپایلر x86-64، اهداف Darwin x86-32، و انتخاب پیشفرض برای اهداف x86-32 مجهز به مجموعه دستورالعمل SSE2 هنگام فعال بودن -ffast-math است.
- sse,387
- sse+387
- both
- تلاش برای استفاده همزمان از هر دو مجموعه دستورالعمل. این کار عملاً تعداد ثباتهای در دسترس را دو برابر میکند، و در تراشههای دارای واحدهای اجرای مجزا برای 387 و SSE منابع پردازشی را نیز دوچندان میسازد. از این گزینه با احتیاط استفاده کنید، چرا که هنوز آزمایشی است، زیرا تخصیصدهنده ثبات GCC واحدهای عملیاتی مجزا را به خوبی مدلسازی نمیکند که منجر به عملکردی ناپایدار میشود.
- -masm=dialect
- خروجی دادن دستورالعملهای اسمبلی با استفاده از گویش (dialect) انتخابشده. همچنین بر این نکته تأثیر میگذارد که کدام گویش برای "asm" پایه و "asm" بسطیافته استفاده شود. گزینههای پشتیبانیشده (به ترتیب گویش) عبارتند از att یا intel. پیشفرض att است. Darwin از intel پشتیبانی نمیکند.
- -mieee-fp
- -mno-ieee-fp
- کنترل اینکه آیا کامپایلر از مقایسههای ممیز شناور IEEE استفاده کند یا خیر. این مقایسهها حالتی را که نتیجه یک مقایسه نامرتب (unordered) است به درستی مدیریت میکنند.
- -m80387
- -mhard-float
- تولید خروجی حاوی دستورالعملهای 80387 برای ممیز شناور.
- -mno-80387
- -msoft-float
- تولید
خروجی حاوی
فراخوانیهای
کتابخانهای
برای ممیز
شناور.
هشدار: کتابخانههای مورد نیاز بخشی از GCC نیستند. به طور معمول از امکانات کامپایلر C مرسومِ سیستم استفاده میشود، اما این کار در کامپایل متقابل (cross-compilation) به طور مستقیم امکانپذیر نیست. شما باید تمهیدات لازم را برای فراهم آوردن توابع کتابخانهای مناسب جهت کامپایل متقابل شخصاً مهیا کنید.
روی ماشینهایی که یک تابع مقادیر ممیز شناور را در پشته ثباتهای 80387 بازمیگرداند، ممکن است حتی در صورت استفاده از -msoft-float نیز برخی آپکدهای ممیز شناور تولید شوند.
- -mno-fp-ret-in-387
- عدم
استفاده از
ثباتهای FPU
برای
مقادیر
بازگشتی
توابع.
قرارداد فراخوانی معمول بدین صورت است که توابع، مقادیر از نوع "float" و "double" را در یک ثبات FPU بازمیگردانند، حتی اگر هیچ FPU وجود نداشته باشد. فرضیه این است که سیستمعامل باید یک FPU را شبیهسازی کند.
گزینه -mno-fp-ret-in-387 باعث میشود اینگونه مقادیر در عوض در ثباتهای معمولی CPU بازگردانده شوند.
- -mno-fancy-math-387
- برخی از شبیهسازهای 387 از دستورالعملهای "sin"، "cos" و "sqrt" برای 387 پشتیبانی نمیکنند. این گزینه را برای جلوگیری از تولید این دستورالعملها تعیین کنید. این گزینه زمانی که -march مشخص کند CPU هدف همواره دارای یک FPU است و بنابراین دستورالعمل نیازی به شبیهسازی ندارد، نادیده گرفته میشود. این دستورالعملها تولید نمیشوند مگر اینکه همزمان از سوئیچ -funsafe-math-optimizations نیز استفاده کنید.
- -malign-double
- -mno-align-double
- کنترل
اینکه آیا GCC
متغیرهای
"double"،
"long double"، و
"long long" را
روی مرز دو
کلمهای
تراز کند یا
روی مرز یک
کلمهای.
تراز کردن
متغیرهای
"double" روی
یک مرز دو
کلمهای
کدی تولید
میکند که
روی یک Pentium تا
حدی
سریعتر
اجرا
میشود،
هرچند به
بهای مصرف
حافظه
بیشتر.
روی x86-64، گزینه -malign-double به صورت پیشفرض فعال است.
هشدار: در صورت استفاده از سوئیچ -malign-double، ساختارهایی که شامل انواع فوق باشند، متفاوت از مشخصاتِ منتشرشدهی واسط باینری کاربردی (ABI) برای x86-32 تراز میشوند و با ساختارها در کدهای کامپایلشده بدون این سوئیچ از نظر باینری سازگار نخواهند بود.
- -m96bit-long-double
- این
گزینهها
اندازهٔ
نوع داده
"long double" را
کنترل
میکنند.
رابط
باینری
کاربردی (ABI)
در x86-32 این
اندازه را
۹۶ بیت مشخص
میکند،
بنابراین
-m96bit-long-double در
حالت ۳۲
بیتی
پیشفرض
است.
معماریهای جدید (Pentium و تازهتر) ترجیح میدهند "long double" با یک مرز ۸ یا ۱۶ بایتی همتراز شود. در آرایهها یا ساختارهای منطبق با ABI، این امر امکانپذیر نیست. بنابراین تعیین -m128bit-long-double با افزودن ۳۲ بیت صفرِ اضافی به "long double"، آن را با یک مرز ۱۶ بایتی تراز میکند.
در کامپایلر x86-64، گزینهٔ -m128bit-long-double انتخاب پیشفرض است، زیرا ABI آن مشخص میکند که "long double" روی یک مرز ۱۶ بایتی تراز شود.
توجه داشته باشید که هیچیک از این گزینهها دقتی فراتر از استاندارد ۸۰ بیتی x87 برای "long double" ارائه نمیدهند.
هشدار: اگر مقدار پیشفرض را برای ABI هدف خود تغییر دهید، اندازهٔ ساختارها و آرایههای حاوی متغیرهای "long double" دگرگون میشود و همچنین قرارداد فراخوانی برای توابعی که آرگومان "long double" میگیرند تغییر میکند. از این رو، آنها با کدهایی که بدون این گزینه کامپایل شدهاند سازگاری باینری نخواهند داشت.
- -mlong-double-64
- -mlong-double-80
- -mlong-double-128
- این
گزینهها
اندازهٔ
نوع داده
"long double" را
کنترل
میکنند.
اندازهٔ ۶۴
بیتی نوع
"long double" را
معادل نوع
"double"
میسازد.
این حالت
پیشفرض
برای
کتابخانه
۳۲ بیتی Bionic C
است.
اندازهٔ
۱۲۸ بیتی
نوع "long double"
را معادل
نوع "__float128"
قرار
میدهد. این
مقدار
پیشفرض
برای
کتابخانه
۶۴ بیتی Bionic C
است.
هشدار: اگر مقدار پیشفرض را برای ABI هدف خود بازنویسی کنید، این کار اندازهٔ ساختارها و آرایههای حاوی متغیرهای "long double" را تغییر داده و همچنین قرارداد فراخوانی را برای توابعی که آرگومان "long double" میپذیرند اصلاح میکند. در نتیجه، آنها با کدهایی که بدون این گزینه کامپایل شدهاند سازگاری باینری نخواهند داشت.
- -malign-data=type
- چگونگی تراز کردن متغیرها توسط GCC را کنترل میکند. مقادیر پشتیبانیشده برای type عبارتند از: compat از مقدار تراز افزایشیافتهٔ سازگار با GCC 4.8 و پیش از آن استفاده میکند، abi از مقدار تراز مشخصشده توسط psABI بهره میبرد، و cacheline از مقدار تراز افزایشیافته جهت تطابق با اندازهٔ خط حافظهٔ نهان (cache line) استفاده میکند. مقدار پیشفرض compat است.
- -mlarge-data-threshold=threshold
- هنگامی که -mcmodel=medium یا -mcmodel=large مشخص شده باشد، اشیاء دادهای بزرگتر از threshold در بخشهای دادههای بزرگ (large data sections) قرار میگیرند. مقدار پیشفرض ۶۵۵۳۵ است.
- -mrtd
- از یک
قرارداد
فراخوانی
توابع
متفاوت
استفاده
میکند که
در آن
توابعی با
تعداد
ثابتی از
آرگومانها
با
دستورالعمل
"ret
num"
برمیگردند،
که
آرگومانهای
آنها را
هنگام
بازگشت از
پشته خارج (pop)
میکند. این
کار یک
دستورالعمل
در تابع
فراخواننده
صرفهجویی
میکند،
زیرا در
آنجا نیازی
به خارج
کردن
آرگومانها
نخواهد بود.
میتوانید تعیین کنید که یک تابع خاص با استفاده از ویژگی تابع "stdcall" با این توالی فراخوانی صدا زده شود. همچنین میتوانید گزینهٔ -mrtd را با استفاده از ویژگی تابع "cdecl" لغو و خنثی کنید.
هشدار: این قرارداد فراخوانی با قراردادی که معمولاً در Unix استفاده میشود ناسازگار است؛ بنابراین اگر نیاز به فراخوانی کتابخانههای کامپایلشده با کامپایلر Unix دارید، نمیتوانید از آن استفاده کنید.
همچنین، باید اعلان پیشنمونه (prototype) را برای تمام توابعی که تعداد متغیری آرگومان میگیرند (از جمله "printf") مشخص کنید؛ در غیر این صورت کدهای نادرستی برای فراخوانی آن توابع تولید میشود.
علاوه بر این، اگر تابعی را با آرگومانهای بیش از حد فراخوانی کنید، کد به شدت نادرستی حاصل خواهد شد. (در حالت عادی، آرگومانهای اضافی بدون آسیب نادیده گرفته میشوند.)
- -mregparm=num
- تعداد
ثباتهایی
را که برای
ارسال
آرگومانهای
عدد صحیح
استفاده
میشوند
کنترل
میکند.
بهطور
پیشفرض،
هیچ ثباتی
برای ارسال
آرگومانها
استفاده
نمیشود و
حداکثر
میتوان از
۳ ثبات
استفاده
کرد.
میتوانید
این رفتار
را برای یک
تابع خاص با
استفاده از
ویژگی تابع
"regparm"
کنترل کنید.
هشدار: اگر از این گزینه استفاده کنید و مقدار num غیرصفر باشد، باید تمام پودمانها، از جمله هرگونه کتابخانه را با همان مقدار بسازید. این امر کتابخانههای سیستم و پودمانهای راهاندازی (startup modules) را نیز در بر میگیرد.
- -msseregparm
- از
قراردادهای
ارسال ثبات
SSE برای
آرگومانها
و مقادیر
بازگشتی float و
double استفاده
میکند.
میتوانید
این رفتار
را برای یک
تابع خاص با
استفاده از
ویژگی تابع
"sseregparm"
تعیین کنید.
هشدار: اگر از این گزینه استفاده کنید، باید تمام پودمانها از جمله هرگونه کتابخانه را با همان مقدار بسازید. این امر شامل کتابخانههای سیستم و پودمانهای راهاندازی نیز میشود.
- -mvect8-ret-in-mem
- بردارهای ۸ بایتی را بهجای ثباتهای MMX در حافظه برمیگرداند. این مورد در VxWorks برای تطابق با ABI کامپایلرهای Sun Studio تا نسخهٔ ۱۲ پیشفرض است. تنها زمانی از این گزینه استفاده کنید که نیازمند حفظ سازگاری با کدهای موجود تولیدشده توسط آن نسخههای قبلی کامپایلر یا نسخههای قدیمیتر GCC باشید.
- -mpc32
- -mpc64
- -mpc80
- دقت ممیز
شناور 80387 را
روی ۳۲، ۶۴
یا ۸۰ بیت
تنظیم
میکند.
زمانی که -mpc32
مشخص شود،
مانتیسهای
نتایج
عملیات
ممیز شناور
تا ۲۴ بیت
(دقت منفرد)
گرد
میشوند؛
-mpc64
مانتیسهای
نتایج
عملیات
ممیز شناور
را تا ۵۳
بیت (دقت
مضاعف) گرد
میکند و -mpc80
مانتیسهای
نتایج
عملیات
ممیز شناور
را تا ۶۴
بیت (دقت
مضاعف
گسترشیافته)
گرد
مینماید
که حالت
پیشفرض
است. هنگام
استفاده از
این گزینه،
عملیات
ممیز شناور
با دقتهای
بالاتر
بدون تنظیم
صریح واژهٔ
کنترل FPU در
دسترس
برنامهنویس
نخواهد بود.
تنظیم گرد کردن عملیات ممیز شناور به کمتر از ۸۰ بیتِ پیشفرض میتواند سرعت اجرای برخی برنامهها را تا ۲٪ یا بیشتر افزایش دهد. توجه داشته باشید که برخی از کتابخانههای ریاضی فرض میکنند عملیات ممیز شناور با دقت گسترشیافته (۸۰ بیتی) بهطور پیشفرض فعال است؛ هنگام استفاده از این گزینه برای تنظیم دقت به مقداری کمتر از دقت گسترشیافته، روالهای موجود در چنین کتابخانههایی ممکن است دچار افت شدید دقت شوند، که معمولاً «ابطال فاجعهبار» (catastrophic cancellation) نامیده میشود.
- -mdaz-ftz
- پرچمهای flush-to-zero (FTZ) و denormals-are-zero (DAZ) در ثبات MXCSR برای کنترل محاسبات ممیز شناور به کار میروند. دستورالعملهای SSE و AVX از جمله دستورالعملهای اسکالر و برداری در صورت مشخص شدن -mdaz-ftz میتوانند از فعالسازی پرچمهای FTZ و DAZ بهرهمند شوند. زمانی که -mno-daz-ftz یا -shared مشخص شده باشد، پرچمهای FTZ/DAZ را تنظیم نکنید؛ گزینهٔ -mdaz-ftz حتی در صورت حضور -shared پرچمهای FTZ/DAZ را تنظیم خواهد کرد.
- -mstackrealign
- تراز کردن مجدد پشته در بدو ورود. در x86، گزینهٔ -mstackrealign یک پرولوگ و اپیلوگ جایگزین تولید میکند که در صورت نیاز پشتهٔ زمان اجرا را مجدداً تراز مینماید. این کار از ادغام کدهای قدیمی که تراز پشتهٔ ۴ بایتی را حفظ میکنند با کدهای جدیدی که تراز پشتهٔ ۱۶ بایتی را برای سازگاری با SSE رعایت میکنند پشتیبانی میکند. همچنین ویژگی "force_align_arg_pointer" را ببینید که برای توابع منفرد قابل اعمال است.
- -mpreferred-stack-boundary=num
- تلاش
میکند تا
مرز پشته را
همتراز با
مرز بایتی ۲
به توان num
نگه دارد.
اگر -mpreferred-stack-boundary
مشخص نشده
باشد،
مقدار
پیشفرض ۴
است (۱۶
بایت یا ۱۲۸
بیت).
هشدار: هنگام تولید کد برای معماری x86-64 با افزونههای غیرفعال SSE، میتوان از -mpreferred-stack-boundary=3 برای نگه داشتن مرز پشته روی مرز ۸ بایتی استفاده کرد. از آنجا که ABI در x86-64 نیازمند تراز پشتهٔ ۱۶ بایتی است، این کار مغایر با ABI بوده و هدف آن استفاده در محیطهای کنترلشدهای است که در آنها فضای پشته یک محدودیت جدی به شمار میرود. این گزینه هنگامی که توابع کامپایلشده با تراز پشتهٔ ۱۶ بایتی (مانند توابع یک کتابخانهٔ استاندارد) با پشتهٔ ترازنشده فراخوانی شوند، منجر به کدهای اشتباه خواهد شد. در این صورت، دستورالعملهای SSE ممکن است باعث بروز تلههای دسترسی ترازنشده به حافظه شوند. علاوه بر این، آرگومانهای متغیر برای اشیاء با تراز ۱۶ بایتی (از جمله x87 long double و __int128) به نادرستی مدیریت میشوند که منجر به نتایج اشتباه خواهد شد. شما باید تمام پودمانها، از جمله هرگونه کتابخانه را با -mpreferred-stack-boundary=3 بسازید. این امر شامل کتابخانههای سیستم و پودمانهای راهاندازی نیز میشود.
- -mincoming-stack-boundary=num
- فرض میکند
که پشتهٔ
ورودی با یک
مرز بایتی ۲
به توان num
تراز شده
است. اگر
-mincoming-stack-boundary مشخص
نشده باشد،
از مقدار
تعیینشده
توسط -mpreferred-stack-boundary
استفاده
میشود.
در پردازندههای Pentium و Pentium Pro، مقادیر "double" و "long double" باید با یک مرز ۸ بایتی تراز شوند (گزینهٔ -malign-double را ببینید)، در غیر این صورت مشمول افت عملکرد چشمگیری در زمان اجرا میشوند. در Pentium III، نوع داده Streaming SIMD Extension (SSE) با نام "__m128" در صورتی که با مرز ۱۶ بایتی تراز نباشد ممکن است به درستی کار نکند.
برای اطمینان از همترازی صحیح این مقادیر روی پشته، مرز پشته باید به اندازهٔ مورد نیاز هر مقداری که روی آن ذخیره میشود تراز باشد. افزون بر این، هر تابع باید به شکلی تولید شود که پشته را تراز نگه دارد. بنابراین، فراخوانی تابعی که با مرز پشتهٔ ترجیحی بالاتری کامپایل شده است از درون تابعی که با مرز پشتهٔ ترجیحی پایینتری کامپایل شده، به احتمال زیاد تراز پشته را به هم میزند. توصیه میشود کتابخانههایی که از بازفراخوانیها (callbacks) استفاده میکنند همواره از تنظیمات پیشفرض بهره ببرند.
این تراز اضافی فضای بیشتری از پشته مصرف میکند و بهطور کلی اندازهٔ کد را افزایش میدهد. کدهایی که به مصرف فضای پشته حساس هستند، مانند سیستمهای تعبیهشده (embedded systems) و هستههای سیستمعامل، ممکن است مایل باشند تراز ترجیحی را به -mpreferred-stack-boundary=2 کاهش دهند..IP -mmmx 4
- -msse
- -msse2
- -msse3
- -mssse3
- -msse4
- -msse4a
- -msse4.1
- -msse4.2
- -mavx
- -mavx2
- -mavx512f
- -mavx512cd
- -mavx512vl
- -mavx512bw
- -mavx512dq
- -mavx512ifma
- -mavx512vbmi
- -msha
- -maes
- -mpclmul
- -mclflushopt
- -mclwb
- -mfsgsbase
- -mptwrite
- -mrdrnd
- -mf16c
- -mfma
- -mpconfig
- -mwbnoinvd
- -mfma4
- -mprfchw
- -mrdpid
- -mrdseed
- -msgx
- -mxop
- -mlwp
- -m3dnow
- -m3dnowa
- -mpopcnt
- -mabm
- -madx
- -mbmi
- -mbmi2
- -mlzcnt
- -mfxsr
- -mxsave
- -mxsaveopt
- -mxsavec
- -mxsaves
- -mrtm
- -mhle
- -mtbm
- -mmwaitx
- -mclzero
- -mpku
- -mavx512vbmi2
- -mavx512bf16
- -mavx512fp16
- -mgfni
- -mvaes
- -mwaitpkg
- -mvpclmulqdq
- -mavx512bitalg
- -mmovdiri
- -mmovdir64b
- -menqcmd
- -muintr
- -mtsxldtrk
- -mavx512vpopcntdq
- -mavx512vp2intersect
- -mavx512vnni
- -mavxvnni
- -mcldemote
- -mserialize
- -mamx-tile
- -mamx-int8
- -mamx-bf16
- -mhreset
- -mkl
- -mwidekl
- -mavxifma
- -mavxvnniint8
- -mavxneconvert
- -mcmpccxadd
- -mamx-fp16
- -mprefetchi
- -mraoint
- -mamx-complex
- -mavxvnniint16
- -msha512
- -msm4
- -mapxf
- -musermsr
- -mavx10.1
- -mavx10.1-256
- -mavx10.1-512
- -mavx10.2
- -mamx-avx512
- -mamx-tf32
- -mamx-transpose
- -mamx-fp8
- -mmovrs
- -mamx-movrs
- این
سوئیچها
استفاده از
دستورالعملها
را در
مجموعهدستورالعملهای
توسعهیافتهٔ
MMX، SSE، AVX512CD، AVX512VL، AVX512BW،
AVX512DQ، AVX512IFMA، AVX512VBMI، SHA،
AES، PCLMUL، CLFLUSHOPT، CLWB،
FSGSBASE، PTWRITE، RDRND، F16C، FMA،
PCONFIG، WBNOINVD، FMA4، PREFETCHW،
RDPID، RDSEED، SGX، XOP، LWP،
3DNow!، enhanced 3DNow!، POPCNT، ABM،
ADX، BMI، BMI2، LZCNT، FXSR،
XSAVE، XSAVEOPT، XSAVEC، XSAVES، RTM،
HLE، TBM، MWAITX، CLZERO، PKU،
AVX512VBMI2، GFNI، VAES، WAITPKG،
VPCLMULQDQ، AVX512BITALG، MOVDIRI، MOVDIR64B،
AVX512BF16، ENQCMD، AVX512VPOPCNTDQ،
AVX512VNNI، SERIALIZE، UINTR، HRESET،
AMXTILE، AMXINT8، AMXBF16، KL، WIDEKL،
AVXVNNI، AVX512-FP16، AVXIFMA، AVXVNNIINT8،
AVXNECONVERT، CMPCCXADD، AMX-FP16، PREFETCHI،
RAOINT، AMX-COMPLEX، AVXVNNIINT16، SM3،
SHA512، SM4، APX_F، USER_MSR، AVX10.1،
AVX10.2، AMX-AVX512، AMX-TF32، AMX-TRANSPOSE،
AMX-FP8، MOVRS، AMX-MOVRS یا CLDEMOTE
فعال
میکنند. هر
کدام یک
گزینهٔ
متناظر -mno-
برای
غیرفعال
کردن
استفاده از
این
دستورالعملها
دارند.
این افزونهها همچنین به عنوان توابع توکار در دسترس هستند: برای جزئیات توابعی که توسط این سوئیچها فعال و غیرفعال میشوند، به x86 Built-in Functions مراجعه کنید.
توجه داشته باشید که -msse4 پشتیبانی از هر دو SSE4.1 و SSE4.2 را فعال میکند، در حالی که -mno-sse4 این ویژگیها را غیرفعال میسازد؛ هیچیک از دو حالت این گزینه بر پشتیبانی از SSE4A، که بهطور جداگانه توسط -msse4a کنترل میشود، تأثیری ندارند.
برای تولید خودکار دستورالعملهای SSE/SSE2 از کدهای ممیز شناور (در مقابل دستورالعملهای 387)، به -mfpmath=sse مراجعه کنید.
هنگامی که -mavx استفاده میشود، GCC از تولید دستورالعملهای SSEx خودداری میکند. در عوض، در صورت نیاز دستورالعملهای جدید AVX یا معادلهای AVX را برای همهٔ دستورالعملهای SSEx تولید مینماید.
این گزینهها به GCC امکان میدهند تا حتی بدون -mfpmath=sse نیز از این دستورالعملهای توسعهیافته در کد تولیدشده استفاده کند. برنامههایی که تشخیص CPU را در زمان اجرا انجام میدهند، باید با استفاده از پرچمهای مناسب، فایلهای جداگانهای را برای هر معماری پشتیبانیشده کامپایل کنند. به ویژه، فایلی که شامل کد تشخیص CPU است باید بدون این گزینهها کامپایل شود.
- -mdump-tune-features
- این گزینه به GCC دستور میدهد تا نام ویژگیهای تنظیم کارایی x86 و تنظیمات پیشفرض آنها را تخلیه (dump) کند. این نامها میتوانند در -mtune-ctrl=feature-list استفاده شوند.
- -mtune-ctrl=feature-list
- این گزینه برای اعمال کنترل دقیق روی ویژگیهای تولید کد x86 استفاده میشود. feature-list فهرستی از نامهای feature است که با کاما از هم جدا شدهاند. همچنین به -mdump-tune-features مراجعه کنید. در صورت تعیین، اگر قبل از feature نویسهٔ ^ نیامده باشد فعال میشود، در غیر این صورت خاموش خواهد شد. -mtune-ctrl=feature-list برای استفاده توسط توسعهدهندگان GCC در نظر گرفته شده است. استفاده از آن ممکن است به مسیرهایی از کد منجر شود که آزمایش نشدهاند و میتواند موجب بروز ICE در کامپایلر یا خطاهای زمان اجرا شود.
- -mno-default
- این گزینه به GCC دستور میدهد تا تمام ویژگیهای قابل تنظیم را غیرفعال کند. همچنین به -mtune-ctrl=feature-list و -mdump-tune-features مراجعه کنید.
- -mcld
- این گزینه به GCC دستور میدهد تا یک دستور "cld" در مقدمهٔ (prologue) توابعی که از دستورالعملهای رشتهای استفاده میکنند درج کند. دستورالعملهای رشتهای برای انتخاب بین حالت افزایش خودکار یا کاهش خودکار به پرچم DF وابستهاند. در حالی که ABI مشخص میکند پرچم DF باید در هنگام ورود به تابع پاک شود، برخی از سیستمعاملها با پاک نکردن پرچم DF در توزیعکنندههای استثنای خود، این مشخصه را نقض میکنند. ممکن است گردانندهٔ استثنا در حالی که پرچم DF تنظیم شده است فراخوانی شود که هنگام استفاده از دستورالعملهای رشتهای به جهتگیری اشتباه منجر میشود. این گزینه میتواند روی هدفهای ۳۲ بیتی x86 با پیکربندی GCC از طریق گزینهٔ پیکربندی --enable-cld به صورت پیشفرض فعال شود. در این حالت، تولید دستورالعملهای "cld" را میتوان با گزینهٔ کامپایلر -mno-cld متوقف کرد.
- -mvzeroupper
- این گزینه به GCC دستور میدهد تا پیش از انتقال جریان کنترل به خارج از تابع، یک دستور "vzeroupper" درج کند تا جریمهٔ انتقال از AVX به SSE به حداقل برسد و همچنین توابع ذاتی "zeroupper" غیرضروری حذف شوند.
- -mprefer-avx128
- این گزینه به GCC دستور میدهد تا در بردارساز خودکار (auto-vectorizer)، به جای دستورالعملهای ۲۵۶ بیتی AVX از دستورالعملهای ۱۲۸ بیتی AVX استفاده کند.
- -mprefer-vector-width=opt
- این گزینه به GCC دستور میدهد تا به جای مقدار پیشفرض روی پلتفرم انتخابشده، از عرض بردار opt بیتی در دستورالعملها استفاده کند.
- -mpartial-vector-fp-math
- این گزینه
به GCC امکان
میدهد تا
عملیاتهای
ممیز
شناوری
تولید کند
که ممکن است
بر
مجموعهای
از
پرچمهای
وضعیت ممیز
شناور روی
بردارهای
جزئی تأثیر
بگذارند،
جایی که
عناصر
بردار در
بخش پایینی
ثبات ۱۲۸
بیتی SSE قرار
دارند. مگر
اینکه -fno-trapping-math
مشخص شده
باشد،
کامپایلر
با
پاکسازی
تمام
عملوندهای
ورودی به
طوری که در
بخش
بالاییِ
استفادهنشدهٔ
ثبات
برداری صفر
قرار گیرد،
رفتار صحیح
را تضمین
میکند.
توجه داشته
باشید که با
استفاده از
توابع
توکار یا
اسمبلی
درونخطی
با
آرگومانهای
بردار
جزئی،
مقادیر NaN،
ناهنجار (denormal)
یا نامعتبر
میتوانند
به بخش
بالایی
بردار نشت
کنند و در
زمان فعال
بودن -fno-trapping-math
باعث
مشکلات
عملکردی
احتمالی
شوند. این
مشکلات را
میتوان با
پاکسازی
دستی بخش
بالایی
ثبات
آرگومان
بردار جزئی
یا با
استفاده از
-mdaz-ftz برای
تنظیم پرچم
DAZ (مخفف denormals-are-zero) در
ثبات MXCSR
برطرف کرد.
این گزینه به طور پیشفرض فعال است.
- -mmove-max=bits
- این گزینه به GCC دستور میدهد تا حداکثر تعداد بیتهایی را که میتوان بهطور کارآمد از حافظه به حافظه منتقل کرد، بر روی bits تنظیم کند. مقادیر معتبر برای bits عبارتند از 128، 256 و 512.
- -mstore-max=bits
- این گزینه به GCC دستور میدهد تا حداکثر تعداد بیتهایی را که میتوان بهطور کارآمد در حافظه ذخیره کرد، بر روی bits تنظیم کند. مقادیر معتبر برای bits عبارتند از 128، 256 و 512.
- none
- هیچ محدودیت اضافی فراتر از آنچه توسط پلتفرم انتخابشده تعریف شده، به GCC اعمال نمیشود.
- 128
- اولویت دادن به عرض بردار ۱۲۸ بیتی برای دستورالعملها.
- 256
- اولویت دادن به عرض بردار ۲۵۶ بیتی برای دستورالعملها.
- 512
- اولویت دادن به عرض بردار ۵۱۲ بیتی برای دستورالعملها.
- -mnoreturn-no-callee-saved-registers
- این گزینه توابع دارای ویژگی "noreturn" یا مشخصهساز "_Noreturn" را با ذخیره نکردن ثباتهای ذخیرهشونده توسط فراخواندهشده (callee-saved) که در تابع استفاده شدهاند (به جز ثبات "BP") در مقدمهٔ تابع، بهینهسازی میکند. این گزینه میتواند در اشکالزدایی فراخوانندهٔ تابع "noreturn" یا هر تابع بالاتر در پشتهٔ فراخوانی تداخل ایجاد کند، بنابراین به طور پیشفرض فعال نیست.
- -mcx16
- این گزینه به GCC امکان میدهد تا در کد ۶۴ بیتی، دستورالعملهای "CMPXCHG16B" را برای پیادهسازی عملیاتهای مقایسه و جابهجایی روی اشیاء ۱۲۸ بیتی همتراز با ۱۶ بایت تولید کند. این ویژگی برای بهروزرسانیهای اتمیک ساختارهای دادهای که اندازهٔ آنها از یک کلمهٔ ماشین فراتر میرود مفید است. کامپایلر از این دستور برای پیادهسازی __sync Builtins استفاده میکند. با این حال، برای __atomic Builtins که روی اعداد صحیح ۱۲۸ بیتی عمل میکنند، همیشه از یک فراخوانی کتابخانهای استفاده میشود.
- -msahf
- این گزینه تولید دستورالعملهای "SAHF" را در کد ۶۴ بیتی فعال میکند. پردازندههای اولیهٔ Intel Pentium 4 دارای پشتیبانی از Intel 64، پیش از معرفی استپینگ Pentium 4 G1 در دسامبر ۲۰۰۵، فاقد دستورالعملهای "LAHF" و "SAHF" بودند که توسط AMD64 پشتیبانی میشوند. اینها به ترتیب دستورالعملهای بارگذاری و ذخیرهسازی برای برخی پرچمهای وضعیت هستند. در حالت ۶۴ بیتی، دستور "SAHF" برای بهینهسازی توابع توکار "fmod"، "drem" و "remainder" استفاده میشود؛ برای جزئیات به Other Builtins مراجعه کنید..IP -mmovbe 4 این گزینه استفاده از دستورالعمل "movbe" را برای بهینهسازی جابهجایی بایتهای (byte swapping) دادههای چهار و هشت بایتی فعال میکند.
- -mshstk
- گزینهٔ -mshstk توابع توکار (built-in) پشتهٔ سایه (shadow stack) از فناوری Control-flow Enforcement Technology (CET) در x86 را فعال میکند.
- -mcrc32
- این گزینه توابع توکار "__builtin_ia32_crc32qi"، "__builtin_ia32_crc32hi"، "__builtin_ia32_crc32si" و "__builtin_ia32_crc32di" را برای تولید دستورالعمل ماشین "crc32" فعال میکند.
- -mmwait
- این گزینه توابع توکار "__builtin_ia32_monitor" و "__builtin_ia32_mwait" را برای تولید دستورالعملهای ماشین "monitor" و "mwait" فعال میکند.
- -mrecip
- این گزینه
استفاده از
دستورالعملهای
"RCPSS" و
"RSQRTSS" (و
متغیرهای
برداریشدهٔ
آنها
"RCPPS" و
"RSQRTPS")
همراه با یک
گام اضافی
نیوتن-رافسون
(Newton-Raphson) برای
افزایش دقت
به جای
"DIVSS" و
"SQRTSS" (و
متغیرهای
برداریشدهٔ
آنها) را
برای
آرگومانهای
ممیز شناور
با دقت
یگانه (single-precision)
فعال
میکند. این
دستورالعملها
تنها زمانی
تولید
میشوند که
-funsafe-math-optimizations
همراه با
-ffinite-math-only و -fno-trapping-math
فعال باشد.
توجه داشته
باشید که
هرچند توان
عملیاتی (throughput)
این دنباله
بیشتر از
توان
عملیاتی
دستورالعمل
غیرمعکوس
است، دقت
دنباله
ممکن است تا
۲ ulp کاهش
یابد (به
عنوان مثال
معکوس ۱٫۰
برابر است
با
۰٫۹۹۹۹۹۹۹۴).
توجه داشته باشید که GCC عبارت "1.0f/sqrtf(x)" را با استفاده از "RSQRTSS" (یا "RSQRTPS") پیشاپیش در -ffast-math (یا ترکیب گزینههای فوق) پیادهسازی میکند و نیازی به -mrecip ندارد.
همچنین توجه داشته باشید که GCC دنبالهٔ فوق را با گام اضافی نیوتن-رافسون برای تقسیم ممیز شناور تکی برداری و sqrtf(x) برداریشده پیشاپیش همراه با -ffast-math (یا ترکیب گزینههای فوق) صادر میکند و نیازی به -mrecip ندارد.
- -mrecip=opt
- این گزینه مشخص میکند کدام دستورالعملهای برآورد معکوس میتوانند استفاده شوند. opt فهرستی از گزینهها است که با کاما از هم جدا شدهاند، و ممکن است یک ! پیش از آنها برای نقیض کردن گزینه بیاید:
- all
- فعال کردن تمام دستورالعملهای برآورد.
- default
- فعال کردن دستورالعملهای پیشفرض، معادل با -mrecip.
- none
- غیرفعال کردن تمام دستورالعملهای برآورد، معادل با -mno-recip.
- div
- فعال کردن تقریب برای تقسیم نردهای (scalar).
- vec-div
- فعال کردن تقریب برای تقسیم برداریشده.
- sqrt
- فعال کردن تقریب برای جذر (ریشه دوم) نردهای.
- vec-sqrt
- فعال کردن تقریب برای جذر (ریشه دوم) برداریشده.
بنابراین، برای مثال، -mrecip=all,!sqrt تمام تقریبهای معکوس را به جز جذر فعال میکند.
- -mveclibabi=type
- نوع ABI مورد
استفاده
برای
برداریسازی
توابع
درونی (intrinsics) با
استفاده از
یک
کتابخانهٔ
خارجی را
تعیین
میکند.
مقادیر
پشتیبانیشده
برای type
عبارتند از
svml برای
کتابخانه
محاسبات
برداری
کوتاه
اینتل (Intel short vector math
library)، aocl برای
کتابخانه
ریاضیاتی (LibM)
از مجموعهٔ
AMD Optimizing CPU Libraries (AOCL)، و acml
برای
کتابخانهٔ
منسوخشدهٔ
AMD core math library (که AOCL-LibM
جانشین آن
است). برای
استفاده از
این گزینه،
باید هر دو
گزینهٔ -ftree-vectorize
و -funsafe-math-optimizations
فعال
باشند، و یک
کتابخانهٔ
سازگار با ABI
مربوط به SVML
یا ACML در زمان
پیوند (link time)
مشخص شده
باشد.
در حال حاضر GCC فراخوانیهایی را به "vmldExp2"، "vmldLn2"، "vmldLog102"، "vmldPow2"، "vmldTanh2"، "vmldTan2"، "vmldAtan2"، "vmldAtanh2"، "vmldCbrt2"، "vmldSinh2"، "vmldSin2"، "vmldAsinh2"، "vmldAsin2"، "vmldCosh2"، "vmldCos2"، "vmldAcosh2"، "vmldAcos2"، "vmlsExp4"، "vmlsLn4"، "vmlsLog104"، "vmlsPow4"، "vmlsTanh4"، "vmlsTan4"، "vmlsAtan4"، "vmlsAtanh4"، "vmlsCbrt4"، "vmlsSinh4"، "vmlsSin4"، "vmlsAsinh4"، "vmlsAsin4"، "vmlsCosh4"، "vmlsCos4"، "vmlsAcosh4" و "vmlsAcos4" برای نوع تابع متناظر در صورت استفاده از -mveclibabi=svml صادر میکند، "amd_vrs4_acosf"، "amd_vrs16_acosf"، "amd_vrd8_asin"، "amd_vrs4_asinf"، "amd_vrs8_asinf"، "amd_vrs16_asinf"، "amd_vrd2_atan"، "amd_vrd8_atan"، "amd_vrs4_atanf"، "amd_vrs8_atanf"، "amd_vrs16_atanf"، "amd_vrd2_cos"، "amd_vrd4_cos"، "amd_vrd8_cos"، "amd_vrs4_cosf"، "amd_vrs8_cosf"، "amd_vrs16_cosf"، "amd_vrs4_coshf"، "amd_vrs8_coshf"، "amd_vrd2_erf"، "amd_vrd4_erf"، "amd_vrd8_erf"، "amd_vrs4_erff"، "amd_vrs8_erff"، "amd_vrs16_erff"، "amd_vrd2_exp"، "amd_vrd4_exp"، "amd_vrd8_exp"، "amd_vrs4_expf"، "amd_vrs8_expf"، "amd_vrs16_expf"، "amd_vrd2_exp10"، "amd_vrs4_exp10f"، "amd_vrd2_exp2"، "amd_vrd4_exp2"، "amd_vrd8_exp2"، "amd_vrs4_exp2f"، "amd_vrs8_exp2f"، "amd_vrs16_exp2f"، "amd_vrs4_expm1f"، "amd_vrd2_log"، "amd_vrd4_log"، "amd_vrd8_log"، "amd_vrs4_logf"، "amd_vrs8_logf"، "amd_vrs16_logf"، "amd_vrd2_log10"، "amd_vrs4_log10f"، "amd_vrs8_log10f"، "amd_vrs16_log10f"، "amd_vrd2_log1p"، "amd_vrs4_log1pf"، "amd_vrd2_log2"، "amd_vrd4_log2"، "amd_vrd8_log2"، "amd_vrs4_log2f"، "amd_vrs8_log2f"، "amd_vrs16_log2f"، "amd_vrd2_pow"، "amd_vrd4_pow"، "amd_vrd8_pow"، "amd_vrs4_powf"، "amd_vrs8_powf"، "amd_vrs16_powf"، "amd_vrd2_sin"، "amd_vrd4_sin"، "amd_vrd8_sin"، "amd_vrs4_sinf"، "amd_vrs8_sinf"، "amd_vrs16_sinf"، "amd_vrd2_tan"، "amd_vrd4_tan"، "amd_vrd8_tan"، "amd_vrs16_tanf"، "amd_vrs4_tanhf"، "amd_vrs8_tanhf"، "amd_vrs16_tanhf" را برای نوع تابع متناظر در صورت استفاده از -mveclibabi=aocl صادر میکند، و "__vrd2_sin"، "__vrd2_cos"، "__vrd2_exp"، "__vrd2_log"، "__vrd2_log2"، "__vrd2_log10"، "__vrs4_sinf"، "__vrs4_cosf"، "__vrs4_expf"، "__vrs4_logf"، "__vrs4_log2f"، "__vrs4_log10f" و "__vrs4_powf" را برای نوع تابع متناظر در صورت استفاده از -mveclibabi=acml صادر میکند.
- -mabi=name
- تولید کد برای قرارداد فراخوانی (calling convention) مشخصشده. مقادیر مجاز عبارتند از sysv برای ABI مورد استفاده در GNU/Linux و سایر سیستمها، و ms برای Microsoft ABI. در صورت هدف قرار دادن Microsoft Windows، مقدار پیشفرض Microsoft ABI است و روی تمام سیستمهای دیگر SysV ABI میباشد. میتوان این رفتار را برای توابع خاص با استفاده از ویژگیهای تابع "ms_abi" و "sysv_abi" کنترل کرد.
- -mforce-indirect-call
- اجبار تمام فراخوانیهای توابع به صورت غیرمستقیم (indirect). این گزینه هنگام استفاده از Intel Processor Trace که در آن اطلاعات زمانبندی دقیقتری برای فراخوانیهای توابع تولید میشود، مفید است.
- -mmanual-endbr
- درج دستورالعمل ENDBR در ورودی تابع فقط از طریق مشخصهٔ تابع "cf_check". این ویژگی هنگام استفاده با گزینهٔ -fcf-protection=branch برای کنترل درج ENDBR در ورودی تابع مفید است.
- -mcet-switch
- بهطور پیشفرض، ابزارگذاری (instrumentation) CET در دستورات switch که از یک جدول پرش (jump table) استفاده میکنند خاموش است و ردیابی شاخهٔ غیرمستقیم غیرفعال است. از آنجا که جدولهای پرش در حافظهٔ فقطخواندنی ذخیره میشوند، این امر مستقیماً منجر به کاهش مقاومسازی نمیشود. اما اگر شاخص جدول پرش توسط مهاجم کنترل شود، پرش غیرمستقیم ممکن است توسط CET محدود نشود. این گزینه ابزارگذاری CET را روشن میکند تا ردیابی شاخهٔ غیرمستقیم را برای دستورات switch دارای جدول پرش فعال کند، که سبب میشود اهداف پرش از طریق هر پرش غیرمستقیمی قابل دستیابی باشند.
- -mcall-ms2sysv-xlogues
- بهدلیل تفاوتها در ABIهای ۶۴بیتی، هر تابع با Microsoft ABI که یک تابع System V ABI را فراخوانی میکند باید RSI، RDI و XMM6-15 را به عنوان مخدوششده (clobbered) در نظر بگیرد. بهطور پیشفرض، کد ذخیره و بازیابی این ثباتها بهصورت درونخطی (inline) صادر میشود که منجر به مقدمهها و موخرههای (prologues and epilogues) نسبتاً طولانی میگردد. استفاده از -mcall-ms2sysv-xlogues مقدمهها و موخرههایی صادر میکند که از تکهکدهای واسط (stubs) در بخش ایستان libgcc برای انجام این ذخیرهها و بازیابیها استفاده میکنند، و بدین ترتیب اندازهٔ تابع را با هزینهٔ چند دستورالعمل اضافی کاهش میدهد.
- -mtls-dialect=type
- تولید کد برای دسترسی به حافظهٔ محلی رشته (thread-local storage) با استفاده از قراردادهای gnu یا gnu2. مقدار gnu گزینهٔ پیشفرضِ محافظهکارانه است؛ gnu2 کارآمدتر است، اما ممکن است نیازمندیهایی در زمان ترجمه و زمان اجرا اضافه کند که در همهٔ سیستمها قابل برآورده شدن نباشد.
- -mpush-args
- -mno-push-args
- استفاده از عملیاتهای PUSH برای ذخیرهٔ پارامترهای ارسالی. این روش کوتاهتر است و معمولاً سرعتی برابر با روش استفاده از عملیاتهای SUB/MOV دارد و بهطور پیشفرض فعال است. در برخی موارد، غیرفعال کردن آن ممکن است به دلیل بهبود زمانبندی و کاهش وابستگیها کارایی را افزایش دهد..IP -maccumulate-outgoing-args 4 در صورت فعال بودن، بیشترین فضای مورد نیاز برای آرگومانهای خروجی در مقدمهٔ تابع (function prologue) محاسبه میشود. این کار در بیشتر پردازندههای مدرن به دلیل کاهش وابستگیها، زمانبندی بهتر و کاهش استفاده از پشته در شرایطی که مرز ترجیحی پشته برابر ۲ نباشد، سریعتر است. عیب آن افزایش چشمگیر در اندازهٔ کد است. این سوییچ متضمن -mno-push-args است.
- -mthreads
- پشتیبانی از مدیریت استثنای امن در برابر ریسه (thread-safe) در MinGW. برنامههایی که به مدیریت استثنای امن در برابر ریسه وابستهاند باید تمام کدها را با گزینهٔ -mthreads کامپایل و پیوند دهند. هنگام کامپایل، -mthreads عبارت -D_MT را تعریف میکند؛ هنگام پیوند دادن، کتابخانهٔ کمکی ریسهٔ ویژهٔ -lmingwthrd را پیوند میدهد که دادههای مدیریت استثنا به ازای هر ریسه را پاکسازی میکند.
- -mms-bitfields
- -mno-ms-bitfields
- فعال/غیرفعال
کردن چینش
فیلدهای
بیتی (bit-field layout)
سازگار با
کامپایلر
بومی Microsoft Windows.
اگر "packed" روی یک ساختار به کار رود، یا اگر از فیلدهای بیتی استفاده شود، ممکن است ABI مایکروسافت ساختار را متفاوت از شیوهٔ معمول GCC بچیند. بهویژه هنگام جابهجایی دادههای فشردهشده (packed) بین توابع کامپایلشده با GCC و کامپایلر بومی مایکروسافت (چه از طریق فراخوانی تابع یا به صورت داده در یک فایل)، ممکن است دسترسی به هر دو قالب ضروری باشد.
این گزینه به طور پیشفرض برای مقصدهای Microsoft Windows فعال است. این رفتار را میتوان به صورت محلی نیز با استفاده از مشخصههای متغیر یا نوع داده کنترل کرد. برای اطلاعات بیشتر، x86 Variable Attributes و x86 Type Attributes را ببینید.
الگوریتم چینش ساختار در مایکروسافت، به استثنای بستهبندی فیلدهای بیتی، نسبتاً ساده است. فاصلهگذاری (padding) و همترازی (alignment) اعضای ساختارها و اینکه آیا یک فیلد بیتی میتواند از مرز یک واحد ذخیرهسازی عبور کند یا خیر، با این قوانین تعیین میشود:
- 1. اعضای ساختار به صورت ترتیبی و به همان ترتیبی که
- اعلان شدهاند ذخیره میشوند: عضو نخست کمترین نشانی حافظه و عضو پایانی بیشترین نشانی را دارد.
- 2. هر شیء دادهای نیازمندی همترازی دارد. نیازمندی همترازی
- برای تمام
دادهها به
جز
ساختارها،
یونیونها
و
آرایهها،
اندازهٔ
شیء یا
اندازهٔ
بستهبندی
فعلی
(مشخصشده
با مشخصهٔ
"aligned" یا
دستور
عملکرد
"pack")،
هرکدام که
کمتر باشد،
است. برای
ساختارها،
یونیونها
و
آرایهها،
نیازمندی
همترازی
برابر با
بزرگترین
نیازمندی
همترازی
اعضای آن
است. به هر
شیء یک آفست
تخصیص
مییابد به
گونهای که:
offset % alignment_requirement == 0
- 3. فیلدهای بیتی مجاور در یک واحد تخصیص ۱، ۲ یا ۴ بایتی
- بستهبندی میشوند، در صورتی که نوعهای صحیح هماندازه باشند و اگر فیلد بیتی بعدی بدون عبور از مرز تحمیلشده توسط نیازمندیهای همترازی مشترک فیلدهای بیتی، در واحد تخصیص جاری جای گیرد.
کامپایلر MSVC فیلدهای بیتی با طول صفر را به روشهای زیر تفسیر میکند:
- 1. اگر یک فیلد بیتی با طول صفر بین دو فیلد بیتی درج شود که
- به طور
معمول
ادغام
میشوند،
فیلدهای
بیتی ادغام
نخواهند شد.
برای مثال:
struct { unsigned long bf_1 : 12; unsigned long : 0; unsigned long bf_2 : 12; } t1;اندازهٔ "t1" همراه با فیلد بیتی با طول صفر، ۸ بایت است. اگر فیلد بیتی با طول صفر حذف میشد، اندازهٔ "t1" برابر با ۴ بایت میبود.
- 2. اگر یک فیلد بیتی با طول صفر پس از یک فیلد بیتی، "foo"، درج شود و
- همترازی
فیلد بیتی
با طول صفر
بزرگتر از
عضوی باشد
که پس از آن
میآید
("bar")،
آنگاه
"bar"
مطابق نوع
فیلد بیتی
با طول صفر
همتراز
میشود.
برای مثال:
struct { char foo : 4; short : 0; char bar; } t2; struct { char foo : 4; short : 0; double bar; } t3;برای "t2"، عضو "bar" به جای آفست ۱، در آفست ۲ قرار میگیرد. بر این اساس، اندازهٔ "t2" برابر با ۴ است. برای "t3"، فیلد بیتی با طول صفر روی همترازی "bar" یا در نتیجه اندازهٔ ساختار تأثیری نمیگذارد.
با در نظر گرفتن این موضوع، توجه به موارد زیر اهمیت دارد:
- 1. اگر یک فیلد بیتی با طول صفر پس از یک فیلد بیتی معمولی بیاید، نوعِ
- فیلد بیتی با طول صفر ممکن است بر همترازی کل ساختار تأثیر بگذارد. برای مثال، "t2" اندازهای برابر با ۴ بایت دارد، زیرا فیلد بیتی با طول صفر پس از یک فیلد بیتی معمولی آمده و از نوع short است.
- 2. حتی اگر پس از یک فیلد بیتی با طول صفر، یک فیلد بیتی معمولی نیاید،
- ممکن است
همچنان بر
همترازی
ساختار
تأثیر
بگذارد:
struct { char foo : 6; long : 0; } t4;در اینجا، "t4" مقدار ۴ بایت فضا اشغال میکند.
- 3. فیلدهای بیتی با طول صفر که پس از اعضای غیر فیلد بیتی میآیند نادیده گرفته میشوند:
-
struct { char foo; long : 0; char bar; } t5;در اینجا، "t5" مقدار ۲ بایت فضا اشغال میکند.
- -mno-align-stringops
- مقصد عملیات رشتهای درونخطیشده را همتراز نمیکند. این سوییچ اندازهٔ کد را کاهش میدهد و در مواردی که مقصد از قبل همتراز باشد اما GCC از آن آگاه نباشد، کارایی را بهبود میبخشد.
- -minline-all-stringops
- به طور پیشفرض GCC تنها هنگامی عملیات رشتهای را درونخطی میکند که مشخص باشد مقصد حداقل روی یک مرز ۴ بایتی همتراز است. این گزینه درونخطیسازی بیشتری را فعال کرده و اندازهٔ کد را افزایش میدهد، اما ممکن است کارایی کدی را که برای طولهای کوتاه به "memcpy" و "memset" سریع وابسته است بهبود بخشد. این گزینه بسط درونخطیِ "strlen" را برای تمامی همترازیهای اشارهگر فعال میکند.
- -minline-stringops-dynamically
- برای عملیات رشتهای با اندازهٔ نامشخص، از بررسیهای زمان اجرا همراه با کد درونخطی برای بلوکهای کوچک و فراخوانی کتابخانه برای بلوکهای بزرگ استفاده میکند.
- -mstringop-strategy=alg
- قواعد مکاشفهای تصمیمگیری داخلی را برای الگوریتم خاص مورد استفاده جهت درونخطیسازی عملیات رشته بازنویسی (override) میکند. مقادیر مجاز برای alg عبارتاند از:
- -mmemcpy-strategy=strategy
- اکتشافیِ تصمیمگیری داخلی را لغو و جایگزین میکند تا مشخص کند که آیا "__builtin_memcpy" باید بهصورت درونخطی درآید و در صورت مشخص بودن اندازهٔ مورد انتظار عملیات کپی، از چه الگوریتم درونخطیای استفاده شود. strategy فهرستی از سهگانههای alg:max_size:dest_align است که با ویرگول از هم جدا شدهاند. alg در -mstringop-strategy مشخص میشود، و max_size حداکثر اندازه برحسب بایت را مشخص میکند که الگوریتم درونخطی alg برای آن مجاز است. برای آخرین سهگانه، مقدار max_size باید -1 باشد. مقدار max_size سهگانهها در فهرست باید به ترتیب صعودی مشخص شود. حداقل اندازه برحسب بایت برای alg برای اولین سهگانه برابر با 0 و برای موارد بعد برابر با "max_size + 1" محدودهٔ قبلی است.
- -mmemset-strategy=strategy
- این گزینه مشابه -mmemcpy-strategy= است با این تفاوت که برای کنترل گسترش "__builtin_memset" به کار میرود.
- -momit-leaf-frame-pointer
- اشارهگر چارچوب (frame pointer) را در یک ثبات برای توابع برگ (leaf functions) نگه نمیدارد. این کار از دستورالعملهای ذخیره، راهاندازی و بازگردانی اشارهگرهای چارچوب جلوگیری کرده و یک ثبات اضافی در توابع برگ در دسترس قرار میدهد. گزینهٔ -fomit-leaf-frame-pointer اشارهگر چارچوب را برای توابع برگ حذف میکند که ممکن است اشکالزدایی را دشوارتر سازد.
- -mtls-direct-seg-refs
- -mno-tls-direct-seg-refs
- کنترل
میکند که
آیا دسترسی
به
متغیرهای TLS
با
آفستهایی
از ثبات
قطعهٔ TLS (%gs
برای ۳۲
بیتی، %fs
برای ۶۴
بیتی) مجاز
است یا
اینکه باید
اشارهگر
پایهٔ رشته
(thread base pointer) اضافه
شود. معتبر
بودن یا
نبودن این
رفتار به
سیستمعامل
و اینکه آیا
قطعه را
برای پوشش
کل ناحیهٔ TLS
نگاشت
میکند یا
خیر، بستگی
دارد.
برای سیستمهایی که از GNU C Library استفاده میکنند، مقدار پیشفرض روشن است.
- -msse2avx
- -mno-sse2avx
- مشخص میکند که اسمبلر باید دستورالعملهای SSE را با پیشوند VEX کدگذاری کند. گزینهٔ -mavx این ویژگی را بهطور پیشفرض فعال میکند.
- -mfentry
- -mno-fentry
- اگر تحلیل کارایی (profiling) فعال باشد (-pg)، فراخوانی شمارندهٔ تحلیل کارایی را قبل از پیشدرآمد (prologue) قرار میدهد. توجه: در معماریهای x86، مشخصهٔ "ms_hook_prologue" در حال حاضر برای -mfentry و -pg امکانپذیر نیست.
- -mrecord-mcount
- -mno-record-mcount
- اگر تحلیل کارایی فعال باشد (-pg)، یک بخش __mcount_loc تولید میکند که حاوی اشارهگرهایی به هر فراخوانی تحلیل کارایی است. این برای وصله کردن خودکار فراخوانیها به داخل و خارج (patching in and out) مفید است.
- -mnop-mcount
- -mno-nop-mcount
- اگر تحلیل کارایی فعال باشد (-pg)، فراخوانیهای توابع تحلیل کارایی را بهصورت دستورهای NOP تولید میکند. این در صورتی مفید است که قرار باشد بعداً بهطور پویا وصلهگذاری شوند. این گزینه احتمالاً تنها همراه با -mrecord-mcount مفید است.
- -minstrument-return=type
- خروج تابع را در توابع ابزارگذاریشده با -pg -mfentry، با فراخوانی تابع مشخصشده ابزارگذاری میکند. این فقط بازگشتهای واقعیِ منتهی به ret را ابزارگذاری میکند، نه فراخوانیهای همسطح (sibling calls) منتهی به jump را. انواع معتبر عبارتند از none برای عدم ابزارگذاری، call برای ایجاد فراخوانی به __return__، یا nop5 برای ایجاد یک nop ۵ بایتی.
- -mrecord-return
- -mno-record-return
- یک بخش __return_loc تولید میکند که به تمام کدهای ابزارگذاری بازگشت اشاره دارد.
- -mfentry-name=name
- نام نماد __fentry__ را که هنگام ورود به تابع برای توابع -pg -mfentry فراخوانی میشود، تعیین میکند.
- -mfentry-section=name
- نام بخش را برای ثبت فراخوانیهای -mrecord-mcount تعیین میکند (پیشفرض __mcount_loc).
- -mskip-rax-setup
- -mno-skip-rax-setup
- هنگام
تولید کد
برای
معماری x86-64 با
افزونههای
غیرفعال SSE،
میتوان از
-mskip-rax-setup برای
صرفنظر
کردن از
راهاندازی
ثبات RAX در
حالتی که
هیچ
آرگومان
متغیری در
ثباتهای
برداری
ارسال
نمیشود،
استفاده
کرد.
هشدار: از آنجا که از ثبات RAX برای جلوگیری از ذخیرهٔ غیرضروری ثباتهای برداری روی پشته هنگام ارسال آرگومانهای متغیر استفاده میشود، پیامدهای این گزینه این است که توابع فراخواندهشده (callees) ممکن است مقداری فضای پشته را هدر دهند، رفتار نادرستی داشته باشند یا به مکانی تصادفی بپرند. کامپایلر GCC 4.4 یا جدیدتر صرفنظر از مقدار ثبات RAX چنین مشکلاتی ندارند.
- -m8bit-idiv
- -mno-8bit-idiv
- در برخی پردازندهها، مانند Intel Atom، تقسیم اعداد صحیح بدون علامت ۸ بیتی بسیار سریعتر از تقسیم اعداد صحیح ۳۲ بیتی/۶۴ بیتی است. این گزینه یک بررسی در زمان اجرا تولید میکند. اگر هر دو مقسوم و مقسومعلیه در محدودهٔ 0 تا 255 باشند، تقسیم صحیح بدون علامت ۸ بیتی بهجای تقسیم صحیح ۳۲ بیتی/۶۴ بیتی استفاده میشود.
- -mavx256-split-unaligned-load
- -mavx256-split-unaligned-store
- عملیات بارگذاری (load) و ذخیرهسازی (store) ناترازِ ۳۲ بایتی AVX را تفکیک میکند.
- -mstack-protector-guard=guard
- -mstack-protector-guard-reg=reg
- -mstack-protector-guard-offset=offset
- -mstack-protector-guard-symbol=symbol
- کد حفاظت از
پشته را با
استفاده از
قناری (canary) در
guard تولید
میکند.
مکانهای
پشتیبانیشده
عبارتند از
global برای
قناری
سراسری یا
tls برای
قناری به
ازای هر
رشته در
بلوک TLS
(پیشفرض).
این گزینه
فقط زمانی
اعمال
میشود که
-fstack-protector یا -fstack-protector-all
مشخص شده
باشد.
با انتخاب حالت دوم، گزینههای -mstack-protector-guard-reg=reg و -mstack-protector-guard-offset=offset علاوه بر این مشخص میکنند که کدام ثبات قطعه (%fs یا %gs) بهعنوان ثبات پایه برای خواندن قناری استفاده شود، و از چه آفستی نسبت به آن ثبات پایه خوانده شود. مقدار پیشفرض آنها همان است که در ABI مربوطه مشخص شده است.
-mstack-protector-guard-symbol=symbol مقدار آفست را با یک ارجاع نمادین به قناری در بلوک TLS لغو و جایگزین میکند.
- -mgeneral-regs-only
- کدی تولید میکند که فقط از ثباتهای همهمنظوره استفاده میکند. این کار کامپایلر را از استفاده از ثباتهای ممیز شناور، برداری، ماسک و ثباتهای کران (bound registers) بازمیدارد.
- -mrelax-cmpxchg-loop
- هنگام تولید حلقهٔ مقایسه و جابجایی (compare-and-swap) برای توابع توکار __sync Builtins و __atomic Builtins که فاقد دستورالعمل بومی هستند، با صدور یک بارگذاری اتمی پیش از دستورالعمل "CMPXCHG" و استفاده از دستورالعمل "PAUSE" برای صرفهجویی در مصرف توان پردازنده هنگام شروع مجدد حلقه، کد را برای مواردی با رقابت شدید بهینهسازی میکند.
- -mindirect-branch=choice
- فراخوانی و
پرش
غیرمستقیم
را با choice
تبدیل
میکند.
مقدار
پیشفرض keep
است که
فراخوانی و
پرش
غیرمستقیم
را بدون
تغییر نگه
میدارد.
مقدار thunk
فراخوانی و
پرش
غیرمستقیم
را به
فراخوانی و
بازگشت thunk
تبدیل
میکند.
مقدار thunk-inline
فراخوانی و
پرش
غیرمستقیم
را به thunk
فراخوانی و
بازگشت
درونخطیشده
تبدیل
میکند.
مقدار thunk-extern
فراخوانی و
پرش
غیرمستقیم
را به thunk
فراخوانی و
بازگشت
خارجی که در
یک فایل شیء
جداگانه
ارائه شده
است تبدیل
میکند.
میتوانید
این رفتار
را برای یک
تابع خاص با
استفاده از
مشخصهٔ
تابع
"indirect_branch"
کنترل کنید.
توجه داشته باشید که -mcmodel=large با -mindirect-branch=thunk و -mindirect-branch=thunk-extern ناسازگار است زیرا تابع thunk ممکن است در مدل کد بزرگ قابل دستیابی نباشد.
توجه داشته باشید که -mindirect-branch=thunk-extern با -fcf-protection=branch سازگار است زیرا میتوان thunk خارجی را بهگونهای ساخت که بررسی جریان کنترل فعال شود..IP -mfunction-return=choice 4 بازگشت تابع را با choice تبدیل میکند. پیشفرض keep است که بازگشت تابع را دستنخورده نگه میدارد. مقدار thunk بازگشت تابع را به thunk فراخوانی و بازگشت (call and return thunk) تبدیل میکند. مقدار thunk-inline بازگشت تابع را به thunk فراخوانی و بازگشت درونخطی تبدیل میکند. مقدار thunk-extern بازگشت تابع را به thunk فراخوانی و بازگشت خارجی که در یک فایل شیء جداگانه ارائه شده تبدیل میکند. میتوانید این رفتار را برای یک تابع خاص با استفاده از مشخصه تابع "function_return" کنترل کنید.
توجه داشته باشید که -mindirect-return=thunk-extern با -fcf-protection=branch سازگار است زیرا میتوان thunk خارجی را طوری ساخت که بررسی جریان کنترل (control-flow check) را فعال کند.
توجه داشته باشید که -mcmodel=large با -mfunction-return=thunk و -mfunction-return=thunk-extern ناسازگار است چرا که تابع thunk ممکن است در مدل کد بزرگ (large code model) در دسترس نباشد.
- -mindirect-branch-register
- فراخوانی و پرش غیرمستقیم از طریق ثبات را اجباری میکند.
- -mharden-sls=choice
- کدی برای کاهش خطرات حدس مستقیم خطی (SLS یا straight line speculation) با choice تولید میکند. پیشفرض none است که تمام مقاومسازیهای SLS را غیرفعال میکند. مقدار return مقاومسازی SLS را برای بازگشتهای تابع فعال میکند. مقدار indirect-jmp مقاومسازی SLS را برای پرشهای غیرمستقیم فعال میسازد. مقدار all تمام مقاومسازیهای SLS را فعال میکند.
- -mindirect-branch-cs-prefix
- پیشوند CS را به call و jmp به سمت thunk غیرمستقیم با مقصد انشعاب در ثباتهای r8-r15 اضافه میکند تا طول دستورالعمل call و jmp برابر با ۶ بایت شود و امکان جایگزینی آنها با lfence; call *%r8-r15 یا lfence; jmp *%r8-r15 در زمان اجرا فراهم گردد.
- -mapx-inline-asm-use-gpr32
- برای پشتیبانی از اسمبلی درونخطی (inline asm) با APX، بهطور پیشفرض ویژگی EGPR غیرفعال شده است تا از بروز دستورالعملهای غیرمجاز احتمالی با EGPR جلوگیری شود. برای بهکارگیری egpr در اسمبلی درونخطی، از گزینه جدید کامپایلر -mapx-inline-asm-use-gpr32 استفاده کنید و کاربر باید اطمینان حاصل کند که دستورالعمل از EGPR پشتیبانی میکند.
- -mevex512
- -mno-evex512
- بردار ۵۱۲ بیتی را فعال/غیرفعال میکند. اگر AVX512F فعال باشد، بهطور پیشفرض فعال خواهد بود.
این سوئیچهای -m علاوه بر موارد فوق، روی پردازندههای x86-64 در محیطهای ۶۴ بیتی پشتیبانی میشوند.
- -m32
- -m64
- -mx32
- -m16
- -miamcu
- تولید کد
برای یک
محیط ۱۶
بیتی، ۳۲
بیتی یا ۶۴
بیتی. گزینه
-m32 نوعهای
"int"،
"long" و
اشارهگر
را روی ۳۲
بیت تنظیم
میکند و
کدی تولید
میکند که
در حالت ۳۲
بیتی اجرا
میشود.
گزینه -m64 نوع "int" را روی ۳۲ بیت و نوعهای "long" و اشارهگر را روی ۶۴ بیت تنظیم میکند و برای معماری x86-64 کد تولید میکند. تنها در Darwin، گزینه -m64 گزینههای -fno-pic و -mdynamic-no-pic را نیز خاموش میکند.
گزینه -mx32 نوعهای "int"، "long" و اشارهگر را روی ۳۲ بیت تنظیم میکند و برای معماری x86-64 کد تولید میکند.
گزینه -m16 همانند -m32 است، بهجز اینکه دستور اسمبلی ".code16gcc" را در ابتدای خروجی اسمبلی درج میکند تا فایل اجرایی بتواند در حالت ۱۶ بیتی اجرا شود.
گزینه -miamcu کدی مطابق با Intel MCU psABI تولید میکند. این گزینه مستلزم فعال بودن گزینه -m32 است.
- -mno-red-zone
- از اصطلاحاً «red zone» (منطقه سرخ) برای کد x86-64 استفاده نمیکند. منطقه سرخ توسط ABI معماری x86-64 الزامی شده است؛ ناحیهای ۱۲۸ بایتی فراتر از موقعیت اشارهگر پشته است که توسط گردانندههای سیگنال یا وقفه دستکاری نمیشود و بنابراین میتواند برای دادههای موقت بدون نیاز به تنظیم اشارهگر پشته استفاده شود. پرچم -mno-red-zone این منطقه سرخ را غیرفعال میکند.
- -mcmodel=small
- تولید کد برای مدل کد کوچک (small code model): برنامه و نمادهای آن باید در ۲ گیگابایت پایینی فضای آدرس پیوند داده شوند. اشارهگرها ۶۴ بیتی هستند. برنامهها را میتوان بهصورت ایستا یا پویا پیوند داد. این مدل کد پیشفرض است.
- -mcmodel=kernel
- تولید کد برای مدل کد هسته (kernel code model). هسته در ۲ گیگابایت منفی فضای آدرس اجرا میشود. این مدل باید برای کد هسته لینوکس استفاده شود.
- -mcmodel=medium
- تولید کد برای مدل متوسط (medium model): برنامه در ۲ گیگابایت پایینی فضای آدرس پیوند میخورد. نمادهای کوچک نیز در آنجا قرار میگیرند. نمادهایی با اندازههای بزرگتر از -mlarge-data-threshold در بخشهای داده یا BSS بزرگ قرار داده میشوند و میتوانند بالای ۲ گیگابایت مستقر شوند. برنامهها میتوانند بهصورت ایستا یا پویا پیوند داده شوند.
- -mcmodel=large
- تولید کد برای مدل بزرگ (large model). این مدل هیچ فرضی درباره آدرسها و اندازه بخشها در نظر نمیگیرد.
- -maddress-mode=long
- تولید کد برای حالت آدرس بلند (long address mode). این مورد فقط برای محیطهای ۶۴ بیتی و x32 پشتیبانی میشود. این حالت آدرس پیشفرض برای محیطهای ۶۴ بیتی است.
- -maddress-mode=short
- تولید کد برای حالت آدرس کوتاه (short address mode). این مورد فقط برای محیطهای ۳۲ بیتی و x32 پشتیبانی میشود. این حالت آدرس پیشفرض برای محیطهای ۳۲ بیتی و x32 است.
- -mneeded
- -mno-needed
- ویژگی گنو GNU_PROPERTY_X86_ISA_1_NEEDED را برای مقصد لینوکس منتشر میکند تا سطح ISA ریزمعماریِ مورد نیاز برای اجرای باینری را مشخص کند.
- -mno-direct-extern-access
- بدون -fpic یا
-fPIC، همیشه
از
اشارهگر GOT
برای
دسترسی به
نمادهای
خارجی
استفاده
میکند. با
-fpic یا -fPIC، با
دسترسی به
نمادهای
محافظتشده
(protected symbols) مانند
نمادهای
محلی
برخورد
میکند.
پیشفرض
-mdirect-extern-access است.
هشدار: کتابخانههای مشترک کامپایلشده با -mno-direct-extern-access و فایلهای اجرایی کامپایلشده با -mdirect-extern-access، در صورتی که نمادهای محافظتشده در کتابخانههای مشترک و فایل اجرایی استفاده شده باشند، ممکن است از نظر باینری با یکدیگر سازگار نباشند.
- -munroll-only-small-loops
- باز کردن محافظهکارانه حلقههای کوچک را کنترل میکند. این گزینه بهطور پیشفرض در O2 فعال است و حلقههای با کمتر از ۴ دستورالعمل را ۱ مرتبه باز میکند. استفاده صریح از -f[no-]unroll-[all-]loops این پرچم را غیرفعال میکند تا از هرگونه رفتار ناخواسته باز کردن حلقه که کاربر مایل به آن نیست جلوگیری شود.
- -mlam=choice
- قابلیت LAM (پوششدهی آدرس خطی یا linear-address masking) امکان استفاده از بیتهای خاص در اشارهگر را برای فراداده (metadata) فراهم میکند. پیشفرض none است. با u48، بیتهای اشارهگر در موقعیتهای 62:48 میتوانند برای فراداده استفاده شوند؛ با u57، بیتهای اشارهگر در موقعیتهای 62:57 میتوانند برای فراداده استفاده شوند.
گزینههای x86 Windows
گزینههای Xstormy16
این گزینهها برای Xstormy16 تعریف شدهاند:
- -msim
- انتخاب فایلهای راهاندازی (startup) و اسکریپت پیونددهنده مناسب برای شبیهساز.
گزینههای Xtensa
این گزینهها برای مقصدهای Xtensa پشتیبانی میشوند:
- -mconst16
- -mno-const16
- استفاده از دستورالعملهای "CONST16" را برای بارگذاری مقادیر ثابت فعال یا غیرفعال میکند. دستورالعمل "CONST16" در حال حاضر یک گزینه استاندارد از سوی Tensilica نیست. هنگام فعال بودن، دستورالعملهای "CONST16" همیشه به جای دستورالعملهای استاندارد "L32R" استفاده میشوند. استفاده از "CONST16" بهطور پیشفرض تنها در صورتی فعال است که دستورالعمل "L32R" در دسترس نباشد..IP -mfused-madd 4
- -mno-fused-madd
- فعال یا غیرفعال کردن استفاده از دستورالعملهای ضرب/جمع و ضرب/تفریق ادغامشده (fused multiply/add و multiply/subtract) در گزینهٔ ممیز شناور (floating-point). در صورتی که گزینهٔ ممیز شناور فعال نباشد، این گزینه بیتأثیر خواهد بود. غیرفعالسازی دستورالعملهای ضرب/جمع و ضرب/تفریق ادغامشده، کامپایلر را وادار میکند تا از دستورالعملهای جداگانه برای عملیاتهای ضرب و جمع/تفریق استفاده کند. این امر ممکن است در مواردی که نتایجی کاملاً منطبق بر استاندارد IEEE 754 مورد نیاز است مطلوب باشد: دستورالعملهای ضرب و جمع/تفریق ادغامشده حاصل میانی را گرد نمیکنند، در نتیجه نتایجی با بیتهای دقت بیشتری نسبت به مشخصات استاندارد IEEE تولید میکنند. همچنین غیرفعال کردن این دستورالعملها تضمین میکند که خروجی برنامه وابسته به توانایی کامپایلر در ادغام عملیاتهای ضرب و جمع/تفریق نباشد.
- -mserialize-volatile
- -mno-serialize-volatile
- هنگامی که این گزینه فعال است، GCC دستورالعملهای "MEMW" را پیش از مراجعات حافظهٔ "volatile" درج میکند تا سازگاری ترتیبی (sequential consistency) تضمین شود. مقدار پیشفرض -mserialize-volatile است. برای حذف دستورالعملهای "MEMW" از گزینهٔ -mno-serialize-volatile استفاده کنید.
- -mforce-no-pic
- برای مقاصدی مانند GNU/Linux، که در آنها تمام کدهای حالت کاربر (user-mode) در Xtensa باید کد مستقل از موقعیت (PIC) باشند، این گزینه PIC را برای کامپایل کردن کد هسته (kernel) غیرفعال میکند.
- -mtext-section-literals
- -mno-text-section-literals
- این گزینهها نحوهٔ مدیریت استخرهای مقادیر مستقیم (literal pools) را کنترل میکنند. حالت پیشفرض -mno-text-section-literals است که مقادیر مستقیم را در یک بخش (section) جداگانه در فایل خروجی قرار میدهد. این امر اجازه میدهد استخر مقادیر مستقیم در RAM/ROM داده قرار گیرد، و همچنین به پیونددهنده اجازه میدهد تا استخرهای مقادیر مستقیم فایلهای شیءِ (object files) مجزا را با هم ترکیب کند تا مقادیر تکراری حذف شده و اندازهٔ کد بهبود یابد. با فعال بودن -mtext-section-literals، مقادیر مستقیم در بخش text پراکنده میشوند تا در نزدیکترین فاصلهٔ ممکن به مراجع خود قرار گیرند. این ممکن است برای فایلهای اسمبلی بزرگ ضروری باشد. مقادیر مستقیم هر تابع درست پیش از همان تابع قرار میگیرند.
- -mauto-litpools
- -mno-auto-litpools
- این گزینهها نحوهٔ مدیریت استخرهای مقادیر مستقیم را کنترل میکنند. حالت پیشفرض -mno-auto-litpools است که مقادیر مستقیم را در یک بخش مجزا در فایل خروجی قرار میدهد، مگر اینکه از -mtext-section-literals استفاده شده باشد. با فعال بودن -mauto-litpools مقادیر مستقیم توسط اسمبلر در بخش text پراکنده میشوند. کامپایلر دستورهای صریح ".literal" تولید نمیکند و مقادیر مستقیم را با دستورالعملهای "MOVI" به جای "L32R" در ثباتها بارگذاری میکند تا به اسمبلر اجازه دهد عملیات تعدیل (relaxation) را انجام داده و مقادیر مستقیم را در صورت لزوم قرار دهد. این گزینه به اسمبلر امکان میدهد تا چندین استخر مقادیر مستقیم برای هر تابع ایجاد کرده و توابع بسیار بزرگ را اسمبل کند، کاری که ممکن است با -mtext-section-literals امکانپذیر نباشد.
- -mtarget-align
- -mno-target-align
- هنگامی که این گزینه فعال است، GCC به اسمبلر دستور میدهد که به طور خودکار دستورالعملها را تراز (align) کند تا جریمههای انشعاب (branch penalties) را به بهای مقداری کاهش تراکم کد، کاهش دهد. اسمبلر تلاش میکند دستورالعملهای تراکم (density instructions) را عریضتر کند تا مقاصد انشعاب و دستورالعملهای پس از دستورهای فراخوانی (call) تراز شوند. اگر دستورالعملهای متراکم امن پیشینِ کافی برای تراز کردن یک مقصد وجود نداشته باشد، هیچ عریضسازی انجام نمیشود. پیشفرض -mtarget-align است. این گزینهها بر رفتار دستورالعملهای خودتراز مانند "LOOP"، که اسمبلر همیشه آنها را چه با عریضسازی دستورالعملهای متراکم یا با درج دستورالعملهای NOP تراز میکند، تأثیری ندارند.
- -mlongcalls
- -mno-longcalls
- هنگامی که این گزینه فعال است، GCC به اسمبلر دستور میدهد که فراخوانیهای مستقیم را به فراخوانیهای غیرمستقیم تبدیل کند، مگر اینکه بتواند تعیین کند که مقصد یک فراخوانی مستقیم در محدودهٔ مجاز دستور فراخوانی قرار دارد. این تبدیل معمولاً برای فراخوانی توابع در فایلهای منبع دیگر رخ میدهد. به طور مشخص، اسمبلر یک دستور مستقیم "CALL" را به یک "L32R" که پس از آن یک دستور "CALLX" قرار دارد ترجمه میکند. حالت پیشفرض -mno-longcalls است. این گزینه باید در برنامههایی استفاده شود که مقصد فراخوانی به صورت بالقوه ممکن است خارج از محدوده باشد. این گزینه در اسمبلر پیادهسازی شده است، نه کامپایلر، بنابراین کد اسمبلی تولید شده توسط GCC همچنان دستورالعملهای فراخوانی مستقیم را نشان میدهد---برای مشاهدهٔ دستورالعملهای واقعی به کد دیزاسمبلشدهٔ شیء نگاه کنید. توجه داشته باشید که اسمبلر برای هر فراخوانی بین فایلی از یک فراخوانی غیرمستقیم استفاده میکند، نه فقط مواردی که واقعاً خارج از محدوده هستند.
- -mabi=name
- تولید کد برای ABI مشخصشده. مقادیر مجاز عبارتند از: call0 و windowed. رابط ABI پیشفرض بر اساس پیکربندی هستهٔ Xtensa انتخاب میشود.
- -mabi=call0
- هنگامی که این گزینه فعال است، پارامترهای تابع در ثباتهای "a2" تا "a7" منتقل میشوند، ثباتهای "a12" تا "a15" توسط فراخواننده ذخیره میشوند (caller-saved)، و ثبات "a15" ممکن است به عنوان اشارهگر فریم (frame pointer) استفاده شود. هنگامی که این نسخه از ABI فعال باشد، نماد پیشپردازندهٔ سی "__XTENSA_CALL0_ABI__" تعریف میشود.
- -mabi=windowed
- هنگامی که این گزینه فعال است، پارامترهای تابع در ثباتهای "a10" تا "a15" منتقل میشوند، و تابع فراخواندهشده در بدو ورود پنجرهٔ ثبات را به اندازهٔ ۸ ثبات میچرخاند تا آرگومانهای آن در ثباتهای "a2" تا "a7" قرار گیرند. ثبات "a7" ممکن است به عنوان اشارهگر فریم استفاده شود. پنجرهٔ ثبات در زمان بازگشت ۸ ثبات به عقب بازگردانده میشود. هنگامی که این نسخه از ABI فعال باشد، نماد پیشپردازندهٔ سی "__XTENSA_WINDOWED_ABI__" تعریف میشود.
- -mextra-l32r-costs=n
- هزینهٔ اضافی دسترسی به RAM/ROM دستورالعملها را برای دستورات "L32R"، بر حسب چرخههای ساعت مشخص میکند. این گزینه هنگام بهینهسازی برای سرعت، بر تصمیمگیری بین بارگذاری یک مقدار ثابت از استخر مقادیر مستقیم با استفاده از "L32R" یا تولید آن ثابت از یک مقدار کوچک با چند دستور محاسباتی تأثیر میگذارد. مقدار پیشفرض 0 است.
- -mstrict-align
- -mno-strict-align
- اجتناب از یا مجاز دانستن تولید دسترسیهای حافظهای که ممکن است طبق توصیف مشخصات معماری، روی مرز طبیعی شیء تراز نشده باشند. مقدار پیشفرض برای هستههایی که از هر دو عملیات بارگذاری و ذخیرهسازی ناتراز در سختافزار پشتیبانی میکنند -mno-strict-align و برای تمام هستههای دیگر -mstrict-align است.
گزینههای zSeries
این موارد در ذیل فهرست شدهاند:.SH "محیط (ENVIRONMENT)" این بخش چندین متغیر محیطی را شرح میدهد که بر نحوه عملکرد GCC تأثیر میگذارند. برخی از آنها با تعیین دایرکتوریها یا پیشوندهایی که هنگام جستجو برای انواع مختلف فایلها به کار میروند، عمل میکنند. برخی دیگر برای تعیین سایر جنبههای محیط کامپایل استفاده میشوند.
توجه داشته باشید که میتوانید مکانهای جستجو را با استفاده از گزینههایی مانند -B، -I و -L نیز مشخص کنید. این گزینهها نسبت به مکانهای مشخصشده با متغیرهای محیطی اولویت دارند، که خود آنها نیز بر موارد تعیینشده توسط پیکربندی GCC تقدم دارند.
- LANG
- LC_CTYPE
- LC_MESSAGES
- LC_ALL
- این
متغیرهای
محیطی روش
استفاده GCC
از اطلاعات
بومیسازی
را کنترل
میکنند که
به GCC اجازه
میدهد با
رسوم و
قراردادهای
ملی مختلف
کار کند.
اگر
پیکربندی
شده باشد، GCC
دستهبندیهای
محلی LC_CTYPE و
LC_MESSAGES را
بررسی
میکند. این
دستهبندیهای
محلی
میتوانند
روی هر
مقداری که
توسط
سامانه شما
پشتیبانی
میشود
تنظیم شوند.
یک مقدار
معمول en_GB.UTF-8
برای
انگلیسی
بریتانیا
با کدگذاری
UTF-8 است.
متغیر محیطی LC_CTYPE دستهبندی نویسهها را مشخص میکند. GCC از آن برای تعیین مرزهای نویسه در یک رشته استفاده میکند؛ این امر برای برخی کدگذاریهای چندبایتی ضروری است که نویسههای نقلقول و گریز (escape) دارند که در غیر این صورت به عنوان پایان رشته یا گریز تفسیر میشوند.
متغیر محیطی LC_MESSAGES زبانی را مشخص میکند که در پیامهای تشخیصی استفاده میشود.
اگر متغیر محیطی LC_ALL تنظیم شده باشد، مقدار LC_CTYPE و LC_MESSAGES را لغو (override) میکند؛ در غیر این صورت، پیشفرض LC_CTYPE و LC_MESSAGES مقدار متغیر محیطی LANG خواهد بود. اگر هیچیک از این متغیرها تنظیم نشده باشند، GCC به رفتار سنتی انگلیسی C بازمیگردد.
- TMPDIR
- اگر TMPDIR تنظیم شده باشد، دایرکتوری مورد استفاده برای فایلهای موقت را مشخص میکند. GCC از فایلهای موقت برای نگهداری خروجی یک مرحله از کامپایل استفاده میکند که قرار است به عنوان ورودی مرحله بعد به کار رود؛ برای مثال، خروجی پیشپردازنده، که ورودی خود کامپایلر است.
- GCC_COMPARE_DEBUG
- تنظیم GCC_COMPARE_DEBUG تقریباً معادل ارسال -fcompare-debug به گرداننده کامپایلر (compiler driver) است. برای جزئیات بیشتر مستندات این گزینه را ببینید.
- GCC_EXEC_PREFIX
- اگر GCC_EXEC_PREFIX
تنظیم شده
باشد،
پیشوندی را
برای
استفاده در
نامهای
زیربرنامههای
اجرا شده
توسط
کامپایلر
مشخص
میکند.
هنگام
ترکیب این
پیشوند با
نام یک
زیربرنامه
هیچ اسلشی
اضافه
نمیشود،
اما در صورت
تمایل
میتوانید
پیشوندی را
مشخص کنید
که با اسلش
پایان
مییابد.
اگر GCC_EXEC_PREFIX تنظیم نشده باشد، GCC تلاش میکند تا بر اساس نام مسیری که با آن فراخوانی شده است، پیشوند مناسبی برای استفاده بیابد.
اگر GCC نتواند زیربرنامه را با استفاده از پیشوند مشخصشده بیابد، جستجو در مکانهای معمول برای زیربرنامه را امتحان میکند.
مقدار پیشفرض GCC_EXEC_PREFIX برابر prefix/lib/gcc/ است که در آن prefix پیشوندِ کامپایلر نصبشده است. در بسیاری از موارد prefix همان مقدار "prefix" در هنگام اجرای اسکریپت configure است.
سایر پیشوندهای مشخصشده با -B بر این پیشوند اولویت دارند.
این پیشوند همچنین برای یافتن فایلهایی مانند crt0.o که برای پیوند دادن (linking) استفاده میشوند به کار میرود.
علاوه بر این، این پیشوند به شیوهای غیرمعمول در یافتن دایرکتوریهای جستجو برای فایلهای سرآیند (header files) استفاده میشود. برای هر یک از دایرکتوریهای استانداردی که نام آنها به طور معمول با /usr/local/lib/gcc (دقیقتر بگوییم، با مقدار GCC_INCLUDE_DIR) آغاز میشود، GCC تلاش میکند آن آغازه را با پیشوند مشخصشده جایگزین کند تا نام دایرکتوری جایگزینی تولید شود. بنابراین با -Bfoo/، GCC درست پیش از جستجوی دایرکتوری استاندارد /usr/local/lib/bar، دایرکتوری foo/bar را جستجو میکند. اگر یک دایرکتوری استاندارد با prefix پیکربندیشده آغاز شود، هنگام جستجوی فایلهای سرآیند، مقدار prefix با GCC_EXEC_PREFIX جایگزین میشود.
- COMPILER_PATH
- مقدار COMPILER_PATH فهرستی از دایرکتوریهای جداشده با دونقطه (colon) است، بسیار شبیه به PATH. اگر GCC نتواند زیربرنامهها را با استفاده از GCC_EXEC_PREFIX پیدا کند، دایرکتوریهایی را که بدینگونه مشخص شدهاند هنگام جستجوی زیربرنامهها بررسی میکند.
- LIBRARY_PATH
- مقدار LIBRARY_PATH فهرستی از دایرکتوریهای جداشده با دونقطه است، بسیار شبیه به PATH. هنگامی که GCC به عنوان یک کامپایلر بومی (native) پیکربندی شده باشد، اگر نتواند فایلهای ویژه پیونددهنده را با استفاده از GCC_EXEC_PREFIX بیابد، دایرکتوریهایی را که بدینگونه مشخص شدهاند بررسی میکند. پیوند زدن با استفاده از GCC همچنین از این دایرکتوریها هنگام جستجوی کتابخانههای معمولی برای گزینه -l استفاده میکند (اما دایرکتوریهای مشخصشده با -L اولویت دارند).
- LANG
- این متغیر برای انتقال اطلاعات محلی (locale) به کامپایلر استفاده میشود. یکی از روشهای استفاده از این اطلاعات، تعیین مجموعه نویسهای (character set) است که هنگام تجزیه لیترالهای نویسهای، لیترالهای رشتهای و کامنتها در C و ++C به کار میرود. هنگامی که کامپایلر برای مجاز دانستن نویسههای چندبایتی پیکربندی شده باشد، مقادیر زیر برای LANG شناخته میشوند:
اگر LANG تعریف نشده باشد یا مقدار دیگری داشته باشد، کامپایلر از "mblen" و "mbtowc" بر اساس محلی پیشفرض برای تشخیص و ترجمه نویسههای چندبایتی استفاده میکند.
- GCC_EXTRA_DIAGNOSTIC_OUTPUT
- اگر GCC_EXTRA_DIAGNOSTIC_OUTPUT روی یکی از مقادیر زیر تنظیم شود، هنگام ارسال راهنماییهای تصحیح (fix-it hints)، متن اضافی به stderr فرستاده میشود. گزینههای -fdiagnostics-parseable-fixits و -fno-diagnostics-parseable-fixits بر این متغیر محیطی اولویت دارند.
برخی متغیرهای محیطی دیگر بر رفتار پیشپردازنده تأثیر میگذارند.
- CPATH
- C_INCLUDE_PATH
- CPLUS_INCLUDE_PATH
- OBJC_INCLUDE_PATH
- مقدار هر
متغیر
فهرستی از
دایرکتوریهای
جداشده با
یک نویسه
ویژه است،
بسیار شبیه
به PATH، که در
آن به دنبال
فایلهای
سرآیند
جستجو
میشود.
نویسه
ویژه،
"PATH_SEPARATOR"،
به معماری
مقصد
وابسته است
و در زمان
ساخت GCC مشخص
میشود.
برای مقاصد
مبتنی بر Microsoft
Windows یک
نقطهویرگول
(semicolon) است، و
تقریباً
برای تمام
مقاصد دیگر
یک دونقطه (colon)
است.
متغیر CPATH فهرستی از دایرکتوریها را مشخص میکند که همانند تعیین با -I جستجو شوند، اما بعد از هر مسیری که با گزینههای -I در خط فرمان داده شده باشد. این متغیر محیطی صرفنظر از اینکه چه زبانی در حال پیشپردازش است استفاده میشود.
بقیه متغیرهای محیطی تنها هنگام پیشپردازش زبان خاص مشخصشده اعمال میشوند. هر یک فهرستی از دایرکتوریها را تعیین میکنند که همانند تعیین با -isystem جستجو شوند، اما بعد از هر مسیری که با گزینههای -isystem در خط فرمان مشخص شده است.
در تمام این متغیرها، یک عنصر خالی به کامپایلر دستور میدهد که دایرکتوری کاری فعلی خود را جستجو کند. عناصر خالی میتوانند در ابتدا یا انتهای یک مسیر ظاهر شوند. به عنوان مثال، اگر مقدار CPATH برابر ":/special/include" باشد، اثری مشابه با -I. -I/special/include دارد..IP DEPENDENCIES_OUTPUT 4 اگر این متغیر مقداردهی شده باشد، مقدار آن نحوهٔ خروجی دادن وابستگیها برای Make را بر اساس فایلهای سرایند غیرسیستمیِ پردازششده توسط کامپایلر مشخص میکند. فایلهای سرایند سیستمی در خروجی وابستگی نادیده گرفته میشوند.
مقدار DEPENDENCIES_OUTPUT میتواند صرفاً یک نام فایل باشد؛ در این حالت، قواعد Make در آن فایل نوشته میشوند و نام هدف از روی نام فایل منبع حدس زده میشود. همچنین مقدار میتواند به قالب file target باشد، که در این حالت قواعد در فایل file با استفاده از target بهعنوان نام هدف نوشته میشوند.
به عبارت دیگر، این متغیر محیطی معادلِ ترکیب گزینههای -MM و -MF، به همراه گزینهٔ اختیاری -MT است.
- SUNPRO_DEPENDENCIES
- این متغیر مشابه DEPENDENCIES_OUTPUT است (بالا را ببینید)، با این تفاوت که فایلهای سرایند سیستمی نادیده گرفته نمیشوند، بنابراین به جای -MM دلالت بر -M دارد. با این حال، وابستگی به فایل ورودی اصلی حذف میشود.
- SOURCE_DATE_EPOCH
- اگر این
متغیر
مقداردهی
شده باشد،
مقدار آن یک
برچسب زمان
یونیکس (UNIX timestamp)
را مشخص
میکند تا
به جای
تاریخ و
زمان کنونی
در
ماکروهای
"__DATE__" و
"__TIME__"
استفاده
شود،
بهطوری که
برچسبهای
زمانی
تعبیهشده
بازتولیدپذیر
شوند.
مقدار SOURCE_DATE_EPOCH باید یک برچسب زمان یونیکس باشد، که به صورت تعداد ثانیهها (بدون احتساب ثانیههای کبیسه) از تاریخ 01 Jan 1970 00:00:00 در قالب ASCII تعریف میشود؛ همسان با خروجی "date +%s" در GNU/Linux و سایر سیستمهایی که از پسوند %s در دستور "date" پشتیبانی میکنند.
این مقدار باید یک برچسب زمان مشخص مانند آخرین زمان تغییر کد منبع یا بسته باشد و باید توسط فرایند ساخت تنظیم شود.
گزارش باگها (BUGS)
برای دریافت دستورالعملهای مربوط به گزارش باگها، پیوند زیر را ببینید: https://gitlab.archlinux.org/archlinux/packaging/packages/kgname/-/issues.
پاورقیها (FOOTNOTES)
- 1.
- در برخی سیستمها، gcc -shared برای کارکرد صحیح سازندهها (constructors) نیازمند ساخت کد جانشین (stub code) تکمیلی است. در سیستمهای چندکتابخانهای (multi-libbed)، دستور gcc -shared باید کتابخانههای پشتیبان مناسب را برای پیوند انتخاب کند. عدم ارائهٔ گزینههای صحیح ممکن است منجر به نقصهای نامحسوس شود. ارائهٔ آنها در مواردی که ضروری نیستند، بیضرر است. گزینهٔ -shared مانع از افزودن کد راهاندازی برای تغییر محیط ممیز شناور (floating-point) میشود، بر خلاف آنچه با گزینههای -ffast-math، -Ofast یا -funsafe-math-optimizations در برخی مقصدها اعمال میشود.
همچنین ببینید (SEE ALSO)
gpl(7)، gfdl(7)، fsf-funding(7)، cpp(1)، gcov(1)، as(1)، ld(1)، gdb(1) و مدخلهای Info برای gcc، cpp، as، ld، binutils و gdb.
نویسندگان (AUTHORS)
برای مشاهدهٔ مشارکتکنندگان در GCC، مدخل Info مربوط به gcc یا https://gcc.gnu.org/onlinedocs/gcc/Contributors.html را ببینید.
کپیرایت و تکثیر (COPYRIGHT)
حق نشر (c) 1988-2025 بنیاد نرمافزارهای آزاد (Free Software Foundation, Inc.)
اجازهٔ کپی، توزیع و/یا تغییر این سند تحت شرایط «مجوز مستندات آزاد گنو» (GNU Free Documentation License)، نسخهٔ 1.3 یا هر نسخهٔ بعدی منتشرشده توسط بنیاد نرمافزارهای آزاد اعطا میشود؛ با بخشهای تغییرناپذیر «GNU General Public License» و «Funding Free Software»، با متنهای روی جلد (الف) (پایین را ببینید) و با متنهای پشت جلد (ب) (پایین را ببینید). نسخهای از این مجوز در صفحهٔ راهنمای gfdl(7) گنجانده شده است.
(الف) متن روی جلد FSF عبارت است از:
A GNU Manual
(ب) متن پشت جلد FSF عبارت است از:
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.
| 2025-08-08 | gcc-15.2.0 |